sparc64: Add global PMU register dumping via sysrq.
[firefly-linux-kernel-4.4.55.git] / arch / sparc / include / asm / ptrace.h
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
56 extern union global_cpu_snapshot global_cpu_snapshot[NR_CPUS];
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) */