1819833afSPeter Tyser /* 2819833afSPeter Tyser * linux/include/asm-arm/proc-armv/ptrace.h 3819833afSPeter Tyser * 4819833afSPeter Tyser * Copyright (C) 1996-1999 Russell King 5819833afSPeter Tyser * 6819833afSPeter Tyser * This program is free software; you can redistribute it and/or modify 7819833afSPeter Tyser * it under the terms of the GNU General Public License version 2 as 8819833afSPeter Tyser * published by the Free Software Foundation. 9819833afSPeter Tyser */ 10819833afSPeter Tyser #ifndef __ASM_PROC_PTRACE_H 11819833afSPeter Tyser #define __ASM_PROC_PTRACE_H 12819833afSPeter Tyser 130ae76531SDavid Feng #ifdef CONFIG_ARM64 140ae76531SDavid Feng 150ae76531SDavid Feng #define PCMASK 0 160ae76531SDavid Feng 170ae76531SDavid Feng #ifndef __ASSEMBLY__ 180ae76531SDavid Feng 190ae76531SDavid Feng /* 200ae76531SDavid Feng * This struct defines the way the registers are stored 210ae76531SDavid Feng * on the stack during an exception. 220ae76531SDavid Feng */ 230ae76531SDavid Feng struct pt_regs { 24*faa7eb0fSJoseph Chen /* 25*faa7eb0fSJoseph Chen * system register 26*faa7eb0fSJoseph Chen * 27*faa7eb0fSJoseph Chen * Note: never change order! see "_exception_entry" and "exception_exit" 28*faa7eb0fSJoseph Chen */ 29*faa7eb0fSJoseph Chen unsigned long ttbr0; 30*faa7eb0fSJoseph Chen unsigned long hcr; /* hcr_el2/scr_el3 */ 31*faa7eb0fSJoseph Chen unsigned long sctlr; 32*faa7eb0fSJoseph Chen unsigned long sp; 33*faa7eb0fSJoseph Chen unsigned long spsr; 34*faa7eb0fSJoseph Chen unsigned long vbar; 35*faa7eb0fSJoseph Chen unsigned long daif; 36*faa7eb0fSJoseph Chen unsigned long esr; 37*faa7eb0fSJoseph Chen 380ae76531SDavid Feng unsigned long elr; 390ae76531SDavid Feng unsigned long regs[31]; 400ae76531SDavid Feng }; 410ae76531SDavid Feng 420ae76531SDavid Feng #endif /* __ASSEMBLY__ */ 430ae76531SDavid Feng 440ae76531SDavid Feng #else /* CONFIG_ARM64 */ 450ae76531SDavid Feng 46819833afSPeter Tyser #define USR26_MODE 0x00 47819833afSPeter Tyser #define FIQ26_MODE 0x01 48819833afSPeter Tyser #define IRQ26_MODE 0x02 49819833afSPeter Tyser #define SVC26_MODE 0x03 50819833afSPeter Tyser #define USR_MODE 0x10 51819833afSPeter Tyser #define FIQ_MODE 0x11 52819833afSPeter Tyser #define IRQ_MODE 0x12 53819833afSPeter Tyser #define SVC_MODE 0x13 54819833afSPeter Tyser #define ABT_MODE 0x17 55b726d22dSMarc Zyngier #define HYP_MODE 0x1a 56819833afSPeter Tyser #define UND_MODE 0x1b 57819833afSPeter Tyser #define SYSTEM_MODE 0x1f 58819833afSPeter Tyser #define MODE_MASK 0x1f 59819833afSPeter Tyser #define T_BIT 0x20 60819833afSPeter Tyser #define F_BIT 0x40 61819833afSPeter Tyser #define I_BIT 0x80 62b726d22dSMarc Zyngier #define A_BIT 0x100 63819833afSPeter Tyser #define CC_V_BIT (1 << 28) 64819833afSPeter Tyser #define CC_C_BIT (1 << 29) 65819833afSPeter Tyser #define CC_Z_BIT (1 << 30) 66819833afSPeter Tyser #define CC_N_BIT (1 << 31) 67819833afSPeter Tyser #define PCMASK 0 68819833afSPeter Tyser 69819833afSPeter Tyser #ifndef __ASSEMBLY__ 70819833afSPeter Tyser 71819833afSPeter Tyser /* this struct defines the way the registers are stored on the 72819833afSPeter Tyser stack during a system call. */ 73819833afSPeter Tyser 74819833afSPeter Tyser struct pt_regs { 75819833afSPeter Tyser long uregs[18]; 76819833afSPeter Tyser }; 77819833afSPeter Tyser 78819833afSPeter Tyser #define ARM_cpsr uregs[16] 79819833afSPeter Tyser #define ARM_pc uregs[15] 80819833afSPeter Tyser #define ARM_lr uregs[14] 81819833afSPeter Tyser #define ARM_sp uregs[13] 82819833afSPeter Tyser #define ARM_ip uregs[12] 83819833afSPeter Tyser #define ARM_fp uregs[11] 84819833afSPeter Tyser #define ARM_r10 uregs[10] 85819833afSPeter Tyser #define ARM_r9 uregs[9] 86819833afSPeter Tyser #define ARM_r8 uregs[8] 87819833afSPeter Tyser #define ARM_r7 uregs[7] 88819833afSPeter Tyser #define ARM_r6 uregs[6] 89819833afSPeter Tyser #define ARM_r5 uregs[5] 90819833afSPeter Tyser #define ARM_r4 uregs[4] 91819833afSPeter Tyser #define ARM_r3 uregs[3] 92819833afSPeter Tyser #define ARM_r2 uregs[2] 93819833afSPeter Tyser #define ARM_r1 uregs[1] 94819833afSPeter Tyser #define ARM_r0 uregs[0] 95819833afSPeter Tyser #define ARM_ORIG_r0 uregs[17] 96819833afSPeter Tyser 97819833afSPeter Tyser #ifdef __KERNEL__ 98819833afSPeter Tyser 99819833afSPeter Tyser #define user_mode(regs) \ 100819833afSPeter Tyser (((regs)->ARM_cpsr & 0xf) == 0) 101819833afSPeter Tyser 102819833afSPeter Tyser #ifdef CONFIG_ARM_THUMB 103819833afSPeter Tyser #define thumb_mode(regs) \ 104819833afSPeter Tyser (((regs)->ARM_cpsr & T_BIT)) 105819833afSPeter Tyser #else 106819833afSPeter Tyser #define thumb_mode(regs) (0) 107819833afSPeter Tyser #endif 108819833afSPeter Tyser 109819833afSPeter Tyser #define processor_mode(regs) \ 110819833afSPeter Tyser ((regs)->ARM_cpsr & MODE_MASK) 111819833afSPeter Tyser 112819833afSPeter Tyser #define interrupts_enabled(regs) \ 113819833afSPeter Tyser (!((regs)->ARM_cpsr & I_BIT)) 114819833afSPeter Tyser 115819833afSPeter Tyser #define fast_interrupts_enabled(regs) \ 116819833afSPeter Tyser (!((regs)->ARM_cpsr & F_BIT)) 117819833afSPeter Tyser 118819833afSPeter Tyser #define condition_codes(regs) \ 119819833afSPeter Tyser ((regs)->ARM_cpsr & (CC_V_BIT|CC_C_BIT|CC_Z_BIT|CC_N_BIT)) 120819833afSPeter Tyser 121819833afSPeter Tyser /* Are the current registers suitable for user mode? 122819833afSPeter Tyser * (used to maintain security in signal handlers) 123819833afSPeter Tyser */ valid_user_regs(struct pt_regs * regs)124819833afSPeter Tyserstatic inline int valid_user_regs(struct pt_regs *regs) 125819833afSPeter Tyser { 126819833afSPeter Tyser if ((regs->ARM_cpsr & 0xf) == 0 && 127819833afSPeter Tyser (regs->ARM_cpsr & (F_BIT|I_BIT)) == 0) 128819833afSPeter Tyser return 1; 129819833afSPeter Tyser 130819833afSPeter Tyser /* 131819833afSPeter Tyser * Force CPSR to something logical... 132819833afSPeter Tyser */ 133819833afSPeter Tyser regs->ARM_cpsr &= (CC_V_BIT|CC_C_BIT|CC_Z_BIT|CC_N_BIT|0x10); 134819833afSPeter Tyser 135819833afSPeter Tyser return 0; 136819833afSPeter Tyser } 137819833afSPeter Tyser 138819833afSPeter Tyser #endif /* __KERNEL__ */ 139819833afSPeter Tyser 140819833afSPeter Tyser #endif /* __ASSEMBLY__ */ 141819833afSPeter Tyser 1420ae76531SDavid Feng #endif /* CONFIG_ARM64 */ 1430ae76531SDavid Feng 144819833afSPeter Tyser #endif 145