From owner-svn-soc-all@freebsd.org Mon Aug 10 18:42:19 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9AE3299E797 for ; Mon, 10 Aug 2015 18:42:19 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7F8096D0 for ; Mon, 10 Aug 2015 18:42:19 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t7AIgJjt075527 for ; Mon, 10 Aug 2015 18:42:19 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t7AIgIOe075498 for svn-soc-all@FreeBSD.org; Mon, 10 Aug 2015 18:42:18 GMT (envelope-from mihai@FreeBSD.org) Date: Mon, 10 Aug 2015 18:42:18 GMT Message-Id: <201508101842.t7AIgIOe075498@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r289533 - soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 10 Aug 2015 18:42:19 -0000 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: