• James Morse's avatar
    KVM: arm64: Forbid kprobing of the VHE world-switch code · 459058f0
    James Morse authored
    [ Upstream commit 7d826029 ]
    
    On systems with VHE the kernel and KVM's world-switch code run at the
    same exception level. Code that is only used on a VHE system does not
    need to be annotated as __hyp_text as it can reside anywhere in the
    kernel text.
    
    __hyp_text was also used to prevent kprobes from patching breakpoint
    instructions into this region, as this code runs at a different
    exception level. While this is no longer true with VHE, KVM still
    switches VBAR_EL1, meaning a kprobe's breakpoint executed in the
    world-switch code will cause a hyp-panic.
    
    echo "p:weasel sysreg_save_guest_state_vhe" > /sys/kernel/debug/tracing/kprobe_events
    echo 1 > /sys/kernel/debug/tracing/events/kprobes/weasel/enable
    lkvm run -k /boot/Image --console serial -p "console=ttyS0 earlycon=uart,mmio,0x3f8"
    
      # lkvm run -k /boot/Image -m 384 -c 3 --name guest-1474
      Info: Placing fdt at 0x8fe00000 - 0x8fffffff
      Info: virtio-mmio.devices=0x200@0x10000:36
    
      Info: virtio-mmio.devices=0x200@0x10200:37
    
      Info: virtio-mmio.devices=0x200@0x10400:38
    
    [  614.178186] Kernel panic - not syncing: HYP panic:
    [  614.178186] PS:404003c9 PC:ffff0000100d70e0 ESR:f2000004
    [  614.178186] FAR:0000000080080000 HPFAR:0000000000800800 PAR:1d00007edbadc0de
    [  614.178186] VCPU:00000000f8de32f1
    [  614.178383] CPU: 2 PID: 1482 Comm: kvm-vcpu-0 Not tainted 5.0.0-rc2 #10799
    [  614.178446] Call trace:
    [  614.178480]  dump_backtrace+0x0/0x148
    [  614.178567]  show_stack+0x24/0x30
    [  614.178658]  dump_stack+0x90/0xb4
    [  614.178710]  panic+0x13c/0x2d8
    [  614.178793]  hyp_panic+0xac/0xd8
    [  614.178880]  kvm_vcpu_run_vhe+0x9c/0xe0
    [  614.178958]  kvm_arch_vcpu_ioctl_run+0x454/0x798
    [  614.179038]  kvm_vcpu_ioctl+0x360/0x898
    [  614.179087]  do_vfs_ioctl+0xc4/0x858
    [  614.179174]  ksys_ioctl+0x84/0xb8
    [  614.179261]  __arm64_sys_ioctl+0x28/0x38
    [  614.179348]  el0_svc_common+0x94/0x108
    [  614.179401]  el0_svc_handler+0x38/0x78
    [  614.179487]  el0_svc+0x8/0xc
    [  614.179558] SMP: stopping secondary CPUs
    [  614.179661] Kernel Offset: disabled
    [  614.179695] CPU features: 0x003,2a80aa38
    [  614.179758] Memory Limit: none
    [  614.179858] ---[ end Kernel panic - not syncing: HYP panic:
    [  614.179858] PS:404003c9 PC:ffff0000100d70e0 ESR:f2000004
    [  614.179858] FAR:0000000080080000 HPFAR:0000000000800800 PAR:1d00007edbadc0de
    [  614.179858] VCPU:00000000f8de32f1 ]---
    
    Annotate the VHE world-switch functions that aren't marked
    __hyp_text using NOKPROBE_SYMBOL().
    Signed-off-by: default avatarJames Morse <james.morse@arm.com>
    Fixes: 3f5c90b8 ("KVM: arm64: Introduce VHE-specific kvm_vcpu_run")
    Acked-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    459058f0
switch.c 16.8 KB