162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * OpenRISC Linux
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Linux architectural port borrowing liberally from similar works of
662306a36Sopenharmony_ci * others.  All original copyrights apply as per the original source
762306a36Sopenharmony_ci * declaration.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * OpenRISC implementation:
1062306a36Sopenharmony_ci * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
1162306a36Sopenharmony_ci * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
1262306a36Sopenharmony_ci * et al.
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci#ifndef __ASM_OPENRISC_PTRACE_H
1562306a36Sopenharmony_ci#define __ASM_OPENRISC_PTRACE_H
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <asm/spr_defs.h>
1962306a36Sopenharmony_ci#include <uapi/asm/ptrace.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/*
2262306a36Sopenharmony_ci * Make kernel PTrace/register structures opaque to userspace... userspace can
2362306a36Sopenharmony_ci * access thread state via the regset mechanism.  This allows us a bit of
2462306a36Sopenharmony_ci * flexibility in how we order the registers on the stack, permitting some
2562306a36Sopenharmony_ci * optimizations like packing call-clobbered registers together so that
2662306a36Sopenharmony_ci * they share a cacheline (not done yet, though... future optimization).
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#ifndef __ASSEMBLY__
3062306a36Sopenharmony_ci/*
3162306a36Sopenharmony_ci * This struct describes how the registers are laid out on the kernel stack
3262306a36Sopenharmony_ci * during a syscall or other kernel entry.
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci * This structure should always be cacheline aligned on the stack.
3562306a36Sopenharmony_ci * FIXME: I don't think that's the case right now.  The alignment is
3662306a36Sopenharmony_ci * taken care of elsewhere... head.S, process.c, etc.
3762306a36Sopenharmony_ci */
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct pt_regs {
4062306a36Sopenharmony_ci	union {
4162306a36Sopenharmony_ci		struct {
4262306a36Sopenharmony_ci			/* Named registers */
4362306a36Sopenharmony_ci			long  sr;	/* Stored in place of r0 */
4462306a36Sopenharmony_ci			long  sp;	/* r1 */
4562306a36Sopenharmony_ci		};
4662306a36Sopenharmony_ci		struct {
4762306a36Sopenharmony_ci			/* Old style */
4862306a36Sopenharmony_ci			long offset[2];
4962306a36Sopenharmony_ci			long gprs[30];
5062306a36Sopenharmony_ci		};
5162306a36Sopenharmony_ci		struct {
5262306a36Sopenharmony_ci			/* New style */
5362306a36Sopenharmony_ci			long gpr[32];
5462306a36Sopenharmony_ci		};
5562306a36Sopenharmony_ci	};
5662306a36Sopenharmony_ci	long  pc;
5762306a36Sopenharmony_ci	/* For restarting system calls:
5862306a36Sopenharmony_ci	 * Set to syscall number for syscall exceptions,
5962306a36Sopenharmony_ci	 * -1 for all other exceptions.
6062306a36Sopenharmony_ci	 */
6162306a36Sopenharmony_ci	long  orig_gpr11;	/* For restarting system calls */
6262306a36Sopenharmony_ci	long fpcsr;		/* Floating point control status register. */
6362306a36Sopenharmony_ci	long dummy2;		/* Cheap alignment fix */
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* TODO: Rename this to REDZONE because that's what it is */
6762306a36Sopenharmony_ci#define STACK_FRAME_OVERHEAD  128  /* size of minimum stack frame */
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define instruction_pointer(regs)	((regs)->pc)
7062306a36Sopenharmony_ci#define user_mode(regs)			(((regs)->sr & SPR_SR_SM) == 0)
7162306a36Sopenharmony_ci#define user_stack_pointer(regs)	((unsigned long)(regs)->sp)
7262306a36Sopenharmony_ci#define profile_pc(regs)		instruction_pointer(regs)
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic inline long regs_return_value(struct pt_regs *regs)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	return regs->gpr[11];
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci/*
8262306a36Sopenharmony_ci * Offsets used by 'ptrace' system call interface.
8362306a36Sopenharmony_ci */
8462306a36Sopenharmony_ci#define PT_SR         0
8562306a36Sopenharmony_ci#define PT_SP         4
8662306a36Sopenharmony_ci#define PT_GPR2       8
8762306a36Sopenharmony_ci#define PT_GPR3       12
8862306a36Sopenharmony_ci#define PT_GPR4       16
8962306a36Sopenharmony_ci#define PT_GPR5       20
9062306a36Sopenharmony_ci#define PT_GPR6       24
9162306a36Sopenharmony_ci#define PT_GPR7       28
9262306a36Sopenharmony_ci#define PT_GPR8       32
9362306a36Sopenharmony_ci#define PT_GPR9       36
9462306a36Sopenharmony_ci#define PT_GPR10      40
9562306a36Sopenharmony_ci#define PT_GPR11      44
9662306a36Sopenharmony_ci#define PT_GPR12      48
9762306a36Sopenharmony_ci#define PT_GPR13      52
9862306a36Sopenharmony_ci#define PT_GPR14      56
9962306a36Sopenharmony_ci#define PT_GPR15      60
10062306a36Sopenharmony_ci#define PT_GPR16      64
10162306a36Sopenharmony_ci#define PT_GPR17      68
10262306a36Sopenharmony_ci#define PT_GPR18      72
10362306a36Sopenharmony_ci#define PT_GPR19      76
10462306a36Sopenharmony_ci#define PT_GPR20      80
10562306a36Sopenharmony_ci#define PT_GPR21      84
10662306a36Sopenharmony_ci#define PT_GPR22      88
10762306a36Sopenharmony_ci#define PT_GPR23      92
10862306a36Sopenharmony_ci#define PT_GPR24      96
10962306a36Sopenharmony_ci#define PT_GPR25      100
11062306a36Sopenharmony_ci#define PT_GPR26      104
11162306a36Sopenharmony_ci#define PT_GPR27      108
11262306a36Sopenharmony_ci#define PT_GPR28      112
11362306a36Sopenharmony_ci#define PT_GPR29      116
11462306a36Sopenharmony_ci#define PT_GPR30      120
11562306a36Sopenharmony_ci#define PT_GPR31      124
11662306a36Sopenharmony_ci#define PT_PC	      128
11762306a36Sopenharmony_ci#define PT_ORIG_GPR11 132
11862306a36Sopenharmony_ci#define PT_FPCSR      136
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci#endif /* __ASM_OPENRISC_PTRACE_H */
121