1/* 2 * Copyright (c) 2017 Microsemi Corporation. 3 * Copyright (c) 2017 Padmarao Begari <Padmarao.Begari@microsemi.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 */ 9#ifndef __ASM_RISCV_PTRACE_H 10#define __ASM_RISCV_PTRACE_H 11 12struct pt_regs { 13 unsigned long sepc; 14 unsigned long ra; 15 unsigned long sp; 16 unsigned long gp; 17 unsigned long tp; 18 unsigned long t0; 19 unsigned long t1; 20 unsigned long t2; 21 unsigned long s0; 22 unsigned long s1; 23 unsigned long a0; 24 unsigned long a1; 25 unsigned long a2; 26 unsigned long a3; 27 unsigned long a4; 28 unsigned long a5; 29 unsigned long a6; 30 unsigned long a7; 31 unsigned long s2; 32 unsigned long s3; 33 unsigned long s4; 34 unsigned long s5; 35 unsigned long s6; 36 unsigned long s7; 37 unsigned long s8; 38 unsigned long s9; 39 unsigned long s10; 40 unsigned long s11; 41 unsigned long t3; 42 unsigned long t4; 43 unsigned long t5; 44 unsigned long t6; 45 /* Supervisor CSRs */ 46 unsigned long sstatus; 47 unsigned long sbadaddr; 48 unsigned long scause; 49}; 50 51#ifdef CONFIG_64BIT 52#define REG_FMT "%016lx" 53#else 54#define REG_FMT "%08lx" 55#endif 56 57#define user_mode(regs) (((regs)->sstatus & SR_PS) == 0) 58 59/* Helpers for working with the instruction pointer */ 60#define GET_IP(regs) ((regs)->sepc) 61#define SET_IP(regs, val) (GET_IP(regs) = (val)) 62 63static inline unsigned long instruction_pointer(struct pt_regs *regs) 64{ 65 return GET_IP(regs); 66} 67 68static inline void instruction_pointer_set(struct pt_regs *regs, ulong val) 69{ 70 SET_IP(regs, val); 71} 72 73#define profile_pc(regs) instruction_pointer(regs) 74 75/* Helpers for working with the user stack pointer */ 76#define GET_USP(regs) ((regs)->sp) 77#define SET_USP(regs, val) (GET_USP(regs) = (val)) 78 79static inline unsigned long user_stack_pointer(struct pt_regs *regs) 80{ 81 return GET_USP(regs); 82} 83 84static inline void user_stack_pointer_set(struct pt_regs *regs, ulong val) 85{ 86 SET_USP(regs, val); 87} 88 89/* Helpers for working with the frame pointer */ 90#define GET_FP(regs) ((regs)->s0) 91#define SET_FP(regs, val) (GET_FP(regs) = (val)) 92 93static inline unsigned long frame_pointer(struct pt_regs *regs) 94{ 95 return GET_FP(regs); 96} 97 98static inline void frame_pointer_set(struct pt_regs *regs, ulong val) 99{ 100 SET_FP(regs, val); 101} 102 103#endif /* __ASM_RISCV_PTRACE_H */ 104