99#include <linux/compiler.h>
1010#include <linux/stringify.h>
1111#include <sys/wait.h>
12+ #include <sys/syscall.h>
13+ #include <sys/prctl.h>
14+ #include <asm/prctl.h>
1215#include "uprobe_syscall.skel.h"
1316#include "uprobe_syscall_executed.skel.h"
1417
@@ -297,6 +300,56 @@ static void test_uretprobe_syscall_call(void)
297300 close (go [1 ]);
298301 close (go [0 ]);
299302}
303+
304+ /*
305+ * Borrowed from tools/testing/selftests/x86/test_shadow_stack.c.
306+ *
307+ * For use in inline enablement of shadow stack.
308+ *
309+ * The program can't return from the point where shadow stack gets enabled
310+ * because there will be no address on the shadow stack. So it can't use
311+ * syscall() for enablement, since it is a function.
312+ *
313+ * Based on code from nolibc.h. Keep a copy here because this can't pull
314+ * in all of nolibc.h.
315+ */
316+ #define ARCH_PRCTL (arg1 , arg2 ) \
317+ ({ \
318+ long _ret; \
319+ register long _num asm("eax") = __NR_arch_prctl; \
320+ register long _arg1 asm("rdi") = (long)(arg1); \
321+ register long _arg2 asm("rsi") = (long)(arg2); \
322+ \
323+ asm volatile ( \
324+ "syscall\n" \
325+ : "=a"(_ret) \
326+ : "r"(_arg1), "r"(_arg2), \
327+ "0"(_num) \
328+ : "rcx", "r11", "memory", "cc" \
329+ ); \
330+ _ret; \
331+ })
332+
333+ #ifndef ARCH_SHSTK_ENABLE
334+ #define ARCH_SHSTK_ENABLE 0x5001
335+ #define ARCH_SHSTK_DISABLE 0x5002
336+ #define ARCH_SHSTK_SHSTK (1ULL << 0)
337+ #endif
338+
339+ static void test_uretprobe_shadow_stack (void )
340+ {
341+ if (ARCH_PRCTL (ARCH_SHSTK_ENABLE , ARCH_SHSTK_SHSTK )) {
342+ test__skip ();
343+ return ;
344+ }
345+
346+ /* Run all of the uretprobe tests. */
347+ test_uretprobe_regs_equal ();
348+ test_uretprobe_regs_change ();
349+ test_uretprobe_syscall_call ();
350+
351+ ARCH_PRCTL (ARCH_SHSTK_DISABLE , ARCH_SHSTK_SHSTK );
352+ }
300353#else
301354static void test_uretprobe_regs_equal (void )
302355{
@@ -312,6 +365,11 @@ static void test_uretprobe_syscall_call(void)
312365{
313366 test__skip ();
314367}
368+
369+ static void test_uretprobe_shadow_stack (void )
370+ {
371+ test__skip ();
372+ }
315373#endif
316374
317375void test_uprobe_syscall (void )
@@ -322,4 +380,6 @@ void test_uprobe_syscall(void)
322380 test_uretprobe_regs_change ();
323381 if (test__start_subtest ("uretprobe_syscall_call" ))
324382 test_uretprobe_syscall_call ();
383+ if (test__start_subtest ("uretprobe_shadow_stack" ))
384+ test_uretprobe_shadow_stack ();
325385}
0 commit comments