socsvn commit: r289533 - soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm
mihai at FreeBSD.org
mihai at FreeBSD.org
Mon Aug 10 18:42:19 UTC 2015
Author: mihai
Date: Mon Aug 10 18:42:18 2015
New Revision: 289533
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=289533
Log:
sys: arm: arm: vmm: arm.c: fix gpa for inst_emul, probe vgic and map timers to the guest
Modified:
soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c
Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c
==============================================================================
--- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Mon Aug 10 18:40:58 2015 (r289532)
+++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Mon Aug 10 18:42:18 2015 (r289533)
@@ -21,6 +21,7 @@
#include "mmu.h"
#include "arm.h"
#include "hyp.h"
+#include "vgic.h"
#define HANDLED 1
#define UNHANDLED 0
@@ -146,6 +147,11 @@
printf("%s hyp_l1pd: %p, phys_hyp_l1pd %p\n", __func__, (void*) hyp_l1pd, (void*)phys_hyp_l1pd);
vmm_call_hyp(&hyp_vector[0], stack_top, LOW(phys_hyp_l1pd), HIGH(phys_hyp_l1pd));
+ /* Initialize VGIC infrastructure */
+ if (vgic_hyp_init()) {
+ return (ENXIO);
+ }
+
return 0;
}
@@ -190,6 +196,8 @@
}
hyp->vm = vm;
+ hyp->vgic_attached = false;
+
hyp->l1pd_phys = (lpae_pd_entry_t) vtophys(&hyp->l1pd[0]);
set_vttbr(hyp);
@@ -197,7 +205,7 @@
hypctx = &hyp->ctx[i];
hypctx->vcpu = i;
hypctx->hyp = hyp;
- hypctx->hcr = HCR_GUEST_MASK;
+ hypctx->hcr = HCR_GUEST_MASK & ~HCR_TSW & ~HCR_TAC & ~HCR_IMO & ~HCR_FMO;
hypctx->midr = cpu_ident();
hypctx->mpidr = (cp15_mpidr_get() & MPIDR_SMP_MASK) |
MPIDR_AFF1_LEVEL(i) |
@@ -211,6 +219,20 @@
sizeof(struct hyp),
VM_PROT_READ | VM_PROT_WRITE);
+ /* Map Timer0 SP804 */
+ lpae_vmmmap_set(hyp,
+ (lpae_vm_vaddr_t)0x1c110000,
+ (lpae_vm_paddr_t)0x1c110000,
+ PAGE_SIZE,
+ VM_PROT_READ | VM_PROT_WRITE);
+
+ lpae_vmmmap_set(hyp,
+ (lpae_vm_vaddr_t)0x1c120000,
+ (lpae_vm_paddr_t)0x1c120000,
+ PAGE_SIZE,
+ VM_PROT_READ | VM_PROT_WRITE);
+
+
return (hyp);
}
@@ -367,7 +389,8 @@
* Build the instruction info and return to user to emulate
*/
vmexit->exitcode = VM_EXITCODE_INST_EMUL;
- vmexit->u.inst_emul.gpa = vmexit->u.hyp.hdfar;
+ vmexit->u.inst_emul.gpa = ((uint64_t)(vmexit->u.hyp.hpfar >> 4) << 12) |
+ (vmexit->u.hyp.hdfar & ((1 << 12) - 1));
vmexit->u.inst_emul.vie.access_size = HSR_ISS_ACCESS_SIZE(HSR_ISS_SAS(hsr_iss));
vmexit->u.inst_emul.vie.sign_extend = HSR_ISS_SSE(hsr_iss);
vmexit->u.inst_emul.vie.dir = HSR_ISS_WnR(hsr_iss);
@@ -378,12 +401,12 @@
// vmexit->u.inst_emul.vie.dir, vmexit->u.inst_emul.vie.reg);
} else {
- printf("%s:%d DABT from guest at address %x witho a stage-2 fault != translation\n",
- __func__, __LINE__, vmexit->u.hyp.hdfar);
+ printf("%s:%d DABT from guest at address %x with hsr %x with a stage-2 fault != translation\n",
+ __func__, __LINE__, vmexit->u.hyp.hdfar, vmexit->u.hyp.hsr);
}
} else {
- printf("%s:%d DABT from guest at address %x without a stage-2 fault translation\n",
- __func__, __LINE__, vmexit->u.hyp.hdfar);
+ printf("%s:%d DABT from guest at address %x with hsr %x, hpfar: %x without a stage-2 fault translation\n",
+ __func__, __LINE__, vmexit->u.hyp.hdfar, vmexit->u.hyp.hsr, vmexit->u.hyp.hpfar);
}
break;
case HSR_EC_DABT_HYP:
More information about the svn-soc-all
mailing list