blob: da051f6e10b85377d604161ce0fbe25f4336d192 [file] [log] [blame]
wdenk6069ff22003-02-28 00:49:47 +00001/*
Shinya Kuribayashi282223a2008-03-25 11:43:17 +09002 * Copyright (C) 1994, 95, 96, 97, 98, 99, 2000 by Ralf Baechle
3 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +01004 *
5 * SPDX-License-Identifier: GPL-2.0
wdenk6069ff22003-02-28 00:49:47 +00006 */
7#ifndef _ASM_PTRACE_H
8#define _ASM_PTRACE_H
9
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010010#include <linux/compiler.h>
11#include <linux/types.h>
12#include <asm/isadep.h>
wdenk6069ff22003-02-28 00:49:47 +000013
wdenk6069ff22003-02-28 00:49:47 +000014/*
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.
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010017 *
18 * If you add a register here, also add it to regoffset_table[] in
19 * arch/mips/kernel/ptrace.c.
wdenk6069ff22003-02-28 00:49:47 +000020 */
21struct pt_regs {
Shinya Kuribayashi282223a2008-03-25 11:43:17 +090022#ifdef CONFIG_32BIT
wdenk6069ff22003-02-28 00:49:47 +000023 /* Pad bytes for argument save space on the stack. */
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010024 unsigned long pad0[8];
Shinya Kuribayashi282223a2008-03-25 11:43:17 +090025#endif
wdenk6069ff22003-02-28 00:49:47 +000026
27 /* Saved main processor registers. */
28 unsigned long regs[32];
29
Shinya Kuribayashi282223a2008-03-25 11:43:17 +090030 /* Saved special registers. */
wdenk6069ff22003-02-28 00:49:47 +000031 unsigned long cp0_status;
Shinya Kuribayashi282223a2008-03-25 11:43:17 +090032 unsigned long hi;
33 unsigned long lo;
34#ifdef CONFIG_CPU_HAS_SMARTMIPS
35 unsigned long acx;
36#endif
37 unsigned long cp0_badvaddr;
wdenk6069ff22003-02-28 00:49:47 +000038 unsigned long cp0_cause;
Shinya Kuribayashi282223a2008-03-25 11:43:17 +090039 unsigned long cp0_epc;
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010040#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);
wdenk6069ff22003-02-28 00:49:47 +000046
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010047static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
48{
49 return regs->regs[31];
50}
wdenk6069ff22003-02-28 00:49:47 +000051
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010052/*
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 */
wdenk6069ff22003-02-28 00:49:47 +000056
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010057static inline void instruction_pointer_set(struct pt_regs *regs,
58 unsigned long val)
59{
60 regs->cp0_epc = val;
61}
wdenk6069ff22003-02-28 00:49:47 +000062
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010063/* 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))
wdenk6069ff22003-02-28 00:49:47 +000066
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010067/**
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;
wdenk6069ff22003-02-28 00:49:47 +000081
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010082 return *(unsigned long *)((unsigned long)regs + offset);
83}
Shinya Kuribayashi282223a2008-03-25 11:43:17 +090084
wdenk6069ff22003-02-28 00:49:47 +000085/*
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)
Shinya Kuribayashi282223a2008-03-25 11:43:17 +090091#define profile_pc(regs) instruction_pointer(regs)
wdenk6069ff22003-02-28 00:49:47 +000092
Daniel Schwierzecka3ab2ae2016-01-12 21:48:26 +010093/* 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}
wdenk6069ff22003-02-28 00:49:47 +0000105
106#endif /* _ASM_PTRACE_H */