}                                       \
 } while (0)
 
+__attribute__((noinline)) int read_ptr(int *ptr);
+void expected_pkey_fault(int pkey);
+
 #if defined(__i386__) || defined(__x86_64__) /* arch */
 #include "pkey-x86.h"
 #else /* arch */
 #define __stringify_1(x...)     #x
 #define __stringify(x...)       __stringify_1(x)
 
+static inline u32 *siginfo_get_pkey_ptr(siginfo_t *si)
+{
+#ifdef si_pkey
+       return &si->si_pkey;
+#else
+       return (u32 *)(((u8 *)si) + si_pkey_offset);
+#endif
+}
+
 #endif /* _PKEYS_HELPER_H */
 
 #endif
 
 #define NR_PKEYS               16
+#define NR_RESERVED_PKEYS      2 /* pkey-0 and exec-only-pkey */
 #define PKEY_BITS_PER_PKEY     2
 #define HPAGE_SIZE             (1UL<<21)
 #define PAGE_SIZE              4096
        return xstate_offset;
 }
 
+static inline int get_arch_reserved_keys(void)
+{
+       return NR_RESERVED_PKEYS;
+}
+
+void expect_fault_on_read_execonly_key(void *p1, int pkey)
+{
+       int ptr_contents;
+
+       ptr_contents = read_ptr(p1);
+       dprintf2("ptr (%p) contents@%d: %x\n", p1, __LINE__, ptr_contents);
+       expected_pkey_fault(pkey);
+}
+
 #endif /* _PKEYS_X86_H */
 
        madvise(p1, PAGE_SIZE, MADV_DONTNEED);
        lots_o_noops_around_write(&scratch);
        do_not_expect_pkey_fault("executing on PROT_EXEC memory");
-       ptr_contents = read_ptr(p1);
-       dprintf2("ptr (%p) contents@%d: %x\n", p1, __LINE__, ptr_contents);
-       expected_pkey_fault(pkey);
+       expect_fault_on_read_execonly_key(p1, pkey);
 }
 
 void test_implicit_mprotect_exec_only_memory(int *ptr, u16 pkey)
        madvise(p1, PAGE_SIZE, MADV_DONTNEED);
        lots_o_noops_around_write(&scratch);
        do_not_expect_pkey_fault("executing on PROT_EXEC memory");
-       ptr_contents = read_ptr(p1);
-       dprintf2("ptr (%p) contents@%d: %x\n", p1, __LINE__, ptr_contents);
-       expected_pkey_fault(UNKNOWN_PKEY);
+       expect_fault_on_read_execonly_key(p1, UNKNOWN_PKEY);
 
        /*
         * Put the memory back to non-PROT_EXEC.  Should clear the