On Thu, May 2, 2019 at 1:22 PM Peter Zijlstra peterz@infradead.org wrote:
Something like so; it boots; but I could've made some horrible mistake (again).
This actually looks much better to me.
Maybe it's more lines (I didn't check), but it's a lot simpler in that now the magic of the int3 stack doesn't get exposed to anything else.
We *could* also make this kernel-mode-only do_int3() be a special function, and do something like
# args: pt_regs pointer (no error code for int3) movl %esp,%eax # allocate a bit of extra room on the stack, so that 'kernel_int3' can move the pt_regs subl $8,%esp call kernel_int3 movl %eax,%esp
and not do any stack switching magic in the asm code AT ALL. We'd do
struct pt_regs *kernel_int3(struct pt_regs *regs) { .. return regs; }
and now you the rule for call emulation ends up being that you need to "memmove()" the ptregs up and down properly, and return the new pt_regs pointer.
Hmm? That would simplify the asm code further, but some people might find it objectionable?
Linus