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? 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.