u64 perf_reg_value(struct pt_regs *regs, int idx) { if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX)) return 0; return regs_get_register(regs, pt_regs_offset[idx]); }
u64 perf_reg_value(struct pt_regs *regs, int idx) { if (WARN_ON_ONCE(idx >= ARRAY_SIZE(pt_regs_offset))) return 0; return regs_get_register(regs, pt_regs_offset[idx]); }
/* * return the address being referenced be instruction * for rm=3 returning the content of the rm reg * for rm!=3 calculates the address using SIB and Disp */ static void __user *mpx_get_addr_ref(struct insn *insn, struct pt_regs *regs) { unsigned long addr, base, indx; int addr_offset, base_offset, indx_offset; insn_byte_t sib; insn_get_modrm(insn); insn_get_sib(insn); sib = insn->sib.value; if (X86_MODRM_MOD(insn->modrm.value) == 3) { addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM); if (addr_offset < 0) goto out_err; addr = regs_get_register(regs, addr_offset); } else { if (insn->sib.nbytes) { base_offset = get_reg_offset(insn, regs, REG_TYPE_BASE); if (base_offset < 0) goto out_err; indx_offset = get_reg_offset(insn, regs, REG_TYPE_INDEX); if (indx_offset < 0) goto out_err; base = regs_get_register(regs, base_offset); indx = regs_get_register(regs, indx_offset); addr = base + indx * (1 << X86_SIB_SCALE(sib)); } else { addr_offset = get_reg_offset(insn, regs, REG_TYPE_RM); if (addr_offset < 0) goto out_err; addr = regs_get_register(regs, addr_offset); } addr += insn->displacement.value; } return (void __user *)addr; out_err: return (void __user *)-1; }
u64 perf_reg_value(struct pt_regs *regs, int idx) { if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX)) return 0; if (idx == PERF_REG_POWERPC_SIER && (IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) || IS_ENABLED(CONFIG_PPC32) || !is_sier_available())) return 0; if (idx == PERF_REG_POWERPC_MMCRA && (IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) || IS_ENABLED(CONFIG_PPC32))) return 0; return regs_get_register(regs, pt_regs_offset[idx]); }
/* fetch handlers */ static __kprobes unsigned long fetch_register(struct pt_regs *regs, void *offset) { return regs_get_register(regs, (unsigned int)((unsigned long)offset)); }