xref: /kvm-unit-tests/lib/arm64/asm/processor.h (revision ad14f089be824ef2baebb5960649271119c46d66)
1 #ifndef _ASMARM64_PROCESSOR_H_
2 #define _ASMARM64_PROCESSOR_H_
3 /*
4  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
5  *
6  * This work is licensed under the terms of the GNU LGPL, version 2.
7  */
8 
9 /* System Control Register (SCTLR_EL1) bits */
10 #define SCTLR_EL1_EE	(1 << 25)
11 #define SCTLR_EL1_WXN	(1 << 19)
12 #define SCTLR_EL1_I	(1 << 12)
13 #define SCTLR_EL1_SA0	(1 << 4)
14 #define SCTLR_EL1_SA	(1 << 3)
15 #define SCTLR_EL1_C	(1 << 2)
16 #define SCTLR_EL1_A	(1 << 1)
17 #define SCTLR_EL1_M	(1 << 0)
18 
19 #ifndef __ASSEMBLY__
20 #include <asm/ptrace.h>
21 
22 enum vector {
23 	EL1T_SYNC,
24 	EL1T_IRQ,
25 	EL1T_FIQ,
26 	EL1T_ERROR,
27 	EL1H_SYNC,
28 	EL1H_IRQ,
29 	EL1H_FIQ,
30 	EL1H_ERROR,
31 	EL0_SYNC_64,
32 	EL0_IRQ_64,
33 	EL0_FIQ_64,
34 	EL0_ERROR_64,
35 	EL0_SYNC_32,
36 	EL0_IRQ_32,
37 	EL0_FIQ_32,
38 	EL0_ERROR_32,
39 	VECTOR_MAX,
40 };
41 
42 #define EC_MAX 64
43 
44 typedef void (*vector_fn)(enum vector v, struct pt_regs *regs,
45 			  unsigned int esr);
46 typedef void (*exception_fn)(struct pt_regs *regs, unsigned int esr);
47 extern void install_vector_handler(enum vector v, vector_fn fn);
48 extern void install_exception_handler(enum vector v, unsigned int ec,
49 				      exception_fn fn);
50 extern void default_vector_handler(enum vector v, struct pt_regs *regs,
51 				   unsigned int esr);
52 extern void vector_handlers_default_init(vector_fn *handlers);
53 
54 extern void show_regs(struct pt_regs *regs);
55 extern bool get_far(unsigned int esr, unsigned long *far);
56 
57 static inline unsigned long current_level(void)
58 {
59 	unsigned long el;
60 	asm volatile("mrs %0, CurrentEL" : "=r" (el));
61 	return el & 0xc;
62 }
63 
64 #define DEFINE_GET_SYSREG32(reg)				\
65 static inline unsigned int get_##reg(void)			\
66 {								\
67 	unsigned int reg;					\
68 	asm volatile("mrs %0, " #reg "_el1" : "=r" (reg));	\
69 	return reg;						\
70 }
71 DEFINE_GET_SYSREG32(mpidr)
72 
73 /* Only support Aff0 for now, gicv2 only */
74 #define mpidr_to_cpu(mpidr) ((int)((mpidr) & 0xff))
75 
76 extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
77 extern bool is_user(void);
78 
79 #endif /* !__ASSEMBLY__ */
80 #endif /* _ASMARM64_PROCESSOR_H_ */
81