]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
lkdtm/powerpc: add isync after slbmte to enforce SLB update ordering
authorSayali Patil <sayalip@linux.ibm.com>
Mon, 18 May 2026 06:56:04 +0000 (12:26 +0530)
committerKees Cook <kees@kernel.org>
Thu, 21 May 2026 10:21:00 +0000 (03:21 -0700)
The slbmte instruction modifies the Segment Lookaside Buffer, but without
a context synchronizing operation the CPU is not guaranteed to observe
the updated SLB state for subsequent instructions. This can result in
use of stale translation state when memory is accessed immediately after
SLB modifications.

Add isync after each slbmte in the PPC_SLB_MULTIHIT test to ensure proper
ordering of SLB updates before subsequent memory accesses.

This aligns with Power ISA context synchronization requirements for changes
in address translation state and improves the reliability of SLB multihit
injection tests in hash MMU mode.

Suggested-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Signed-off-by: Sayali Patil <sayalip@linux.ibm.com>
Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Reviewed-by: Michael Ellerman <mpe@kernel.org>
Link: https://patch.msgid.link/2f8d430962a96a7498903b994f081deee4a4d97a.1778975974.git.sayalip@linux.ibm.com
Signed-off-by: Kees Cook <kees@kernel.org>
drivers/misc/lkdtm/powerpc.c

index be385449911a8d23db788d66dd97bcdf69946a04..ef07e5201edf8aa4668b1bdbc0787963db31cc25 100644 (file)
@@ -17,11 +17,14 @@ static void insert_slb_entry(unsigned long p, int ssize, int page_size)
                     : "r" (mk_vsid_data(p, ssize, flags)),
                       "r" (mk_esid_data(p, ssize, SLB_NUM_BOLTED))
                     : "memory");
+       isync();
 
        asm volatile("slbmte %0,%1" :
                        : "r" (mk_vsid_data(p, ssize, flags)),
                          "r" (mk_esid_data(p, ssize, SLB_NUM_BOLTED + 1))
                        : "memory");
+       isync();
+
        preempt_enable();
 }
 
@@ -84,6 +87,7 @@ static void insert_dup_slb_entry_0(void)
                        : "r" (vsid),
                          "r" (esid | SLB_NUM_BOLTED)
                        : "memory");
+       isync();
 
        asm volatile("slbmfee  %0,%1" : "=r" (esid) : "r" (i));
        asm volatile("slbmfev  %0,%1" : "=r" (vsid) : "r" (i));
@@ -93,6 +97,7 @@ static void insert_dup_slb_entry_0(void)
                        : "r" (vsid),
                          "r" (esid | (SLB_NUM_BOLTED + 1))
                        : "memory");
+       isync();
 
        pr_info("%s accessing test address 0x%lx: 0x%lx\n",
                __func__, test_address, *test_ptr);