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