uboot/arch/mips/include/asm/ptrace.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000 by Ralf Baechle
   3 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0
   6 */
   7#ifndef _ASM_PTRACE_H
   8#define _ASM_PTRACE_H
   9
  10#include <linux/compiler.h>
  11#include <linux/types.h>
  12#include <asm/isadep.h>
  13
  14/*
  15 * This struct defines the way the registers are stored on the stack during a
  16 * system call/exception. As usual the registers k0/k1 aren't being saved.
  17 *
  18 * If you add a register here, also add it to regoffset_table[] in
  19 * arch/mips/kernel/ptrace.c.
  20 */
  21struct pt_regs {
  22#ifdef CONFIG_32BIT
  23        /* Pad bytes for argument save space on the stack. */
  24        unsigned long pad0[8];
  25#endif
  26
  27        /* Saved main processor registers. */
  28        unsigned long regs[32];
  29
  30        /* Saved special registers. */
  31        unsigned long cp0_status;
  32        unsigned long hi;
  33        unsigned long lo;
  34#ifdef CONFIG_CPU_HAS_SMARTMIPS
  35        unsigned long acx;
  36#endif
  37        unsigned long cp0_badvaddr;
  38        unsigned long cp0_cause;
  39        unsigned long cp0_epc;
  40#ifdef CONFIG_CPU_CAVIUM_OCTEON
  41        unsigned long long mpl[6];        /* MTM{0-5} */
  42        unsigned long long mtp[6];        /* MTP{0-5} */
  43#endif
  44        unsigned long __last[0];
  45} __aligned(8);
  46
  47static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
  48{
  49        return regs->regs[31];
  50}
  51
  52/*
  53 * Don't use asm-generic/ptrace.h it defines FP accessors that don't make
  54 * sense on MIPS.  We rather want an error if they get invoked.
  55 */
  56
  57static inline void instruction_pointer_set(struct pt_regs *regs,
  58                                                unsigned long val)
  59{
  60        regs->cp0_epc = val;
  61}
  62
  63/* Query offset/name of register from its name/offset */
  64extern int regs_query_register_offset(const char *name);
  65#define MAX_REG_OFFSET (offsetof(struct pt_regs, __last))
  66
  67/**
  68 * regs_get_register() - get register value from its offset
  69 * @regs:       pt_regs from which register value is gotten.
  70 * @offset:     offset number of the register.
  71 *
  72 * regs_get_register returns the value of a register. The @offset is the
  73 * offset of the register in struct pt_regs address which specified by @regs.
  74 * If @offset is bigger than MAX_REG_OFFSET, this returns 0.
  75 */
  76static inline unsigned long regs_get_register(struct pt_regs *regs,
  77                                                unsigned int offset)
  78{
  79        if (unlikely(offset > MAX_REG_OFFSET))
  80                return 0;
  81
  82        return *(unsigned long *)((unsigned long)regs + offset);
  83}
  84
  85/*
  86 * Does the process account for user or for system time?
  87 */
  88#define user_mode(regs) (((regs)->cp0_status & KU_MASK) == KU_USER)
  89
  90#define instruction_pointer(regs) ((regs)->cp0_epc)
  91#define profile_pc(regs) instruction_pointer(regs)
  92
  93/* Helpers for working with the user stack pointer */
  94
  95static inline unsigned long user_stack_pointer(struct pt_regs *regs)
  96{
  97        return regs->regs[29];
  98}
  99
 100static inline void user_stack_pointer_set(struct pt_regs *regs,
 101                                                unsigned long val)
 102{
 103        regs->regs[29] = val;
 104}
 105
 106#endif /* _ASM_PTRACE_H */
 107