xref: /kvm-unit-tests/lib/arm64/asm/processor.h (revision ad14f089be824ef2baebb5960649271119c46d66)
17ee966e9SAndrew Jones #ifndef _ASMARM64_PROCESSOR_H_
27ee966e9SAndrew Jones #define _ASMARM64_PROCESSOR_H_
37ee966e9SAndrew Jones /*
47ee966e9SAndrew Jones  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
57ee966e9SAndrew Jones  *
67ee966e9SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
77ee966e9SAndrew Jones  */
8db328a24SAndrew Jones 
9db328a24SAndrew Jones /* System Control Register (SCTLR_EL1) bits */
10db328a24SAndrew Jones #define SCTLR_EL1_EE	(1 << 25)
11db328a24SAndrew Jones #define SCTLR_EL1_WXN	(1 << 19)
12db328a24SAndrew Jones #define SCTLR_EL1_I	(1 << 12)
13db328a24SAndrew Jones #define SCTLR_EL1_SA0	(1 << 4)
14db328a24SAndrew Jones #define SCTLR_EL1_SA	(1 << 3)
15db328a24SAndrew Jones #define SCTLR_EL1_C	(1 << 2)
16db328a24SAndrew Jones #define SCTLR_EL1_A	(1 << 1)
17db328a24SAndrew Jones #define SCTLR_EL1_M	(1 << 0)
18db328a24SAndrew Jones 
19db328a24SAndrew Jones #ifndef __ASSEMBLY__
207ee966e9SAndrew Jones #include <asm/ptrace.h>
217ee966e9SAndrew Jones 
227ee966e9SAndrew Jones enum vector {
237ee966e9SAndrew Jones 	EL1T_SYNC,
247ee966e9SAndrew Jones 	EL1T_IRQ,
257ee966e9SAndrew Jones 	EL1T_FIQ,
267ee966e9SAndrew Jones 	EL1T_ERROR,
277ee966e9SAndrew Jones 	EL1H_SYNC,
287ee966e9SAndrew Jones 	EL1H_IRQ,
297ee966e9SAndrew Jones 	EL1H_FIQ,
307ee966e9SAndrew Jones 	EL1H_ERROR,
317ee966e9SAndrew Jones 	EL0_SYNC_64,
327ee966e9SAndrew Jones 	EL0_IRQ_64,
337ee966e9SAndrew Jones 	EL0_FIQ_64,
347ee966e9SAndrew Jones 	EL0_ERROR_64,
357ee966e9SAndrew Jones 	EL0_SYNC_32,
367ee966e9SAndrew Jones 	EL0_IRQ_32,
377ee966e9SAndrew Jones 	EL0_FIQ_32,
387ee966e9SAndrew Jones 	EL0_ERROR_32,
397ee966e9SAndrew Jones 	VECTOR_MAX,
407ee966e9SAndrew Jones };
417ee966e9SAndrew Jones 
427ee966e9SAndrew Jones #define EC_MAX 64
437ee966e9SAndrew Jones 
447ee966e9SAndrew Jones typedef void (*vector_fn)(enum vector v, struct pt_regs *regs,
457ee966e9SAndrew Jones 			  unsigned int esr);
467ee966e9SAndrew Jones typedef void (*exception_fn)(struct pt_regs *regs, unsigned int esr);
477ee966e9SAndrew Jones extern void install_vector_handler(enum vector v, vector_fn fn);
487ee966e9SAndrew Jones extern void install_exception_handler(enum vector v, unsigned int ec,
497ee966e9SAndrew Jones 				      exception_fn fn);
50a4049322SAndrew Jones extern void default_vector_handler(enum vector v, struct pt_regs *regs,
51a4049322SAndrew Jones 				   unsigned int esr);
52*ad14f089SAndrew Jones extern void vector_handlers_default_init(vector_fn *handlers);
537ee966e9SAndrew Jones 
547ee966e9SAndrew Jones extern void show_regs(struct pt_regs *regs);
55db328a24SAndrew Jones extern bool get_far(unsigned int esr, unsigned long *far);
567ee966e9SAndrew Jones 
577ee966e9SAndrew Jones static inline unsigned long current_level(void)
587ee966e9SAndrew Jones {
597ee966e9SAndrew Jones 	unsigned long el;
607ee966e9SAndrew Jones 	asm volatile("mrs %0, CurrentEL" : "=r" (el));
617ee966e9SAndrew Jones 	return el & 0xc;
627ee966e9SAndrew Jones }
637ee966e9SAndrew Jones 
64f6d10793SAndrew Jones #define DEFINE_GET_SYSREG32(reg)				\
65f6d10793SAndrew Jones static inline unsigned int get_##reg(void)			\
66f6d10793SAndrew Jones {								\
67f6d10793SAndrew Jones 	unsigned int reg;					\
68f6d10793SAndrew Jones 	asm volatile("mrs %0, " #reg "_el1" : "=r" (reg));	\
69f6d10793SAndrew Jones 	return reg;						\
70f6d10793SAndrew Jones }
71f6d10793SAndrew Jones DEFINE_GET_SYSREG32(mpidr)
72f6d10793SAndrew Jones 
73f6d10793SAndrew Jones /* Only support Aff0 for now, gicv2 only */
74f6d10793SAndrew Jones #define mpidr_to_cpu(mpidr) ((int)((mpidr) & 0xff))
75f6d10793SAndrew Jones 
767ee966e9SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
77f6d10793SAndrew Jones extern bool is_user(void);
787ee966e9SAndrew Jones 
79db328a24SAndrew Jones #endif /* !__ASSEMBLY__ */
807ee966e9SAndrew Jones #endif /* _ASMARM64_PROCESSOR_H_ */
81