Loading arch/s390/kernel/kprobes.c +2 −29 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ #include <linux/preempt.h> #include <linux/stop_machine.h> #include <linux/kdebug.h> #include <linux/uaccess.h> #include <asm/cacheflush.h> #include <asm/sections.h> #include <asm/uaccess.h> #include <linux/module.h> DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; Loading Loading @@ -155,35 +155,8 @@ void __kprobes get_instruction_type(struct arch_specific_insn *ainsn) static int __kprobes swap_instruction(void *aref) { struct ins_replace_args *args = aref; u32 *addr; u32 instr; int err = -EFAULT; /* * Text segment is read-only, hence we use stura to bypass dynamic * address translation to exchange the instruction. Since stura * always operates on four bytes, but we only want to exchange two * bytes do some calculations to get things right. In addition we * shall not cross any page boundaries (vmalloc area!) when writing * the new instruction. */ addr = (u32 *)((unsigned long)args->ptr & -4UL); if ((unsigned long)args->ptr & 2) instr = ((*addr) & 0xffff0000) | args->new; else instr = ((*addr) & 0x0000ffff) | args->new << 16; asm volatile( " lra %1,0(%1)\n" "0: stura %2,%1\n" "1: la %0,0\n" "2:\n" EX_TABLE(0b,2b) : "+d" (err) : "a" (addr), "d" (instr) : "memory", "cc"); return err; return probe_kernel_write(args->ptr, &args->new, sizeof(args->new)); } void __kprobes arch_arm_kprobe(struct kprobe *p) Loading Loading
arch/s390/kernel/kprobes.c +2 −29 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ #include <linux/preempt.h> #include <linux/stop_machine.h> #include <linux/kdebug.h> #include <linux/uaccess.h> #include <asm/cacheflush.h> #include <asm/sections.h> #include <asm/uaccess.h> #include <linux/module.h> DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; Loading Loading @@ -155,35 +155,8 @@ void __kprobes get_instruction_type(struct arch_specific_insn *ainsn) static int __kprobes swap_instruction(void *aref) { struct ins_replace_args *args = aref; u32 *addr; u32 instr; int err = -EFAULT; /* * Text segment is read-only, hence we use stura to bypass dynamic * address translation to exchange the instruction. Since stura * always operates on four bytes, but we only want to exchange two * bytes do some calculations to get things right. In addition we * shall not cross any page boundaries (vmalloc area!) when writing * the new instruction. */ addr = (u32 *)((unsigned long)args->ptr & -4UL); if ((unsigned long)args->ptr & 2) instr = ((*addr) & 0xffff0000) | args->new; else instr = ((*addr) & 0x0000ffff) | args->new << 16; asm volatile( " lra %1,0(%1)\n" "0: stura %2,%1\n" "1: la %0,0\n" "2:\n" EX_TABLE(0b,2b) : "+d" (err) : "a" (addr), "d" (instr) : "memory", "cc"); return err; return probe_kernel_write(args->ptr, &args->new, sizeof(args->new)); } void __kprobes arch_arm_kprobe(struct kprobe *p) Loading