xref: /kvm-unit-tests/lib/arm64/asm/ptrace.h (revision 7ee966e98ee6e326b4149ed28330a71d6e96b10d)
1*7ee966e9SAndrew Jones #ifndef _ASMARM64_PTRACE_H_
2*7ee966e9SAndrew Jones #define _ASMARM64_PTRACE_H_
3*7ee966e9SAndrew Jones /*
4*7ee966e9SAndrew Jones  * Adapted from Linux kernel headers
5*7ee966e9SAndrew Jones  * arch/arm64/include/asm/ptrace.h
6*7ee966e9SAndrew Jones  * arch/arm64/include/uapi/asm/ptrace.h
7*7ee966e9SAndrew Jones  */
8*7ee966e9SAndrew Jones 
9*7ee966e9SAndrew Jones /* Current Exception Level values, as contained in CurrentEL */
10*7ee966e9SAndrew Jones #define CurrentEL_EL1	(1 << 2)
11*7ee966e9SAndrew Jones #define CurrentEL_EL2	(2 << 2)
12*7ee966e9SAndrew Jones 
13*7ee966e9SAndrew Jones /*
14*7ee966e9SAndrew Jones  * PSR bits
15*7ee966e9SAndrew Jones  */
16*7ee966e9SAndrew Jones #define PSR_MODE_EL0t	0x00000000
17*7ee966e9SAndrew Jones #define PSR_MODE_EL1t	0x00000004
18*7ee966e9SAndrew Jones #define PSR_MODE_EL1h	0x00000005
19*7ee966e9SAndrew Jones #define PSR_MODE_EL2t	0x00000008
20*7ee966e9SAndrew Jones #define PSR_MODE_EL2h	0x00000009
21*7ee966e9SAndrew Jones #define PSR_MODE_EL3t	0x0000000c
22*7ee966e9SAndrew Jones #define PSR_MODE_EL3h	0x0000000d
23*7ee966e9SAndrew Jones #define PSR_MODE_MASK	0x0000000f
24*7ee966e9SAndrew Jones 
25*7ee966e9SAndrew Jones /* AArch32 CPSR bits */
26*7ee966e9SAndrew Jones #define PSR_MODE32_BIT	0x00000010
27*7ee966e9SAndrew Jones 
28*7ee966e9SAndrew Jones /* AArch64 SPSR bits */
29*7ee966e9SAndrew Jones #define PSR_F_BIT	0x00000040
30*7ee966e9SAndrew Jones #define PSR_I_BIT	0x00000080
31*7ee966e9SAndrew Jones #define PSR_A_BIT	0x00000100
32*7ee966e9SAndrew Jones #define PSR_D_BIT	0x00000200
33*7ee966e9SAndrew Jones #define PSR_Q_BIT	0x08000000
34*7ee966e9SAndrew Jones #define PSR_V_BIT	0x10000000
35*7ee966e9SAndrew Jones #define PSR_C_BIT	0x20000000
36*7ee966e9SAndrew Jones #define PSR_Z_BIT	0x40000000
37*7ee966e9SAndrew Jones #define PSR_N_BIT	0x80000000
38*7ee966e9SAndrew Jones 
39*7ee966e9SAndrew Jones /*
40*7ee966e9SAndrew Jones  * Groups of PSR bits
41*7ee966e9SAndrew Jones  */
42*7ee966e9SAndrew Jones #define PSR_f		0xff000000	/* Flags                */
43*7ee966e9SAndrew Jones #define PSR_s		0x00ff0000	/* Status               */
44*7ee966e9SAndrew Jones #define PSR_x		0x0000ff00	/* Extension            */
45*7ee966e9SAndrew Jones #define PSR_c		0x000000ff	/* Control              */
46*7ee966e9SAndrew Jones 
47*7ee966e9SAndrew Jones #ifndef __ASSEMBLY__
48*7ee966e9SAndrew Jones #include <libcflat.h>
49*7ee966e9SAndrew Jones 
50*7ee966e9SAndrew Jones struct user_pt_regs {
51*7ee966e9SAndrew Jones 	u64		regs[31];
52*7ee966e9SAndrew Jones 	u64		sp;
53*7ee966e9SAndrew Jones 	u64		pc;
54*7ee966e9SAndrew Jones 	u64		pstate;
55*7ee966e9SAndrew Jones };
56*7ee966e9SAndrew Jones 
57*7ee966e9SAndrew Jones struct user_fpsimd_state {
58*7ee966e9SAndrew Jones 	__uint128_t	vregs[32];
59*7ee966e9SAndrew Jones 	u32		fpsr;
60*7ee966e9SAndrew Jones 	u32		fpcr;
61*7ee966e9SAndrew Jones };
62*7ee966e9SAndrew Jones 
63*7ee966e9SAndrew Jones /*
64*7ee966e9SAndrew Jones  * This struct defines the way the registers are stored on the stack during an
65*7ee966e9SAndrew Jones  * exception. Note that sizeof(struct pt_regs) has to be a multiple of 16 (for
66*7ee966e9SAndrew Jones  * stack alignment). struct user_pt_regs must form a prefix of struct pt_regs.
67*7ee966e9SAndrew Jones  */
68*7ee966e9SAndrew Jones struct pt_regs {
69*7ee966e9SAndrew Jones 	union {
70*7ee966e9SAndrew Jones 		struct user_pt_regs user_regs;
71*7ee966e9SAndrew Jones 		struct {
72*7ee966e9SAndrew Jones 			u64 regs[31];
73*7ee966e9SAndrew Jones 			u64 sp;
74*7ee966e9SAndrew Jones 			u64 pc;
75*7ee966e9SAndrew Jones 			u64 pstate;
76*7ee966e9SAndrew Jones 		};
77*7ee966e9SAndrew Jones 	};
78*7ee966e9SAndrew Jones 	u64 orig_x0;
79*7ee966e9SAndrew Jones 	u64 syscallno;
80*7ee966e9SAndrew Jones };
81*7ee966e9SAndrew Jones 
82*7ee966e9SAndrew Jones #define user_mode(regs) \
83*7ee966e9SAndrew Jones 	(((regs)->pstate & PSR_MODE_MASK) == PSR_MODE_EL0t)
84*7ee966e9SAndrew Jones 
85*7ee966e9SAndrew Jones #define processor_mode(regs) \
86*7ee966e9SAndrew Jones 	((regs)->pstate & PSR_MODE_MASK)
87*7ee966e9SAndrew Jones 
88*7ee966e9SAndrew Jones #define interrupts_enabled(regs) \
89*7ee966e9SAndrew Jones 	(!((regs)->pstate & PSR_I_BIT))
90*7ee966e9SAndrew Jones 
91*7ee966e9SAndrew Jones #define fast_interrupts_enabled(regs) \
92*7ee966e9SAndrew Jones 	(!((regs)->pstate & PSR_F_BIT))
93*7ee966e9SAndrew Jones 
94*7ee966e9SAndrew Jones #endif /* !__ASSEMBLY__ */
95*7ee966e9SAndrew Jones #endif /* _ASMARM64_PTRACE_H_ */
96