xref: /kvm-unit-tests/lib/arm/asm/processor.h (revision 92fca209bc2c7979f421060d6b6360ef6a562985)
12edfe428SAndrew Jones #ifndef _ASMARM_PROCESSOR_H_
22edfe428SAndrew Jones #define _ASMARM_PROCESSOR_H_
32edfe428SAndrew Jones /*
42edfe428SAndrew Jones  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
52edfe428SAndrew Jones  *
62edfe428SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
72edfe428SAndrew Jones  */
88cca5668SAndrew Jones #include <asm/ptrace.h>
9*92fca209SWei Huang #include <asm/sysreg.h>
102edfe428SAndrew Jones 
112edfe428SAndrew Jones enum vector {
122edfe428SAndrew Jones 	EXCPTN_RST,
132edfe428SAndrew Jones 	EXCPTN_UND,
142edfe428SAndrew Jones 	EXCPTN_SVC,
152edfe428SAndrew Jones 	EXCPTN_PABT,
162edfe428SAndrew Jones 	EXCPTN_DABT,
172edfe428SAndrew Jones 	EXCPTN_ADDREXCPTN,
182edfe428SAndrew Jones 	EXCPTN_IRQ,
192edfe428SAndrew Jones 	EXCPTN_FIQ,
202edfe428SAndrew Jones 	EXCPTN_MAX,
212edfe428SAndrew Jones };
222edfe428SAndrew Jones 
232edfe428SAndrew Jones typedef void (*exception_fn)(struct pt_regs *);
242edfe428SAndrew Jones extern void install_exception_handler(enum vector v, exception_fn fn);
252edfe428SAndrew Jones 
262edfe428SAndrew Jones extern void show_regs(struct pt_regs *regs);
272edfe428SAndrew Jones 
282edfe428SAndrew Jones static inline unsigned long current_cpsr(void)
292edfe428SAndrew Jones {
302edfe428SAndrew Jones 	unsigned long cpsr;
312edfe428SAndrew Jones 	asm volatile("mrs %0, cpsr" : "=r" (cpsr));
322edfe428SAndrew Jones 	return cpsr;
332edfe428SAndrew Jones }
342edfe428SAndrew Jones 
352edfe428SAndrew Jones #define current_mode() (current_cpsr() & MODE_MASK)
362edfe428SAndrew Jones 
37*92fca209SWei Huang #define MPIDR __ACCESS_CP15(c0, 0, c0, 5)
38f6d10793SAndrew Jones static inline unsigned int get_mpidr(void)
39f6d10793SAndrew Jones {
40*92fca209SWei Huang 	return read_sysreg(MPIDR);
41f6d10793SAndrew Jones }
42f6d10793SAndrew Jones 
43f6d10793SAndrew Jones /* Only support Aff0 for now, up to 4 cpus */
44f6d10793SAndrew Jones #define mpidr_to_cpu(mpidr) ((int)((mpidr) & 0xff))
45f6d10793SAndrew Jones 
462edfe428SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
47f6d10793SAndrew Jones extern bool is_user(void);
482edfe428SAndrew Jones 
492edfe428SAndrew Jones #endif /* _ASMARM_PROCESSOR_H_ */
50