Messages in this thread | | | Subject | Re: [PATCH][v2] uprobes/x86: emulate push insns for uprobe on x86 | From | Yonghong Song <> | Date | Tue, 14 Nov 2017 14:22:46 -0800 |
| |
On 11/14/17 7:34 AM, Oleg Nesterov wrote: > On 11/13, Yonghong Song wrote: >> >> On 11/13/17 4:59 AM, Oleg Nesterov wrote: >>>> + switch (opc1) { >>>> + case 0x50: >>>> + reg_offset = offsetof(struct pt_regs, r8); >>>> + break; >>>> + case 0x51: >>>> + reg_offset = offsetof(struct pt_regs, r9); >>>> + break; >>>> + case 0x52: >>>> + reg_offset = offsetof(struct pt_regs, r10); >>>> + break; >>>> + case 0x53: >>>> + reg_offset = offsetof(struct pt_regs, r11); >>>> + break; >>>> + case 0x54: >>>> + reg_offset = offsetof(struct pt_regs, r12); >>>> + break; >>>> + case 0x55: >>>> + reg_offset = offsetof(struct pt_regs, r13); >>>> + break; >>>> + case 0x56: >>>> + reg_offset = offsetof(struct pt_regs, r14); >>>> + break; >>>> + case 0x57: >>>> + reg_offset = offsetof(struct pt_regs, r15); >>>> + break; >>>> + } >>>> +#else >>>> + return -ENOSYS; >>>> +#endif >>> >>> OK, but shouldn't we also return ENOSYS if CONFIG_X86_64=y but the probed task is 32bit? >> >> Just tested with a 32bit app on x86 box and segfaults. > > Hmm. How did you verify this?
On a x86_32 box, I compiled the test case with static libraries (including static libc). And I then run this binary on x86_64 with uprobe enabled. You will need to install glibc-static package to make it work.
> > Your v3 doesn't look right and it seems you misunderstood me... > >> Yes, we would need to >> return ENOSYS if the app is 32bit on 64bit system. > > Only if insn->length == 2. "push bp" and other valid 32bit push'es should be > emulated correctly or your patch is wrong. Confused... > >>> Or in this case uprobe_init_insn(x86_64 => false) should fail and push_setup_xol_ops() >>> won't be called? > > So it doesn't fail? > > Oleg. >
| |