From owner-svn-soc-all@freebsd.org Fri Jul 17 20:08:34 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 373F29A2850 for ; Fri, 17 Jul 2015 20:08:34 +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 265211CAA for ; Fri, 17 Jul 2015 20:08:34 +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 t6HK8YNF011503 for ; Fri, 17 Jul 2015 20:08:34 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6HK8VB0011468 for svn-soc-all@FreeBSD.org; Fri, 17 Jul 2015 20:08:31 GMT (envelope-from mihai@FreeBSD.org) Date: Fri, 17 Jul 2015 20:08:31 GMT Message-Id: <201507172008.t6HK8VB0011468@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: r288506 - in soc2015/mihai/bhyve-on-arm-head: sys/arm/include sys/arm/vmm usr.sbin/bhyvearm 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: Fri, 17 Jul 2015 20:08:34 -0000 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 */