Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ptrace.h
Go to the documentation of this file.
1 #ifndef __SPARC_PTRACE_H
2 #define __SPARC_PTRACE_H
3 
4 #include <uapi/asm/ptrace.h>
5 
6 #if defined(__sparc__) && defined(__arch64__)
7 #ifndef __ASSEMBLY__
8 
9 #include <linux/threads.h>
10 #include <asm/switch_to.h>
11 
12 static inline int pt_regs_trap_type(struct pt_regs *regs)
13 {
14  return regs->magic & 0x1ff;
15 }
16 
17 static inline bool pt_regs_is_syscall(struct pt_regs *regs)
18 {
19  return (regs->tstate & TSTATE_SYSCALL);
20 }
21 
22 static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
23 {
24  return (regs->tstate &= ~TSTATE_SYSCALL);
25 }
26 
27 #define arch_ptrace_stop_needed(exit_code, info) \
28 ({ flush_user_windows(); \
29  get_thread_wsaved() != 0; \
30 })
31 
32 #define arch_ptrace_stop(exit_code, info) \
33  synchronize_user_stack()
34 
35 struct global_reg_snapshot {
36  unsigned long tstate;
37  unsigned long tpc;
38  unsigned long tnpc;
39  unsigned long o7;
40  unsigned long i7;
41  unsigned long rpc;
42  struct thread_info *thread;
43  unsigned long pad1;
44 };
45 
46 struct global_pmu_snapshot {
47  unsigned long pcr[4];
48  unsigned long pic[4];
49 };
50 
51 union global_cpu_snapshot {
52  struct global_reg_snapshot reg;
53  struct global_pmu_snapshot pmu;
54 };
55 
57 
58 #define force_successful_syscall_return() \
59 do { current_thread_info()->syscall_noerror = 1; \
60 } while (0)
61 #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
62 #define instruction_pointer(regs) ((regs)->tpc)
63 #define instruction_pointer_set(regs, val) ((regs)->tpc = (val))
64 #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
65 static inline int is_syscall_success(struct pt_regs *regs)
66 {
67  return !(regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY));
68 }
69 
70 static inline long regs_return_value(struct pt_regs *regs)
71 {
72  return regs->u_regs[UREG_I0];
73 }
74 #ifdef CONFIG_SMP
75 extern unsigned long profile_pc(struct pt_regs *);
76 #else
77 #define profile_pc(regs) instruction_pointer(regs)
78 #endif
79 #else /* __ASSEMBLY__ */
80 #endif /* __ASSEMBLY__ */
81 #else /* (defined(__sparc__) && defined(__arch64__)) */
82 #ifndef __ASSEMBLY__
83 #include <asm/switch_to.h>
84 
85 static inline bool pt_regs_is_syscall(struct pt_regs *regs)
86 {
87  return (regs->psr & PSR_SYSCALL);
88 }
89 
90 static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
91 {
92  return (regs->psr &= ~PSR_SYSCALL);
93 }
94 
95 #define arch_ptrace_stop_needed(exit_code, info) \
96 ({ flush_user_windows(); \
97  current_thread_info()->w_saved != 0; \
98 })
99 
100 #define arch_ptrace_stop(exit_code, info) \
101  synchronize_user_stack()
102 
103 #define user_mode(regs) (!((regs)->psr & PSR_PS))
104 #define instruction_pointer(regs) ((regs)->pc)
105 #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
106 unsigned long profile_pc(struct pt_regs *);
107 #else /* (!__ASSEMBLY__) */
108 #endif /* (!__ASSEMBLY__) */
109 #endif /* (defined(__sparc__) && defined(__arch64__)) */
110 #define STACK_BIAS 2047
111 
112 /* global_reg_snapshot offsets */
113 #define GR_SNAP_TSTATE 0x00
114 #define GR_SNAP_TPC 0x08
115 #define GR_SNAP_TNPC 0x10
116 #define GR_SNAP_O7 0x18
117 #define GR_SNAP_I7 0x20
118 #define GR_SNAP_RPC 0x28
119 #define GR_SNAP_THREAD 0x30
120 #define GR_SNAP_PAD1 0x38
121 
122 #endif /* !(__SPARC_PTRACE_H) */