socsvn commit: r288506 - in soc2015/mihai/bhyve-on-arm-head: sys/arm/include sys/arm/vmm usr.sbin/bhyvearm

mihai at FreeBSD.org mihai at FreeBSD.org
Fri Jul 17 20:08:34 UTC 2015


Author: mihai
Date: Fri Jul 17 20:08:30 2015
New Revision: 288506
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288506

Log:
  soc2015: mihai: bhyve: sys: arm: vmm: save the exception state from HYP mode and add the main exception stubs

Modified:
  soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h
  soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c
  soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h
  soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
  soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_genassym.c
  soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c
  soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h	Fri Jul 17 19:10:43 2015	(r288505)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h	Fri Jul 17 20:08:30 2015	(r288506)
@@ -250,6 +250,7 @@
 	VM_EXITCODE_PAUSE,
 	VM_EXITCODE_PAGING,
 	VM_EXITCODE_SPINUP_AP,
+	VM_EXITCODE_HYP,
 	VM_EXITCODE_MAX
 };
 
@@ -273,6 +274,17 @@
 	int			inst_length;	/* 0 means unknown */
 	uint64_t		pc;
 	union {
+		/*
+		 * ARM specific payload.
+		 */
+		struct {
+			uint32_t	exception_nr;
+			uint32_t	hsr;	/* Hyp Syndrome Register */
+			uint32_t	hdfar;	/* VA at a Data Abort exception */
+			uint32_t	hifar;	/* VA at a Prefetch Abort exception */
+			uint32_t	hpfar;	/* IPA[39:12] at aborts on stage 2 address translations */
+		} hyp;
+
 		struct {
 			uint64_t	gpa;
 			int		fault_type;

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c	Fri Jul 17 19:10:43 2015	(r288505)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c	Fri Jul 17 20:08:30 2015	(r288506)
@@ -215,6 +215,48 @@
 }
 
 static int
+hyp_exit_process(struct hyp *hyp, int vcpu, struct vm_exit *vmexit)
+{
+	int handled;
+	struct hypctx *hypctx;
+	
+	hypctx = &hyp->ctx[vcpu];
+
+	handled = UNHANDLED;
+
+	vmexit->exitcode = VM_EXITCODE_BOGUS;
+
+	switch(vmexit->u.hyp.exception_nr) {
+	case EXCEPTION_UNDEF:
+		panic("%s undefined exception\n", __func__);
+		break;
+	case EXCEPTION_SVC:
+		panic("%s take SVC exception to hyp mode\n", __func__);
+		break;
+	/* The following are in the same category and are distinguished using HSR */
+	case EXCEPTION_PABT:
+	case EXCEPTION_DABT:
+	case EXCEPTION_HVC:
+		printf("%s PABT/DABT/HYP unimplemented exception\n",__func__);
+		vmexit->exitcode = VM_EXITCODE_HYP;
+		break;
+	case EXCEPTION_FIQ:
+		printf("%s FIQ unsupported exception\n",__func__);
+		vmexit->exitcode = VM_EXITCODE_HYP;
+		break;
+	case EXCEPTION_IRQ:
+		printf("%s IRQ unsupported exception\n",__func__);
+		vmexit->exitcode = VM_EXITCODE_HYP;
+		break;
+	default:
+		printf("%s unknown exception: %d\n",__func__, vmexit->u.hyp.exception_nr);
+		vmexit->exitcode = VM_EXITCODE_HYP;
+		break;
+	}
+	return (handled);
+}
+
+static int
 arm_vmrun(void *arg, int vcpu, register_t pc, pmap_t pmap, 
 	void *rend_cookie, void *suspended_cookie)
 {
@@ -223,17 +265,28 @@
 	struct hyp *hyp;
 	struct hypctx *hypctx;
 	struct vm *vm;
+	struct vm_exit *vmexit;
 
 	hyp = arg;
 	hypctx = &hyp->ctx[vcpu];
 	vm = hyp->vm;
+	vmexit = vm_exitinfo(vm, vcpu);
 
 	do {
 		handled = UNHANDLED;
 
 		rc = vmm_call_hyp((void *)hyp_enter_guest, hypctx);
+		
 		printf("%s rc: %d\n",__func__, rc);
-//		handled = HANDLED;
+		vmexit->pc = hypctx->regs.r_pc;
+		vmexit->inst_length = 4; /* TODO -> HSR[25] */
+		vmexit->u.hyp.exception_nr = rc;
+		vmexit->u.hyp.hsr = hypctx->exit_info.hsr;
+		vmexit->u.hyp.hifar = hypctx->exit_info.hifar;
+		vmexit->u.hyp.hdfar = hypctx->exit_info.hdfar;
+		vmexit->u.hyp.hpfar = hypctx->exit_info.hpfar;
+
+		handled = hyp_exit_process(hyp, vcpu, vmexit);
 
 	} while(handled);
 	return 0;

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h	Fri Jul 17 19:10:43 2015	(r288505)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.h	Fri Jul 17 20:08:30 2015	(r288506)
@@ -61,6 +61,12 @@
 	uint64_t	cp15_par;
 	uint32_t	cp15_amair0;
 	uint32_t	cp15_amair1;
+	struct {
+		uint32_t	hsr;	/* Hyp Syndrome Register */
+		uint32_t	hdfar;	/* VA at a Data Abort exception */
+		uint32_t	hifar;	/* VA at a Prefetch Abort exception */
+		uint32_t	hpfar;	/* IPA[39:12] at aborts on stage 2 address translations */
+	} exit_info;
 
 };
 

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S	Fri Jul 17 19:10:43 2015	(r288505)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.S	Fri Jul 17 20:08:30 2015	(r288506)
@@ -78,6 +78,16 @@
 	 * guest r0-r2 saved on stack when trapping in HYP mode 
 	 */
 	
+	/* Save exit status registers */
+	mrc	p15, 4, r2, c5, c2, 0	@ Load HSR
+	str	r2, [r0, #HYPCTX_EXIT_INFO_HSR]
+	mrc	p15, 4, r2, c6, c0, 2	@ Load HIFAR
+	str	r2, [r0, #HYPCTX_EXIT_INFO_HIFAR]
+	mrc	p15, 4, r2, c6, c0, 0	@ Load HDFAR
+	str	r2, [r0, #HYPCTX_EXIT_INFO_HDFAR]
+	mrc	p15, 4, r2, c6, c0, 4	@ Load HPFAR
+	str	r2, [r0, #HYPCTX_EXIT_INFO_HPFAR]
+
 	save_guest_regs
 	
 	/* Disable trap access to the CP10/CP11 [vfp/simd] */
@@ -293,12 +303,10 @@
 	eret
 
 guest_trap:
-	/* Load hypctx in r0 from HTPIDR*/
+	/* Load hypctx in r0 from HTPIDR */
 	mrc	p15, 4, r0, c13, c0, 2
 	mov	r1, #EXCEPTION_HVC
 
-	// TODO: check exception cause and load status registers in hypctx
-
 	b	hyp_exit_guest
 
 	.align

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_genassym.c
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_genassym.c	Fri Jul 17 19:10:43 2015	(r288505)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp_genassym.c	Fri Jul 17 20:08:30 2015	(r288506)
@@ -71,6 +71,13 @@
 ASSYM(HYPCTX_CP15_AMAIR0, offsetof(struct hypctx, cp15_amair0));
 ASSYM(HYPCTX_CP15_AMAIR1, offsetof(struct hypctx, cp15_amair1));
 
+ASSYM(HYPCTX_EXIT_INFO_HSR, offsetof(struct hypctx, exit_info.hsr));
+ASSYM(HYPCTX_EXIT_INFO_HDFAR, offsetof(struct hypctx, exit_info.hdfar));
+ASSYM(HYPCTX_EXIT_INFO_HIFAR, offsetof(struct hypctx, exit_info.hifar));
+ASSYM(HYPCTX_EXIT_INFO_HPFAR, offsetof(struct hypctx, exit_info.hpfar));
+
+
+
 
 
 

Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c	Fri Jul 17 19:10:43 2015	(r288505)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c	Fri Jul 17 20:08:30 2015	(r288506)
@@ -149,6 +149,19 @@
 	vcpu->vcpuid = vcpu_id;
 }
 
+struct vm_exit *
+vm_exitinfo(struct vm *vm, int cpuid)
+{
+	struct vcpu *vcpu;
+
+	if (cpuid < 0 || cpuid >= VM_MAXCPU)
+		panic("vm_exitinfo: invalid cpuid %d", cpuid);
+
+	vcpu = &vm->vcpu[cpuid];
+
+	return (&vcpu->exitinfo);
+}
+
 static int
 vmm_init(void)
 {

Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c	Fri Jul 17 19:10:43 2015	(r288505)
+++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c	Fri Jul 17 20:08:30 2015	(r288506)
@@ -150,7 +150,10 @@
 	snprintf(tname, sizeof(tname), "%s vcpu %d", vmname, vcpu);
 	pthread_set_name_np(mtp->mt_thr, tname);
 
+	printf("%s %s\n",__func__, tname);
+
 	vm_loop(mtp->mt_ctx, vcpu, vmexit[vcpu].pc);
+	printf("%s %s aftervm_loop\n",__func__, tname);
 
 	/* not reached */
 	exit(1);
@@ -219,11 +222,11 @@
 }
 
 static int
-vmexit_vmx(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu)
+vmexit_hyp(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu)
 {
 
 	fprintf(stderr, "vm exit[%d]\n", *pvcpu);
-	fprintf(stderr, "\treason\t\tVMX\n");
+	fprintf(stderr, "\treason\t\tHYP\n");
 	fprintf(stderr, "\tpc\t\t0x%016llx\n", vmexit->pc);
 	fprintf(stderr, "\tinst_length\t%d\n", vmexit->inst_length);
 
@@ -297,7 +300,7 @@
 }
 
 static vmexit_handler_t handler[VM_EXITCODE_MAX] = {
-	[VM_EXITCODE_VMX]    = vmexit_vmx,
+	[VM_EXITCODE_HYP]    = vmexit_hyp,
 	[VM_EXITCODE_BOGUS]  = vmexit_bogus,
 	[VM_EXITCODE_MTRAP]  = vmexit_mtrap,
 	[VM_EXITCODE_PAGING] = vmexit_paging,
@@ -317,9 +320,13 @@
 					       sizeof(mask), &mask);
 		assert(error == 0);
 	}
-
+	printf("%s\n",__func__);
 	while (1) {
+		printf("%s 2\n",__func__);
+
 		error = vm_run(ctx, vcpu, pc, &vmexit[vcpu]);
+		printf("%s 3\n",__func__);
+
 		if (error != 0) {
 			/*
 			 * It is possible that 'vmmctl' or some other process
@@ -451,7 +458,7 @@
 
 	error = vm_get_register(ctx, BSP, VM_REG_GUEST_PC, &pc);
 	assert(error == 0);
-
+	printf("%s pc: %llx\n",__func__, pc);
 	/*
 	 * Add CPU 0
 	 */


More information about the svn-soc-all mailing list