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); 50*a4049322SAndrew Jones extern void default_vector_handler(enum vector v, struct pt_regs *regs, 51*a4049322SAndrew Jones unsigned int esr); 527ee966e9SAndrew Jones 537ee966e9SAndrew Jones extern void show_regs(struct pt_regs *regs); 547ee966e9SAndrew Jones extern void *get_sp(void); 55db328a24SAndrew Jones extern bool get_far(unsigned int esr, unsigned long *far); 567ee966e9SAndrew Jones 577ee966e9SAndrew Jones static inline unsigned long current_level(void) 587ee966e9SAndrew Jones { 597ee966e9SAndrew Jones unsigned long el; 607ee966e9SAndrew Jones asm volatile("mrs %0, CurrentEL" : "=r" (el)); 617ee966e9SAndrew Jones return el & 0xc; 627ee966e9SAndrew Jones } 637ee966e9SAndrew Jones 647ee966e9SAndrew Jones extern bool user_mode; 657ee966e9SAndrew Jones extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr); 667ee966e9SAndrew Jones 67db328a24SAndrew Jones #endif /* !__ASSEMBLY__ */ 687ee966e9SAndrew Jones #endif /* _ASMARM64_PROCESSOR_H_ */ 69