socsvn commit: r287374 - in soc2015/mihai/bhyve-on-arm-head/sys: arm/arm arm/conf conf

mihai at FreeBSD.org mihai at FreeBSD.org
Sat Jun 20 11:34:33 UTC 2015


Author: mihai
Date: Sat Jun 20 11:34:31 2015
New Revision: 287374
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287374

Log:
  soc2015: mihai: bhyve-on-arm-head: install stub handler for HYP mode in order to bhyve call it later to make the real initialization

Added:
  soc2015/mihai/bhyve-on-arm-head/sys/arm/arm/hypervisor-stub.S
Modified:
  soc2015/mihai/bhyve-on-arm-head/sys/arm/arm/locore-v6.S
  soc2015/mihai/bhyve-on-arm-head/sys/arm/conf/FVP_VE_CORTEX_A15x1
  soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm

Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/arm/hypervisor-stub.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/arm/hypervisor-stub.S	Sat Jun 20 11:34:31 2015	(r287374)
@@ -0,0 +1,57 @@
+#include "assym.s"
+#include <sys/syscall.h>
+#include <machine/asm.h>
+#include <machine/asmacros.h>
+#include <machine/armreg.h>
+#include <machine/sysreg.h>
+#include <machine/cpuconf.h>
+
+ASENTRY_NP(_hypervisor_stub_vect_install)
+
+	/* If we are not in SVC mode than return */
+	mrs	r0, cpsr
+	and	r0, r0, #(PSR_MODE)
+	cmp	r0, #(PSR_HYP32_MODE)
+	movne	pc, lr
+
+	/* Install hypervisor stub vectors. */
+	ldr	r0, =_hypervisor_stub_vect
+	mcr	p15, 4, r0, c12, c0, 0	@ set HVBAR
+
+	/* Disable all the traps in the hypervisor. */
+	mov	r0, #0
+	mcr	p15, 4, r0, c1, c1, 0	@ HCR
+	mcr	p15, 4, r0, c1, c1, 2	@ HCPTR
+	mcr	p15, 4, r0, c1, c1, 3	@ HSTR
+	mcr	p15, 4, r0, c1, c0, 0	@ HSCTLR
+
+	/* Don't disable access to perf-mon from PL0,1 */ 
+	mrc	p15, 4, r0, c1, c1, 1	@ HDCR
+	and	r0, #0x1f		@ Preserve HPMN
+	mcr	p15, 4, r0, c1, c1, 1	@ HDCR
+
+	mov	pc, lr
+END(_hypervisor_stub_vect_install)
+
+ASENTRY_NP(_hypervisor_stub_trap)
+	/*
+	 * If the first parameter is -1 than return the
+	 * exception vector (HVBAR), otherwise set it to
+	 * the value of it.
+	 */
+	cmp	r0, #-1
+	mrceq	p15, 4, r0, c12, c0, 0	@ get HVBAR
+	mcrne	p15, 4, r0, c12, c0, 0	@ set HVBAR
+	eret
+END(_hypervisor_stub_trap)
+
+
+_C_LABEL(_hypervisor_stub_vect):
+	.word 0 /* Reset */
+	.word 0 /* undev */
+	.word 0 /* SMC */
+	.word 0 /* PABT */
+	.word 0 /* DABT */
+	b	_hypervisor_stub_trap /* HYP-Mode */
+	.word 0 /* FIQ */
+	.word 0 /* IRQ */

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/arm/locore-v6.S
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/arm/locore-v6.S	Sat Jun 20 09:06:48 2015	(r287373)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/arm/locore-v6.S	Sat Jun 20 11:34:31 2015	(r287374)
@@ -67,9 +67,30 @@
 btext:
 ASENTRY_NP(_start)
 	STOP_UNWINDING		/* Can't unwind into the bootloader! */
-
-	/* Setup status register for supervisor mode, interrupts disabled */
-	msr     cpsr_fc, #0xd3
+	
+	# If HYP-MODE is active, install an exception vector stub
+	bl _hypervisor_stub_vect_install
+
+	# Return to SVC
+	mrs	r0, cpsr
+	eor	r0, r0, #(PSR_HYP32_MODE)
+	tst	r0, #(PSR_MODE)
+	bic	r0, r0, #(PSR_MODE)
+	orr	r0, r0, #(PSR_F | PSR_I | PSR_SVC32_MODE)
+	/* If we are not in HYP, we disable all interrupts and set SCVN mode */
+	bne	1f
+	/*
+	 * If we are in HYP mode set the LR from HYP-Mode to the
+	 * address of label 2: and the SPSR to the value of CPSR
+	 */
+	orr	r0, r0, #(PSR_A)
+	adr	lr, 2f
+	msr	ELR_hyp, lr
+	msr	spsr_fsxc, r0
+	eret
+1:
+	msr	cpsr_c, r0
+2:
 
 	mov	r8, r0		/* 0 or boot mode from boot2 */
 	mov	r9, r1		/* Save Machine type */

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/conf/FVP_VE_CORTEX_A15x1
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/conf/FVP_VE_CORTEX_A15x1	Sat Jun 20 09:06:48 2015	(r287373)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/conf/FVP_VE_CORTEX_A15x1	Sat Jun 20 11:34:31 2015	(r287374)
@@ -8,7 +8,7 @@
 
 cpu		CPU_CORTEXA
 machine		arm armv6
-makeoptions	CONF_CFLAGS="-march=armv7a"
+makeoptions	CONF_CFLAGS="-mcpu=cortex-a15"
 
 include 	"std.armv6"
 

Modified: soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm	Sat Jun 20 09:06:48 2015	(r287373)
+++ soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm	Sat Jun 20 11:34:31 2015	(r287374)
@@ -43,6 +43,7 @@
 arm/arm/in_cksum_arm.S		optional	inet | inet6
 arm/arm/intr.c			standard
 arm/arm/locore.S		standard	no-obj
+arm/arm/hypervisor-stub.S	standard
 arm/arm/machdep.c		standard
 arm/arm/mem.c			optional	mem
 arm/arm/minidump_machdep.c	optional	mem


More information about the svn-soc-all mailing list