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 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 38990e5425SAndrew Jones static inline void local_irq_enable(void) 39990e5425SAndrew Jones { 40990e5425SAndrew Jones asm volatile("cpsie i" : : : "memory", "cc"); 41990e5425SAndrew Jones } 42990e5425SAndrew Jones 43990e5425SAndrew Jones static inline void local_irq_disable(void) 44990e5425SAndrew Jones { 45990e5425SAndrew Jones asm volatile("cpsid i" : : : "memory", "cc"); 46990e5425SAndrew Jones } 47990e5425SAndrew Jones 4892fca209SWei Huang #define MPIDR __ACCESS_CP15(c0, 0, c0, 5) 49*da905c9dSAndrew Jones static inline uint64_t get_mpidr(void) 50f6d10793SAndrew Jones { 5192fca209SWei Huang return read_sysreg(MPIDR); 52f6d10793SAndrew Jones } 53f6d10793SAndrew Jones 54d9729025SAndrew Jones #define MPIDR_HWID_BITMASK 0xffffff 55d9729025SAndrew Jones extern int mpidr_to_cpu(uint64_t mpidr); 56d9729025SAndrew Jones 57d9729025SAndrew Jones #define MPIDR_LEVEL_SHIFT(level) \ 58d9729025SAndrew Jones (((1 << level) >> 1) << 3) 59d9729025SAndrew Jones #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ 60d9729025SAndrew Jones ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff) 61f6d10793SAndrew Jones 622edfe428SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); 63f6d10793SAndrew Jones extern bool is_user(void); 642edfe428SAndrew Jones 65a5875fd4SAndrew Jones #define CNTVCT __ACCESS_CP15_64(1, c14) 66a5875fd4SAndrew Jones #define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0) 67a5875fd4SAndrew Jones 68a5875fd4SAndrew Jones static inline u64 get_cntvct(void) 69a5875fd4SAndrew Jones { 70a5875fd4SAndrew Jones isb(); 71a5875fd4SAndrew Jones return read_sysreg(CNTVCT); 72a5875fd4SAndrew Jones } 73a5875fd4SAndrew Jones 74a5875fd4SAndrew Jones static inline u32 get_cntfrq(void) 75a5875fd4SAndrew Jones { 76a5875fd4SAndrew Jones return read_sysreg(CNTFRQ); 77a5875fd4SAndrew Jones } 78a5875fd4SAndrew Jones 792edfe428SAndrew Jones #endif /* _ASMARM_PROCESSOR_H_ */ 80