Thread (12 messages) 12 messages, 4 authors, 2021-11-02

Re: [PATCH 2/3] powerpc/book3e: Fix set_memory_x() and set_memory_nx()

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2021-10-28 11:33:49
Also in: lkml

Christophe Leroy [off-list ref] writes:
Le 27/10/2021 à 06:44, Nicholas Piggin a écrit :
quoted
Excerpts from Christophe Leroy's message of October 26, 2021 3:39 pm:
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help