133e53ae1SGuo Ren // SPDX-License-Identifier: GPL-2.0+ 233e53ae1SGuo Ren 333e53ae1SGuo Ren #include <linux/kprobes.h> 433e53ae1SGuo Ren #include <linux/extable.h> 533e53ae1SGuo Ren #include <linux/slab.h> 633e53ae1SGuo Ren #include <linux/stop_machine.h> 733e53ae1SGuo Ren #include <asm/ptrace.h> 833e53ae1SGuo Ren #include <linux/uaccess.h> 933e53ae1SGuo Ren #include <asm/sections.h> 1033e53ae1SGuo Ren #include <asm/cacheflush.h> 1133e53ae1SGuo Ren 1233e53ae1SGuo Ren #include "decode-insn.h" 1333e53ae1SGuo Ren 1433e53ae1SGuo Ren DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; 1533e53ae1SGuo Ren DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); 1633e53ae1SGuo Ren 1733e53ae1SGuo Ren static void __kprobes 1833e53ae1SGuo Ren post_kprobe_handler(struct kprobe_ctlblk *, struct pt_regs *); 1933e53ae1SGuo Ren 2033e53ae1SGuo Ren struct csky_insn_patch { 2133e53ae1SGuo Ren kprobe_opcode_t *addr; 2233e53ae1SGuo Ren u32 opcode; 2333e53ae1SGuo Ren atomic_t cpu_count; 2433e53ae1SGuo Ren }; 2533e53ae1SGuo Ren 2633e53ae1SGuo Ren static int __kprobes patch_text_cb(void *priv) 2733e53ae1SGuo Ren { 2833e53ae1SGuo Ren struct csky_insn_patch *param = priv; 2933e53ae1SGuo Ren unsigned int addr = (unsigned int)param->addr; 3033e53ae1SGuo Ren 3133e53ae1SGuo Ren if (atomic_inc_return(¶m->cpu_count) == 1) { 3233e53ae1SGuo Ren *(u16 *) addr = cpu_to_le16(param->opcode); 3333e53ae1SGuo Ren dcache_wb_range(addr, addr + 2); 3433e53ae1SGuo Ren atomic_inc(¶m->cpu_count); 3533e53ae1SGuo Ren } else { 3633e53ae1SGuo Ren while (atomic_read(¶m->cpu_count) <= num_online_cpus()) 3733e53ae1SGuo Ren cpu_relax(); 3833e53ae1SGuo Ren } 3933e53ae1SGuo Ren 4033e53ae1SGuo Ren icache_inv_range(addr, addr + 2); 4133e53ae1SGuo Ren 4233e53ae1SGuo Ren return 0; 4333e53ae1SGuo Ren } 4433e53ae1SGuo Ren 4533e53ae1SGuo Ren static int __kprobes patch_text(kprobe_opcode_t *addr, u32 opcode) 4633e53ae1SGuo Ren { 4733e53ae1SGuo Ren struct csky_insn_patch param = { addr, opcode, ATOMIC_INIT(0) }; 4833e53ae1SGuo Ren 4933e53ae1SGuo Ren return stop_machine_cpuslocked(patch_text_cb, ¶m, cpu_online_mask); 5033e53ae1SGuo Ren } 5133e53ae1SGuo Ren 5233e53ae1SGuo Ren static void __kprobes arch_prepare_ss_slot(struct kprobe *p) 5333e53ae1SGuo Ren { 5433e53ae1SGuo Ren unsigned long offset = is_insn32(p->opcode) ? 4 : 2; 5533e53ae1SGuo Ren 5633e53ae1SGuo Ren p->ainsn.api.restore = (unsigned long)p->addr + offset; 5733e53ae1SGuo Ren 5833e53ae1SGuo Ren patch_text(p->ainsn.api.insn, p->opcode); 5933e53ae1SGuo Ren } 6033e53ae1SGuo Ren 6133e53ae1SGuo Ren static void __kprobes arch_prepare_simulate(struct kprobe *p) 6233e53ae1SGuo Ren { 6333e53ae1SGuo Ren p->ainsn.api.restore = 0; 6433e53ae1SGuo Ren } 6533e53ae1SGuo Ren 6633e53ae1SGuo Ren static void __kprobes arch_simulate_insn(struct kprobe *p, struct pt_regs *regs) 6733e53ae1SGuo Ren { 6833e53ae1SGuo Ren struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 6933e53ae1SGuo Ren 7033e53ae1SGuo Ren if (p->ainsn.api.handler) 7133e53ae1SGuo Ren p->ainsn.api.handler((u32)p->opcode, (long)p->addr, regs); 7233e53ae1SGuo Ren 7333e53ae1SGuo Ren post_kprobe_handler(kcb, regs); 7433e53ae1SGuo Ren } 7533e53ae1SGuo Ren 7633e53ae1SGuo Ren int __kprobes arch_prepare_kprobe(struct kprobe *p) 7733e53ae1SGuo Ren { 7833e53ae1SGuo Ren unsigned long probe_addr = (unsigned long)p->addr; 7933e53ae1SGuo Ren 8033e53ae1SGuo Ren if (probe_addr & 0x1) { 8133e53ae1SGuo Ren pr_warn("Address not aligned.\n"); 8233e53ae1SGuo Ren return -EINVAL; 8333e53ae1SGuo Ren } 8433e53ae1SGuo Ren 8533e53ae1SGuo Ren /* copy instruction */ 8633e53ae1SGuo Ren p->opcode = le32_to_cpu(*p->addr); 8733e53ae1SGuo Ren 8833e53ae1SGuo Ren /* decode instruction */ 8933e53ae1SGuo Ren switch (csky_probe_decode_insn(p->addr, &p->ainsn.api)) { 9033e53ae1SGuo Ren case INSN_REJECTED: /* insn not supported */ 9133e53ae1SGuo Ren return -EINVAL; 9233e53ae1SGuo Ren 9333e53ae1SGuo Ren case INSN_GOOD_NO_SLOT: /* insn need simulation */ 9433e53ae1SGuo Ren p->ainsn.api.insn = NULL; 9533e53ae1SGuo Ren break; 9633e53ae1SGuo Ren 9733e53ae1SGuo Ren case INSN_GOOD: /* instruction uses slot */ 9833e53ae1SGuo Ren p->ainsn.api.insn = get_insn_slot(); 9933e53ae1SGuo Ren if (!p->ainsn.api.insn) 10033e53ae1SGuo Ren return -ENOMEM; 10133e53ae1SGuo Ren break; 10233e53ae1SGuo Ren } 10333e53ae1SGuo Ren 10433e53ae1SGuo Ren /* prepare the instruction */ 10533e53ae1SGuo Ren if (p->ainsn.api.insn) 10633e53ae1SGuo Ren arch_prepare_ss_slot(p); 10733e53ae1SGuo Ren else 10833e53ae1SGuo Ren arch_prepare_simulate(p); 10933e53ae1SGuo Ren 11033e53ae1SGuo Ren return 0; 11133e53ae1SGuo Ren } 11233e53ae1SGuo Ren 11333e53ae1SGuo Ren /* install breakpoint in text */ 11433e53ae1SGuo Ren void __kprobes arch_arm_kprobe(struct kprobe *p) 11533e53ae1SGuo Ren { 11633e53ae1SGuo Ren patch_text(p->addr, USR_BKPT); 11733e53ae1SGuo Ren } 11833e53ae1SGuo Ren 11933e53ae1SGuo Ren /* remove breakpoint from text */ 12033e53ae1SGuo Ren void __kprobes arch_disarm_kprobe(struct kprobe *p) 12133e53ae1SGuo Ren { 12233e53ae1SGuo Ren patch_text(p->addr, p->opcode); 12333e53ae1SGuo Ren } 12433e53ae1SGuo Ren 12533e53ae1SGuo Ren void __kprobes arch_remove_kprobe(struct kprobe *p) 12633e53ae1SGuo Ren { 12733e53ae1SGuo Ren } 12833e53ae1SGuo Ren 12933e53ae1SGuo Ren static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) 13033e53ae1SGuo Ren { 13133e53ae1SGuo Ren kcb->prev_kprobe.kp = kprobe_running(); 13233e53ae1SGuo Ren kcb->prev_kprobe.status = kcb->kprobe_status; 13333e53ae1SGuo Ren } 13433e53ae1SGuo Ren 13533e53ae1SGuo Ren static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb) 13633e53ae1SGuo Ren { 13733e53ae1SGuo Ren __this_cpu_write(current_kprobe, kcb->prev_kprobe.kp); 13833e53ae1SGuo Ren kcb->kprobe_status = kcb->prev_kprobe.status; 13933e53ae1SGuo Ren } 14033e53ae1SGuo Ren 14133e53ae1SGuo Ren static void __kprobes set_current_kprobe(struct kprobe *p) 14233e53ae1SGuo Ren { 14333e53ae1SGuo Ren __this_cpu_write(current_kprobe, p); 14433e53ae1SGuo Ren } 14533e53ae1SGuo Ren 14633e53ae1SGuo Ren /* 14733e53ae1SGuo Ren * Interrupts need to be disabled before single-step mode is set, and not 14833e53ae1SGuo Ren * reenabled until after single-step mode ends. 14933e53ae1SGuo Ren * Without disabling interrupt on local CPU, there is a chance of 15033e53ae1SGuo Ren * interrupt occurrence in the period of exception return and start of 15133e53ae1SGuo Ren * out-of-line single-step, that result in wrongly single stepping 15233e53ae1SGuo Ren * into the interrupt handler. 15333e53ae1SGuo Ren */ 15433e53ae1SGuo Ren static void __kprobes kprobes_save_local_irqflag(struct kprobe_ctlblk *kcb, 15533e53ae1SGuo Ren struct pt_regs *regs) 15633e53ae1SGuo Ren { 15733e53ae1SGuo Ren kcb->saved_sr = regs->sr; 15833e53ae1SGuo Ren regs->sr &= ~BIT(6); 15933e53ae1SGuo Ren } 16033e53ae1SGuo Ren 16133e53ae1SGuo Ren static void __kprobes kprobes_restore_local_irqflag(struct kprobe_ctlblk *kcb, 16233e53ae1SGuo Ren struct pt_regs *regs) 16333e53ae1SGuo Ren { 16433e53ae1SGuo Ren regs->sr = kcb->saved_sr; 16533e53ae1SGuo Ren } 16633e53ae1SGuo Ren 16733e53ae1SGuo Ren static void __kprobes 16833e53ae1SGuo Ren set_ss_context(struct kprobe_ctlblk *kcb, unsigned long addr, struct kprobe *p) 16933e53ae1SGuo Ren { 17033e53ae1SGuo Ren unsigned long offset = is_insn32(p->opcode) ? 4 : 2; 17133e53ae1SGuo Ren 17233e53ae1SGuo Ren kcb->ss_ctx.ss_pending = true; 17333e53ae1SGuo Ren kcb->ss_ctx.match_addr = addr + offset; 17433e53ae1SGuo Ren } 17533e53ae1SGuo Ren 17633e53ae1SGuo Ren static void __kprobes clear_ss_context(struct kprobe_ctlblk *kcb) 17733e53ae1SGuo Ren { 17833e53ae1SGuo Ren kcb->ss_ctx.ss_pending = false; 17933e53ae1SGuo Ren kcb->ss_ctx.match_addr = 0; 18033e53ae1SGuo Ren } 18133e53ae1SGuo Ren 18233e53ae1SGuo Ren #define TRACE_MODE_SI BIT(14) 18333e53ae1SGuo Ren #define TRACE_MODE_MASK ~(0x3 << 14) 18433e53ae1SGuo Ren #define TRACE_MODE_RUN 0 18533e53ae1SGuo Ren 18633e53ae1SGuo Ren static void __kprobes setup_singlestep(struct kprobe *p, 18733e53ae1SGuo Ren struct pt_regs *regs, 18833e53ae1SGuo Ren struct kprobe_ctlblk *kcb, int reenter) 18933e53ae1SGuo Ren { 19033e53ae1SGuo Ren unsigned long slot; 19133e53ae1SGuo Ren 19233e53ae1SGuo Ren if (reenter) { 19333e53ae1SGuo Ren save_previous_kprobe(kcb); 19433e53ae1SGuo Ren set_current_kprobe(p); 19533e53ae1SGuo Ren kcb->kprobe_status = KPROBE_REENTER; 19633e53ae1SGuo Ren } else { 19733e53ae1SGuo Ren kcb->kprobe_status = KPROBE_HIT_SS; 19833e53ae1SGuo Ren } 19933e53ae1SGuo Ren 20033e53ae1SGuo Ren if (p->ainsn.api.insn) { 20133e53ae1SGuo Ren /* prepare for single stepping */ 20233e53ae1SGuo Ren slot = (unsigned long)p->ainsn.api.insn; 20333e53ae1SGuo Ren 20433e53ae1SGuo Ren set_ss_context(kcb, slot, p); /* mark pending ss */ 20533e53ae1SGuo Ren 20633e53ae1SGuo Ren /* IRQs and single stepping do not mix well. */ 20733e53ae1SGuo Ren kprobes_save_local_irqflag(kcb, regs); 20833e53ae1SGuo Ren regs->sr = (regs->sr & TRACE_MODE_MASK) | TRACE_MODE_SI; 20933e53ae1SGuo Ren instruction_pointer_set(regs, slot); 21033e53ae1SGuo Ren } else { 21133e53ae1SGuo Ren /* insn simulation */ 21233e53ae1SGuo Ren arch_simulate_insn(p, regs); 21333e53ae1SGuo Ren } 21433e53ae1SGuo Ren } 21533e53ae1SGuo Ren 21633e53ae1SGuo Ren static int __kprobes reenter_kprobe(struct kprobe *p, 21733e53ae1SGuo Ren struct pt_regs *regs, 21833e53ae1SGuo Ren struct kprobe_ctlblk *kcb) 21933e53ae1SGuo Ren { 22033e53ae1SGuo Ren switch (kcb->kprobe_status) { 22133e53ae1SGuo Ren case KPROBE_HIT_SSDONE: 22233e53ae1SGuo Ren case KPROBE_HIT_ACTIVE: 22333e53ae1SGuo Ren kprobes_inc_nmissed_count(p); 22433e53ae1SGuo Ren setup_singlestep(p, regs, kcb, 1); 22533e53ae1SGuo Ren break; 22633e53ae1SGuo Ren case KPROBE_HIT_SS: 22733e53ae1SGuo Ren case KPROBE_REENTER: 22833e53ae1SGuo Ren pr_warn("Unrecoverable kprobe detected.\n"); 22933e53ae1SGuo Ren dump_kprobe(p); 23033e53ae1SGuo Ren BUG(); 23133e53ae1SGuo Ren break; 23233e53ae1SGuo Ren default: 23333e53ae1SGuo Ren WARN_ON(1); 23433e53ae1SGuo Ren return 0; 23533e53ae1SGuo Ren } 23633e53ae1SGuo Ren 23733e53ae1SGuo Ren return 1; 23833e53ae1SGuo Ren } 23933e53ae1SGuo Ren 24033e53ae1SGuo Ren static void __kprobes 24133e53ae1SGuo Ren post_kprobe_handler(struct kprobe_ctlblk *kcb, struct pt_regs *regs) 24233e53ae1SGuo Ren { 24333e53ae1SGuo Ren struct kprobe *cur = kprobe_running(); 24433e53ae1SGuo Ren 24533e53ae1SGuo Ren if (!cur) 24633e53ae1SGuo Ren return; 24733e53ae1SGuo Ren 24833e53ae1SGuo Ren /* return addr restore if non-branching insn */ 24933e53ae1SGuo Ren if (cur->ainsn.api.restore != 0) 25033e53ae1SGuo Ren regs->pc = cur->ainsn.api.restore; 25133e53ae1SGuo Ren 25233e53ae1SGuo Ren /* restore back original saved kprobe variables and continue */ 25333e53ae1SGuo Ren if (kcb->kprobe_status == KPROBE_REENTER) { 25433e53ae1SGuo Ren restore_previous_kprobe(kcb); 25533e53ae1SGuo Ren return; 25633e53ae1SGuo Ren } 25733e53ae1SGuo Ren 25833e53ae1SGuo Ren /* call post handler */ 25933e53ae1SGuo Ren kcb->kprobe_status = KPROBE_HIT_SSDONE; 26033e53ae1SGuo Ren if (cur->post_handler) { 26133e53ae1SGuo Ren /* post_handler can hit breakpoint and single step 26233e53ae1SGuo Ren * again, so we enable D-flag for recursive exception. 26333e53ae1SGuo Ren */ 26433e53ae1SGuo Ren cur->post_handler(cur, regs, 0); 26533e53ae1SGuo Ren } 26633e53ae1SGuo Ren 26733e53ae1SGuo Ren reset_current_kprobe(); 26833e53ae1SGuo Ren } 26933e53ae1SGuo Ren 27033e53ae1SGuo Ren int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr) 27133e53ae1SGuo Ren { 27233e53ae1SGuo Ren struct kprobe *cur = kprobe_running(); 27333e53ae1SGuo Ren struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 27433e53ae1SGuo Ren 27533e53ae1SGuo Ren switch (kcb->kprobe_status) { 27633e53ae1SGuo Ren case KPROBE_HIT_SS: 27733e53ae1SGuo Ren case KPROBE_REENTER: 27833e53ae1SGuo Ren /* 27933e53ae1SGuo Ren * We are here because the instruction being single 28033e53ae1SGuo Ren * stepped caused a page fault. We reset the current 28133e53ae1SGuo Ren * kprobe and the ip points back to the probe address 28233e53ae1SGuo Ren * and allow the page fault handler to continue as a 28333e53ae1SGuo Ren * normal page fault. 28433e53ae1SGuo Ren */ 28533e53ae1SGuo Ren regs->pc = (unsigned long) cur->addr; 28633e53ae1SGuo Ren if (!instruction_pointer(regs)) 28733e53ae1SGuo Ren BUG(); 28833e53ae1SGuo Ren 28933e53ae1SGuo Ren if (kcb->kprobe_status == KPROBE_REENTER) 29033e53ae1SGuo Ren restore_previous_kprobe(kcb); 29133e53ae1SGuo Ren else 29233e53ae1SGuo Ren reset_current_kprobe(); 29333e53ae1SGuo Ren 29433e53ae1SGuo Ren break; 29533e53ae1SGuo Ren case KPROBE_HIT_ACTIVE: 29633e53ae1SGuo Ren case KPROBE_HIT_SSDONE: 29733e53ae1SGuo Ren /* 29833e53ae1SGuo Ren * In case the user-specified fault handler returned 29933e53ae1SGuo Ren * zero, try to fix up. 30033e53ae1SGuo Ren */ 30133e53ae1SGuo Ren if (fixup_exception(regs)) 30233e53ae1SGuo Ren return 1; 30333e53ae1SGuo Ren } 30433e53ae1SGuo Ren return 0; 30533e53ae1SGuo Ren } 30633e53ae1SGuo Ren 30733e53ae1SGuo Ren int __kprobes 30833e53ae1SGuo Ren kprobe_breakpoint_handler(struct pt_regs *regs) 30933e53ae1SGuo Ren { 31033e53ae1SGuo Ren struct kprobe *p, *cur_kprobe; 31133e53ae1SGuo Ren struct kprobe_ctlblk *kcb; 31233e53ae1SGuo Ren unsigned long addr = instruction_pointer(regs); 31333e53ae1SGuo Ren 31433e53ae1SGuo Ren kcb = get_kprobe_ctlblk(); 31533e53ae1SGuo Ren cur_kprobe = kprobe_running(); 31633e53ae1SGuo Ren 31733e53ae1SGuo Ren p = get_kprobe((kprobe_opcode_t *) addr); 31833e53ae1SGuo Ren 31933e53ae1SGuo Ren if (p) { 32033e53ae1SGuo Ren if (cur_kprobe) { 32133e53ae1SGuo Ren if (reenter_kprobe(p, regs, kcb)) 32233e53ae1SGuo Ren return 1; 32333e53ae1SGuo Ren } else { 32433e53ae1SGuo Ren /* Probe hit */ 32533e53ae1SGuo Ren set_current_kprobe(p); 32633e53ae1SGuo Ren kcb->kprobe_status = KPROBE_HIT_ACTIVE; 32733e53ae1SGuo Ren 32833e53ae1SGuo Ren /* 32933e53ae1SGuo Ren * If we have no pre-handler or it returned 0, we 33033e53ae1SGuo Ren * continue with normal processing. If we have a 33133e53ae1SGuo Ren * pre-handler and it returned non-zero, it will 33233e53ae1SGuo Ren * modify the execution path and no need to single 33333e53ae1SGuo Ren * stepping. Let's just reset current kprobe and exit. 33433e53ae1SGuo Ren * 33533e53ae1SGuo Ren * pre_handler can hit a breakpoint and can step thru 33633e53ae1SGuo Ren * before return. 33733e53ae1SGuo Ren */ 33833e53ae1SGuo Ren if (!p->pre_handler || !p->pre_handler(p, regs)) 33933e53ae1SGuo Ren setup_singlestep(p, regs, kcb, 0); 34033e53ae1SGuo Ren else 34133e53ae1SGuo Ren reset_current_kprobe(); 34233e53ae1SGuo Ren } 34333e53ae1SGuo Ren return 1; 34433e53ae1SGuo Ren } 34533e53ae1SGuo Ren 34633e53ae1SGuo Ren /* 34733e53ae1SGuo Ren * The breakpoint instruction was removed right 34833e53ae1SGuo Ren * after we hit it. Another cpu has removed 34933e53ae1SGuo Ren * either a probepoint or a debugger breakpoint 35033e53ae1SGuo Ren * at this address. In either case, no further 35133e53ae1SGuo Ren * handling of this interrupt is appropriate. 35233e53ae1SGuo Ren * Return back to original instruction, and continue. 35333e53ae1SGuo Ren */ 35433e53ae1SGuo Ren return 0; 35533e53ae1SGuo Ren } 35633e53ae1SGuo Ren 35733e53ae1SGuo Ren int __kprobes 35833e53ae1SGuo Ren kprobe_single_step_handler(struct pt_regs *regs) 35933e53ae1SGuo Ren { 36033e53ae1SGuo Ren struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 36133e53ae1SGuo Ren 36233e53ae1SGuo Ren if ((kcb->ss_ctx.ss_pending) 36333e53ae1SGuo Ren && (kcb->ss_ctx.match_addr == instruction_pointer(regs))) { 36433e53ae1SGuo Ren clear_ss_context(kcb); /* clear pending ss */ 36533e53ae1SGuo Ren 36633e53ae1SGuo Ren kprobes_restore_local_irqflag(kcb, regs); 36733e53ae1SGuo Ren regs->sr = (regs->sr & TRACE_MODE_MASK) | TRACE_MODE_RUN; 36833e53ae1SGuo Ren 36933e53ae1SGuo Ren post_kprobe_handler(kcb, regs); 37033e53ae1SGuo Ren return 1; 37133e53ae1SGuo Ren } 37233e53ae1SGuo Ren return 0; 37333e53ae1SGuo Ren } 37433e53ae1SGuo Ren 37533e53ae1SGuo Ren /* 37633e53ae1SGuo Ren * Provide a blacklist of symbols identifying ranges which cannot be kprobed. 37733e53ae1SGuo Ren * This blacklist is exposed to userspace via debugfs (kprobes/blacklist). 37833e53ae1SGuo Ren */ 37933e53ae1SGuo Ren int __init arch_populate_kprobe_blacklist(void) 38033e53ae1SGuo Ren { 38133e53ae1SGuo Ren int ret; 38233e53ae1SGuo Ren 38333e53ae1SGuo Ren ret = kprobe_add_area_blacklist((unsigned long)__irqentry_text_start, 38433e53ae1SGuo Ren (unsigned long)__irqentry_text_end); 38533e53ae1SGuo Ren return ret; 38633e53ae1SGuo Ren } 38733e53ae1SGuo Ren 38833e53ae1SGuo Ren void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs) 38933e53ae1SGuo Ren { 390*03c8a4a4SMasami Hiramatsu return (void *)kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL); 39133e53ae1SGuo Ren } 39233e53ae1SGuo Ren 39333e53ae1SGuo Ren void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, 39433e53ae1SGuo Ren struct pt_regs *regs) 39533e53ae1SGuo Ren { 39633e53ae1SGuo Ren ri->ret_addr = (kprobe_opcode_t *)regs->lr; 397*03c8a4a4SMasami Hiramatsu ri->fp = NULL; 39833e53ae1SGuo Ren regs->lr = (unsigned long) &kretprobe_trampoline; 39933e53ae1SGuo Ren } 40033e53ae1SGuo Ren 40133e53ae1SGuo Ren int __kprobes arch_trampoline_kprobe(struct kprobe *p) 40233e53ae1SGuo Ren { 40333e53ae1SGuo Ren return 0; 40433e53ae1SGuo Ren } 40533e53ae1SGuo Ren 40633e53ae1SGuo Ren int __init arch_init_kprobes(void) 40733e53ae1SGuo Ren { 40833e53ae1SGuo Ren return 0; 40933e53ae1SGuo Ren } 410