linux/arch/mips/include/asm/ptrace.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000 by Ralf Baechle
   7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
   8 */
   9#ifndef _ASM_PTRACE_H
  10#define _ASM_PTRACE_H
  11
  12
  13#include <linux/compiler.h>
  14#include <linux/linkage.h>
  15#include <linux/types.h>
  16#include <asm/isadep.h>
  17#include <uapi/asm/ptrace.h>
  18
  19/*
  20 * This struct defines the way the registers are stored on the stack during a
  21 * system call/exception. As usual the registers k0/k1 aren't being saved.
  22 */
  23struct pt_regs {
  24#ifdef CONFIG_32BIT
  25        /* Pad bytes for argument save space on the stack. */
  26        unsigned long pad0[8];
  27#endif
  28
  29        /* Saved main processor registers. */
  30        unsigned long regs[32];
  31
  32        /* Saved special registers. */
  33        unsigned long cp0_status;
  34        unsigned long hi;
  35        unsigned long lo;
  36#ifdef CONFIG_CPU_HAS_SMARTMIPS
  37        unsigned long acx;
  38#endif
  39        unsigned long cp0_badvaddr;
  40        unsigned long cp0_cause;
  41        unsigned long cp0_epc;
  42#ifdef CONFIG_CPU_CAVIUM_OCTEON
  43        unsigned long long mpl[6];        /* MTM{0-5} */
  44        unsigned long long mtp[6];        /* MTP{0-5} */
  45#endif
  46} __aligned(8);
  47
  48struct task_struct;
  49
  50extern int ptrace_getregs(struct task_struct *child,
  51        struct user_pt_regs __user *data);
  52extern int ptrace_setregs(struct task_struct *child,
  53        struct user_pt_regs __user *data);
  54
  55extern int ptrace_getfpregs(struct task_struct *child, __u32 __user *data);
  56extern int ptrace_setfpregs(struct task_struct *child, __u32 __user *data);
  57
  58extern int ptrace_get_watch_regs(struct task_struct *child,
  59        struct pt_watch_regs __user *addr);
  60extern int ptrace_set_watch_regs(struct task_struct *child,
  61        struct pt_watch_regs __user *addr);
  62
  63/*
  64 * Does the process account for user or for system time?
  65 */
  66#define user_mode(regs) (((regs)->cp0_status & KU_MASK) == KU_USER)
  67
  68static inline int is_syscall_success(struct pt_regs *regs)
  69{
  70        return !regs->regs[7];
  71}
  72
  73static inline long regs_return_value(struct pt_regs *regs)
  74{
  75        if (is_syscall_success(regs))
  76                return regs->regs[2];
  77        else
  78                return -regs->regs[2];
  79}
  80
  81#define instruction_pointer(regs) ((regs)->cp0_epc)
  82#define profile_pc(regs) instruction_pointer(regs)
  83
  84extern asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall);
  85extern asmlinkage void syscall_trace_leave(struct pt_regs *regs);
  86
  87extern void die(const char *, struct pt_regs *) __noreturn;
  88
  89static inline void die_if_kernel(const char *str, struct pt_regs *regs)
  90{
  91        if (unlikely(!user_mode(regs)))
  92                die(str, regs);
  93}
  94
  95#define current_pt_regs()                                               \
  96({                                                                      \
  97        unsigned long sp = (unsigned long)__builtin_frame_address(0);   \
  98        (struct pt_regs *)((sp | (THREAD_SIZE - 1)) + 1 - 32) - 1;      \
  99})
 100
 101/* Helpers for working with the user stack pointer */
 102
 103static inline unsigned long user_stack_pointer(struct pt_regs *regs)
 104{
 105        return regs->regs[29];
 106}
 107
 108static inline void user_stack_pointer_set(struct pt_regs *regs,
 109        unsigned long val)
 110{
 111        regs->regs[29] = val;
 112}
 113
 114#endif /* _ASM_PTRACE_H */
 115