xref: /kvm-unit-tests/lib/arm64/asm/ptrace.h (revision 0cc3a351b925928827baa4b69cf0e46ff5837083)
17ee966e9SAndrew Jones #ifndef _ASMARM64_PTRACE_H_
27ee966e9SAndrew Jones #define _ASMARM64_PTRACE_H_
37ee966e9SAndrew Jones /*
47ee966e9SAndrew Jones  * Adapted from Linux kernel headers
57ee966e9SAndrew Jones  * arch/arm64/include/asm/ptrace.h
67ee966e9SAndrew Jones  * arch/arm64/include/uapi/asm/ptrace.h
749f758b8SAndrew Jones  *
849f758b8SAndrew Jones  * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com>
949f758b8SAndrew Jones  *
1049f758b8SAndrew Jones  * This work is licensed under the terms of the GNU GPL, version 2.
117ee966e9SAndrew Jones  */
127ee966e9SAndrew Jones 
137ee966e9SAndrew Jones /* Current Exception Level values, as contained in CurrentEL */
147ee966e9SAndrew Jones #define CurrentEL_EL1	(1 << 2)
157ee966e9SAndrew Jones #define CurrentEL_EL2	(2 << 2)
167ee966e9SAndrew Jones 
177ee966e9SAndrew Jones /*
187ee966e9SAndrew Jones  * PSR bits
197ee966e9SAndrew Jones  */
207ee966e9SAndrew Jones #define PSR_MODE_EL0t	0x00000000
217ee966e9SAndrew Jones #define PSR_MODE_EL1t	0x00000004
227ee966e9SAndrew Jones #define PSR_MODE_EL1h	0x00000005
237ee966e9SAndrew Jones #define PSR_MODE_EL2t	0x00000008
247ee966e9SAndrew Jones #define PSR_MODE_EL2h	0x00000009
257ee966e9SAndrew Jones #define PSR_MODE_EL3t	0x0000000c
267ee966e9SAndrew Jones #define PSR_MODE_EL3h	0x0000000d
277ee966e9SAndrew Jones #define PSR_MODE_MASK	0x0000000f
287ee966e9SAndrew Jones 
297ee966e9SAndrew Jones /* AArch32 CPSR bits */
307ee966e9SAndrew Jones #define PSR_MODE32_BIT	0x00000010
317ee966e9SAndrew Jones 
327ee966e9SAndrew Jones /* AArch64 SPSR bits */
337ee966e9SAndrew Jones #define PSR_F_BIT	0x00000040
347ee966e9SAndrew Jones #define PSR_I_BIT	0x00000080
357ee966e9SAndrew Jones #define PSR_A_BIT	0x00000100
367ee966e9SAndrew Jones #define PSR_D_BIT	0x00000200
377ee966e9SAndrew Jones #define PSR_Q_BIT	0x08000000
387ee966e9SAndrew Jones #define PSR_V_BIT	0x10000000
397ee966e9SAndrew Jones #define PSR_C_BIT	0x20000000
407ee966e9SAndrew Jones #define PSR_Z_BIT	0x40000000
417ee966e9SAndrew Jones #define PSR_N_BIT	0x80000000
427ee966e9SAndrew Jones 
437ee966e9SAndrew Jones /*
447ee966e9SAndrew Jones  * Groups of PSR bits
457ee966e9SAndrew Jones  */
467ee966e9SAndrew Jones #define PSR_f		0xff000000	/* Flags                */
477ee966e9SAndrew Jones #define PSR_s		0x00ff0000	/* Status               */
487ee966e9SAndrew Jones #define PSR_x		0x0000ff00	/* Extension            */
497ee966e9SAndrew Jones #define PSR_c		0x000000ff	/* Control              */
507ee966e9SAndrew Jones 
51*0cc3a351SSean Christopherson #ifndef __ASSEMBLER__
527ee966e9SAndrew Jones #include <libcflat.h>
537ee966e9SAndrew Jones 
547ee966e9SAndrew Jones struct user_pt_regs {
557ee966e9SAndrew Jones 	u64		regs[31];
567ee966e9SAndrew Jones 	u64		sp;
577ee966e9SAndrew Jones 	u64		pc;
587ee966e9SAndrew Jones 	u64		pstate;
597ee966e9SAndrew Jones };
607ee966e9SAndrew Jones 
617ee966e9SAndrew Jones struct user_fpsimd_state {
627ee966e9SAndrew Jones 	__uint128_t	vregs[32];
637ee966e9SAndrew Jones 	u32		fpsr;
647ee966e9SAndrew Jones 	u32		fpcr;
657ee966e9SAndrew Jones };
667ee966e9SAndrew Jones 
677ee966e9SAndrew Jones /*
687ee966e9SAndrew Jones  * This struct defines the way the registers are stored on the stack during an
697ee966e9SAndrew Jones  * exception. Note that sizeof(struct pt_regs) has to be a multiple of 16 (for
707ee966e9SAndrew Jones  * stack alignment). struct user_pt_regs must form a prefix of struct pt_regs.
717ee966e9SAndrew Jones  */
727ee966e9SAndrew Jones struct pt_regs {
737ee966e9SAndrew Jones 	union {
747ee966e9SAndrew Jones 		struct user_pt_regs user_regs;
757ee966e9SAndrew Jones 		struct {
767ee966e9SAndrew Jones 			u64 regs[31];
777ee966e9SAndrew Jones 			u64 sp;
787ee966e9SAndrew Jones 			u64 pc;
797ee966e9SAndrew Jones 			u64 pstate;
807ee966e9SAndrew Jones 		};
817ee966e9SAndrew Jones 	};
827ee966e9SAndrew Jones 	u64 orig_x0;
837ee966e9SAndrew Jones 	u64 syscallno;
847ee966e9SAndrew Jones };
857ee966e9SAndrew Jones 
867ee966e9SAndrew Jones #define user_mode(regs) \
877ee966e9SAndrew Jones 	(((regs)->pstate & PSR_MODE_MASK) == PSR_MODE_EL0t)
887ee966e9SAndrew Jones 
897ee966e9SAndrew Jones #define processor_mode(regs) \
907ee966e9SAndrew Jones 	((regs)->pstate & PSR_MODE_MASK)
917ee966e9SAndrew Jones 
927ee966e9SAndrew Jones #define interrupts_enabled(regs) \
937ee966e9SAndrew Jones 	(!((regs)->pstate & PSR_I_BIT))
947ee966e9SAndrew Jones 
957ee966e9SAndrew Jones #define fast_interrupts_enabled(regs) \
967ee966e9SAndrew Jones 	(!((regs)->pstate & PSR_F_BIT))
977ee966e9SAndrew Jones 
98*0cc3a351SSean Christopherson #endif /* !__ASSEMBLER__ */
997ee966e9SAndrew Jones #endif /* _ASMARM64_PTRACE_H_ */
100