xref: /kvm-unit-tests/lib/arm/asm/processor.h (revision a5875fd46839a73910f1aaafc923c8ffbf6a3eb1)
1 #ifndef _ASMARM_PROCESSOR_H_
2 #define _ASMARM_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 #include <asm/ptrace.h>
9 #include <asm/sysreg.h>
10 #include <asm/barrier.h>
11 
12 enum vector {
13 	EXCPTN_RST,
14 	EXCPTN_UND,
15 	EXCPTN_SVC,
16 	EXCPTN_PABT,
17 	EXCPTN_DABT,
18 	EXCPTN_ADDREXCPTN,
19 	EXCPTN_IRQ,
20 	EXCPTN_FIQ,
21 	EXCPTN_MAX,
22 };
23 
24 typedef void (*exception_fn)(struct pt_regs *);
25 extern void install_exception_handler(enum vector v, exception_fn fn);
26 
27 extern void show_regs(struct pt_regs *regs);
28 
29 static inline unsigned long current_cpsr(void)
30 {
31 	unsigned long cpsr;
32 	asm volatile("mrs %0, cpsr" : "=r" (cpsr));
33 	return cpsr;
34 }
35 
36 #define current_mode() (current_cpsr() & MODE_MASK)
37 
38 #define MPIDR __ACCESS_CP15(c0, 0, c0, 5)
39 static inline unsigned int get_mpidr(void)
40 {
41 	return read_sysreg(MPIDR);
42 }
43 
44 #define MPIDR_HWID_BITMASK 0xffffff
45 extern int mpidr_to_cpu(uint64_t mpidr);
46 
47 #define MPIDR_LEVEL_SHIFT(level) \
48 	(((1 << level) >> 1) << 3)
49 #define MPIDR_AFFINITY_LEVEL(mpidr, level) \
50 	((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff)
51 
52 extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
53 extern bool is_user(void);
54 
55 #define CNTVCT		__ACCESS_CP15_64(1, c14)
56 #define CNTFRQ		__ACCESS_CP15(c14, 0, c0, 0)
57 
58 static inline u64 get_cntvct(void)
59 {
60 	isb();
61 	return read_sysreg(CNTVCT);
62 }
63 
64 static inline u32 get_cntfrq(void)
65 {
66 	return read_sysreg(CNTFRQ);
67 }
68 
69 #endif /* _ASMARM_PROCESSOR_H_ */
70