16020faf6SRick Chen /*
26020faf6SRick Chen * Copyright (c) 2017 Microsemi Corporation.
36020faf6SRick Chen * Copyright (c) 2017 Padmarao Begari <Padmarao.Begari@microsemi.com>
46020faf6SRick Chen *
56020faf6SRick Chen * This program is free software; you can redistribute it and/or modify
66020faf6SRick Chen * it under the terms of the GNU General Public License version 2 as
76020faf6SRick Chen * published by the Free Software Foundation.
86020faf6SRick Chen */
96020faf6SRick Chen #ifndef __ASM_RISCV_PTRACE_H
106020faf6SRick Chen #define __ASM_RISCV_PTRACE_H
116020faf6SRick Chen
126020faf6SRick Chen struct pt_regs {
136020faf6SRick Chen unsigned long sepc;
146020faf6SRick Chen unsigned long ra;
156020faf6SRick Chen unsigned long sp;
166020faf6SRick Chen unsigned long gp;
176020faf6SRick Chen unsigned long tp;
186020faf6SRick Chen unsigned long t0;
196020faf6SRick Chen unsigned long t1;
206020faf6SRick Chen unsigned long t2;
216020faf6SRick Chen unsigned long s0;
226020faf6SRick Chen unsigned long s1;
236020faf6SRick Chen unsigned long a0;
246020faf6SRick Chen unsigned long a1;
256020faf6SRick Chen unsigned long a2;
266020faf6SRick Chen unsigned long a3;
276020faf6SRick Chen unsigned long a4;
286020faf6SRick Chen unsigned long a5;
296020faf6SRick Chen unsigned long a6;
306020faf6SRick Chen unsigned long a7;
316020faf6SRick Chen unsigned long s2;
326020faf6SRick Chen unsigned long s3;
336020faf6SRick Chen unsigned long s4;
346020faf6SRick Chen unsigned long s5;
356020faf6SRick Chen unsigned long s6;
366020faf6SRick Chen unsigned long s7;
376020faf6SRick Chen unsigned long s8;
386020faf6SRick Chen unsigned long s9;
396020faf6SRick Chen unsigned long s10;
406020faf6SRick Chen unsigned long s11;
416020faf6SRick Chen unsigned long t3;
426020faf6SRick Chen unsigned long t4;
436020faf6SRick Chen unsigned long t5;
446020faf6SRick Chen unsigned long t6;
456020faf6SRick Chen /* Supervisor CSRs */
466020faf6SRick Chen unsigned long sstatus;
476020faf6SRick Chen unsigned long sbadaddr;
486020faf6SRick Chen unsigned long scause;
496020faf6SRick Chen };
506020faf6SRick Chen
516020faf6SRick Chen #ifdef CONFIG_64BIT
526020faf6SRick Chen #define REG_FMT "%016lx"
536020faf6SRick Chen #else
546020faf6SRick Chen #define REG_FMT "%08lx"
556020faf6SRick Chen #endif
566020faf6SRick Chen
576020faf6SRick Chen #define user_mode(regs) (((regs)->sstatus & SR_PS) == 0)
586020faf6SRick Chen
596020faf6SRick Chen /* Helpers for working with the instruction pointer */
606020faf6SRick Chen #define GET_IP(regs) ((regs)->sepc)
616020faf6SRick Chen #define SET_IP(regs, val) (GET_IP(regs) = (val))
626020faf6SRick Chen
instruction_pointer(struct pt_regs * regs)636020faf6SRick Chen static inline unsigned long instruction_pointer(struct pt_regs *regs)
646020faf6SRick Chen {
656020faf6SRick Chen return GET_IP(regs);
666020faf6SRick Chen }
676020faf6SRick Chen
instruction_pointer_set(struct pt_regs * regs,ulong val)68*45fc9375SRick Chen static inline void instruction_pointer_set(struct pt_regs *regs, ulong val)
696020faf6SRick Chen {
706020faf6SRick Chen SET_IP(regs, val);
716020faf6SRick Chen }
726020faf6SRick Chen
736020faf6SRick Chen #define profile_pc(regs) instruction_pointer(regs)
746020faf6SRick Chen
756020faf6SRick Chen /* Helpers for working with the user stack pointer */
766020faf6SRick Chen #define GET_USP(regs) ((regs)->sp)
776020faf6SRick Chen #define SET_USP(regs, val) (GET_USP(regs) = (val))
786020faf6SRick Chen
user_stack_pointer(struct pt_regs * regs)796020faf6SRick Chen static inline unsigned long user_stack_pointer(struct pt_regs *regs)
806020faf6SRick Chen {
816020faf6SRick Chen return GET_USP(regs);
826020faf6SRick Chen }
836020faf6SRick Chen
user_stack_pointer_set(struct pt_regs * regs,ulong val)84*45fc9375SRick Chen static inline void user_stack_pointer_set(struct pt_regs *regs, ulong val)
856020faf6SRick Chen {
866020faf6SRick Chen SET_USP(regs, val);
876020faf6SRick Chen }
886020faf6SRick Chen
896020faf6SRick Chen /* Helpers for working with the frame pointer */
906020faf6SRick Chen #define GET_FP(regs) ((regs)->s0)
916020faf6SRick Chen #define SET_FP(regs, val) (GET_FP(regs) = (val))
926020faf6SRick Chen
frame_pointer(struct pt_regs * regs)936020faf6SRick Chen static inline unsigned long frame_pointer(struct pt_regs *regs)
946020faf6SRick Chen {
956020faf6SRick Chen return GET_FP(regs);
966020faf6SRick Chen }
976020faf6SRick Chen
frame_pointer_set(struct pt_regs * regs,ulong val)98*45fc9375SRick Chen static inline void frame_pointer_set(struct pt_regs *regs, ulong val)
996020faf6SRick Chen {
1006020faf6SRick Chen SET_FP(regs, val);
1016020faf6SRick Chen }
1026020faf6SRick Chen
1036020faf6SRick Chen #endif /* __ASM_RISCV_PTRACE_H */
104