Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/*
  3 * OpenRISC Linux
  4 *
  5 * Linux architectural port borrowing liberally from similar works of
  6 * others.  All original copyrights apply as per the original source
  7 * declaration.
  8 *
  9 * OpenRISC implementation:
 10 * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
 11 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
 12 * et al.
 13 */
 14#ifndef __ASM_OPENRISC_PTRACE_H
 15#define __ASM_OPENRISC_PTRACE_H
 16
 17
 18#include <asm/spr_defs.h>
 19#include <uapi/asm/ptrace.h>
 20
 21/*
 22 * Make kernel PTrace/register structures opaque to userspace... userspace can
 23 * access thread state via the regset mechanism.  This allows us a bit of
 24 * flexibility in how we order the registers on the stack, permitting some
 25 * optimizations like packing call-clobbered registers together so that
 26 * they share a cacheline (not done yet, though... future optimization).
 27 */
 28
 29#ifndef __ASSEMBLY__
 30/*
 31 * This struct describes how the registers are laid out on the kernel stack
 32 * during a syscall or other kernel entry.
 33 *
 34 * This structure should always be cacheline aligned on the stack.
 35 * FIXME: I don't think that's the case right now.  The alignment is
 36 * taken care of elsewhere... head.S, process.c, etc.
 37 */
 38
 39struct pt_regs {
 40	union {
 41		struct {
 42			/* Named registers */
 43			long  sr;	/* Stored in place of r0 */
 44			long  sp;	/* r1 */
 45		};
 46		struct {
 47			/* Old style */
 48			long offset[2];
 49			long gprs[30];
 50		};
 51		struct {
 52			/* New style */
 53			long gpr[32];
 54		};
 55	};
 56	long  pc;
 57	/* For restarting system calls:
 58	 * Set to syscall number for syscall exceptions,
 59	 * -1 for all other exceptions.
 60	 */
 61	long  orig_gpr11;	/* For restarting system calls */
 62	long dummy;		/* Cheap alignment fix */
 63	long dummy2;		/* Cheap alignment fix */
 64};
 65
 66/* TODO: Rename this to REDZONE because that's what it is */
 67#define STACK_FRAME_OVERHEAD  128  /* size of minimum stack frame */
 68
 69#define instruction_pointer(regs)	((regs)->pc)
 70#define user_mode(regs)			(((regs)->sr & SPR_SR_SM) == 0)
 71#define user_stack_pointer(regs)	((unsigned long)(regs)->sp)
 72#define profile_pc(regs)		instruction_pointer(regs)
 73
 74static inline long regs_return_value(struct pt_regs *regs)
 75{
 76	return regs->gpr[11];
 77}
 78
 79#endif /* __ASSEMBLY__ */
 80
 81/*
 82 * Offsets used by 'ptrace' system call interface.
 83 */
 84#define PT_SR         0
 85#define PT_SP         4
 86#define PT_GPR2       8
 87#define PT_GPR3       12
 88#define PT_GPR4       16
 89#define PT_GPR5       20
 90#define PT_GPR6       24
 91#define PT_GPR7       28
 92#define PT_GPR8       32
 93#define PT_GPR9       36
 94#define PT_GPR10      40
 95#define PT_GPR11      44
 96#define PT_GPR12      48
 97#define PT_GPR13      52
 98#define PT_GPR14      56
 99#define PT_GPR15      60
100#define PT_GPR16      64
101#define PT_GPR17      68
102#define PT_GPR18      72
103#define PT_GPR19      76
104#define PT_GPR20      80
105#define PT_GPR21      84
106#define PT_GPR22      88
107#define PT_GPR23      92
108#define PT_GPR24      96
109#define PT_GPR25      100
110#define PT_GPR26      104
111#define PT_GPR27      108
112#define PT_GPR28      112
113#define PT_GPR29      116
114#define PT_GPR30      120
115#define PT_GPR31      124
116#define PT_PC	      128
117#define PT_ORIG_GPR11 132
118#define PT_SYSCALLNO  136
119
120#endif /* __ASM_OPENRISC_PTRACE_H */