Messages in this thread | | | From | Michael Ellerman <> | Subject | Re: [PATCH 2/3] powerpc/book3e: Fix set_memory_x() and set_memory_nx() | Date | Thu, 28 Oct 2021 22:33:40 +1100 |
| |
Christophe Leroy <christophe.leroy@csgroup.eu> writes: > Le 27/10/2021 à 06:44, Nicholas Piggin a écrit : >> Excerpts from Christophe Leroy's message of October 26, 2021 3:39 pm: >>> set_memory_x() calls pte_mkexec() which sets _PAGE_EXEC. >>> set_memory_nx() calls pte_exprotec() which clears _PAGE_EXEC. >>> >>> Book3e has 2 bits, UX and SX, which defines the exec rights >>> resp. for user (PR=1) and for kernel (PR=0). >>> >>> _PAGE_EXEC is defined as UX only. >>> >>> An executable kernel page is set with either _PAGE_KERNEL_RWX >>> or _PAGE_KERNEL_ROX, which both have SX set and UX cleared. >>> >>> So set_memory_nx() call for an executable kernel page does >>> nothing because UX is already cleared. >>> >>> And set_memory_x() on a non-executable kernel page makes it >>> executable for the user and keeps it non-executable for kernel. >>> >>> Also, pte_exec() always returns 'false' on kernel pages, because >>> it checks _PAGE_EXEC which doesn't include SX, so for instance >>> the W+X check doesn't work. >>> >>> To fix this: >>> - change tlb_low_64e.S to use _PAGE_BAP_UX instead of _PAGE_USER >>> - sets both UX and SX in _PAGE_EXEC so that pte_user() returns >>> true whenever one of the two bits is set >> >> I don't understand this change. Which pte_user() returns true after >> this change? Or do you mean pte_exec()? > > Oops, yes, I mean pte_exec() > > Unless I have to re-spin, can Michael eventually fix that typo while > applying ?
I did.
cheers
| |