linux/arch/arm64/kernel/perf_regs.c
<<
>>
Prefs
   1#include <linux/errno.h>
   2#include <linux/kernel.h>
   3#include <linux/perf_event.h>
   4#include <linux/bug.h>
   5
   6#include <asm/compat.h>
   7#include <asm/perf_regs.h>
   8#include <asm/ptrace.h>
   9
  10u64 perf_reg_value(struct pt_regs *regs, int idx)
  11{
  12        if (WARN_ON_ONCE((u32)idx >= PERF_REG_ARM64_MAX))
  13                return 0;
  14
  15        /*
  16         * Compat (i.e. 32 bit) mode:
  17         * - PC has been set in the pt_regs struct in kernel_entry,
  18         * - Handle SP and LR here.
  19         */
  20        if (compat_user_mode(regs)) {
  21                if ((u32)idx == PERF_REG_ARM64_SP)
  22                        return regs->compat_sp;
  23                if ((u32)idx == PERF_REG_ARM64_LR)
  24                        return regs->compat_lr;
  25        }
  26
  27        if ((u32)idx == PERF_REG_ARM64_SP)
  28                return regs->sp;
  29
  30        if ((u32)idx == PERF_REG_ARM64_PC)
  31                return regs->pc;
  32
  33        return regs->regs[idx];
  34}
  35
  36#define REG_RESERVED (~((1ULL << PERF_REG_ARM64_MAX) - 1))
  37
  38int perf_reg_validate(u64 mask)
  39{
  40        if (!mask || mask & REG_RESERVED)
  41                return -EINVAL;
  42
  43        return 0;
  44}
  45
  46u64 perf_reg_abi(struct task_struct *task)
  47{
  48        if (is_compat_thread(task_thread_info(task)))
  49                return PERF_SAMPLE_REGS_ABI_32;
  50        else
  51                return PERF_SAMPLE_REGS_ABI_64;
  52}
  53
  54void perf_get_regs_user(struct perf_regs *regs_user,
  55                        struct pt_regs *regs,
  56                        struct pt_regs *regs_user_copy)
  57{
  58        regs_user->regs = task_pt_regs(current);
  59        regs_user->abi = perf_reg_abi(current);
  60}
  61