diff options
Diffstat (limited to 'arch/arm64/include/asm/ptrace.h')
-rw-r--r-- | arch/arm64/include/asm/ptrace.h | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h index 61dcc3fdbcd..bf326e33ae5 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -145,8 +145,28 @@ struct pt_regs { #define fast_interrupts_enabled(regs) \ (!((regs)->pstate & PSR_F_BIT)) -#define user_stack_pointer(regs) \ - (!compat_user_mode(regs) ? (regs)->sp : (regs)->compat_sp) +/** + * regs_get_register() - get register value from its offset + * @regs: pt_regs from which register value is gotten + * @offset: offset number of the register. + * + * regs_get_register returns the value of a register whose offset from @regs. + * The @offset is the offset of the register in struct pt_regs. + * If @offset is bigger than MAX_REG_OFFSET, this returns 0. + */ +static inline u64 regs_get_register(struct pt_regs *regs, + unsigned int offset) +{ + if (unlikely(offset > MAX_REG_OFFSET)) + return 0; + return *(u64 *)((u64)regs + offset); +} + +/* Valid only for Kernel mode traps. */ +static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) +{ + return regs->ARM_sp; +} static inline unsigned long regs_return_value(struct pt_regs *regs) { @@ -187,13 +207,35 @@ static inline int valid_user_regs(struct user_pt_regs *regs) return 0; } -#define instruction_pointer(regs) ((regs)->pc) +#define GET_USP(regs) \ + (!compat_user_mode(regs) ? (regs)->sp : (regs)->compat_sp) + +#define SET_USP(regs, val) \ + do { \ + if (compat_user_mode(regs)) \ + (regs)->compat_sp = val; \ + else \ + (regs)->sp = val; \ + } while (0) + +#define GET_FP(regs) \ + (!compat_user_mode(regs) ? (regs)->regs[29] : (regs)->compat_fp) + +#define SET_FP(regs, val) \ + do { \ + if (compat_user_mode(regs)) \ + (regs)->compat_fp = val; \ + else \ + (regs)->regs[29] = val; \ + } while (0) + +#include <asm-generic/ptrace.h> + #define stack_pointer(regs) ((regs)->sp) #ifdef CONFIG_SMP +#undef profile_pc extern unsigned long profile_pc(struct pt_regs *regs); -#else -#define profile_pc(regs) instruction_pointer(regs) #endif #endif /* __ASSEMBLY__ */ |