• Nicholas Piggin's avatar
    powerpc/64: remove system call instruction emulation · a553476c
    Nicholas Piggin authored
    emulate_step() instruction emulation including sc instruction emulation
    initially appeared in xmon. It was then moved into sstep.c where kprobes
    could use it too, and later hw_breakpoint and uprobes started to use it.
    
    Until uprobes, the only instruction emulation users were for kernel
    mode instructions.
    
    - xmon only steps / breaks on kernel addresses.
    - kprobes is kernel only.
    - hw_breakpoint only emulates kernel instructions, single steps user.
    
    At one point, there was support for the kernel to execute sc
    instructions, although that is long removed and it's not clear whether
    there were any in-tree users. So system call emulation is not required
    by the above users.
    
    uprobes uses emulate_step and it appears possible to emulate sc
    instruction in userspace. Userspace system call emulation is broken and
    it's not clear it ever worked well.
    
    The big complication is that userspace takes an interrupt to the kernel
    to emulate the instruction. The user->kernel interrupt sets up registers
    and interrupt stack frame expecting to return to userspace, then system
    call instruction emulation re-directs that stack frame to the kernel,
    early in the system call interrupt handler. This means the interrupt
    return code takes the kernel->kernel restore path, which does not
    restore everything as the system call interrupt handler would expect
    coming from userspace. regs->iamr appears to get lost for example,
    because the kernel->kernel return does not restore the user iamr.
    Accounting such as irqflags tracing and CPU accounting does not get
    flipped back to user mode as the system call handler expects, so those
    appear to enter the kernel twice without returning to userspace.
    
    These things may be individually fixable with various complication, but
    it is a big complexity for unclear real benefit.
    
    Furthermore, it is not possible to single step a system call instruction
    since it causes an interrupt. As such, a separate patch disables probing
    on system call instructions.
    
    This patch removes system call emulation and disables stepping system
    calls.
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    [minor commit log edit, and also get rid of '#ifdef CONFIG_PPC64']
    Signed-off-by: default avatarNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/a412e3b3791ed83de18704c8d90f492e7a0049c0.1648648712.git.naveen.n.rao@linux.vnet.ibm.com
    a553476c
sstep.c 81.7 KB