hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
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
/*
 * Copyright (C) 2001 - 2007 Tensilica Inc.
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#ifndef _XTENSA_PTRACE_H
#define _XTENSA_PTRACE_H
 
#include <compiler.h>
 
/*
 * Kernel stack
 *
 *        +-----------------------+  -------- STACK_SIZE
 *        |     register file     |  |
 *        +-----------------------+  |
 *        |    struct pt_regs     |  |
 *        +-----------------------+  | ------ PT_REGS_OFFSET
 * double    :  16 bytes spill area  :  |  ^
 * exception    :- - - - - - - - - - - -:  |  |
 * frame    :    struct pt_regs     :  |  |
 *        :- - - - - - - - - - - -:  |  |
 *        |                       |  |  |
 *        |     memory stack      |  |  |
 *        |                       |  |  |
 *        ~                       ~  ~  ~
 *        ~                       ~  ~  ~
 *        |                       |  |  |
 *        |                       |  |  |
 *        +-----------------------+  |  | --- STACK_BIAS
 *        |  struct task_struct   |  |  |  ^
 *  current --> +-----------------------+  |  |  |
 *        |  struct thread_info   |  |  |  |
 *        +-----------------------+ --------
 */
 
#define KERNEL_STACK_SIZE (2 * PAGE_SIZE)
 
/*  Offsets for exception_handlers[] (3 x 64-entries x 4-byte tables) */
 
#define EXC_TABLE_KSTK        0x004    /* Kernel Stack */
#define EXC_TABLE_DOUBLE_SAVE    0x008    /* Double exception save area for a0 */
#define EXC_TABLE_FIXUP        0x00c    /* Fixup handler */
#define EXC_TABLE_PARAM        0x010    /* For passing a parameter to fixup */
#define EXC_TABLE_SYSCALL_SAVE    0x014    /* For fast syscall handler */
#define EXC_TABLE_FAST_USER    0x100    /* Fast user exception handler */
#define EXC_TABLE_FAST_KERNEL    0x200    /* Fast kernel exception handler */
#define EXC_TABLE_DEFAULT    0x300    /* Default C-Handler */
#define EXC_TABLE_SIZE        0x400
 
/* Registers used by strace */
 
#define REG_A_BASE    0xfc000000
#define REG_AR_BASE    0x04000000
#define REG_PC        0x14000000
#define REG_PS        0x080000e6
#define REG_WB        0x08000048
#define REG_WS        0x08000049
#define REG_LBEG    0x08000000
#define REG_LEND    0x08000001
#define REG_LCOUNT    0x08000002
#define REG_SAR        0x08000003
#define REG_DEPC    0x080000c0
#define REG_EXCCAUSE    0x080000e8
#define REG_EXCVADDR    0x080000ee
#define SYSCALL_NR    0x1
 
#define AR_REGNO_TO_A_REGNO(ar, wb) (ar - wb*4) & ~(XCHAL_NUM_AREGS - 1)
 
/* Other PTRACE_ values defined in <linux/ptrace.h> using values 0-9,16,17,24 */
 
#define PTRACE_GETREGS            12
#define PTRACE_SETREGS            13
#define PTRACE_GETFPREGS          14
#define PTRACE_SETFPREGS          15
#define PTRACE_GETFPREGSIZE       18
 
#ifndef __ASSEMBLY__
 
/*
 * This struct defines the way the registers are stored on the
 * kernel stack during a system call or other kernel entry.
 */
struct pt_regs {
   unsigned long pc;        /*   4 */
   unsigned long ps;        /*   8 */
   unsigned long depc;        /*  12 */
   unsigned long exccause;        /*  16 */
   unsigned long excvaddr;        /*  20 */
   unsigned long debugcause;    /*  24 */
   unsigned long wmask;        /*  28 */
   unsigned long lbeg;        /*  32 */
   unsigned long lend;        /*  36 */
   unsigned long lcount;        /*  40 */
   unsigned long sar;        /*  44 */
   unsigned long windowbase;    /*  48 */
   unsigned long windowstart;    /*  52 */
   unsigned long syscall;        /*  56 */
   unsigned long icountlevel;    /*  60 */
   int reserved[1];        /*  64 */
 
   /* Make sure the areg field is 16 bytes aligned */
   int align[0] __aligned(16);
 
   /* current register frame.
    * Note: The ESF for kernel exceptions ends after 16 registers!
    */
   unsigned long areg[16];        /* 128 (64) */
};
 
#ifdef __KERNEL__
 
# define task_pt_regs(tsk) ((struct pt_regs *) \
   (task_stack_page(tsk) + KERNEL_STACK_SIZE - (XCHAL_NUM_AREGS-16)*4) - 1)
# define user_mode(regs) (((regs)->ps & 0x00000020) != 0)
# define instruction_pointer(regs) ((regs)->pc)
void show_regs(struct pt_regs *);
 
# ifndef CONFIG_SMP
#  define profile_pc(regs) instruction_pointer(regs)
# endif
#endif /* __KERNEL__ */
 
#else    /* __ASSEMBLY__ */
 
#ifdef __KERNEL__
# include <asm/asm-offsets.h>
#define PT_REGS_OFFSET      (KERNEL_STACK_SIZE - PT_USER_SIZE)
#endif
 
#endif    /* !__ASSEMBLY__ */
#endif    /* _XTENSA_PTRACE_H */