17ee966e9SAndrew Jones #ifndef _ASMARM64_PROCESSOR_H_ 27ee966e9SAndrew Jones #define _ASMARM64_PROCESSOR_H_ 37ee966e9SAndrew Jones /* 47ee966e9SAndrew Jones * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com> 57ee966e9SAndrew Jones * 67ee966e9SAndrew Jones * This work is licensed under the terms of the GNU LGPL, version 2. 77ee966e9SAndrew Jones */ 8db328a24SAndrew Jones 9db328a24SAndrew Jones /* System Control Register (SCTLR_EL1) bits */ 10db328a24SAndrew Jones #define SCTLR_EL1_EE (1 << 25) 11db328a24SAndrew Jones #define SCTLR_EL1_WXN (1 << 19) 12db328a24SAndrew Jones #define SCTLR_EL1_I (1 << 12) 13db328a24SAndrew Jones #define SCTLR_EL1_SA0 (1 << 4) 14db328a24SAndrew Jones #define SCTLR_EL1_SA (1 << 3) 15db328a24SAndrew Jones #define SCTLR_EL1_C (1 << 2) 16db328a24SAndrew Jones #define SCTLR_EL1_A (1 << 1) 17db328a24SAndrew Jones #define SCTLR_EL1_M (1 << 0) 18db328a24SAndrew Jones 19db328a24SAndrew Jones #ifndef __ASSEMBLY__ 207ee966e9SAndrew Jones #include <asm/ptrace.h> 217ee966e9SAndrew Jones 227ee966e9SAndrew Jones enum vector { 237ee966e9SAndrew Jones EL1T_SYNC, 247ee966e9SAndrew Jones EL1T_IRQ, 257ee966e9SAndrew Jones EL1T_FIQ, 267ee966e9SAndrew Jones EL1T_ERROR, 277ee966e9SAndrew Jones EL1H_SYNC, 287ee966e9SAndrew Jones EL1H_IRQ, 297ee966e9SAndrew Jones EL1H_FIQ, 307ee966e9SAndrew Jones EL1H_ERROR, 317ee966e9SAndrew Jones EL0_SYNC_64, 327ee966e9SAndrew Jones EL0_IRQ_64, 337ee966e9SAndrew Jones EL0_FIQ_64, 347ee966e9SAndrew Jones EL0_ERROR_64, 357ee966e9SAndrew Jones EL0_SYNC_32, 367ee966e9SAndrew Jones EL0_IRQ_32, 377ee966e9SAndrew Jones EL0_FIQ_32, 387ee966e9SAndrew Jones EL0_ERROR_32, 397ee966e9SAndrew Jones VECTOR_MAX, 407ee966e9SAndrew Jones }; 417ee966e9SAndrew Jones 427ee966e9SAndrew Jones #define EC_MAX 64 437ee966e9SAndrew Jones 447ee966e9SAndrew Jones typedef void (*vector_fn)(enum vector v, struct pt_regs *regs, 457ee966e9SAndrew Jones unsigned int esr); 467ee966e9SAndrew Jones typedef void (*exception_fn)(struct pt_regs *regs, unsigned int esr); 477ee966e9SAndrew Jones extern void install_vector_handler(enum vector v, vector_fn fn); 487ee966e9SAndrew Jones extern void install_exception_handler(enum vector v, unsigned int ec, 497ee966e9SAndrew Jones exception_fn fn); 50a4049322SAndrew Jones extern void default_vector_handler(enum vector v, struct pt_regs *regs, 51a4049322SAndrew Jones unsigned int esr); 527ee966e9SAndrew Jones 537ee966e9SAndrew Jones extern void show_regs(struct pt_regs *regs); 54db328a24SAndrew Jones extern bool get_far(unsigned int esr, unsigned long *far); 557ee966e9SAndrew Jones 567ee966e9SAndrew Jones static inline unsigned long current_level(void) 577ee966e9SAndrew Jones { 587ee966e9SAndrew Jones unsigned long el; 597ee966e9SAndrew Jones asm volatile("mrs %0, CurrentEL" : "=r" (el)); 607ee966e9SAndrew Jones return el & 0xc; 617ee966e9SAndrew Jones } 627ee966e9SAndrew Jones 63*f6d10793SAndrew Jones #define DEFINE_GET_SYSREG32(reg) \ 64*f6d10793SAndrew Jones static inline unsigned int get_##reg(void) \ 65*f6d10793SAndrew Jones { \ 66*f6d10793SAndrew Jones unsigned int reg; \ 67*f6d10793SAndrew Jones asm volatile("mrs %0, " #reg "_el1" : "=r" (reg)); \ 68*f6d10793SAndrew Jones return reg; \ 69*f6d10793SAndrew Jones } 70*f6d10793SAndrew Jones DEFINE_GET_SYSREG32(mpidr) 71*f6d10793SAndrew Jones 72*f6d10793SAndrew Jones /* Only support Aff0 for now, gicv2 only */ 73*f6d10793SAndrew Jones #define mpidr_to_cpu(mpidr) ((int)((mpidr) & 0xff)) 74*f6d10793SAndrew Jones 757ee966e9SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); 76*f6d10793SAndrew Jones extern bool is_user(void); 777ee966e9SAndrew Jones 78db328a24SAndrew Jones #endif /* !__ASSEMBLY__ */ 797ee966e9SAndrew Jones #endif /* _ASMARM64_PROCESSOR_H_ */ 80