1*d30c1683SDeepak Gupta /* SPDX-License-Identifier: GPL-2.0-only */ 2*d30c1683SDeepak Gupta 3*d30c1683SDeepak Gupta #ifndef SELFTEST_RISCV_CFI_H 4*d30c1683SDeepak Gupta #define SELFTEST_RISCV_CFI_H 5*d30c1683SDeepak Gupta #include <stddef.h> 6*d30c1683SDeepak Gupta #include <sys/types.h> 7*d30c1683SDeepak Gupta #include "shadowstack.h" 8*d30c1683SDeepak Gupta 9*d30c1683SDeepak Gupta #define CHILD_EXIT_CODE_SSWRITE 10 10*d30c1683SDeepak Gupta #define CHILD_EXIT_CODE_SIG_TEST 11 11*d30c1683SDeepak Gupta 12*d30c1683SDeepak Gupta #define my_syscall5(num, arg1, arg2, arg3, arg4, arg5) \ 13*d30c1683SDeepak Gupta ({ \ 14*d30c1683SDeepak Gupta register long _num __asm__ ("a7") = (num); \ 15*d30c1683SDeepak Gupta register long _arg1 __asm__ ("a0") = (long)(arg1); \ 16*d30c1683SDeepak Gupta register long _arg2 __asm__ ("a1") = (long)(arg2); \ 17*d30c1683SDeepak Gupta register long _arg3 __asm__ ("a2") = (long)(arg3); \ 18*d30c1683SDeepak Gupta register long _arg4 __asm__ ("a3") = (long)(arg4); \ 19*d30c1683SDeepak Gupta register long _arg5 __asm__ ("a4") = (long)(arg5); \ 20*d30c1683SDeepak Gupta \ 21*d30c1683SDeepak Gupta __asm__ volatile( \ 22*d30c1683SDeepak Gupta "ecall\n" \ 23*d30c1683SDeepak Gupta : "+r" \ 24*d30c1683SDeepak Gupta (_arg1) \ 25*d30c1683SDeepak Gupta : "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), \ 26*d30c1683SDeepak Gupta "r"(_num) \ 27*d30c1683SDeepak Gupta : "memory", "cc" \ 28*d30c1683SDeepak Gupta ); \ 29*d30c1683SDeepak Gupta _arg1; \ 30*d30c1683SDeepak Gupta }) 31*d30c1683SDeepak Gupta 32*d30c1683SDeepak Gupta #define my_syscall3(num, arg1, arg2, arg3) \ 33*d30c1683SDeepak Gupta ({ \ 34*d30c1683SDeepak Gupta register long _num __asm__ ("a7") = (num); \ 35*d30c1683SDeepak Gupta register long _arg1 __asm__ ("a0") = (long)(arg1); \ 36*d30c1683SDeepak Gupta register long _arg2 __asm__ ("a1") = (long)(arg2); \ 37*d30c1683SDeepak Gupta register long _arg3 __asm__ ("a2") = (long)(arg3); \ 38*d30c1683SDeepak Gupta \ 39*d30c1683SDeepak Gupta __asm__ volatile( \ 40*d30c1683SDeepak Gupta "ecall\n" \ 41*d30c1683SDeepak Gupta : "+r" (_arg1) \ 42*d30c1683SDeepak Gupta : "r"(_arg2), "r"(_arg3), \ 43*d30c1683SDeepak Gupta "r"(_num) \ 44*d30c1683SDeepak Gupta : "memory", "cc" \ 45*d30c1683SDeepak Gupta ); \ 46*d30c1683SDeepak Gupta _arg1; \ 47*d30c1683SDeepak Gupta }) 48*d30c1683SDeepak Gupta 49*d30c1683SDeepak Gupta #ifndef __NR_prctl 50*d30c1683SDeepak Gupta #define __NR_prctl 167 51*d30c1683SDeepak Gupta #endif 52*d30c1683SDeepak Gupta 53*d30c1683SDeepak Gupta #ifndef __NR_map_shadow_stack 54*d30c1683SDeepak Gupta #define __NR_map_shadow_stack 453 55*d30c1683SDeepak Gupta #endif 56*d30c1683SDeepak Gupta 57*d30c1683SDeepak Gupta #define CSR_SSP 0x011 58*d30c1683SDeepak Gupta 59*d30c1683SDeepak Gupta #ifdef __ASSEMBLY__ 60*d30c1683SDeepak Gupta #define __ASM_STR(x) x 61*d30c1683SDeepak Gupta #else 62*d30c1683SDeepak Gupta #define __ASM_STR(x) #x 63*d30c1683SDeepak Gupta #endif 64*d30c1683SDeepak Gupta 65*d30c1683SDeepak Gupta #define csr_read(csr) \ 66*d30c1683SDeepak Gupta ({ \ 67*d30c1683SDeepak Gupta register unsigned long __v; \ 68*d30c1683SDeepak Gupta __asm__ __volatile__ ("csrr %0, " __ASM_STR(csr) \ 69*d30c1683SDeepak Gupta : "=r" (__v) : \ 70*d30c1683SDeepak Gupta : "memory"); \ 71*d30c1683SDeepak Gupta __v; \ 72*d30c1683SDeepak Gupta }) 73*d30c1683SDeepak Gupta 74*d30c1683SDeepak Gupta #define csr_write(csr, val) \ 75*d30c1683SDeepak Gupta ({ \ 76*d30c1683SDeepak Gupta unsigned long __v = (unsigned long)(val); \ 77*d30c1683SDeepak Gupta __asm__ __volatile__ ("csrw " __ASM_STR(csr) ", %0" \ 78*d30c1683SDeepak Gupta : : "rK" (__v) \ 79*d30c1683SDeepak Gupta : "memory"); \ 80*d30c1683SDeepak Gupta }) 81*d30c1683SDeepak Gupta 82*d30c1683SDeepak Gupta #endif 83