Merge branch kvm-arm64/nvhe-stacktrace into kvmarm-master/next
authorMarc Zyngier <maz@kernel.org>
Wed, 27 Jul 2022 17:33:27 +0000 (18:33 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 27 Jul 2022 17:33:27 +0000 (18:33 +0100)
* kvm-arm64/nvhe-stacktrace: (27 commits)
  : .
  : Add an overflow stack to the nVHE EL2 code, allowing
  : the implementation of an unwinder, courtesy of
  : Kalesh Singh. From the cover letter (slightly edited):
  :
  : "nVHE has two modes of operation: protected (pKVM) and unprotected
  : (conventional nVHE). Depending on the mode, a slightly different approach
  : is used to dump the hypervisor stacktrace but the core unwinding logic
  : remains the same.
  :
  : * Protected nVHE (pKVM) stacktraces:
  :
  : In protected nVHE mode, the host cannot directly access hypervisor memory.
  :
  : The hypervisor stack unwinding happens in EL2 and is made accessible to
  : the host via a shared buffer. Symbolizing and printing the stacktrace
  : addresses is delegated to the host and happens in EL1.
  :
  : * Non-protected (Conventional) nVHE stacktraces:
  :
  : In non-protected mode, the host is able to directly access the hypervisor
  : stack pages.
  :
  : The hypervisor stack unwinding and dumping of the stacktrace is performed
  : by the host in EL1, as this avoids the memory overhead of setting up
  : shared buffers between the host and hypervisor."
  :
  : Additional patches from Oliver Upton and Marc Zyngier, tidying up
  : the initial series.
  : .
  arm64: Update 'unwinder howto'
  KVM: arm64: Don't open code ARRAY_SIZE()
  KVM: arm64: Move nVHE-only helpers into kvm/stacktrace.c
  KVM: arm64: Make unwind()/on_accessible_stack() per-unwinder functions
  KVM: arm64: Move nVHE stacktrace unwinding into its own compilation unit
  KVM: arm64: Move PROTECTED_NVHE_STACKTRACE around
  KVM: arm64: Introduce pkvm_dump_backtrace()
  KVM: arm64: Implement protected nVHE hyp stack unwinder
  KVM: arm64: Save protected-nVHE (pKVM) hyp stacktrace
  KVM: arm64: Stub implementation of pKVM HYP stack unwinder
  KVM: arm64: Allocate shared pKVM hyp stacktrace buffers
  KVM: arm64: Add PROTECTED_NVHE_STACKTRACE Kconfig
  KVM: arm64: Introduce hyp_dump_backtrace()
  KVM: arm64: Implement non-protected nVHE hyp stack unwinder
  KVM: arm64: Prepare non-protected nVHE hypervisor stacktrace
  KVM: arm64: Stub implementation of non-protected nVHE HYP stack unwinder
  KVM: arm64: On stack overflow switch to hyp overflow_stack
  arm64: stacktrace: Add description of stacktrace/common.h
  arm64: stacktrace: Factor out common unwind()
  arm64: stacktrace: Handle frame pointer from different address spaces
  ...

Signed-off-by: Marc Zyngier <maz@kernel.org>
1  2 
arch/arm64/kvm/arm.c
arch/arm64/kvm/handle_exit.c
arch/arm64/kvm/hyp/nvhe/Makefile
arch/arm64/kvm/hyp/nvhe/switch.c

Simple merge
@@@ -347,12 -348,15 +348,15 @@@ void __noreturn __cold nvhe_hyp_panic_h
                        kvm_err("nVHE hyp BUG at: %s:%u!\n", file, line);
                else
                        kvm_err("nVHE hyp BUG at: [<%016llx>] %pB!\n", panic_addr,
 -                                      (void *)panic_addr);
 +                                      (void *)(panic_addr + kaslr_offset()));
        } else {
                kvm_err("nVHE hyp panic at: [<%016llx>] %pB!\n", panic_addr,
 -                              (void *)panic_addr);
 +                              (void *)(panic_addr + kaslr_offset()));
        }
  
+       /* Dump the nVHE hypervisor backtrace */
+       kvm_nvhe_dump_backtrace(hyp_offset);
        /*
         * Hyp has panicked and we're going to handle that by panicking the
         * kernel. The kernel offset will be revealed in the panic so we're
@@@ -12,13 -12,13 +12,13 @@@ HOST_EXTRACFLAGS += -I$(objtree)/includ
  lib-objs := clear_page.o copy_page.o memcpy.o memset.o
  lib-objs := $(addprefix ../../../lib/, $(lib-objs))
  
 -obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \
 +hyp-obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \
         hyp-main.o hyp-smp.o psci-relay.o early_alloc.o page_alloc.o \
-        cache.o setup.o mm.o mem_protect.o sys_regs.o pkvm.o
+        cache.o setup.o mm.o mem_protect.o sys_regs.o pkvm.o stacktrace.o
 -obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \
 +hyp-obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \
         ../fpsimd.o ../hyp-entry.o ../exception.o ../pgtable.o
 -obj-$(CONFIG_DEBUG_LIST) += list_debug.o
 -obj-y += $(lib-objs)
 +hyp-obj-$(CONFIG_DEBUG_LIST) += list_debug.o
 +hyp-obj-y += $(lib-objs)
  
  ##
  ## Build rules for compiling nVHE hyp code
Simple merge