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 setI 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