xref: /linux/tools/testing/selftests/riscv/cfi/cfi_rv_test.h (revision cee73b1e840c154f64ace682cb477c1ae2e29cc4)
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