~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/sparc/include/asm/ptrace.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef __SPARC_PTRACE_H
  3 #define __SPARC_PTRACE_H
  4 
  5 #include <uapi/asm/ptrace.h>
  6 
  7 #if defined(__sparc__) && defined(__arch64__)
  8 #ifndef __ASSEMBLY__
  9 
 10 #include <linux/compiler.h>
 11 #include <linux/threads.h>
 12 #include <asm/switch_to.h>
 13 
 14 static inline int pt_regs_trap_type(struct pt_regs *regs)
 15 {
 16         return regs->magic & 0x1ff;
 17 }
 18 
 19 static inline bool pt_regs_is_syscall(struct pt_regs *regs)
 20 {
 21         return (regs->tstate & TSTATE_SYSCALL);
 22 }
 23 
 24 static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
 25 {
 26         return (regs->tstate &= ~TSTATE_SYSCALL);
 27 }
 28 
 29 #define arch_ptrace_stop_needed() \
 30 ({      flush_user_windows(); \
 31         get_thread_wsaved() != 0; \
 32 })
 33 
 34 #define arch_ptrace_stop() \
 35         synchronize_user_stack()
 36 
 37 #define current_pt_regs() \
 38         ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
 39 
 40 struct global_reg_snapshot {
 41         unsigned long           tstate;
 42         unsigned long           tpc;
 43         unsigned long           tnpc;
 44         unsigned long           o7;
 45         unsigned long           i7;
 46         unsigned long           rpc;
 47         struct thread_info      *thread;
 48         unsigned long           pad1;
 49 };
 50 
 51 struct global_pmu_snapshot {
 52         unsigned long           pcr[4];
 53         unsigned long           pic[4];
 54 };
 55 
 56 union global_cpu_snapshot {
 57         struct global_reg_snapshot      reg;
 58         struct global_pmu_snapshot      pmu;
 59 };
 60 
 61 extern union global_cpu_snapshot global_cpu_snapshot[NR_CPUS];
 62 
 63 #define force_successful_syscall_return() set_thread_noerror(1)
 64 #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
 65 #define instruction_pointer(regs) ((regs)->tpc)
 66 #define instruction_pointer_set(regs, val) do { \
 67                 (regs)->tpc = (val); \
 68                 (regs)->tnpc = (val)+4; \
 69         } while (0)
 70 #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
 71 static inline int is_syscall_success(struct pt_regs *regs)
 72 {
 73         return !(regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY));
 74 }
 75 
 76 static inline long regs_return_value(struct pt_regs *regs)
 77 {
 78         return regs->u_regs[UREG_I0];
 79 }
 80 #ifdef CONFIG_SMP
 81 unsigned long profile_pc(struct pt_regs *);
 82 #else
 83 #define profile_pc(regs) instruction_pointer(regs)
 84 #endif
 85 
 86 #define MAX_REG_OFFSET (offsetof(struct pt_regs, magic))
 87 
 88 int regs_query_register_offset(const char *name);
 89 unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n);
 90 
 91 /**
 92  * regs_get_register() - get register value from its offset
 93  * @regs:       pt_regs from which register value is gotten
 94  * @offset:     offset number of the register.
 95  *
 96  * regs_get_register returns the value of a register whose
 97  * offset from @regs. The @offset is the offset of the register
 98  * in struct pt_regs. If @offset is bigger than MAX_REG_OFFSET,
 99  * this returns 0.
100  */
101 static inline unsigned long regs_get_register(struct pt_regs *regs,
102                                              unsigned long offset)
103 {
104         if (unlikely(offset >= MAX_REG_OFFSET))
105                 return 0;
106         if (offset == PT_V9_Y)
107                 return *(unsigned int *)((unsigned long)regs + offset);
108         return *(unsigned long *)((unsigned long)regs + offset);
109 }
110 
111 /* Valid only for Kernel mode traps. */
112 static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
113 {
114         return regs->u_regs[UREG_I6];
115 }
116 #else /* __ASSEMBLY__ */
117 #endif /* __ASSEMBLY__ */
118 #else /* (defined(__sparc__) && defined(__arch64__)) */
119 #ifndef __ASSEMBLY__
120 #include <asm/switch_to.h>
121 
122 static inline bool pt_regs_is_syscall(struct pt_regs *regs)
123 {
124         return (regs->psr & PSR_SYSCALL);
125 }
126 
127 static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
128 {
129         return (regs->psr &= ~PSR_SYSCALL);
130 }
131 
132 #define arch_ptrace_stop_needed() \
133 ({      flush_user_windows(); \
134         current_thread_info()->w_saved != 0;    \
135 })
136 
137 #define arch_ptrace_stop() \
138         synchronize_user_stack()
139 
140 #define current_pt_regs() \
141         ((struct pt_regs *)((unsigned long)current_thread_info() + THREAD_SIZE) - 1)
142 
143 #define user_mode(regs) (!((regs)->psr & PSR_PS))
144 #define instruction_pointer(regs) ((regs)->pc)
145 #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
146 unsigned long profile_pc(struct pt_regs *);
147 #else /* (!__ASSEMBLY__) */
148 #endif /* (!__ASSEMBLY__) */
149 #endif /* (defined(__sparc__) && defined(__arch64__)) */
150 #define STACK_BIAS              2047
151 
152 /* global_reg_snapshot offsets */
153 #define GR_SNAP_TSTATE  0x00
154 #define GR_SNAP_TPC     0x08
155 #define GR_SNAP_TNPC    0x10
156 #define GR_SNAP_O7      0x18
157 #define GR_SNAP_I7      0x20
158 #define GR_SNAP_RPC     0x28
159 #define GR_SNAP_THREAD  0x30
160 #define GR_SNAP_PAD1    0x38
161 
162 #endif /* !(__SPARC_PTRACE_H) */
163 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php