From: Anders Berg <anders.b...@intel.com>

CPU4: Booted secondary processor
Kernel panic - not syncing: unexpected prefetch abort in Hyp mode at: 0x921680
unexpected data abort in Hyp mode at: 0xc0916c2c
unexpected HVC/SVC trap in Hyp mode at: 0xc0b2d4a0
CPU: 4 PID: 0 Comm: swapper/4 Not tainted 3.10.38-ltsi-00013-g59f309e-dirty #96
[<c0421658>] (unwind_backtrace+0x0/0xf8) from [<c041df54>] 
(show_stack+0x10/0x14)
[<c041df54>] (show_stack+0x10/0x14) from [<c0916cbc>] (panic+0x90/0x1e4)
[<c0916cbc>] (panic+0x90/0x1e4) from [<c0413048>] (cpu_init_hyp_mode+0x10/0x6c)
[<c0413048>] (cpu_init_hyp_mode+0x10/0x6c) from [<c04130c8>] 
(hyp_init_cpu_notify+0x24/0x2c)
[<c04130c8>] (hyp_init_cpu_notify+0x24/0x2c) from [<c091f744>] 
(notifier_call_chain+0x44/0x84)
[<c091f744>] (notifier_call_chain+0x44/0x84) from [<c04343e8>] 
(__cpu_notify+0x28/0x44)
[<c04343e8>] (__cpu_notify+0x28/0x44) from [<c09148a0>] 
(secondary_start_kernel+0xd4/0x120)
[<c09148a0>] (secondary_start_kernel+0xd4/0x120) from [<c042d4c0>] 
(axxia_platform_cpu_die+0x54/0xa0)

The fix for this crash was obtained from from upstream kernel.org (relevant
parts of):

   commit 37a34ac1 "arm: kvm: fix CPU hotplug"
   commit b20c9f29 "arm/arm64: KVM: detect CPU reset on CPU_PM_EXIT"

Signed-off-by: Anders Berg <anders.b...@intel.com>
---
 arch/arm/kvm/arm.c        |  3 ++-
 arch/arm/kvm/interrupts.S | 11 ++++++++++-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index ef1703b..34dff05 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -824,7 +824,8 @@ static int hyp_init_cpu_notify(struct notifier_block *self,
        switch (action) {
        case CPU_STARTING:
        case CPU_STARTING_FROZEN:
-               cpu_init_hyp_mode(NULL);
+               if (__hyp_get_vectors() == hyp_default_vectors)
+                       cpu_init_hyp_mode(NULL);
                break;
        }
 
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
index 16cd4ba..723bcef 100644
--- a/arch/arm/kvm/interrupts.S
+++ b/arch/arm/kvm/interrupts.S
@@ -220,6 +220,10 @@ after_vfp_restore:
  * in Hyp mode (see init_hyp_mode in arch/arm/kvm/arm.c).  Return values are
  * passed in r0 and r1.
  *
+ * A function pointer with a value of 0xffffffff has a special meaning,
+ * and is used to implement __hyp_get_vectors in the same way as in
+ * arch/arm/kernel/hyp_stub.S.
+ *
  * The calling convention follows the standard AAPCS:
  *   r0 - r3: caller save
  *   r12:     caller save
@@ -363,6 +367,11 @@ hyp_hvc:
 host_switch_to_hyp:
        pop     {r0, r1, r2}
 
+       /* Check for __hyp_get_vectors */
+       cmp     r0, #-1
+       mrceq   p15, 4, r0, c12, c0, 0  @ get HVBAR
+       beq     1f
+
        push    {lr}
        mrs     lr, SPSR
        push    {lr}
@@ -378,7 +387,7 @@ THUMB(      orr     lr, #1)
        pop     {lr}
        msr     SPSR_csxf, lr
        pop     {lr}
-       eret
+1:     eret
 
 guest_trap:
        load_vcpu                       @ Load VCPU pointer to r0
-- 
1.8.1.4

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to