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