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> 10*a5875fd4SAndrew Jones #include <asm/barrier.h> 112edfe428SAndrew Jones 122edfe428SAndrew Jones enum vector { 132edfe428SAndrew Jones EXCPTN_RST, 142edfe428SAndrew Jones EXCPTN_UND, 152edfe428SAndrew Jones EXCPTN_SVC, 162edfe428SAndrew Jones EXCPTN_PABT, 172edfe428SAndrew Jones EXCPTN_DABT, 182edfe428SAndrew Jones EXCPTN_ADDREXCPTN, 192edfe428SAndrew Jones EXCPTN_IRQ, 202edfe428SAndrew Jones EXCPTN_FIQ, 212edfe428SAndrew Jones EXCPTN_MAX, 222edfe428SAndrew Jones }; 232edfe428SAndrew Jones 242edfe428SAndrew Jones typedef void (*exception_fn)(struct pt_regs *); 252edfe428SAndrew Jones extern void install_exception_handler(enum vector v, exception_fn fn); 262edfe428SAndrew Jones 272edfe428SAndrew Jones extern void show_regs(struct pt_regs *regs); 282edfe428SAndrew Jones 292edfe428SAndrew Jones static inline unsigned long current_cpsr(void) 302edfe428SAndrew Jones { 312edfe428SAndrew Jones unsigned long cpsr; 322edfe428SAndrew Jones asm volatile("mrs %0, cpsr" : "=r" (cpsr)); 332edfe428SAndrew Jones return cpsr; 342edfe428SAndrew Jones } 352edfe428SAndrew Jones 362edfe428SAndrew Jones #define current_mode() (current_cpsr() & MODE_MASK) 372edfe428SAndrew Jones 3892fca209SWei Huang #define MPIDR __ACCESS_CP15(c0, 0, c0, 5) 39f6d10793SAndrew Jones static inline unsigned int get_mpidr(void) 40f6d10793SAndrew Jones { 4192fca209SWei Huang return read_sysreg(MPIDR); 42f6d10793SAndrew Jones } 43f6d10793SAndrew Jones 44d9729025SAndrew Jones #define MPIDR_HWID_BITMASK 0xffffff 45d9729025SAndrew Jones extern int mpidr_to_cpu(uint64_t mpidr); 46d9729025SAndrew Jones 47d9729025SAndrew Jones #define MPIDR_LEVEL_SHIFT(level) \ 48d9729025SAndrew Jones (((1 << level) >> 1) << 3) 49d9729025SAndrew Jones #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ 50d9729025SAndrew Jones ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff) 51f6d10793SAndrew Jones 522edfe428SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); 53f6d10793SAndrew Jones extern bool is_user(void); 542edfe428SAndrew Jones 55*a5875fd4SAndrew Jones #define CNTVCT __ACCESS_CP15_64(1, c14) 56*a5875fd4SAndrew Jones #define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0) 57*a5875fd4SAndrew Jones 58*a5875fd4SAndrew Jones static inline u64 get_cntvct(void) 59*a5875fd4SAndrew Jones { 60*a5875fd4SAndrew Jones isb(); 61*a5875fd4SAndrew Jones return read_sysreg(CNTVCT); 62*a5875fd4SAndrew Jones } 63*a5875fd4SAndrew Jones 64*a5875fd4SAndrew Jones static inline u32 get_cntfrq(void) 65*a5875fd4SAndrew Jones { 66*a5875fd4SAndrew Jones return read_sysreg(CNTFRQ); 67*a5875fd4SAndrew Jones } 68*a5875fd4SAndrew Jones 692edfe428SAndrew Jones #endif /* _ASMARM_PROCESSOR_H_ */ 70