1 #ifndef _ASMARM64_PROCESSOR_H_ 2 #define _ASMARM64_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 9 /* System Control Register (SCTLR_EL1) bits */ 10 #define SCTLR_EL1_EE (1 << 25) 11 #define SCTLR_EL1_WXN (1 << 19) 12 #define SCTLR_EL1_I (1 << 12) 13 #define SCTLR_EL1_SA0 (1 << 4) 14 #define SCTLR_EL1_SA (1 << 3) 15 #define SCTLR_EL1_C (1 << 2) 16 #define SCTLR_EL1_A (1 << 1) 17 #define SCTLR_EL1_M (1 << 0) 18 19 #ifndef __ASSEMBLY__ 20 #include <asm/ptrace.h> 21 22 enum vector { 23 EL1T_SYNC, 24 EL1T_IRQ, 25 EL1T_FIQ, 26 EL1T_ERROR, 27 EL1H_SYNC, 28 EL1H_IRQ, 29 EL1H_FIQ, 30 EL1H_ERROR, 31 EL0_SYNC_64, 32 EL0_IRQ_64, 33 EL0_FIQ_64, 34 EL0_ERROR_64, 35 EL0_SYNC_32, 36 EL0_IRQ_32, 37 EL0_FIQ_32, 38 EL0_ERROR_32, 39 VECTOR_MAX, 40 }; 41 42 #define EC_MAX 64 43 44 typedef void (*vector_fn)(enum vector v, struct pt_regs *regs, 45 unsigned int esr); 46 typedef void (*exception_fn)(struct pt_regs *regs, unsigned int esr); 47 extern void install_vector_handler(enum vector v, vector_fn fn); 48 extern void install_exception_handler(enum vector v, unsigned int ec, 49 exception_fn fn); 50 extern void default_vector_handler(enum vector v, struct pt_regs *regs, 51 unsigned int esr); 52 extern void vector_handlers_default_init(vector_fn *handlers); 53 54 extern void show_regs(struct pt_regs *regs); 55 extern bool get_far(unsigned int esr, unsigned long *far); 56 57 static inline unsigned long current_level(void) 58 { 59 unsigned long el; 60 asm volatile("mrs %0, CurrentEL" : "=r" (el)); 61 return el & 0xc; 62 } 63 64 #define DEFINE_GET_SYSREG32(reg) \ 65 static inline unsigned int get_##reg(void) \ 66 { \ 67 unsigned int reg; \ 68 asm volatile("mrs %0, " #reg "_el1" : "=r" (reg)); \ 69 return reg; \ 70 } 71 DEFINE_GET_SYSREG32(mpidr) 72 73 /* Only support Aff0 for now, gicv2 only */ 74 #define mpidr_to_cpu(mpidr) ((int)((mpidr) & 0xff)) 75 76 extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); 77 extern bool is_user(void); 78 79 #endif /* !__ASSEMBLY__ */ 80 #endif /* _ASMARM64_PROCESSOR_H_ */ 81