Re: [PATCH v2 4/4] x86/static_call: Add inline static call implementation for x86-64

From: Linus Torvalds
Date: Thu Nov 29 2018 - 11:50:40 EST

On Thu, Nov 29, 2018 at 8:33 AM Josh Poimboeuf <jpoimboe@xxxxxxxxxx> wrote:
> This seems to work...
> + .if \create_gap == 1
> + .rept 6
> + pushq 5*8(%rsp)
> + .endr
> + .endif
> +
> -idtentry int3 do_int3 has_error_code=0
> +idtentry int3 do_int3 has_error_code=0 create_gap=1

Ugh. Doesn't this entirely screw up the stack layout, which then
screws up task_pt_regs(), which then breaks ptrace and friends?

... and you'd only notice it for users that use int3 in user space,
which now writes random locations on the kernel stack, which is then a
huge honking security hole.

It's possible that I'm confused, but let's not play random games with
the stack like this. The entry code is sacred, in scary ways.

So no. Do *not* try to change %rsp on the stack in the bp handler.
Instead, I'd suggest:

- just restart the instruction (with the suggested "ptregs->rip --")

- to avoid any "oh, we're not making progress" issues, just fix the
instruction yourself to be the right call, by looking it up in the
"what needs to be fixed" tables.