hc
2023-11-22 f743a7adbd6e230d66a6206fa115b59fec2d88eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 *  linux/include/asm-arm/proc-armv/ptrace.h
 *
 *  Copyright (C) 1996-1999 Russell King
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#ifndef __ASM_PROC_PTRACE_H
#define __ASM_PROC_PTRACE_H
 
#ifdef CONFIG_ARM64
 
#define PCMASK        0
 
#ifndef __ASSEMBLY__
 
/*
 * This struct defines the way the registers are stored
 * on the stack during an exception.
 */
struct pt_regs {
   /*
    * system register
    *
    * Note: never change order! see "_exception_entry" and "exception_exit"
    */
   unsigned long ttbr0;
   unsigned long hcr;    /* hcr_el2/scr_el3 */
   unsigned long sctlr;
   unsigned long sp;
   unsigned long spsr;
   unsigned long vbar;
   unsigned long daif;
   unsigned long esr;
 
   unsigned long elr;
   unsigned long regs[31];
};
 
#endif    /* __ASSEMBLY__ */
 
#else    /* CONFIG_ARM64 */
 
#define USR26_MODE    0x00
#define FIQ26_MODE    0x01
#define IRQ26_MODE    0x02
#define SVC26_MODE    0x03
#define USR_MODE    0x10
#define FIQ_MODE    0x11
#define IRQ_MODE    0x12
#define SVC_MODE    0x13
#define ABT_MODE    0x17
#define HYP_MODE    0x1a
#define UND_MODE    0x1b
#define SYSTEM_MODE    0x1f
#define MODE_MASK    0x1f
#define T_BIT        0x20
#define F_BIT        0x40
#define I_BIT        0x80
#define A_BIT        0x100
#define CC_V_BIT    (1 << 28)
#define CC_C_BIT    (1 << 29)
#define CC_Z_BIT    (1 << 30)
#define CC_N_BIT    (1 << 31)
#define PCMASK        0
 
#ifndef __ASSEMBLY__
 
/* this struct defines the way the registers are stored on the
   stack during a system call. */
 
struct pt_regs {
   long uregs[18];
};
 
#define ARM_cpsr    uregs[16]
#define ARM_pc        uregs[15]
#define ARM_lr        uregs[14]
#define ARM_sp        uregs[13]
#define ARM_ip        uregs[12]
#define ARM_fp        uregs[11]
#define ARM_r10        uregs[10]
#define ARM_r9        uregs[9]
#define ARM_r8        uregs[8]
#define ARM_r7        uregs[7]
#define ARM_r6        uregs[6]
#define ARM_r5        uregs[5]
#define ARM_r4        uregs[4]
#define ARM_r3        uregs[3]
#define ARM_r2        uregs[2]
#define ARM_r1        uregs[1]
#define ARM_r0        uregs[0]
#define ARM_ORIG_r0    uregs[17]
 
#ifdef __KERNEL__
 
#define user_mode(regs)    \
   (((regs)->ARM_cpsr & 0xf) == 0)
 
#ifdef CONFIG_ARM_THUMB
#define thumb_mode(regs) \
   (((regs)->ARM_cpsr & T_BIT))
#else
#define thumb_mode(regs) (0)
#endif
 
#define processor_mode(regs) \
   ((regs)->ARM_cpsr & MODE_MASK)
 
#define interrupts_enabled(regs) \
   (!((regs)->ARM_cpsr & I_BIT))
 
#define fast_interrupts_enabled(regs) \
   (!((regs)->ARM_cpsr & F_BIT))
 
#define condition_codes(regs) \
   ((regs)->ARM_cpsr & (CC_V_BIT|CC_C_BIT|CC_Z_BIT|CC_N_BIT))
 
/* Are the current registers suitable for user mode?
 * (used to maintain security in signal handlers)
 */
static inline int valid_user_regs(struct pt_regs *regs)
{
   if ((regs->ARM_cpsr & 0xf) == 0 &&
       (regs->ARM_cpsr & (F_BIT|I_BIT)) == 0)
       return 1;
 
   /*
    * Force CPSR to something logical...
    */
   regs->ARM_cpsr &= (CC_V_BIT|CC_C_BIT|CC_Z_BIT|CC_N_BIT|0x10);
 
   return 0;
}
 
#endif    /* __KERNEL__ */
 
#endif    /* __ASSEMBLY__ */
 
#endif    /* CONFIG_ARM64 */
 
#endif