socsvn commit: r289596 - in soc2015/mihai/bhyve-on-arm-head/sys/arm: include vmm

mihai at FreeBSD.org mihai at FreeBSD.org
Tue Aug 11 16:37:12 UTC 2015


Author: mihai
Date: Tue Aug 11 16:37:10 2015
New Revision: 289596
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289596

Log:
  sys: arm: vmm: hyp.S: save/restore vgic state at each context switch

Modified:
  soc2015/mihai/bhyve-on-arm-head/sys/arm/include/gic.h
  soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
  soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_helpers.h

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/include/gic.h
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/include/gic.h	Tue Aug 11 15:53:11 2015	(r289595)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/include/gic.h	Tue Aug 11 16:37:10 2015	(r289596)
@@ -1,7 +1,6 @@
 #ifndef _MACHINE_GIC_H_
 #define	_MACHINE_GIC_H_
 
-#include <machine/bus.h>
 
 /* We are using GICv2 register naming */
 
@@ -70,6 +69,8 @@
 #define	GIC_RES_COUNT	3
 #endif
 
+#ifndef __ASSEMBLER__
+#include <machine/bus.h>
 struct arm_gic_softc {
 	device_t		gic_dev;
 	struct resource *	gic_res[GIC_RES_COUNT];
@@ -103,5 +104,6 @@
 #endif
 
 struct arm_gic_softc *get_arm_gic_sc(void);
+#endif
 
 #endif

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S	Tue Aug 11 15:53:11 2015	(r289595)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S	Tue Aug 11 16:37:10 2015	(r289596)
@@ -30,6 +30,8 @@
 	mcr	p15, 4, r0, c13, c0, 2		@ Store hyp_vmxctx into HTPIDR
 	save_host_regs
 
+	restore_vgic_regs
+
 	/* Save HOST CP15 registers */
 	load_cp15_regs_batch1				@ Load in r2-r12 CP15 regs
 	push {r2-r12}
@@ -128,6 +130,8 @@
 	pop {r2-r12}
 	store_cp15_regs_batch1			@ Load in r2-r12 CP15 regs
 
+	save_vgic_regs
+
 	restore_host_regs
 
 	mov	r0, r1				@ r0 must hold the return value

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_helpers.h
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_helpers.h	Tue Aug 11 15:53:11 2015	(r289595)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_helpers.h	Tue Aug 11 16:37:10 2015	(r289596)
@@ -1,6 +1,7 @@
 #ifndef _VMM_HYP_HELPERS_H_
 #define	_VMM_HYP_HELPERS_H_
 
+#include <machine/gic.h>
 
 /* Banked registers */
 #define SAVE_GUEST_BANKED_REG(reg)		\
@@ -256,4 +257,64 @@
 	ldr	r3, [r0, #HYPCTX_CP15_AMAIR0];			\
 	ldr	r6, [r0, #HYPCTX_CP15_AMAIR1]
 
+
+#define save_vgic_regs						\
+	ldr	r2, [r0, #HYPCTX_VGIC_INT_CTRL];		\
+	cmp	r2, #0;						\
+	beq	1f;						\
+								\
+	ldr	r3, [r2, #GICH_HCR];				\
+	str	r3, [r0, #HYPCTX_VGIC_HCR];			\
+								\
+	ldr	r3, [r2, #GICH_VMCR];				\
+	str	r3, [r0, #HYPCTX_VGIC_VMCR];			\
+								\
+	ldr	r3, [r2, #GICH_MISR];				\
+	str	r3, [r0, #HYPCTX_VGIC_MISR];			\
+								\
+	ldr	r3, [r2, #GICH_EISR0];				\
+	ldr	r4, [r2, #GICH_EISR1];				\
+	str	r3, [r2, #HYPCTX_VGIC_EISR];			\
+	str	r4, [r2, #(HYPCTX_VGIC_EISR + 4)];		\
+								\
+	ldr	r3, [r2, #GICH_ELSR0];				\
+	ldr	r4, [r2, #GICH_ELSR1];				\
+	str	r3, [r0, #HYPCTX_VGIC_ELSR];			\
+	str	r4, [r0, #(HYPCTX_VGIC_ELSR + 4)];		\
+								\
+	ldr	r3, [r2, #GICH_APR];				\
+	str 	r3, [r0, #HYPCTX_VGIC_APR];			\
+								\
+	ldr	r3, [r0, #HYPCTX_VGIC_LR_NUM];			\
+	add	r4, r2, #GICH_LR0;				\
+	add	r5, r0, #HYPCTX_VGIC_LR;			\
+2:	ldr	r6, [r4], #4;					\
+	str	r6, [r5], #4;					\
+	subs	r3, r3, #1;					\
+	bne	2b;						\
+1:
+
+#define restore_vgic_regs					\
+	ldr	r2, [r0, #HYPCTX_VGIC_INT_CTRL];		\
+	cmp	r2, #0;						\
+	beq	3f;						\
+								\
+	ldr	r3, [r0, #HYPCTX_VGIC_HCR];			\
+	str	r3, [r2, #GICH_HCR];				\
+								\
+	ldr	r3, [r0, #HYPCTX_VGIC_VMCR];			\
+	str	r3, [r2, #GICH_VMCR];				\
+								\
+	str 	r3, [r0, #HYPCTX_VGIC_APR];			\
+	ldr	r3, [r2, #GICH_APR];				\
+								\
+	ldr	r3, [r0, #HYPCTX_VGIC_LR_NUM];			\
+	add	r4, r2, #GICH_LR0;				\
+	add	r5, r0, #HYPCTX_VGIC_LR;			\
+4:	ldr	r6, [r5], #4;					\
+	str	r6, [r4], #4;					\
+	subs	r3, r3, #1;					\
+	bne	4b;						\
+3:
+
 #endif


More information about the svn-soc-all mailing list