xref: /kvm-unit-tests/lib/arm/asm/processor.h (revision 0917dc65eabbacb592456c0d1bb05e5828c23661)
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>
992fca209SWei Huang #include <asm/sysreg.h>
10a5875fd4SAndrew Jones #include <asm/barrier.h>
112edfe428SAndrew Jones 
12410b3bf0SAlexandru Elisei #define CTR_DMINLINE_SHIFT	16
13410b3bf0SAlexandru Elisei #define CTR_DMINLINE_MASK	(0xf << 16)
14410b3bf0SAlexandru Elisei #define CTR_DMINLINE(x)	\
15410b3bf0SAlexandru Elisei 	(((x) & CTR_DMINLINE_MASK) >> CTR_DMINLINE_SHIFT)
16410b3bf0SAlexandru Elisei 
172edfe428SAndrew Jones enum vector {
182edfe428SAndrew Jones 	EXCPTN_RST,
192edfe428SAndrew Jones 	EXCPTN_UND,
202edfe428SAndrew Jones 	EXCPTN_SVC,
212edfe428SAndrew Jones 	EXCPTN_PABT,
222edfe428SAndrew Jones 	EXCPTN_DABT,
232edfe428SAndrew Jones 	EXCPTN_ADDREXCPTN,
242edfe428SAndrew Jones 	EXCPTN_IRQ,
252edfe428SAndrew Jones 	EXCPTN_FIQ,
262edfe428SAndrew Jones 	EXCPTN_MAX,
272edfe428SAndrew Jones };
282edfe428SAndrew Jones 
2925f66327SEric Auger typedef void (*irq_handler_fn)(struct pt_regs *regs);
302edfe428SAndrew Jones typedef void (*exception_fn)(struct pt_regs *);
3125f66327SEric Auger 
322edfe428SAndrew Jones extern void install_exception_handler(enum vector v, exception_fn fn);
332edfe428SAndrew Jones 
342edfe428SAndrew Jones extern void show_regs(struct pt_regs *regs);
352edfe428SAndrew Jones 
362edfe428SAndrew Jones static inline unsigned long current_cpsr(void)
372edfe428SAndrew Jones {
382edfe428SAndrew Jones 	unsigned long cpsr;
392edfe428SAndrew Jones 	asm volatile("mrs %0, cpsr" : "=r" (cpsr));
402edfe428SAndrew Jones 	return cpsr;
412edfe428SAndrew Jones }
422edfe428SAndrew Jones 
432edfe428SAndrew Jones #define current_mode() (current_cpsr() & MODE_MASK)
442edfe428SAndrew Jones 
45990e5425SAndrew Jones static inline void local_irq_enable(void)
46990e5425SAndrew Jones {
47990e5425SAndrew Jones 	asm volatile("cpsie i" : : : "memory", "cc");
48990e5425SAndrew Jones }
49990e5425SAndrew Jones 
50990e5425SAndrew Jones static inline void local_irq_disable(void)
51990e5425SAndrew Jones {
52990e5425SAndrew Jones 	asm volatile("cpsid i" : : : "memory", "cc");
53990e5425SAndrew Jones }
54990e5425SAndrew Jones 
5592fca209SWei Huang #define MPIDR __ACCESS_CP15(c0, 0, c0, 5)
56da905c9dSAndrew Jones static inline uint64_t get_mpidr(void)
57f6d10793SAndrew Jones {
5892fca209SWei Huang 	return read_sysreg(MPIDR);
59f6d10793SAndrew Jones }
60f6d10793SAndrew Jones 
61d9729025SAndrew Jones #define MPIDR_HWID_BITMASK 0xffffff
62d9729025SAndrew Jones extern int mpidr_to_cpu(uint64_t mpidr);
63d9729025SAndrew Jones 
64d9729025SAndrew Jones #define MPIDR_LEVEL_SHIFT(level) \
65d9729025SAndrew Jones 	(((1 << level) >> 1) << 3)
66d9729025SAndrew Jones #define MPIDR_AFFINITY_LEVEL(mpidr, level) \
67d9729025SAndrew Jones 	((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff)
68f6d10793SAndrew Jones 
692edfe428SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
70*0917dc65SNikos Nikoleris extern bool __mmu_enabled(void);
71f6d10793SAndrew Jones extern bool is_user(void);
722edfe428SAndrew Jones 
73a5875fd4SAndrew Jones #define CNTVCT		__ACCESS_CP15_64(1, c14)
74a5875fd4SAndrew Jones #define CNTFRQ		__ACCESS_CP15(c14, 0, c0, 0)
75410b3bf0SAlexandru Elisei #define CTR		__ACCESS_CP15(c0, 0, c0, 1)
76*0917dc65SNikos Nikoleris #define SCTRL		__ACCESS_CP15(c1, 0, c0, 0)
77a5875fd4SAndrew Jones 
78a5875fd4SAndrew Jones static inline u64 get_cntvct(void)
79a5875fd4SAndrew Jones {
80a5875fd4SAndrew Jones 	isb();
81a5875fd4SAndrew Jones 	return read_sysreg(CNTVCT);
82a5875fd4SAndrew Jones }
83a5875fd4SAndrew Jones 
84a5875fd4SAndrew Jones static inline u32 get_cntfrq(void)
85a5875fd4SAndrew Jones {
86a5875fd4SAndrew Jones 	return read_sysreg(CNTFRQ);
87a5875fd4SAndrew Jones }
88a5875fd4SAndrew Jones 
89410b3bf0SAlexandru Elisei static inline u32 get_ctr(void)
90410b3bf0SAlexandru Elisei {
91410b3bf0SAlexandru Elisei 	return read_sysreg(CTR);
92410b3bf0SAlexandru Elisei }
93410b3bf0SAlexandru Elisei 
94956e3800SAndrew Jones extern unsigned long dcache_line_size;
95410b3bf0SAlexandru Elisei 
962edfe428SAndrew Jones #endif /* _ASMARM_PROCESSOR_H_ */
97