From: Jan Kiszka <
jan.k...@siemens.com>
Same reasoning and some strategy as for arm: pull the exception code
into entry.S. This allows to shutdown_el2 to fall through to vmreturn.
asm/setup.h effectively becomes the new entry.h here.
hypervisor/arch/arm64/Kbuild | 3 +-
hypervisor/arch/arm64/entry.S | 80 +++++++++++++++++-
hypervisor/arch/arm64/exception.S | 98 ----------------------
hypervisor/arch/arm64/include/asm/control.h | 3 -
.../arch/arm64/include/asm/{setup.h => entry.h} | 10 +--
hypervisor/arch/arm64/setup.c | 2 +-
hypervisor/arch/arm64/traps.c | 1 +
7 files changed, 86 insertions(+), 111 deletions(-)
delete mode 100644 hypervisor/arch/arm64/exception.S
rename hypervisor/arch/arm64/include/asm/{setup.h => entry.h} (57%)
diff --git a/hypervisor/arch/arm64/Kbuild b/hypervisor/arch/arm64/Kbuild
index 91c2a912..26b9ff36 100644
--- a/hypervisor/arch/arm64/Kbuild
+++ b/hypervisor/arch/arm64/Kbuild
@@ -17,5 +17,4 @@ include $(src)/../arm-common/Kbuild
always := built-in.o
obj-y := $(COMMON_OBJECTS)
-obj-y += entry.o setup.o control.o mmio.o caches.o
-obj-y += exception.o traps.o
+obj-y += entry.o setup.o control.o mmio.o caches.o traps.o
diff --git a/hypervisor/arch/arm64/entry.S b/hypervisor/arch/arm64/entry.S
index ff57c79e..61c5dc49 100644
--- a/hypervisor/arch/arm64/entry.S
+++ b/hypervisor/arch/arm64/entry.S
@@ -272,6 +272,59 @@ bootstrap_vectors:
ventry .
+.macro handle_vmexit exit_reason
+ .align 7
+ /* Fill the struct registers. Should comply with NUM_USR_REGS */
+ stp x29, x30, [sp, #-16]!
+ stp x27, x28, [sp, #-16]!
+ stp x25, x26, [sp, #-16]!
+ stp x23, x24, [sp, #-16]!
+ stp x21, x22, [sp, #-16]!
+ stp x19, x20, [sp, #-16]!
+ stp x17, x18, [sp, #-16]!
+ stp x15, x16, [sp, #-16]!
+ stp x13, x14, [sp, #-16]!
+ stp x11, x12, [sp, #-16]!
+ stp x9, x10, [sp, #-16]!
+ stp x7, x8, [sp, #-16]!
+ stp x5, x6, [sp, #-16]!
+ stp x3, x4, [sp, #-16]!
+ stp x1, x2, [sp, #-16]!
+
+ mov x1, #\exit_reason
+ stp x1, x0, [sp, #-16]!
+
+ mov x29, xzr /* reset fp,lr */
+ mov x30, xzr
+ mrs x0, tpidr_el2
+ mov x1, sp
+ bl arch_handle_exit
+ b .
+.endm
+
+ .align 11
+hyp_vectors:
+ ventry .
+ ventry .
+ ventry .
+ ventry .
+
+ handle_vmexit EXIT_REASON_EL2_ABORT
+ ventry .
+ ventry .
+ ventry .
+
+ handle_vmexit EXIT_REASON_EL1_ABORT
+ handle_vmexit EXIT_REASON_EL1_IRQ
+ ventry .
+ ventry .
+
+ ventry .
+ ventry .
+ ventry .
+ ventry .
+
+
.pushsection .trampoline, "ax"
.globl enable_mmu_el2
enable_mmu_el2:
@@ -337,7 +390,30 @@ shutdown_el2:
msr tpidr_el2, xzr
- /* Call vmreturn(guest_registers) */
+ /* Prepare continuation as vmreturn(guest_registers). */
add x0, x0, #(PERCPU_STACK_END - 32 * 8)
- b vmreturn
+
+ /* Fall through to vmreturn */
+
+ .globl vmreturn
+vmreturn:
+ /* x0: struct registers* */
+ mov sp, x0
+ ldp x1, x0, [sp], #16 /* x1 is the exit_reason */
+ ldp x1, x2, [sp], #16
+ ldp x3, x4, [sp], #16
+ ldp x5, x6, [sp], #16
+ ldp x7, x8, [sp], #16
+ ldp x9, x10, [sp], #16
+ ldp x11, x12, [sp], #16
+ ldp x13, x14, [sp], #16
+ ldp x15, x16, [sp], #16
+ ldp x17, x18, [sp], #16
+ ldp x19, x20, [sp], #16
+ ldp x21, x22, [sp], #16
+ ldp x23, x24, [sp], #16
+ ldp x25, x26, [sp], #16
+ ldp x27, x28, [sp], #16
+ ldp x29, x30, [sp], #16
+ eret
.popsection
diff --git a/hypervisor/arch/arm64/exception.S b/hypervisor/arch/arm64/exception.S
deleted file mode 100644
index 3e5d8eb9..00000000
--- a/hypervisor/arch/arm64/exception.S
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Jailhouse AArch64 support
- *
- * Copyright (C) 2015 Huawei Technologies Duesseldorf GmbH
- *
- * Authors:
- * Antonios Motakis <
antonios...@huawei.com>
- *
- * This work is licensed under the terms of the GNU GPL, version 2. See
- * the COPYING file in the top-level directory.
- */
-
-#include <asm/processor.h>
-#include <asm/sysregs.h>
-
-.macro ventry label
- .align 7
- b \label
-.endm
-
-.macro handle_vmexit exit_reason
- .align 7
- /* Fill the struct registers. Should comply with NUM_USR_REGS */
- stp x29, x30, [sp, #-16]!
- stp x27, x28, [sp, #-16]!
- stp x25, x26, [sp, #-16]!
- stp x23, x24, [sp, #-16]!
- stp x21, x22, [sp, #-16]!
- stp x19, x20, [sp, #-16]!
- stp x17, x18, [sp, #-16]!
- stp x15, x16, [sp, #-16]!
- stp x13, x14, [sp, #-16]!
- stp x11, x12, [sp, #-16]!
- stp x9, x10, [sp, #-16]!
- stp x7, x8, [sp, #-16]!
- stp x5, x6, [sp, #-16]!
- stp x3, x4, [sp, #-16]!
- stp x1, x2, [sp, #-16]!
-
- mov x1, #\exit_reason
- stp x1, x0, [sp, #-16]!
-
- mov x29, xzr /* reset fp,lr */
- mov x30, xzr
- mrs x0, tpidr_el2
- mov x1, sp
- bl arch_handle_exit
- b .
-.endm
-
- .text
- .globl hyp_vectors
- .align 11
-hyp_vectors:
- ventry .
- ventry .
- ventry .
- ventry .
-
- handle_vmexit EXIT_REASON_EL2_ABORT
- ventry .
- ventry .
- ventry .
-
- handle_vmexit EXIT_REASON_EL1_ABORT
- handle_vmexit EXIT_REASON_EL1_IRQ
- ventry .
- ventry .
-
- ventry .
- ventry .
- ventry .
- ventry .
-
-
- .pushsection .trampoline, "ax"
- .globl vmreturn
-vmreturn:
- /* x0: struct registers* */
- mov sp, x0
- ldp x1, x0, [sp], #16 /* x1 is the exit_reason */
- ldp x1, x2, [sp], #16
- ldp x3, x4, [sp], #16
- ldp x5, x6, [sp], #16
- ldp x7, x8, [sp], #16
- ldp x9, x10, [sp], #16
- ldp x11, x12, [sp], #16
- ldp x13, x14, [sp], #16
- ldp x15, x16, [sp], #16
- ldp x17, x18, [sp], #16
- ldp x19, x20, [sp], #16
- ldp x21, x22, [sp], #16
- ldp x23, x24, [sp], #16
- ldp x25, x26, [sp], #16
- ldp x27, x28, [sp], #16
- ldp x29, x30, [sp], #16
- eret
- .popsection
diff --git a/hypervisor/arch/arm64/include/asm/control.h b/hypervisor/arch/arm64/include/asm/control.h
index 014c3d7a..904eb4ea 100644
--- a/hypervisor/arch/arm64/include/asm/control.h
+++ b/hypervisor/arch/arm64/include/asm/control.h
@@ -32,9 +32,6 @@ void arch_reset_self(struct per_cpu *cpu_data);
void arch_shutdown_self(struct per_cpu *cpu_data);
unsigned int arm_cpu_by_mpidr(struct cell *cell, unsigned long mpidr);
-void __attribute__((noreturn)) vmreturn(struct registers *guest_regs);
-void __attribute__((noreturn)) shutdown_el2(struct per_cpu *cpu_data);
-
void arm_cpu_reset(unsigned long pc);
void arm_cpu_park(void);
void arm_cpu_kick(unsigned int cpu_id);
diff --git a/hypervisor/arch/arm64/include/asm/setup.h b/hypervisor/arch/arm64/include/asm/entry.h
similarity index 57%
rename from hypervisor/arch/arm64/include/asm/setup.h
rename to hypervisor/arch/arm64/include/asm/entry.h
index 81161f85..0aa3a227 100644
--- a/hypervisor/arch/arm64/include/asm/setup.h
+++ b/hypervisor/arch/arm64/include/asm/entry.h
@@ -2,19 +2,19 @@
* Jailhouse AArch64 support
*
* Copyright (C) 2015 Huawei Technologies Duesseldorf GmbH
+ * Copyright (c) Siemens AG, 2017
*
* Authors:
* Antonios Motakis <
antonios...@huawei.com>
*
* This work is licensed under the terms of the GNU GPL, version 2. See
* the COPYING file in the top-level directory.
*/
-#ifndef _JAILHOUSE_ASM_SETUP_H
-#define _JAILHOUSE_ASM_SETUP_H
-
-#include <jailhouse/types.h>
+#include <asm/percpu.h>
void enable_mmu_el2(u64 ttbr0_el2);
+void __attribute__((noreturn)) shutdown_el2(struct per_cpu *cpu_data);
-#endif /* !_JAILHOUSE_ASM_SETUP_H */
+void __attribute__((noreturn)) vmreturn(struct registers *guest_regs);
diff --git a/hypervisor/arch/arm64/setup.c b/hypervisor/arch/arm64/setup.c
index e46f5bee..f304a4e1 100644
--- a/hypervisor/arch/arm64/setup.c
+++ b/hypervisor/arch/arm64/setup.c
@@ -16,8 +16,8 @@
#include <jailhouse/printk.h>
#include <jailhouse/processor.h>
#include <asm/control.h>
+#include <asm/entry.h>
#include <asm/irqchip.h>
-#include <asm/setup.h>
#include <asm/setup-common.h>
extern u8 __trampoline_start[];
diff --git a/hypervisor/arch/arm64/traps.c b/hypervisor/arch/arm64/traps.c
index 4a35d0d5..cd309233 100644
--- a/hypervisor/arch/arm64/traps.c
+++ b/hypervisor/arch/arm64/traps.c
@@ -14,6 +14,7 @@
#include <jailhouse/control.h>
#include <jailhouse/printk.h>
#include <asm/control.h>
+#include <asm/entry.h>
#include <asm/gic.h>
#include <asm/mmio.h>
#include <asm/psci.h>
--
2.12.3