powerpc: Don't use 'struct ppc_inst' to reference instruction location
'struct ppc_inst' is an internal representation of an instruction, but in-memory instructions are and will remain a table of 'u32' forever. Replace all 'struct ppc_inst *' used for locating an instruction in memory by 'u32 *'. This removes a lot of undue casts to 'struct ppc_inst *'. It also helps locating ab-use of 'struct ppc_inst' dereference. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> [mpe: Fix ppc_inst_next(), use u32 instead of unsigned int] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/7062722b087228e42cbd896e39bfdf526d6a340a.1621516826.git.christophe.leroy@csgroup.eu
This commit is contained in:
committed by
Michael Ellerman
parent
e90a21ea80
commit
69d4d6e5fd
@@ -35,7 +35,7 @@ void __init reserve_kdump_trampoline(void)
|
||||
|
||||
static void __init create_trampoline(unsigned long addr)
|
||||
{
|
||||
struct ppc_inst *p = (struct ppc_inst *)addr;
|
||||
u32 *p = (u32 *)addr;
|
||||
|
||||
/* The maximum range of a single instruction branch, is the current
|
||||
* instruction's address + (32 MB - 4) bytes. For the trampoline we
|
||||
@@ -46,7 +46,7 @@ static void __init create_trampoline(unsigned long addr)
|
||||
* two instructions it doesn't require any registers.
|
||||
*/
|
||||
patch_instruction(p, ppc_inst(PPC_RAW_NOP()));
|
||||
patch_branch((void *)p + 4, addr + PHYSICAL_START, 0);
|
||||
patch_branch(p + 1, addr + PHYSICAL_START, 0);
|
||||
}
|
||||
|
||||
void __init setup_kdump_trampoline(void)
|
||||
|
||||
@@ -38,9 +38,9 @@ static int __init early_init_dt_scan_epapr(unsigned long node,
|
||||
|
||||
for (i = 0; i < (len / 4); i++) {
|
||||
struct ppc_inst inst = ppc_inst(be32_to_cpu(insts[i]));
|
||||
patch_instruction((struct ppc_inst *)(epapr_hypercall_start + i), inst);
|
||||
patch_instruction(epapr_hypercall_start + i, inst);
|
||||
#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64)
|
||||
patch_instruction((struct ppc_inst *)(epapr_ev_idle_start + i), inst);
|
||||
patch_instruction(epapr_ev_idle_start + i, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
void arch_jump_label_transform(struct jump_entry *entry,
|
||||
enum jump_label_type type)
|
||||
{
|
||||
struct ppc_inst *addr = (struct ppc_inst *)jump_entry_code(entry);
|
||||
u32 *addr = (u32 *)jump_entry_code(entry);
|
||||
|
||||
if (type == JUMP_LABEL_JMP)
|
||||
patch_branch(addr, jump_entry_target(entry), 0);
|
||||
|
||||
@@ -417,11 +417,10 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code,
|
||||
|
||||
int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
|
||||
{
|
||||
u32 instr, *addr = (u32 *)bpt->bpt_addr;
|
||||
int err;
|
||||
unsigned int instr;
|
||||
struct ppc_inst *addr = (struct ppc_inst *)bpt->bpt_addr;
|
||||
|
||||
err = get_kernel_nofault(instr, (unsigned *) addr);
|
||||
err = get_kernel_nofault(instr, addr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -429,7 +428,7 @@ int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
|
||||
if (err)
|
||||
return -EFAULT;
|
||||
|
||||
*(unsigned int *)bpt->saved_instr = instr;
|
||||
*(u32 *)bpt->saved_instr = instr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -438,7 +437,7 @@ int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)
|
||||
{
|
||||
int err;
|
||||
unsigned int instr = *(unsigned int *)bpt->saved_instr;
|
||||
struct ppc_inst *addr = (struct ppc_inst *)bpt->bpt_addr;
|
||||
u32 *addr = (u32 *)bpt->bpt_addr;
|
||||
|
||||
err = patch_instruction(addr, ppc_inst(instr));
|
||||
if (err)
|
||||
|
||||
@@ -107,7 +107,7 @@ int arch_prepare_kprobe(struct kprobe *p)
|
||||
{
|
||||
int ret = 0;
|
||||
struct kprobe *prev;
|
||||
struct ppc_inst insn = ppc_inst_read((struct ppc_inst *)p->addr);
|
||||
struct ppc_inst insn = ppc_inst_read(p->addr);
|
||||
|
||||
if ((unsigned long)p->addr & 0x03) {
|
||||
printk("Attempt to register kprobe at an unaligned address\n");
|
||||
@@ -116,15 +116,14 @@ int arch_prepare_kprobe(struct kprobe *p)
|
||||
printk("Cannot register a kprobe on rfi/rfid or mtmsr[d]\n");
|
||||
ret = -EINVAL;
|
||||
} else if ((unsigned long)p->addr & ~PAGE_MASK &&
|
||||
ppc_inst_prefixed(ppc_inst_read((struct ppc_inst *)(p->addr - 1)))) {
|
||||
ppc_inst_prefixed(ppc_inst_read(p->addr - 1))) {
|
||||
printk("Cannot register a kprobe on the second word of prefixed instruction\n");
|
||||
ret = -EINVAL;
|
||||
}
|
||||
preempt_disable();
|
||||
prev = get_kprobe(p->addr - 1);
|
||||
preempt_enable_no_resched();
|
||||
if (prev &&
|
||||
ppc_inst_prefixed(ppc_inst_read((struct ppc_inst *)prev->ainsn.insn))) {
|
||||
if (prev && ppc_inst_prefixed(ppc_inst_read(prev->ainsn.insn))) {
|
||||
printk("Cannot register a kprobe on the second word of prefixed instruction\n");
|
||||
ret = -EINVAL;
|
||||
}
|
||||
@@ -138,7 +137,7 @@ int arch_prepare_kprobe(struct kprobe *p)
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
patch_instruction((struct ppc_inst *)p->ainsn.insn, insn);
|
||||
patch_instruction(p->ainsn.insn, insn);
|
||||
p->opcode = ppc_inst_val(insn);
|
||||
}
|
||||
|
||||
@@ -149,13 +148,13 @@ NOKPROBE_SYMBOL(arch_prepare_kprobe);
|
||||
|
||||
void arch_arm_kprobe(struct kprobe *p)
|
||||
{
|
||||
patch_instruction((struct ppc_inst *)p->addr, ppc_inst(BREAKPOINT_INSTRUCTION));
|
||||
patch_instruction(p->addr, ppc_inst(BREAKPOINT_INSTRUCTION));
|
||||
}
|
||||
NOKPROBE_SYMBOL(arch_arm_kprobe);
|
||||
|
||||
void arch_disarm_kprobe(struct kprobe *p)
|
||||
{
|
||||
patch_instruction((struct ppc_inst *)p->addr, ppc_inst(p->opcode));
|
||||
patch_instruction(p->addr, ppc_inst(p->opcode));
|
||||
}
|
||||
NOKPROBE_SYMBOL(arch_disarm_kprobe);
|
||||
|
||||
@@ -228,7 +227,7 @@ NOKPROBE_SYMBOL(arch_prepare_kretprobe);
|
||||
static int try_to_emulate(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
int ret;
|
||||
struct ppc_inst insn = ppc_inst_read((struct ppc_inst *)p->ainsn.insn);
|
||||
struct ppc_inst insn = ppc_inst_read(p->ainsn.insn);
|
||||
|
||||
/* regs->nip is also adjusted if emulate_step returns 1 */
|
||||
ret = emulate_step(regs, insn);
|
||||
@@ -439,7 +438,7 @@ int kprobe_post_handler(struct pt_regs *regs)
|
||||
if (!cur || user_mode(regs))
|
||||
return 0;
|
||||
|
||||
len = ppc_inst_len(ppc_inst_read((struct ppc_inst *)cur->ainsn.insn));
|
||||
len = ppc_inst_len(ppc_inst_read(cur->ainsn.insn));
|
||||
/* make sure we got here for instruction we have a kprobe on */
|
||||
if (((unsigned long)cur->ainsn.insn + len) != regs->nip)
|
||||
return 0;
|
||||
|
||||
@@ -463,7 +463,7 @@ static int mce_find_instr_ea_and_phys(struct pt_regs *regs, uint64_t *addr,
|
||||
pfn = addr_to_pfn(regs, regs->nip);
|
||||
if (pfn != ULONG_MAX) {
|
||||
instr_addr = (pfn << PAGE_SHIFT) + (regs->nip & ~PAGE_MASK);
|
||||
instr = ppc_inst_read((struct ppc_inst *)instr_addr);
|
||||
instr = ppc_inst_read((u32 *)instr_addr);
|
||||
if (!analyse_instr(&op, &tmp, instr)) {
|
||||
pfn = addr_to_pfn(regs, op.ea);
|
||||
*addr = op.ea;
|
||||
|
||||
@@ -89,9 +89,8 @@ static unsigned long can_optimize(struct kprobe *p)
|
||||
* Ensure that the instruction is not a conditional branch,
|
||||
* and that can be emulated.
|
||||
*/
|
||||
if (!is_conditional_branch(ppc_inst_read((struct ppc_inst *)p->ainsn.insn)) &&
|
||||
analyse_instr(&op, ®s,
|
||||
ppc_inst_read((struct ppc_inst *)p->ainsn.insn)) == 1) {
|
||||
if (!is_conditional_branch(ppc_inst_read(p->ainsn.insn)) &&
|
||||
analyse_instr(&op, ®s, ppc_inst_read(p->ainsn.insn)) == 1) {
|
||||
emulate_update_regs(®s, &op);
|
||||
nip = regs.nip;
|
||||
}
|
||||
@@ -132,12 +131,10 @@ void arch_remove_optimized_kprobe(struct optimized_kprobe *op)
|
||||
|
||||
static void patch_imm32_load_insns(unsigned long val, int reg, kprobe_opcode_t *addr)
|
||||
{
|
||||
patch_instruction((struct ppc_inst *)addr,
|
||||
ppc_inst(PPC_RAW_LIS(reg, IMM_H(val))));
|
||||
patch_instruction(addr, ppc_inst(PPC_RAW_LIS(reg, IMM_H(val))));
|
||||
addr++;
|
||||
|
||||
patch_instruction((struct ppc_inst *)addr,
|
||||
ppc_inst(PPC_RAW_ORI(reg, reg, IMM_L(val))));
|
||||
patch_instruction(addr, ppc_inst(PPC_RAW_ORI(reg, reg, IMM_L(val))));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -147,31 +144,31 @@ static void patch_imm32_load_insns(unsigned long val, int reg, kprobe_opcode_t *
|
||||
static void patch_imm64_load_insns(unsigned long long val, int reg, kprobe_opcode_t *addr)
|
||||
{
|
||||
/* lis reg,(op)@highest */
|
||||
patch_instruction((struct ppc_inst *)addr,
|
||||
patch_instruction(addr,
|
||||
ppc_inst(PPC_INST_ADDIS | ___PPC_RT(reg) |
|
||||
((val >> 48) & 0xffff)));
|
||||
addr++;
|
||||
|
||||
/* ori reg,reg,(op)@higher */
|
||||
patch_instruction((struct ppc_inst *)addr,
|
||||
patch_instruction(addr,
|
||||
ppc_inst(PPC_INST_ORI | ___PPC_RA(reg) |
|
||||
___PPC_RS(reg) | ((val >> 32) & 0xffff)));
|
||||
addr++;
|
||||
|
||||
/* rldicr reg,reg,32,31 */
|
||||
patch_instruction((struct ppc_inst *)addr,
|
||||
patch_instruction(addr,
|
||||
ppc_inst(PPC_INST_RLDICR | ___PPC_RA(reg) |
|
||||
___PPC_RS(reg) | __PPC_SH64(32) | __PPC_ME64(31)));
|
||||
addr++;
|
||||
|
||||
/* oris reg,reg,(op)@h */
|
||||
patch_instruction((struct ppc_inst *)addr,
|
||||
patch_instruction(addr,
|
||||
ppc_inst(PPC_INST_ORIS | ___PPC_RA(reg) |
|
||||
___PPC_RS(reg) | ((val >> 16) & 0xffff)));
|
||||
addr++;
|
||||
|
||||
/* ori reg,reg,(op)@l */
|
||||
patch_instruction((struct ppc_inst *)addr,
|
||||
patch_instruction(addr,
|
||||
ppc_inst(PPC_INST_ORI | ___PPC_RA(reg) |
|
||||
___PPC_RS(reg) | (val & 0xffff)));
|
||||
}
|
||||
@@ -225,8 +222,7 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *p)
|
||||
size = (TMPL_END_IDX * sizeof(kprobe_opcode_t)) / sizeof(int);
|
||||
pr_devel("Copying template to %p, size %lu\n", buff, size);
|
||||
for (i = 0; i < size; i++) {
|
||||
rc = patch_instruction((struct ppc_inst *)(buff + i),
|
||||
ppc_inst(*(optprobe_template_entry + i)));
|
||||
rc = patch_instruction(buff + i, ppc_inst(*(optprobe_template_entry + i)));
|
||||
if (rc < 0)
|
||||
goto error;
|
||||
}
|
||||
@@ -247,34 +243,30 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *p)
|
||||
goto error;
|
||||
}
|
||||
|
||||
rc = create_branch(&branch_op_callback,
|
||||
(struct ppc_inst *)(buff + TMPL_CALL_HDLR_IDX),
|
||||
rc = create_branch(&branch_op_callback, buff + TMPL_CALL_HDLR_IDX,
|
||||
(unsigned long)op_callback_addr,
|
||||
BRANCH_SET_LINK);
|
||||
|
||||
rc |= create_branch(&branch_emulate_step,
|
||||
(struct ppc_inst *)(buff + TMPL_EMULATE_IDX),
|
||||
rc |= create_branch(&branch_emulate_step, buff + TMPL_EMULATE_IDX,
|
||||
(unsigned long)emulate_step_addr,
|
||||
BRANCH_SET_LINK);
|
||||
|
||||
if (rc)
|
||||
goto error;
|
||||
|
||||
patch_instruction((struct ppc_inst *)(buff + TMPL_CALL_HDLR_IDX),
|
||||
branch_op_callback);
|
||||
patch_instruction((struct ppc_inst *)(buff + TMPL_EMULATE_IDX),
|
||||
branch_emulate_step);
|
||||
patch_instruction(buff + TMPL_CALL_HDLR_IDX, branch_op_callback);
|
||||
patch_instruction(buff + TMPL_EMULATE_IDX, branch_emulate_step);
|
||||
|
||||
/*
|
||||
* 3. load instruction to be emulated into relevant register, and
|
||||
*/
|
||||
temp = ppc_inst_read((struct ppc_inst *)p->ainsn.insn);
|
||||
temp = ppc_inst_read(p->ainsn.insn);
|
||||
patch_imm_load_insns(ppc_inst_as_ulong(temp), 4, buff + TMPL_INSN_IDX);
|
||||
|
||||
/*
|
||||
* 4. branch back from trampoline
|
||||
*/
|
||||
patch_branch((struct ppc_inst *)(buff + TMPL_RET_IDX), (unsigned long)nip, 0);
|
||||
patch_branch(buff + TMPL_RET_IDX, nip, 0);
|
||||
|
||||
flush_icache_range((unsigned long)buff,
|
||||
(unsigned long)(&buff[TMPL_END_IDX]));
|
||||
@@ -317,10 +309,9 @@ void arch_optimize_kprobes(struct list_head *oplist)
|
||||
*/
|
||||
memcpy(op->optinsn.copied_insn, op->kp.addr,
|
||||
RELATIVEJUMP_SIZE);
|
||||
create_branch(&instr,
|
||||
(struct ppc_inst *)op->kp.addr,
|
||||
create_branch(&instr, op->kp.addr,
|
||||
(unsigned long)op->optinsn.insn, 0);
|
||||
patch_instruction((struct ppc_inst *)op->kp.addr, instr);
|
||||
patch_instruction(op->kp.addr, instr);
|
||||
list_del_init(&op->list);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ EXPORT_SYMBOL(DMA_MODE_WRITE);
|
||||
*/
|
||||
notrace void __init machine_init(u64 dt_ptr)
|
||||
{
|
||||
struct ppc_inst *addr = (struct ppc_inst *)patch_site_addr(&patch__memset_nocache);
|
||||
u32 *addr = (u32 *)patch_site_addr(&patch__memset_nocache);
|
||||
struct ppc_inst insn;
|
||||
|
||||
/* Configure static keys first, now that we're relocated. */
|
||||
|
||||
@@ -49,7 +49,7 @@ ftrace_call_replace(unsigned long ip, unsigned long addr, int link)
|
||||
addr = ppc_function_entry((void *)addr);
|
||||
|
||||
/* if (link) set op to 'bl' else 'b' */
|
||||
create_branch(&op, (struct ppc_inst *)ip, addr, link ? 1 : 0);
|
||||
create_branch(&op, (u32 *)ip, addr, link ? 1 : 0);
|
||||
|
||||
return op;
|
||||
}
|
||||
@@ -79,7 +79,7 @@ ftrace_modify_code(unsigned long ip, struct ppc_inst old, struct ppc_inst new)
|
||||
}
|
||||
|
||||
/* replace the text with the new text */
|
||||
if (patch_instruction((struct ppc_inst *)ip, new))
|
||||
if (patch_instruction((u32 *)ip, new))
|
||||
return -EPERM;
|
||||
|
||||
return 0;
|
||||
@@ -94,7 +94,7 @@ static int test_24bit_addr(unsigned long ip, unsigned long addr)
|
||||
addr = ppc_function_entry((void *)addr);
|
||||
|
||||
/* use the create_branch to verify that this offset can be branched */
|
||||
return create_branch(&op, (struct ppc_inst *)ip, addr, 0) == 0;
|
||||
return create_branch(&op, (u32 *)ip, addr, 0) == 0;
|
||||
}
|
||||
|
||||
static int is_bl_op(struct ppc_inst op)
|
||||
@@ -208,7 +208,7 @@ __ftrace_make_nop(struct module *mod,
|
||||
}
|
||||
#endif /* CONFIG_MPROFILE_KERNEL */
|
||||
|
||||
if (patch_instruction((struct ppc_inst *)ip, pop)) {
|
||||
if (patch_instruction((u32 *)ip, pop)) {
|
||||
pr_err("Patching NOP failed.\n");
|
||||
return -EPERM;
|
||||
}
|
||||
@@ -280,7 +280,7 @@ __ftrace_make_nop(struct module *mod,
|
||||
|
||||
op = ppc_inst(PPC_RAW_NOP());
|
||||
|
||||
if (patch_instruction((struct ppc_inst *)ip, op))
|
||||
if (patch_instruction((u32 *)ip, op))
|
||||
return -EPERM;
|
||||
|
||||
return 0;
|
||||
@@ -380,7 +380,7 @@ static int setup_mcount_compiler_tramp(unsigned long tramp)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (patch_branch((struct ppc_inst *)tramp, ptr, 0)) {
|
||||
if (patch_branch((u32 *)tramp, ptr, 0)) {
|
||||
pr_debug("REL24 out of range!\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -424,7 +424,7 @@ static int __ftrace_make_nop_kernel(struct dyn_ftrace *rec, unsigned long addr)
|
||||
}
|
||||
}
|
||||
|
||||
if (patch_instruction((struct ppc_inst *)ip, ppc_inst(PPC_RAW_NOP()))) {
|
||||
if (patch_instruction((u32 *)ip, ppc_inst(PPC_RAW_NOP()))) {
|
||||
pr_err("Patching NOP failed.\n");
|
||||
return -EPERM;
|
||||
}
|
||||
@@ -589,10 +589,10 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||
{
|
||||
int err;
|
||||
struct ppc_inst op;
|
||||
unsigned long ip = rec->ip;
|
||||
u32 *ip = (u32 *)rec->ip;
|
||||
|
||||
/* read where this goes */
|
||||
if (copy_inst_from_kernel_nofault(&op, (void *)ip))
|
||||
if (copy_inst_from_kernel_nofault(&op, ip))
|
||||
return -EFAULT;
|
||||
|
||||
/* It should be pointing to a nop */
|
||||
@@ -608,8 +608,7 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||
}
|
||||
|
||||
/* create the branch to the trampoline */
|
||||
err = create_branch(&op, (struct ppc_inst *)ip,
|
||||
rec->arch.mod->arch.tramp, BRANCH_SET_LINK);
|
||||
err = create_branch(&op, ip, rec->arch.mod->arch.tramp, BRANCH_SET_LINK);
|
||||
if (err) {
|
||||
pr_err("REL24 out of range!\n");
|
||||
return -EINVAL;
|
||||
@@ -617,7 +616,7 @@ __ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||
|
||||
pr_devel("write to %lx\n", rec->ip);
|
||||
|
||||
if (patch_instruction((struct ppc_inst *)ip, op))
|
||||
if (patch_instruction(ip, op))
|
||||
return -EPERM;
|
||||
|
||||
return 0;
|
||||
@@ -762,7 +761,7 @@ __ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
||||
/* The new target may be within range */
|
||||
if (test_24bit_addr(ip, addr)) {
|
||||
/* within range */
|
||||
if (patch_branch((struct ppc_inst *)ip, addr, BRANCH_SET_LINK)) {
|
||||
if (patch_branch((u32 *)ip, addr, BRANCH_SET_LINK)) {
|
||||
pr_err("REL24 out of range!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -790,12 +789,12 @@ __ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
|
||||
}
|
||||
|
||||
/* Ensure branch is within 24 bits */
|
||||
if (create_branch(&op, (struct ppc_inst *)ip, tramp, BRANCH_SET_LINK)) {
|
||||
if (create_branch(&op, (u32 *)ip, tramp, BRANCH_SET_LINK)) {
|
||||
pr_err("Branch out of range\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (patch_branch((struct ppc_inst *)ip, tramp, BRANCH_SET_LINK)) {
|
||||
if (patch_branch((u32 *)ip, tramp, BRANCH_SET_LINK)) {
|
||||
pr_err("REL24 out of range!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -851,7 +850,7 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
struct ppc_inst old, new;
|
||||
int ret;
|
||||
|
||||
old = ppc_inst_read((struct ppc_inst *)&ftrace_call);
|
||||
old = ppc_inst_read((u32 *)&ftrace_call);
|
||||
new = ftrace_call_replace(ip, (unsigned long)func, 1);
|
||||
ret = ftrace_modify_code(ip, old, new);
|
||||
|
||||
@@ -859,7 +858,7 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
/* Also update the regs callback function */
|
||||
if (!ret) {
|
||||
ip = (unsigned long)(&ftrace_regs_call);
|
||||
old = ppc_inst_read((struct ppc_inst *)&ftrace_regs_call);
|
||||
old = ppc_inst_read((u32 *)&ftrace_regs_call);
|
||||
new = ftrace_call_replace(ip, (unsigned long)func, 1);
|
||||
ret = ftrace_modify_code(ip, old, new);
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe,
|
||||
return -EINVAL;
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_31) &&
|
||||
ppc_inst_prefixed(ppc_inst_read(&auprobe->insn)) &&
|
||||
ppc_inst_prefixed(ppc_inst_read(auprobe->insn)) &&
|
||||
(addr & 0x3f) == 60) {
|
||||
pr_info_ratelimited("Cannot register a uprobe on 64 byte unaligned prefixed instruction\n");
|
||||
return -EINVAL;
|
||||
@@ -119,7 +119,7 @@ int arch_uprobe_post_xol(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
* support doesn't exist and have to fix-up the next instruction
|
||||
* to be executed.
|
||||
*/
|
||||
regs->nip = (unsigned long)ppc_inst_next((void *)utask->vaddr, &auprobe->insn);
|
||||
regs->nip = (unsigned long)ppc_inst_next((void *)utask->vaddr, auprobe->insn);
|
||||
|
||||
user_disable_single_step(current);
|
||||
return 0;
|
||||
@@ -182,7 +182,7 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
* emulate_step() returns 1 if the insn was successfully emulated.
|
||||
* For all other cases, we need to single-step in hardware.
|
||||
*/
|
||||
ret = emulate_step(regs, ppc_inst_read(&auprobe->insn));
|
||||
ret = emulate_step(regs, ppc_inst_read(auprobe->insn));
|
||||
if (ret > 0)
|
||||
return true;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user