diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-08 08:24:38 +0900 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-08 08:24:38 +0900 |
| commit | 280c84d1c1726be7ada045735858acdc8cfdd65a (patch) | |
| tree | b9afa3fb97b08272b6952d5c8d1fe31f6a8092fa /arch/s390/kernel/kprobes.c | |
| parent | 8efdf2b759409f85953b84d52a14ea4d39c80474 (diff) | |
| parent | de9587a2f54d2d0063f0dbc775328129b9daaaa2 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 updates from Martin Schwidefsky:
"The bulk of the patches for the 3.13 merge window.
Heiko spent quite a bit of work to improve the code generation for the
kernel. That includes the exploitation of the interlocked-access
facility for the atomics and bitops implementation and the improvement
for the -march and -mtune compiler settings.
Another important change is the removal of the user_mode=home option,
user processes now always run in primary space. The storage keys are
not initialized at system startup any more, with that the storage key
removal work is complete. For the PCI support the hibernation hooks
have been implemented.
And as usual cleanup and fixes"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux: (62 commits)
s390/scm_blk: fix endless loop for requests != REQ_TYPE_FS
s390/mm,tlb: correct tlb flush on page table upgrade
s390/mm: page_table_realloc returns failure
s390: allow to set gcc -mtune flag
s390/percpu: remove this_cpu_xor() implementation
s390/vtime: correct idle time calculation
s390/time: fix get_tod_clock_ext inline assembly
tty/hvc_iucv: remove redundant NULL check
s390/dasd: Write to profile data area only if it is available
s390: convert use of typedef ctl_table to struct ctl_table
s390/pci: cleanup function information block
s390/pci: remove CONFIG_PCI_DEBUG dependancy
s390/pci: message cleanup
Update default configuration
s390: add a couple of useful defconfigs
s390/percpu: make use of interlocked-access facility 1 instructions
s390/percpu: use generic percpu ops for CONFIG_32BIT
s390/compat: make psw32_user_bits a constant value again
s390: fix handling of runtime instrumentation psw bit
s390: fix save and restore of the floating-point-control register
...
Diffstat (limited to 'arch/s390/kernel/kprobes.c')
| -rw-r--r-- | arch/s390/kernel/kprobes.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c index d86e64eddb42..59a9c35c4598 100644 --- a/arch/s390/kernel/kprobes.c +++ b/arch/s390/kernel/kprobes.c @@ -26,11 +26,12 @@ #include <linux/stop_machine.h> #include <linux/kdebug.h> #include <linux/uaccess.h> -#include <asm/cacheflush.h> -#include <asm/sections.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/hardirq.h> +#include <asm/cacheflush.h> +#include <asm/sections.h> +#include <asm/dis.h> DEFINE_PER_CPU(struct kprobe *, current_kprobe); DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); @@ -59,6 +60,8 @@ struct kprobe_insn_cache kprobe_dmainsn_slots = { static int __kprobes is_prohibited_opcode(kprobe_opcode_t *insn) { + if (!is_known_insn((unsigned char *)insn)) + return -EINVAL; switch (insn[0] >> 8) { case 0x0c: /* bassm */ case 0x0b: /* bsm */ @@ -208,7 +211,7 @@ static void __kprobes copy_instruction(struct kprobe *p) s64 disp, new_disp; u64 addr, new_addr; - memcpy(p->ainsn.insn, p->addr, ((p->opcode >> 14) + 3) & -2); + memcpy(p->ainsn.insn, p->addr, insn_length(p->opcode >> 8)); if (!is_insn_relative_long(p->ainsn.insn)) return; /* @@ -252,7 +255,7 @@ static int __kprobes s390_get_insn_slot(struct kprobe *p) p->ainsn.insn = NULL; if (is_kernel_addr(p->addr)) p->ainsn.insn = get_dmainsn_slot(); - if (is_module_addr(p->addr)) + else if (is_module_addr(p->addr)) p->ainsn.insn = get_insn_slot(); return p->ainsn.insn ? 0 : -ENOMEM; } @@ -608,7 +611,7 @@ static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs) ip += (unsigned long) p->addr - (unsigned long) p->ainsn.insn; if (fixup & FIXUP_BRANCH_NOT_TAKEN) { - int ilen = ((p->ainsn.insn[0] >> 14) + 3) & -2; + int ilen = insn_length(p->ainsn.insn[0] >> 8); if (ip - (unsigned long) p->ainsn.insn == ilen) ip = (unsigned long) p->addr + ilen; } |
