| #ifndef _ASMARM_PROCESSOR_H_ |
| #define _ASMARM_PROCESSOR_H_ |
| /* |
| * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com> |
| * |
| * This work is licensed under the terms of the GNU LGPL, version 2. |
| */ |
| #include <asm/ptrace.h> |
| #include <asm/sysreg.h> |
| #include <asm/barrier.h> |
| |
| #define CTR_DMINLINE_SHIFT 16 |
| #define CTR_DMINLINE_MASK (0xf << 16) |
| #define CTR_DMINLINE(x) \ |
| (((x) & CTR_DMINLINE_MASK) >> CTR_DMINLINE_SHIFT) |
| |
| enum vector { |
| EXCPTN_RST, |
| EXCPTN_UND, |
| EXCPTN_SVC, |
| EXCPTN_PABT, |
| EXCPTN_DABT, |
| EXCPTN_ADDREXCPTN, |
| EXCPTN_IRQ, |
| EXCPTN_FIQ, |
| EXCPTN_MAX, |
| }; |
| |
| typedef void (*irq_handler_fn)(struct pt_regs *regs); |
| typedef void (*exception_fn)(struct pt_regs *); |
| |
| extern void install_exception_handler(enum vector v, exception_fn fn); |
| |
| extern void show_regs(struct pt_regs *regs); |
| |
| static inline unsigned long current_cpsr(void) |
| { |
| unsigned long cpsr; |
| asm volatile("mrs %0, cpsr" : "=r" (cpsr)); |
| return cpsr; |
| } |
| |
| #define current_mode() (current_cpsr() & MODE_MASK) |
| |
| static inline void local_irq_enable(void) |
| { |
| asm volatile("cpsie i" : : : "memory", "cc"); |
| } |
| |
| static inline void local_irq_disable(void) |
| { |
| asm volatile("cpsid i" : : : "memory", "cc"); |
| } |
| |
| #define MPIDR __ACCESS_CP15(c0, 0, c0, 5) |
| static inline uint64_t get_mpidr(void) |
| { |
| return read_sysreg(MPIDR); |
| } |
| |
| #define MPIDR_HWID_BITMASK 0xffffff |
| extern int mpidr_to_cpu(uint64_t mpidr); |
| |
| #define MPIDR_LEVEL_SHIFT(level) \ |
| (((1 << level) >> 1) << 3) |
| #define MPIDR_AFFINITY_LEVEL(mpidr, level) \ |
| ((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff) |
| |
| extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); |
| extern bool is_user(void); |
| |
| #define CNTVCT __ACCESS_CP15_64(1, c14) |
| #define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0) |
| #define CTR __ACCESS_CP15(c0, 0, c0, 1) |
| |
| static inline u64 get_cntvct(void) |
| { |
| isb(); |
| return read_sysreg(CNTVCT); |
| } |
| |
| static inline u32 get_cntfrq(void) |
| { |
| return read_sysreg(CNTFRQ); |
| } |
| |
| static inline u32 get_ctr(void) |
| { |
| return read_sysreg(CTR); |
| } |
| |
| extern u32 dcache_line_size; |
| |
| #endif /* _ASMARM_PROCESSOR_H_ */ |