• Mark Rutland's avatar
    arm64: armv8_deprecated: rework deprected instruction handling · 124c49b1
    Mark Rutland authored
    Support for deprecated instructions can be enabled or disabled at
    runtime. To handle this, the code in armv8_deprecated.c registers and
    unregisters undef_hooks, and makes cross CPU calls to configure HW
    support. This is rather complicated, and the synchronization required to
    make this safe ends up serializing the handling of instructions which
    have been trapped.
    
    This patch simplifies the deprecated instruction handling by removing
    the dynamic registration and unregistration, and changing the trap
    handling code to determine whether a handler should be invoked. This
    removes the need for dynamic list management, and simplifies the locking
    requirements, making it possible to handle trapped instructions entirely
    in parallel.
    
    Where changing the emulation state requires a cross-call, this is
    serialized by locally disabling interrupts, ensuring that the CPU is not
    left in an inconsistent state.
    
    To simplify sysctl management, each insn_emulation is given a separate
    sysctl table, permitting these to be registered separately. The core
    sysctl code will iterate over all of these when walking sysfs.
    
    I've tested this with userspace programs which use each of the
    deprecated instructions, and I've concurrently modified the support
    level for each of the features back-and-forth between HW and emulated to
    check that there are no spurious SIGILLs sent to userspace when the
    support level is changed.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Joey Gouly <joey.gouly@arm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20221019144123.612388-10-mark.rutland@arm.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    124c49b1
traps.c 27.2 KB