diff --git a/arch/sw_64/kernel/perf_regs.c b/arch/sw_64/kernel/perf_regs.c index b036f213936bc6d79214c9b7bdf1ab9a82a40b69..d8f3b1d4dee8b6076cdcf18d38c8ed0ccd7c55a5 100644 --- a/arch/sw_64/kernel/perf_regs.c +++ b/arch/sw_64/kernel/perf_regs.c @@ -8,7 +8,24 @@ u64 perf_reg_value(struct pt_regs *regs, int idx) if (WARN_ON_ONCE((u32)idx >= PERF_REG_SW64_MAX)) return 0; - return ((unsigned long *)regs)[idx]; + switch (idx) { + case PERF_REG_SW64_R16: + return regs->r16; + case PERF_REG_SW64_R17: + return regs->r17; + case PERF_REG_SW64_R18: + return regs->r18; + case PERF_REG_SW64_R19 ... PERF_REG_SW64_R28: + return ((unsigned long *)regs)[idx - 3]; + case PERF_REG_SW64_GP: + return regs->gp; + case PERF_REG_SW64_SP: + return (u64)(user_mode(regs) ? rdusp() : (regs + 1)); + case PERF_REG_SW64_PC: + return regs->pc; + default: + return ((unsigned long *)regs)[idx]; + } } #define REG_RESERVED (~((1ULL << PERF_REG_SW64_MAX) - 1))