linux/arch/sparc/include/asm/ptrace.h
<<
>>
Prefs
   1#ifndef __SPARC_PTRACE_H
   2#define __SPARC_PTRACE_H
   3
   4#if defined(__sparc__) && defined(__arch64__)
   5/* 64 bit sparc */
   6#include <asm/pstate.h>
   7
   8/* This struct defines the way the registers are stored on the
   9 * stack during a system call and basically all traps.
  10 */
  11
  12/* This magic value must have the low 9 bits clear,
  13 * as that is where we encode the %tt value, see below.
  14 */
  15#define PT_REGS_MAGIC 0x57ac6c00
  16
  17#ifndef __ASSEMBLY__
  18
  19#include <linux/types.h>
  20
  21struct pt_regs {
  22        unsigned long u_regs[16]; /* globals and ins */
  23        unsigned long tstate;
  24        unsigned long tpc;
  25        unsigned long tnpc;
  26        unsigned int y;
  27
  28        /* We encode a magic number, PT_REGS_MAGIC, along
  29         * with the %tt (trap type) register value at trap
  30         * entry time.  The magic number allows us to identify
  31         * accurately a trap stack frame in the stack
  32         * unwinder, and the %tt value allows us to test
  33         * things like "in a system call" etc. for an arbitray
  34         * process.
  35         *
  36         * The PT_REGS_MAGIC is chosen such that it can be
  37         * loaded completely using just a sethi instruction.
  38         */
  39        unsigned int magic;
  40};
  41
  42struct pt_regs32 {
  43        unsigned int psr;
  44        unsigned int pc;
  45        unsigned int npc;
  46        unsigned int y;
  47        unsigned int u_regs[16]; /* globals and ins */
  48};
  49
  50/* A V9 register window */
  51struct reg_window {
  52        unsigned long locals[8];
  53        unsigned long ins[8];
  54};
  55
  56/* A 32-bit register window. */
  57struct reg_window32 {
  58        unsigned int locals[8];
  59        unsigned int ins[8];
  60};
  61
  62/* A V9 Sparc stack frame */
  63struct sparc_stackf {
  64        unsigned long locals[8];
  65        unsigned long ins[6];
  66        struct sparc_stackf *fp;
  67        unsigned long callers_pc;
  68        char *structptr;
  69        unsigned long xargs[6];
  70        unsigned long xxargs[1];
  71};
  72
  73/* A 32-bit Sparc stack frame */
  74struct sparc_stackf32 {
  75        unsigned int locals[8];
  76        unsigned int ins[6];
  77        unsigned int fp;
  78        unsigned int callers_pc;
  79        unsigned int structptr;
  80        unsigned int xargs[6];
  81        unsigned int xxargs[1];
  82};
  83
  84struct sparc_trapf {
  85        unsigned long locals[8];
  86        unsigned long ins[8];
  87        unsigned long _unused;
  88        struct pt_regs *regs;
  89};
  90#endif /* (!__ASSEMBLY__) */
  91#else
  92/* 32 bit sparc */
  93
  94#include <asm/psr.h>
  95
  96/* This struct defines the way the registers are stored on the
  97 * stack during a system call and basically all traps.
  98 */
  99#ifndef __ASSEMBLY__
 100
 101#include <linux/types.h>
 102
 103struct pt_regs {
 104        unsigned long psr;
 105        unsigned long pc;
 106        unsigned long npc;
 107        unsigned long y;
 108        unsigned long u_regs[16]; /* globals and ins */
 109};
 110
 111/* A 32-bit register window. */
 112struct reg_window32 {
 113        unsigned long locals[8];
 114        unsigned long ins[8];
 115};
 116
 117/* A Sparc stack frame */
 118struct sparc_stackf {
 119        unsigned long locals[8];
 120        unsigned long ins[6];
 121        struct sparc_stackf *fp;
 122        unsigned long callers_pc;
 123        char *structptr;
 124        unsigned long xargs[6];
 125        unsigned long xxargs[1];
 126};
 127#endif /* (!__ASSEMBLY__) */
 128
 129#endif /* (defined(__sparc__) && defined(__arch64__))*/
 130
 131#ifndef __ASSEMBLY__
 132
 133#define TRACEREG_SZ     sizeof(struct pt_regs)
 134#define STACKFRAME_SZ   sizeof(struct sparc_stackf)
 135
 136#define TRACEREG32_SZ   sizeof(struct pt_regs32)
 137#define STACKFRAME32_SZ sizeof(struct sparc_stackf32)
 138
 139#endif /* (!__ASSEMBLY__) */
 140
 141#define UREG_G0        0
 142#define UREG_G1        1
 143#define UREG_G2        2
 144#define UREG_G3        3
 145#define UREG_G4        4
 146#define UREG_G5        5
 147#define UREG_G6        6
 148#define UREG_G7        7
 149#define UREG_I0        8
 150#define UREG_I1        9
 151#define UREG_I2        10
 152#define UREG_I3        11
 153#define UREG_I4        12
 154#define UREG_I5        13
 155#define UREG_I6        14
 156#define UREG_I7        15
 157#define UREG_FP        UREG_I6
 158#define UREG_RETPC     UREG_I7
 159
 160#if defined(__sparc__) && defined(__arch64__)
 161/* 64 bit sparc */
 162
 163#ifndef __ASSEMBLY__
 164
 165#ifdef __KERNEL__
 166
 167#include <linux/threads.h>
 168#include <asm/switch_to.h>
 169
 170static inline int pt_regs_trap_type(struct pt_regs *regs)
 171{
 172        return regs->magic & 0x1ff;
 173}
 174
 175static inline bool pt_regs_is_syscall(struct pt_regs *regs)
 176{
 177        return (regs->tstate & TSTATE_SYSCALL);
 178}
 179
 180static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
 181{
 182        return (regs->tstate &= ~TSTATE_SYSCALL);
 183}
 184
 185#define arch_ptrace_stop_needed(exit_code, info) \
 186({      flush_user_windows(); \
 187        get_thread_wsaved() != 0; \
 188})
 189
 190#define arch_ptrace_stop(exit_code, info) \
 191        synchronize_user_stack()
 192
 193struct global_reg_snapshot {
 194        unsigned long           tstate;
 195        unsigned long           tpc;
 196        unsigned long           tnpc;
 197        unsigned long           o7;
 198        unsigned long           i7;
 199        unsigned long           rpc;
 200        struct thread_info      *thread;
 201        unsigned long           pad1;
 202};
 203extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
 204
 205#define force_successful_syscall_return()           \
 206do {    current_thread_info()->syscall_noerror = 1; \
 207} while (0)
 208#define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
 209#define instruction_pointer(regs) ((regs)->tpc)
 210#define instruction_pointer_set(regs, val) ((regs)->tpc = (val))
 211#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
 212static inline int is_syscall_success(struct pt_regs *regs)
 213{
 214        return !(regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY));
 215}
 216
 217static inline long regs_return_value(struct pt_regs *regs)
 218{
 219        return regs->u_regs[UREG_I0];
 220}
 221#ifdef CONFIG_SMP
 222extern unsigned long profile_pc(struct pt_regs *);
 223#else
 224#define profile_pc(regs) instruction_pointer(regs)
 225#endif
 226#endif /* (__KERNEL__) */
 227
 228#else /* __ASSEMBLY__ */
 229/* For assembly code. */
 230#define TRACEREG_SZ             0xa0
 231#define STACKFRAME_SZ           0xc0
 232
 233#define TRACEREG32_SZ           0x50
 234#define STACKFRAME32_SZ         0x60
 235#endif /* __ASSEMBLY__ */
 236
 237#else /* (defined(__sparc__) && defined(__arch64__)) */
 238
 239/* 32 bit sparc */
 240
 241#ifndef __ASSEMBLY__
 242
 243#ifdef __KERNEL__
 244#include <asm/switch_to.h>
 245
 246static inline bool pt_regs_is_syscall(struct pt_regs *regs)
 247{
 248        return (regs->psr & PSR_SYSCALL);
 249}
 250
 251static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
 252{
 253        return (regs->psr &= ~PSR_SYSCALL);
 254}
 255
 256#define arch_ptrace_stop_needed(exit_code, info) \
 257({      flush_user_windows(); \
 258        current_thread_info()->w_saved != 0;    \
 259})
 260
 261#define arch_ptrace_stop(exit_code, info) \
 262        synchronize_user_stack()
 263
 264#define user_mode(regs) (!((regs)->psr & PSR_PS))
 265#define instruction_pointer(regs) ((regs)->pc)
 266#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
 267unsigned long profile_pc(struct pt_regs *);
 268#endif /* (__KERNEL__) */
 269
 270#else /* (!__ASSEMBLY__) */
 271/* For assembly code. */
 272#define TRACEREG_SZ       0x50
 273#define STACKFRAME_SZ     0x60
 274#endif /* (!__ASSEMBLY__) */
 275
 276#endif /* (defined(__sparc__) && defined(__arch64__)) */
 277
 278#ifdef __KERNEL__
 279#define STACK_BIAS              2047
 280#endif
 281
 282/* These are for pt_regs. */
 283#define PT_V9_G0     0x00
 284#define PT_V9_G1     0x08
 285#define PT_V9_G2     0x10
 286#define PT_V9_G3     0x18
 287#define PT_V9_G4     0x20
 288#define PT_V9_G5     0x28
 289#define PT_V9_G6     0x30
 290#define PT_V9_G7     0x38
 291#define PT_V9_I0     0x40
 292#define PT_V9_I1     0x48
 293#define PT_V9_I2     0x50
 294#define PT_V9_I3     0x58
 295#define PT_V9_I4     0x60
 296#define PT_V9_I5     0x68
 297#define PT_V9_I6     0x70
 298#define PT_V9_FP     PT_V9_I6
 299#define PT_V9_I7     0x78
 300#define PT_V9_TSTATE 0x80
 301#define PT_V9_TPC    0x88
 302#define PT_V9_TNPC   0x90
 303#define PT_V9_Y      0x98
 304#define PT_V9_MAGIC  0x9c
 305#define PT_TSTATE       PT_V9_TSTATE
 306#define PT_TPC          PT_V9_TPC
 307#define PT_TNPC         PT_V9_TNPC
 308
 309/* These for pt_regs32. */
 310#define PT_PSR    0x0
 311#define PT_PC     0x4
 312#define PT_NPC    0x8
 313#define PT_Y      0xc
 314#define PT_G0     0x10
 315#define PT_WIM    PT_G0
 316#define PT_G1     0x14
 317#define PT_G2     0x18
 318#define PT_G3     0x1c
 319#define PT_G4     0x20
 320#define PT_G5     0x24
 321#define PT_G6     0x28
 322#define PT_G7     0x2c
 323#define PT_I0     0x30
 324#define PT_I1     0x34
 325#define PT_I2     0x38
 326#define PT_I3     0x3c
 327#define PT_I4     0x40
 328#define PT_I5     0x44
 329#define PT_I6     0x48
 330#define PT_FP     PT_I6
 331#define PT_I7     0x4c
 332
 333/* Reg_window offsets */
 334#define RW_V9_L0     0x00
 335#define RW_V9_L1     0x08
 336#define RW_V9_L2     0x10
 337#define RW_V9_L3     0x18
 338#define RW_V9_L4     0x20
 339#define RW_V9_L5     0x28
 340#define RW_V9_L6     0x30
 341#define RW_V9_L7     0x38
 342#define RW_V9_I0     0x40
 343#define RW_V9_I1     0x48
 344#define RW_V9_I2     0x50
 345#define RW_V9_I3     0x58
 346#define RW_V9_I4     0x60
 347#define RW_V9_I5     0x68
 348#define RW_V9_I6     0x70
 349#define RW_V9_I7     0x78
 350
 351#define RW_L0     0x00
 352#define RW_L1     0x04
 353#define RW_L2     0x08
 354#define RW_L3     0x0c
 355#define RW_L4     0x10
 356#define RW_L5     0x14
 357#define RW_L6     0x18
 358#define RW_L7     0x1c
 359#define RW_I0     0x20
 360#define RW_I1     0x24
 361#define RW_I2     0x28
 362#define RW_I3     0x2c
 363#define RW_I4     0x30
 364#define RW_I5     0x34
 365#define RW_I6     0x38
 366#define RW_I7     0x3c
 367
 368/* Stack_frame offsets */
 369#define SF_V9_L0     0x00
 370#define SF_V9_L1     0x08
 371#define SF_V9_L2     0x10
 372#define SF_V9_L3     0x18
 373#define SF_V9_L4     0x20
 374#define SF_V9_L5     0x28
 375#define SF_V9_L6     0x30
 376#define SF_V9_L7     0x38
 377#define SF_V9_I0     0x40
 378#define SF_V9_I1     0x48
 379#define SF_V9_I2     0x50
 380#define SF_V9_I3     0x58
 381#define SF_V9_I4     0x60
 382#define SF_V9_I5     0x68
 383#define SF_V9_FP     0x70
 384#define SF_V9_PC     0x78
 385#define SF_V9_RETP   0x80
 386#define SF_V9_XARG0  0x88
 387#define SF_V9_XARG1  0x90
 388#define SF_V9_XARG2  0x98
 389#define SF_V9_XARG3  0xa0
 390#define SF_V9_XARG4  0xa8
 391#define SF_V9_XARG5  0xb0
 392#define SF_V9_XXARG  0xb8
 393
 394#define SF_L0     0x00
 395#define SF_L1     0x04
 396#define SF_L2     0x08
 397#define SF_L3     0x0c
 398#define SF_L4     0x10
 399#define SF_L5     0x14
 400#define SF_L6     0x18
 401#define SF_L7     0x1c
 402#define SF_I0     0x20
 403#define SF_I1     0x24
 404#define SF_I2     0x28
 405#define SF_I3     0x2c
 406#define SF_I4     0x30
 407#define SF_I5     0x34
 408#define SF_FP     0x38
 409#define SF_PC     0x3c
 410#define SF_RETP   0x40
 411#define SF_XARG0  0x44
 412#define SF_XARG1  0x48
 413#define SF_XARG2  0x4c
 414#define SF_XARG3  0x50
 415#define SF_XARG4  0x54
 416#define SF_XARG5  0x58
 417#define SF_XXARG  0x5c
 418
 419#ifdef __KERNEL__
 420
 421/* global_reg_snapshot offsets */
 422#define GR_SNAP_TSTATE  0x00
 423#define GR_SNAP_TPC     0x08
 424#define GR_SNAP_TNPC    0x10
 425#define GR_SNAP_O7      0x18
 426#define GR_SNAP_I7      0x20
 427#define GR_SNAP_RPC     0x28
 428#define GR_SNAP_THREAD  0x30
 429#define GR_SNAP_PAD1    0x38
 430
 431#endif  /*  __KERNEL__  */
 432
 433/* Stuff for the ptrace system call */
 434#define PTRACE_SPARC_DETACH       11
 435#define PTRACE_GETREGS            12
 436#define PTRACE_SETREGS            13
 437#define PTRACE_GETFPREGS          14
 438#define PTRACE_SETFPREGS          15
 439#define PTRACE_READDATA           16
 440#define PTRACE_WRITEDATA          17
 441#define PTRACE_READTEXT           18
 442#define PTRACE_WRITETEXT          19
 443#define PTRACE_GETFPAREGS         20
 444#define PTRACE_SETFPAREGS         21
 445
 446/* There are for debugging 64-bit processes, either from a 32 or 64 bit
 447 * parent.  Thus their complements are for debugging 32-bit processes only.
 448 */
 449
 450#define PTRACE_GETREGS64          22
 451#define PTRACE_SETREGS64          23
 452/* PTRACE_SYSCALL is 24 */
 453#define PTRACE_GETFPREGS64        25
 454#define PTRACE_SETFPREGS64        26
 455
 456#endif /* !(__SPARC_PTRACE_H) */
 457