Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Mar 2017 14:30:02 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r315712 - in head/sys: arm/arm arm/include conf
Message-ID:  <201703221430.v2MEU25t046504@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Wed Mar 22 14:30:02 2017
New Revision: 315712
URL: https://svnweb.freebsd.org/changeset/base/315712

Log:
  Add the early hypervisor code needed on 32-bit ARMv7. This will be used
  when we bring in bhyve support.
  
  Submitted by:	Mihai Carabas <mihai.carabas AT gmail.com>
  Differential Revision:	https://reviews.freebsd.org/D10045

Added:
  head/sys/arm/arm/hypervisor-stub.S   (contents, props changed)
Modified:
  head/sys/arm/arm/locore-v6.S
  head/sys/arm/include/armreg.h
  head/sys/arm/include/asm.h
  head/sys/arm/include/sysreg.h
  head/sys/conf/files.arm

Added: head/sys/arm/arm/hypervisor-stub.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/arm/arm/hypervisor-stub.S	Wed Mar 22 14:30:02 2017	(r315712)
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 Mihai Carabas <mihai.carabas@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "assym.s"
+#include <sys/syscall.h>
+#include <machine/asm.h>
+#include <machine/asmacros.h>
+#include <machine/armreg.h>
+
+__FBSDID("$FreeBSD$");
+
+#if __ARM_ARCH >= 7
+#if defined(__ARM_ARCH_7VE__) || defined(__clang__)
+.arch_extension virt
+#endif
+
+ASENTRY_NP(hypervisor_stub_vect_install)
+
+	/* Install hypervisor stub vectors. */
+	adr	r0, hypervisor_stub_vect
+	mcr	CP15_HVBAR(r0)
+
+	/* Disable all the traps in the hypervisor. */
+	mov	r0, #0
+	mcr	CP15_HCR(r0)
+	mcr	CP15_HCPTR(r0)
+	mcr	CP15_HSTR(r0)
+	mcr	CP15_HSCTLR(r0)
+
+	/* Don't disable access to perf-mon from PL0,1 and preserve HPMN. */
+	mrc	CP15_HDCR(r0)
+	and	r0, #(ARM_CP15_HDCR_HPMN)
+	/*  Caller implicit instruction barrier in the ERET. */
+	mcr	CP15_HDCR(r0)
+
+	RET
+
+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	CP15_HVBAR(r0)
+	mcrne	CP15_HVBAR(r0)
+	ERET
+END(hypervisor_stub_trap)
+
+	.globl hypervisor_stub_vect
+	.align 5
+_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 */
+#endif /* __ARM_ARCH >= 7 */
+

Modified: head/sys/arm/arm/locore-v6.S
==============================================================================
--- head/sys/arm/arm/locore-v6.S	Wed Mar 22 13:53:21 2017	(r315711)
+++ head/sys/arm/arm/locore-v6.S	Wed Mar 22 14:30:02 2017	(r315712)
@@ -38,7 +38,6 @@
 
 __FBSDID("$FreeBSD$");
 
-
 #if __ARM_ARCH >= 7
 #if defined(__ARM_ARCH_7VE__) || defined(__clang__)
 /*
@@ -46,11 +45,6 @@ __FBSDID("$FreeBSD$");
  * when enabled. llvm >= 3.6 supports it too.
  */
 .arch_extension virt
-#define	MSR_ELR_HYP(regnum)	msr	elr_hyp, lr
-#define	ERET	eret
-#else
-#define MSR_ELR_HYP(regnum) .word (0xe12ef300 | regnum)
-#define ERET .word 0xe160006e
 #endif
 #endif /* __ARM_ARCH >= 7 */
 
@@ -61,12 +55,17 @@ __FBSDID("$FreeBSD$");
 	.align	2
 
 #if __ARM_ARCH >= 7
-#define	LEAVE_HYP							\
+#define	HANDLE_HYP							\
 	/* Leave HYP mode */						;\
 	mrs	r0, cpsr						;\
 	and	r0, r0, #(PSR_MODE)   /* Mode is in the low 5 bits of CPSR */ ;\
 	teq	r0, #(PSR_HYP32_MODE) /* Hyp Mode? */			;\
 	bne	1f							;\
+	/* Install Hypervisor Stub Exception Vector */			;\
+	bl hypervisor_stub_vect_install					;\
+	mov	r0, 0							;\
+	adr	r1, hypmode_enabled					;\
+	str	r0, [r1]						;\
 	/* Ensure that IRQ, FIQ and Aborts will be disabled after eret */ ;\
 	mrs	r0, cpsr						;\
 	bic	r0, r0, #(PSR_MODE)					;\
@@ -74,12 +73,16 @@ __FBSDID("$FreeBSD$");
 	orr	r0, r0, #(PSR_I | PSR_F | PSR_A)			;\
 	msr	spsr_cxsf, r0						;\
 	/* Exit hypervisor mode */					;\
-	adr	lr, 1f							;\
+	adr	lr, 2f							;\
 	MSR_ELR_HYP(14)							;\
 	ERET								;\
-1:
+1:									;\
+	mov	r0, -1							;\
+	adr	r1, hypmode_enabled					;\
+	str	r0, [r1]						;\
+2:
 #else
-#define	LEAVE_HYP
+#define	HANDLE_HYP
 #endif /* __ARM_ARCH >= 7 */
 
 /*
@@ -107,7 +110,8 @@ ASENTRY_NP(_start)
 	mov	r10, r2		/* Save meta data */
 	mov	r11, r3		/* Future expansion */
 
-	LEAVE_HYP
+	# If HYP-MODE is active, install an exception vector stub
+	HANDLE_HYP
 
 	/*
 	 * Check whether data cache is enabled.  If it is, then we know
@@ -411,6 +415,9 @@ build_pagetables:
 
 VA_TO_PA_POINTER(Lpagetable, boot_pt1)
 
+	.global _C_LABEL(hypmode_enabled)
+_C_LABEL(hypmode_enabled):
+	.word 0
 
 .Lstart:
 	.word	_edata			/* Note that these three items are */
@@ -444,7 +451,7 @@ ASENTRY_NP(mpentry)
 	/* Make sure interrupts are disabled. */
 	cpsid	ifa
 
-	LEAVE_HYP
+	HANDLE_HYP
 
 	/* Setup core, disable all caches. */
 	mrc	CP15_SCTLR(r0)

Modified: head/sys/arm/include/armreg.h
==============================================================================
--- head/sys/arm/include/armreg.h	Wed Mar 22 13:53:21 2017	(r315711)
+++ head/sys/arm/include/armreg.h	Wed Mar 22 14:30:02 2017	(r315712)
@@ -477,4 +477,7 @@
 
 #define THUMB_INSN_SIZE		2		/* Some are 4 bytes.  */
 
+/* ARM Hypervisor Related Defines */
+#define	ARM_CP15_HDCR_HPMN	0x0000001f
+
 #endif /* !MACHINE_ARMREG_H */

Modified: head/sys/arm/include/asm.h
==============================================================================
--- head/sys/arm/include/asm.h	Wed Mar 22 13:53:21 2017	(r315711)
+++ head/sys/arm/include/asm.h	Wed Mar 22 14:30:02 2017	(r315712)
@@ -235,6 +235,15 @@
 #define DSB	dsb
 #define DMB	dmb
 #define WFI	wfi
+
+#if defined(__ARM_ARCH_7VE__) || defined(__clang__)
+#define	MSR_ELR_HYP(regnum)	msr	elr_hyp, lr
+#define	ERET	eret
+#else
+#define MSR_ELR_HYP(regnum) .word (0xe12ef300 | regnum)
+#define ERET .word 0xe160006e
+#endif
+
 #elif __ARM_ARCH == 6
 #define ISB	mcr CP15_CP15ISB
 #define DSB	mcr CP15_CP15DSB

Modified: head/sys/arm/include/sysreg.h
==============================================================================
--- head/sys/arm/include/sysreg.h	Wed Mar 22 13:53:21 2017	(r315711)
+++ head/sys/arm/include/sysreg.h	Wed Mar 22 14:30:02 2017	(r315712)
@@ -76,6 +76,12 @@
 #define	CP15_ID_MMFR2(rr)	p15, 0, rr, c0, c1,  6 /* Memory Model Feature Register 2 */
 #define	CP15_ID_MMFR3(rr)	p15, 0, rr, c0, c1,  7 /* Memory Model Feature Register 3 */
 
+#define	CP15_HCR(rr)		p15, 4, rr, c1, c1, 0 /* Hyp Configuration Register */
+#define	CP15_HCPTR(rr)		p15, 4, rr, c1, c1, 2 /* Hyp Coprocessor Trap Register */
+#define	CP15_HSTR(rr)		p15, 4, rr, c1, c1, 3 /* Hyp System Trap Register */
+#define	CP15_HSCTLR(rr)		p15, 4, rr, c1, c0, 0 /* Hyp System Control Register */
+#define	CP15_HDCR(rr)		p15, 4, rr, c1, c1, 1 /* Hyp Debug Configuration Register */
+
 #define	CP15_ID_ISAR0(rr)	p15, 0, rr, c0, c2,  0 /* Instruction Set Attribute Register 0 */
 #define	CP15_ID_ISAR1(rr)	p15, 0, rr, c0, c2,  1 /* Instruction Set Attribute Register 1 */
 #define	CP15_ID_ISAR2(rr)	p15, 0, rr, c0, c2,  2 /* Instruction Set Attribute Register 2 */
@@ -265,6 +271,7 @@
 #define	CP15_MVBAR(rr)		p15, 0, rr, c12, c0, 1 /* Monitor Vector Base Address Register */
 
 #define	CP15_ISR(rr)		p15, 0, rr, c12, c1, 0 /* Interrupt Status Register */
+#define	CP15_HVBAR(rr)		p15, 4, rr, c12, c0, 0 /* Hyp Vector Base Address Register*/
 
 /*
  * CP15 C13 registers

Modified: head/sys/conf/files.arm
==============================================================================
--- head/sys/conf/files.arm	Wed Mar 22 13:53:21 2017	(r315711)
+++ head/sys/conf/files.arm	Wed Mar 22 14:30:02 2017	(r315712)
@@ -67,6 +67,7 @@ arm/arm/in_cksum_arm.S		optional	inet | 
 arm/arm/intr.c			optional	!intrng
 kern/subr_intr.c		optional	intrng
 arm/arm/locore.S		standard	no-obj
+arm/arm/hypervisor-stub.S	optional	armv6
 arm/arm/machdep.c		standard
 arm/arm/machdep_boot.c		standard
 arm/arm/machdep_kdb.c		standard



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703221430.v2MEU25t046504>