Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Feb 2014 19:57:00 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r262188 - in projects/arm64/sys/arm64: arm64 include
Message-ID:  <201402181957.s1IJv0JE019534@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Tue Feb 18 19:57:00 2014
New Revision: 262188
URL: http://svnweb.freebsd.org/changeset/base/262188

Log:
  If we are in EL2 drop to EL1

Added:
  projects/arm64/sys/arm64/include/armreg.h   (contents, props changed)
  projects/arm64/sys/arm64/include/hypervisor.h   (contents, props changed)
Modified:
  projects/arm64/sys/arm64/arm64/locore.S

Modified: projects/arm64/sys/arm64/arm64/locore.S
==============================================================================
--- projects/arm64/sys/arm64/arm64/locore.S	Tue Feb 18 19:52:51 2014	(r262187)
+++ projects/arm64/sys/arm64/arm64/locore.S	Tue Feb 18 19:57:00 2014	(r262188)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2014 Andrew Turner
+ * Copyright (c) 2012-2014 Andrew Turner
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -23,15 +23,32 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
+ * $FreeBSD$
  */
 
 #include "assym.s"
+#include <machine/armreg.h>
+#include <machine/hypervisor.h>
 
 	.globl	kernbase
 	.set	kernbase, KERNBASE
 
-	.globl	_start
+/*
+ * We assume:
+ *  MMU      off
+ *  D-Cache: off
+ *  I-Cache: on or off
+ *  We are loaded at a 2MiB aligned address
+ */
+
+#define	INIT_STACK_SIZE	(PAGE_SIZE * 4)
+
+	.text
+	.globl _start
 _start:
+	/* Drop to EL1 */
+	bl	drop_to_el1
+
 	/* Load the address of the fvp UART */
 	mov	x0, 0x1c090000
 	/* Load 'A' */
@@ -41,6 +58,82 @@ _start:
 
 1:	b	1b
 
+/*
+ * If we are started in EL2, configure the required hypervisor
+ * registers and drop to EL1.
+ */
+drop_to_el1:
+	mrs	x1, CurrentEL
+	lsr	x1, x1, #2
+	cmp	x1, #0x2
+	b.eq	1f
+	ret
+1:
+	/* Configure the Hypervisor */
+	mov	x2, #(HCR_RW)
+	msr	hcr_el2, x2
+
+	/* Load the Virtualization Process ID Register */
+	mrs	x2, midr_el1
+	msr	vpidr_el2, x2
+
+	/* Load the Virtualization Multiprocess ID Register */
+	mrs	x2, mpidr_el1
+	msr	vmpidr_el2, x2
+
+	/* Set the bits that need to be 1 in sctlr_el1 */
+	ldr	x2, .Lsctlr_res1
+	msr	sctlr_el1, x2
+
+	/* Don't trap to EL2 for exceptions */
+	mov	x2, #CPTR_RES1
+	msr	cptr_el2, x2
+
+	/* Don't trap to EL2 for CP15 traps */
+	msr	hstr_el2, xzr
+
+	/* Hypervisor trap functions */
+	adr	x2, hyp_vectors
+	msr	vbar_el2, x2
+
+	mov	x2, #(PSR_F | PSR_I | PSR_A | PSR_D | PSR_M_EL1h)
+	msr	spsr_el2, x2
+
+	/* Set the address to return to */
+	msr	elr_el2, x30
+
+	eret
+.Lsctlr_res1:
+	.word SCTLR_RES1
+
+#define	VECT_EMPTY	\
+    .align 7;		\
+    1:	b	1b
+
+	.align 11
+hyp_vectors:
+	VECT_EMPTY	/* Synchronous EL2t */
+	VECT_EMPTY	/* IRQ EL2t */
+	VECT_EMPTY	/* FIQ EL2t */
+	VECT_EMPTY	/* Error EL2t */
+
+	VECT_EMPTY	/* Synchronous EL2h */
+	VECT_EMPTY	/* IRQ EL2h */
+	VECT_EMPTY	/* FIQ EL2h */
+	VECT_EMPTY	/* Error EL2h */
+
+	VECT_EMPTY	/* Synchronous 64-bit EL1 */
+	VECT_EMPTY	/* IRQ 64-bit EL1 */
+	VECT_EMPTY	/* FIQ 64-bit EL1 */
+	VECT_EMPTY	/* Error 64-bit EL1 */
+
+	VECT_EMPTY	/* Synchronous 32-bit EL1 */
+	VECT_EMPTY	/* IRQ 32-bit EL1 */
+	VECT_EMPTY	/* FIQ 32-bit EL1 */
+	VECT_EMPTY	/* Error 32-bit EL1 */
+
+hyp_trap_invalid:
+	b	hyp_trap_invalid
 
 	.globl abort
 abort:

Added: projects/arm64/sys/arm64/include/armreg.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/arm64/sys/arm64/include/armreg.h	Tue Feb 18 19:57:00 2014	(r262188)
@@ -0,0 +1,84 @@
+/*-
+ * Copyright (c) 2013, 2014 Andrew Turner
+ * 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 THE 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 THE 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_ARMREG_H_
+#define	_MACHINE_ARMREG_H_
+
+/*
+ * The various *PSR registers, e.g. cpsr or cpsr.
+ *
+ * When the exception is taken in AArch64:
+ * M[4]   is 0 for AArch64 mode
+ * M[3:2] is the exception level
+ * M[1]   is unused
+ * M[0]   is the SP select:
+ *         0: always SP0
+ *         1: current ELs SP
+ */
+#define	PSR_M_EL0t	0x00000000
+#define	PSR_M_EL1t	0x00000004
+#define	PSR_M_EL1h	0x00000005
+#define	PSR_M_EL2t	0x00000008
+#define	PSR_M_EL2h	0x00000009
+
+#define	PSR_F		0x00000040
+#define	PSR_I		0x00000080
+#define	PSR_A		0x00000100
+#define	PSR_D		0x00000200
+#define	PSR_IL		0x00100000
+#define	PSR_SS		0x00200000
+#define	PSR_V		0x10000000
+#define	PSR_C		0x20000000
+#define	PSR_Z		0x40000000
+#define	PSR_N		0x80000000
+
+/* SCTLR bits */
+#define	SCTLR_RES0	0xc8222400	/* Reserved, write 0 */
+#define	SCTLR_RES1	0x30d00800	/* Reserved, write 1 */
+
+#define	SCTLR_M		0x00000001
+#define	SCTLR_A		0x00000002
+#define	SCTLR_C		0x00000004
+#define	SCTLR_SA	0x00000008
+#define	SCTLR_SA0	0x00000010
+#define	SCTLR_CP15BEN	0x00000020
+#define	SCTLR_THEE	0x00000040
+#define	SCTLR_ITD	0x00000080
+#define	SCTLR_SED	0x00000100
+#define	SCTLR_UMA	0x00000200
+#define	SCTLR_I		0x00001000
+#define	SCTLR_DZE	0x00004000
+#define	SCTLR_UCT	0x00008000
+#define	SCTLR_nTWI	0x00010000
+#define	SCTLR_nTWE	0x00040000
+#define	SCTLR_WXN	0x00080000
+#define	SCTLR_EOE	0x01000000
+#define	SCTLR_EE	0x02000000
+#define	SCTLR_UCI	0x04000000
+
+#endif

Added: projects/arm64/sys/arm64/include/hypervisor.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/arm64/sys/arm64/include/hypervisor.h	Tue Feb 18 19:57:00 2014	(r262188)
@@ -0,0 +1,85 @@
+/*-
+ * Copyright (c) 2013, 2014 Andrew Turner
+ * 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 THE 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 THE 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_HYPERVISOR_H_
+#define	_MACHINE_HYPERVISOR_H_
+
+/*
+ * These registers are only useful when in hypervisor context,
+ * e.g. specific to EL2, or controlling the hypervisor.
+ */
+
+/*
+ * Architecture feature trap register
+ */
+#define	CPTR_RES0	0x7fefc800
+#define	CPTR_RES1	0x000033ff
+#define	CPTR_TFP	0x00000400
+#define	CPTR_TTA	0x00100000
+#define	CPTR_TCPAC	0x80000000
+
+/*
+ * Hypervisor Config Register
+ */
+
+#define	HCR_VM		0x0000000000000001
+#define	HCR_SWIO	0x0000000000000002
+#define	HCR_PTW		0x0000000000000004
+#define	HCR_FMO		0x0000000000000008
+#define	HCR_IMO		0x0000000000000010
+#define	HCR_AMO		0x0000000000000020
+#define	HCR_VF		0x0000000000000040
+#define	HCR_VI		0x0000000000000080
+#define	HCR_VSE		0x0000000000000100
+#define	HCR_FB		0x0000000000000200
+#define	HCR_BSU_MASK	0x0000000000000c00
+#define	HCR_DC		0x0000000000001000
+#define	HCR_TWI		0x0000000000002000
+#define	HCR_TWE		0x0000000000004000
+#define	HCR_TID0	0x0000000000008000
+#define	HCR_TID1	0x0000000000010000
+#define	HCR_TID2	0x0000000000020000
+#define	HCR_TID3	0x0000000000040000
+#define	HCR_TSC		0x0000000000080000
+#define	HCR_TIDCP	0x0000000000100000
+#define	HCR_TACR	0x0000000000200000
+#define	HCR_TSW		0x0000000000400000
+#define	HCR_TPC		0x0000000000800000
+#define	HCR_TPU		0x0000000001000000
+#define	HCR_TTLB	0x0000000002000000
+#define	HCR_TVM		0x0000000004000000
+#define	HCR_TGE		0x0000000008000000
+#define	HCR_TDZ		0x0000000010000000
+#define	HCR_HCD		0x0000000020000000
+#define	HCR_TRVM	0x0000000040000000
+#define	HCR_RW		0x0000000080000000
+#define	HCR_CD		0x0000000100000000
+#define	HCR_ID		0x0000000200000000
+
+#endif
+



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