diff options
Diffstat (limited to 'usr/src/uts')
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/amd/svm.c | 36 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/amd/svm_msr.c | 5 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/amd/svm_msr.h | 6 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/intel/vmx.c | 39 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/intel/vmx_msr.c | 4 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/intel/vmx_msr.h | 4 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/io/vhpet.c | 8 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/io/vhpet.h | 12 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/io/vioapic.c | 8 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/io/vioapic.h | 20 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/io/vlapic.c | 14 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/io/vlapic.h | 6 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/sys/vmm_instruction_emul.h | 2 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/sys/vmm_kernel.h | 2 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/vmm.c | 178 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c | 96 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/vmm_lapic.c | 18 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/vmm_lapic.h | 22 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c | 12 | ||||
-rw-r--r-- | usr/src/uts/i86pc/sys/vmm.h | 2 |
20 files changed, 236 insertions, 258 deletions
diff --git a/usr/src/uts/i86pc/io/vmm/amd/svm.c b/usr/src/uts/i86pc/io/vmm/amd/svm.c index e9a34f8630..dd9d5a55a8 100644 --- a/usr/src/uts/i86pc/io/vmm/amd/svm.c +++ b/usr/src/uts/i86pc/io/vmm/amd/svm.c @@ -1112,7 +1112,7 @@ clear_nmi_blocking(struct svm_softc *sc, int vcpu) #define EFER_MBZ_BITS 0xFFFFFFFFFFFF0200UL static int -svm_write_efer(struct svm_softc *sc, int vcpu, uint64_t newval, bool *retu) +svm_write_efer(struct svm_softc *sc, int vcpu, uint64_t newval) { struct vm_exit *vme; struct vmcb_state *state; @@ -1157,8 +1157,7 @@ svm_write_efer(struct svm_softc *sc, int vcpu, uint64_t newval, bool *retu) if (newval & EFER_LMSLE) { vme = vm_exitinfo(sc->vm, vcpu); vm_exit_svm(vme, VMCB_EXIT_MSR, 1, 0); - *retu = true; - return (0); + return (-1); } if (newval & EFER_FFXSR) { @@ -1180,23 +1179,22 @@ gpf: } static int -emulate_wrmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t val, - bool *retu) +emulate_wrmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t val) { int error; if (lapic_msr(num)) - error = lapic_wrmsr(sc->vm, vcpu, num, val, retu); + error = lapic_wrmsr(sc->vm, vcpu, num, val); else if (num == MSR_EFER) - error = svm_write_efer(sc, vcpu, val, retu); + error = svm_write_efer(sc, vcpu, val); else - error = svm_wrmsr(sc, vcpu, num, val, retu); + error = svm_wrmsr(sc, vcpu, num, val); return (error); } static int -emulate_rdmsr(struct svm_softc *sc, int vcpu, u_int num, bool *retu) +emulate_rdmsr(struct svm_softc *sc, int vcpu, u_int num) { struct vmcb_state *state; struct svm_regctx *ctx; @@ -1204,9 +1202,9 @@ emulate_rdmsr(struct svm_softc *sc, int vcpu, u_int num, bool *retu) int error; if (lapic_msr(num)) - error = lapic_rdmsr(sc->vm, vcpu, num, &result, retu); + error = lapic_rdmsr(sc->vm, vcpu, num, &result); else - error = svm_rdmsr(sc, vcpu, num, &result, retu); + error = svm_rdmsr(sc, vcpu, num, &result); if (error == 0) { state = svm_get_vmcb_state(sc, vcpu); @@ -1302,7 +1300,6 @@ svm_vmexit(struct svm_softc *svm_sc, int vcpu, struct vm_exit *vmexit) #else int error, errcode_valid = 0, handled, idtvec, reflect; #endif - bool retu; ctx = svm_get_guest_regctx(svm_sc, vcpu); vmcb = svm_get_vmcb(svm_sc, vcpu); @@ -1438,19 +1435,19 @@ svm_vmexit(struct svm_softc *svm_sc, int vcpu, struct vm_exit *vmexit) eax = state->rax; ecx = ctx->sctx_rcx; edx = ctx->sctx_rdx; - retu = false; if (info1) { vmm_stat_incr(svm_sc->vm, vcpu, VMEXIT_WRMSR, 1); val = (uint64_t)edx << 32 | eax; VCPU_CTR2(svm_sc->vm, vcpu, "wrmsr %x val %lx", ecx, val); - if (emulate_wrmsr(svm_sc, vcpu, ecx, val, &retu)) { + error = emulate_wrmsr(svm_sc, vcpu, ecx, val); + if (error == 0) { + handled = 1; + } else if (error > 0) { vmexit->exitcode = VM_EXITCODE_WRMSR; vmexit->u.msr.code = ecx; vmexit->u.msr.wval = val; - } else if (!retu) { - handled = 1; } else { KASSERT(vmexit->exitcode != VM_EXITCODE_BOGUS, ("emulate_wrmsr retu with bogus exitcode")); @@ -1458,11 +1455,12 @@ svm_vmexit(struct svm_softc *svm_sc, int vcpu, struct vm_exit *vmexit) } else { VCPU_CTR1(svm_sc->vm, vcpu, "rdmsr %x", ecx); vmm_stat_incr(svm_sc->vm, vcpu, VMEXIT_RDMSR, 1); - if (emulate_rdmsr(svm_sc, vcpu, ecx, &retu)) { + error = emulate_rdmsr(svm_sc, vcpu, ecx); + if (error == 0) { + handled = 1; + } else if (error > 0) { vmexit->exitcode = VM_EXITCODE_RDMSR; vmexit->u.msr.code = ecx; - } else if (!retu) { - handled = 1; } else { KASSERT(vmexit->exitcode != VM_EXITCODE_BOGUS, ("emulate_rdmsr retu with bogus exitcode")); diff --git a/usr/src/uts/i86pc/io/vmm/amd/svm_msr.c b/usr/src/uts/i86pc/io/vmm/amd/svm_msr.c index ea344165dd..abea850244 100644 --- a/usr/src/uts/i86pc/io/vmm/amd/svm_msr.c +++ b/usr/src/uts/i86pc/io/vmm/amd/svm_msr.c @@ -144,8 +144,7 @@ svm_msr_guest_exit(struct svm_softc *sc, int vcpu) } int -svm_rdmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t *result, - bool *retu) +svm_rdmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t *result) { int error = 0; @@ -181,7 +180,7 @@ svm_rdmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t *result, } int -svm_wrmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t val, bool *retu) +svm_wrmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t val) { int error = 0; diff --git a/usr/src/uts/i86pc/io/vmm/amd/svm_msr.h b/usr/src/uts/i86pc/io/vmm/amd/svm_msr.h index 1dba8101ab..e47b0548ac 100644 --- a/usr/src/uts/i86pc/io/vmm/amd/svm_msr.h +++ b/usr/src/uts/i86pc/io/vmm/amd/svm_msr.h @@ -38,9 +38,7 @@ void svm_msr_guest_init(struct svm_softc *sc, int vcpu); void svm_msr_guest_enter(struct svm_softc *sc, int vcpu); void svm_msr_guest_exit(struct svm_softc *sc, int vcpu); -int svm_wrmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t val, - bool *retu); -int svm_rdmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t *result, - bool *retu); +int svm_wrmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t val); +int svm_rdmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t *result); #endif /* _SVM_MSR_H_ */ diff --git a/usr/src/uts/i86pc/io/vmm/intel/vmx.c b/usr/src/uts/i86pc/io/vmm/intel/vmx.c index c5b83a5f0b..edd5a64443 100644 --- a/usr/src/uts/i86pc/io/vmm/intel/vmx.c +++ b/usr/src/uts/i86pc/io/vmm/intel/vmx.c @@ -2044,9 +2044,8 @@ static int vmx_handle_apic_write(struct vmx *vmx, int vcpuid, struct vlapic *vlapic, uint64_t qual) { - int error, handled, offset; + int handled, offset; uint32_t *apic_regs, vector; - bool retu; handled = HANDLED; offset = APIC_WRITE_OFFSET(qual); @@ -2086,10 +2085,9 @@ vmx_handle_apic_write(struct vmx *vmx, int vcpuid, struct vlapic *vlapic, vlapic_esr_write_handler(vlapic); break; case APIC_OFFSET_ICR_LOW: - retu = false; - error = vlapic_icrlo_write_handler(vlapic, &retu); - if (error != 0 || retu) + if (vlapic_icrlo_write_handler(vlapic) != 0) { handled = UNHANDLED; + } break; case APIC_OFFSET_CMCI_LVT: case APIC_OFFSET_TIMER_LVT ... APIC_OFFSET_ERROR_LVT: @@ -2208,28 +2206,28 @@ vmx_task_switch_reason(uint64_t qual) } static int -emulate_wrmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t val, bool *retu) +emulate_wrmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t val) { int error; if (lapic_msr(num)) - error = lapic_wrmsr(vmx->vm, vcpuid, num, val, retu); + error = lapic_wrmsr(vmx->vm, vcpuid, num, val); else - error = vmx_wrmsr(vmx, vcpuid, num, val, retu); + error = vmx_wrmsr(vmx, vcpuid, num, val); return (error); } static int -emulate_rdmsr(struct vmx *vmx, int vcpuid, u_int num, bool *retu) +emulate_rdmsr(struct vmx *vmx, int vcpuid, u_int num) { uint64_t result; int error; if (lapic_msr(num)) - error = lapic_rdmsr(vmx->vm, vcpuid, num, &result, retu); + error = lapic_rdmsr(vmx->vm, vcpuid, num, &result); else - error = vmx_rdmsr(vmx, vcpuid, num, &result, retu); + error = vmx_rdmsr(vmx, vcpuid, num, &result); if (error == 0) { vmx->ctx[vcpuid].guest_rax = (uint32_t)result; @@ -2254,7 +2252,6 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) uint32_t eax, ecx, edx, idtvec_info, idtvec_err, intr_info; uint32_t intr_type, intr_vec, reason; uint64_t exitintinfo, qual, gpa; - bool retu; CTASSERT((PINBASED_CTLS_ONE_SETTING & PINBASED_VIRTUAL_NMI) != 0); CTASSERT((PINBASED_CTLS_ONE_SETTING & PINBASED_NMI_EXITING) != 0); @@ -2397,16 +2394,15 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) break; case EXIT_REASON_RDMSR: vmm_stat_incr(vmx->vm, vcpu, VMEXIT_RDMSR, 1); - retu = false; ecx = vmxctx->guest_rcx; VCPU_CTR1(vmx->vm, vcpu, "rdmsr 0x%08x", ecx); SDT_PROBE4(vmm, vmx, exit, rdmsr, vmx, vcpu, vmexit, ecx); - error = emulate_rdmsr(vmx, vcpu, ecx, &retu); - if (error) { + error = emulate_rdmsr(vmx, vcpu, ecx); + if (error == 0) { + handled = HANDLED; + } else if (error > 0) { vmexit->exitcode = VM_EXITCODE_RDMSR; vmexit->u.msr.code = ecx; - } else if (!retu) { - handled = HANDLED; } else { /* Return to userspace with a valid exitcode */ KASSERT(vmexit->exitcode != VM_EXITCODE_BOGUS, @@ -2415,7 +2411,6 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) break; case EXIT_REASON_WRMSR: vmm_stat_incr(vmx->vm, vcpu, VMEXIT_WRMSR, 1); - retu = false; eax = vmxctx->guest_rax; ecx = vmxctx->guest_rcx; edx = vmxctx->guest_rdx; @@ -2424,13 +2419,13 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit) SDT_PROBE5(vmm, vmx, exit, wrmsr, vmx, vmexit, vcpu, ecx, (uint64_t)edx << 32 | eax); error = emulate_wrmsr(vmx, vcpu, ecx, - (uint64_t)edx << 32 | eax, &retu); - if (error) { + (uint64_t)edx << 32 | eax); + if (error == 0) { + handled = HANDLED; + } else if (error > 0) { vmexit->exitcode = VM_EXITCODE_WRMSR; vmexit->u.msr.code = ecx; vmexit->u.msr.wval = (uint64_t)edx << 32 | eax; - } else if (!retu) { - handled = HANDLED; } else { /* Return to userspace with a valid exitcode */ KASSERT(vmexit->exitcode != VM_EXITCODE_BOGUS, diff --git a/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.c b/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.c index cfdf2bfe05..2c9ef0c196 100644 --- a/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.c +++ b/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.c @@ -398,7 +398,7 @@ vmx_msr_guest_exit(struct vmx *vmx, int vcpuid) } int -vmx_rdmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t *val, bool *retu) +vmx_rdmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t *val) { const uint64_t *guest_msrs; int error; @@ -439,7 +439,7 @@ vmx_rdmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t *val, bool *retu) } int -vmx_wrmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t val, bool *retu) +vmx_wrmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t val) { uint64_t *guest_msrs; uint64_t changed; diff --git a/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.h b/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.h index 848cdea26b..04583336e2 100644 --- a/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.h +++ b/usr/src/uts/i86pc/io/vmm/intel/vmx_msr.h @@ -37,8 +37,8 @@ void vmx_msr_init(void); void vmx_msr_guest_init(struct vmx *vmx, int vcpuid); void vmx_msr_guest_enter(struct vmx *vmx, int vcpuid); void vmx_msr_guest_exit(struct vmx *vmx, int vcpuid); -int vmx_rdmsr(struct vmx *, int vcpuid, u_int num, uint64_t *val, bool *retu); -int vmx_wrmsr(struct vmx *, int vcpuid, u_int num, uint64_t val, bool *retu); +int vmx_rdmsr(struct vmx *, int vcpuid, u_int num, uint64_t *val); +int vmx_wrmsr(struct vmx *, int vcpuid, u_int num, uint64_t val); int vmx_set_ctlreg(int ctl_reg, int true_ctl_reg, uint32_t ones_mask, uint32_t zeros_mask, uint32_t *retval); diff --git a/usr/src/uts/i86pc/io/vmm/io/vhpet.c b/usr/src/uts/i86pc/io/vmm/io/vhpet.c index 29e9188b77..34004d482a 100644 --- a/usr/src/uts/i86pc/io/vmm/io/vhpet.c +++ b/usr/src/uts/i86pc/io/vmm/io/vhpet.c @@ -478,8 +478,8 @@ vhpet_timer_update_config(struct vhpet *vhpet, int n, uint64_t data, } int -vhpet_mmio_write(void *vm, int vcpuid, uint64_t gpa, uint64_t val, int size, - void *arg) +vhpet_mmio_write(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t val, + int size) { struct vhpet *vhpet; uint64_t data, mask, oldval, val64; @@ -628,8 +628,8 @@ done: } int -vhpet_mmio_read(void *vm, int vcpuid, uint64_t gpa, uint64_t *rval, int size, - void *arg) +vhpet_mmio_read(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t *rval, + int size) { int i, offset; struct vhpet *vhpet; diff --git a/usr/src/uts/i86pc/io/vmm/io/vhpet.h b/usr/src/uts/i86pc/io/vmm/io/vhpet.h index e6ded31a66..e416b315d6 100644 --- a/usr/src/uts/i86pc/io/vmm/io/vhpet.h +++ b/usr/src/uts/i86pc/io/vmm/io/vhpet.h @@ -40,12 +40,12 @@ #define VHPET_SIZE 1024 struct vhpet *vhpet_init(struct vm *vm); -void vhpet_cleanup(struct vhpet *vhpet); -int vhpet_mmio_write(void *vm, int vcpuid, uint64_t gpa, uint64_t val, - int size, void *arg); -int vhpet_mmio_read(void *vm, int vcpuid, uint64_t gpa, uint64_t *val, - int size, void *arg); -int vhpet_getcap(struct vm_hpet_cap *cap); +void vhpet_cleanup(struct vhpet *vhpet); +int vhpet_mmio_write(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t val, + int size); +int vhpet_mmio_read(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t *val, + int size); +int vhpet_getcap(struct vm_hpet_cap *cap); #ifndef __FreeBSD__ void vhpet_localize_resources(struct vhpet *vhpet); diff --git a/usr/src/uts/i86pc/io/vmm/io/vioapic.c b/usr/src/uts/i86pc/io/vmm/io/vioapic.c index dbd3420420..1e8ee1fa7a 100644 --- a/usr/src/uts/i86pc/io/vmm/io/vioapic.c +++ b/usr/src/uts/i86pc/io/vmm/io/vioapic.c @@ -514,8 +514,8 @@ vioapic_mmio_rw(struct vioapic *vioapic, int vcpuid, uint64_t gpa, } int -vioapic_mmio_read(void *vm, int vcpuid, uint64_t gpa, uint64_t *rval, - int size, void *arg) +vioapic_mmio_read(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t *rval, + int size) { int error; struct vioapic *vioapic; @@ -526,8 +526,8 @@ vioapic_mmio_read(void *vm, int vcpuid, uint64_t gpa, uint64_t *rval, } int -vioapic_mmio_write(void *vm, int vcpuid, uint64_t gpa, uint64_t wval, - int size, void *arg) +vioapic_mmio_write(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t wval, + int size) { int error; struct vioapic *vioapic; diff --git a/usr/src/uts/i86pc/io/vmm/io/vioapic.h b/usr/src/uts/i86pc/io/vmm/io/vioapic.h index 6bf3e80e05..3c74bd5170 100644 --- a/usr/src/uts/i86pc/io/vmm/io/vioapic.h +++ b/usr/src/uts/i86pc/io/vmm/io/vioapic.h @@ -48,17 +48,17 @@ #define VIOAPIC_SIZE 4096 struct vioapic *vioapic_init(struct vm *vm); -void vioapic_cleanup(struct vioapic *vioapic); +void vioapic_cleanup(struct vioapic *vioapic); -int vioapic_assert_irq(struct vm *vm, int irq); -int vioapic_deassert_irq(struct vm *vm, int irq); -int vioapic_pulse_irq(struct vm *vm, int irq); +int vioapic_assert_irq(struct vm *vm, int irq); +int vioapic_deassert_irq(struct vm *vm, int irq); +int vioapic_pulse_irq(struct vm *vm, int irq); -int vioapic_mmio_write(void *vm, int vcpuid, uint64_t gpa, - uint64_t wval, int size, void *arg); -int vioapic_mmio_read(void *vm, int vcpuid, uint64_t gpa, - uint64_t *rval, int size, void *arg); +int vioapic_mmio_write(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t wval, + int size); +int vioapic_mmio_read(struct vm *vm, int vcpuid, uint64_t gpa, uint64_t *rval, + int size); -int vioapic_pincount(struct vm *vm); -void vioapic_process_eoi(struct vm *vm, int vcpuid, int vector); +int vioapic_pincount(struct vm *vm); +void vioapic_process_eoi(struct vm *vm, int vcpuid, int vector); #endif diff --git a/usr/src/uts/i86pc/io/vmm/io/vlapic.c b/usr/src/uts/i86pc/io/vmm/io/vlapic.c index f7a05254ec..038c17ca78 100644 --- a/usr/src/uts/i86pc/io/vmm/io/vlapic.c +++ b/usr/src/uts/i86pc/io/vmm/io/vlapic.c @@ -956,7 +956,7 @@ vlapic_get_cr8(struct vlapic *vlapic) } int -vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu) +vlapic_icrlo_write_handler(struct vlapic *vlapic) { int i; bool phys; @@ -1062,10 +1062,8 @@ vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu) } } - /* - * This will cause a return to userland. - */ - return (1); + /* Return to userland. */ + return (-1); } void @@ -1181,7 +1179,7 @@ vlapic_svr_write_handler(struct vlapic *vlapic) int vlapic_read(struct vlapic *vlapic, int mmio_access, uint64_t offset, - uint64_t *data, bool *retu) + uint64_t *data) { struct LAPIC *lapic = vlapic->apic_page; uint32_t *reg; @@ -1302,7 +1300,7 @@ done: int vlapic_write(struct vlapic *vlapic, int mmio_access, uint64_t offset, - uint64_t data, bool *retu) + uint64_t data) { struct LAPIC *lapic = vlapic->apic_page; uint32_t *regptr; @@ -1367,7 +1365,7 @@ vlapic_write(struct vlapic *vlapic, int mmio_access, uint64_t offset, lapic->icr_lo = data; if (x2apic(vlapic)) lapic->icr_hi = data >> 32; - retval = vlapic_icrlo_write_handler(vlapic, retu); + retval = vlapic_icrlo_write_handler(vlapic); break; case APIC_OFFSET_ICR_HI: lapic->icr_hi = data; diff --git a/usr/src/uts/i86pc/io/vmm/io/vlapic.h b/usr/src/uts/i86pc/io/vmm/io/vlapic.h index 47ca3cd0b8..746699393f 100644 --- a/usr/src/uts/i86pc/io/vmm/io/vlapic.h +++ b/usr/src/uts/i86pc/io/vmm/io/vlapic.h @@ -39,9 +39,9 @@ struct vm; enum x2apic_state; int vlapic_write(struct vlapic *vlapic, int mmio_access, uint64_t offset, - uint64_t data, bool *retu); + uint64_t data); int vlapic_read(struct vlapic *vlapic, int mmio_access, uint64_t offset, - uint64_t *data, bool *retu); + uint64_t *data); /* * Returns 0 if there is no eligible vector that can be delivered to the @@ -103,7 +103,7 @@ void vlapic_ldr_write_handler(struct vlapic *vlapic); void vlapic_dfr_write_handler(struct vlapic *vlapic); void vlapic_svr_write_handler(struct vlapic *vlapic); void vlapic_esr_write_handler(struct vlapic *vlapic); -int vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu); +int vlapic_icrlo_write_handler(struct vlapic *vlapic); void vlapic_icrtmr_write_handler(struct vlapic *vlapic); void vlapic_dcr_write_handler(struct vlapic *vlapic); void vlapic_lvt_write_handler(struct vlapic *vlapic, uint32_t offset); diff --git a/usr/src/uts/i86pc/io/vmm/sys/vmm_instruction_emul.h b/usr/src/uts/i86pc/io/vmm/sys/vmm_instruction_emul.h index d3a07b0f99..75abfeeaf6 100644 --- a/usr/src/uts/i86pc/io/vmm/sys/vmm_instruction_emul.h +++ b/usr/src/uts/i86pc/io/vmm/sys/vmm_instruction_emul.h @@ -68,7 +68,7 @@ void vie_fallback_exitinfo(const struct vie *vie, struct vm_exit *vme); void vie_reset(struct vie *vie); void vie_advance_pc(struct vie *vie, uint64_t *nextrip); -int vie_emulate_mmio(struct vie *vie, void *vm, int vcpuid); +int vie_emulate_mmio(struct vie *vie, struct vm *vm, int vcpuid); int vie_emulate_inout(struct vie *vie, struct vm *vm, int vcpuid); /* diff --git a/usr/src/uts/i86pc/io/vmm/sys/vmm_kernel.h b/usr/src/uts/i86pc/io/vmm/sys/vmm_kernel.h index 9501850dfc..68e5e1d51d 100644 --- a/usr/src/uts/i86pc/io/vmm/sys/vmm_kernel.h +++ b/usr/src/uts/i86pc/io/vmm/sys/vmm_kernel.h @@ -372,7 +372,7 @@ void vm_inject_ud(struct vm *vm, int vcpuid); void vm_inject_gp(struct vm *vm, int vcpuid); void vm_inject_ac(struct vm *vm, int vcpuid, int errcode); void vm_inject_ss(struct vm *vm, int vcpuid, int errcode); - +void vm_inject_pf(struct vm *vm, int vcpuid, int errcode, uint64_t cr2); #ifndef __FreeBSD__ diff --git a/usr/src/uts/i86pc/io/vmm/vmm.c b/usr/src/uts/i86pc/io/vmm/vmm.c index 4eb967fd89..14aa9c552b 100644 --- a/usr/src/uts/i86pc/io/vmm/vmm.c +++ b/usr/src/uts/i86pc/io/vmm/vmm.c @@ -1442,7 +1442,7 @@ vcpu_require_state_locked(struct vm *vm, int vcpuid, enum vcpu_state newstate) * Emulate a guest 'hlt' by sleeping until the vcpu is ready to run. */ static int -vm_handle_hlt(struct vm *vm, int vcpuid, bool intr_disabled, bool *retu) +vm_handle_hlt(struct vm *vm, int vcpuid, bool intr_disabled) { struct vcpu *vcpu; #ifdef __FreeBSD__ @@ -1539,7 +1539,7 @@ vm_handle_hlt(struct vm *vm, int vcpuid, bool intr_disabled, bool *retu) } static int -vm_handle_paging(struct vm *vm, int vcpuid, bool *retu) +vm_handle_paging(struct vm *vm, int vcpuid) { int rv, ftype; struct vm_map *map; @@ -1585,14 +1585,13 @@ vm_service_mmio_read(struct vm *vm, int cpuid, uint64_t gpa, uint64_t *rval, int rsize) { int err = ESRCH; - void *arg = NULL; if (gpa >= DEFAULT_APIC_BASE && gpa < DEFAULT_APIC_BASE + PAGE_SIZE) { - err = lapic_mmio_read(vm, cpuid, gpa, rval, rsize, &arg); + err = lapic_mmio_read(vm, cpuid, gpa, rval, rsize); } else if (gpa >= VIOAPIC_BASE && gpa < VIOAPIC_BASE + VIOAPIC_SIZE) { - err = vioapic_mmio_read(vm, cpuid, gpa, rval, rsize, &arg); + err = vioapic_mmio_read(vm, cpuid, gpa, rval, rsize); } else if (gpa >= VHPET_BASE && gpa < VHPET_BASE + VHPET_SIZE) { - err = vhpet_mmio_read(vm, cpuid, gpa, rval, rsize, &arg); + err = vhpet_mmio_read(vm, cpuid, gpa, rval, rsize); } return (err); @@ -1603,21 +1602,20 @@ vm_service_mmio_write(struct vm *vm, int cpuid, uint64_t gpa, uint64_t wval, int wsize) { int err = ESRCH; - void *arg = NULL; if (gpa >= DEFAULT_APIC_BASE && gpa < DEFAULT_APIC_BASE + PAGE_SIZE) { - err = lapic_mmio_write(vm, cpuid, gpa, wval, wsize, &arg); + err = lapic_mmio_write(vm, cpuid, gpa, wval, wsize); } else if (gpa >= VIOAPIC_BASE && gpa < VIOAPIC_BASE + VIOAPIC_SIZE) { - err = vioapic_mmio_write(vm, cpuid, gpa, wval, wsize, &arg); + err = vioapic_mmio_write(vm, cpuid, gpa, wval, wsize); } else if (gpa >= VHPET_BASE && gpa < VHPET_BASE + VHPET_SIZE) { - err = vhpet_mmio_write(vm, cpuid, gpa, wval, wsize, &arg); + err = vhpet_mmio_write(vm, cpuid, gpa, wval, wsize); } return (err); } static int -vm_handle_mmio_emul(struct vm *vm, int vcpuid, bool *retu) +vm_handle_mmio_emul(struct vm *vm, int vcpuid) { struct vie *vie; struct vcpu *vcpu; @@ -1659,15 +1657,13 @@ vm_handle_mmio_emul(struct vm *vm, int vcpuid, bool *retu) inst_addr); /* Dump (unrecognized) instruction bytes in userspace */ vie_fallback_exitinfo(vie, vme); - *retu = true; - return (0); + return (-1); } if (vme->u.mmio_emul.gla != VIE_INVALID_GLA && vie_verify_gla(vie, vm, vcpuid, vme->u.mmio_emul.gla) != 0) { /* Decoded GLA does not match GLA from VM exit state */ vie_fallback_exitinfo(vie, vme); - *retu = true; - return (0); + return (-1); } repeat: @@ -1678,8 +1674,6 @@ repeat: * make a trip out to userspace for it. */ vie_exitinfo(vie, vme); - *retu = true; - error = 0; } else if (error == EAGAIN) { /* * Continue emulating the rep-prefixed instruction, which has @@ -1698,8 +1692,7 @@ repeat: */ vie_reset(vie); vme->exitcode = VM_EXITCODE_BOGUS; - *retu = true; - return (0); + return (-1); } } else if (error == 0) { /* Update %rip now that instruction has been emulated */ @@ -1709,7 +1702,7 @@ repeat: } static int -vm_handle_inout(struct vm *vm, int vcpuid, struct vm_exit *vme, bool *retu) +vm_handle_inout(struct vm *vm, int vcpuid, struct vm_exit *vme) { struct vcpu *vcpu; struct vie *vie; @@ -1727,8 +1720,7 @@ repeat: * so make a trip out to userspace for it. */ vie_exitinfo(vie, vme); - *retu = true; - return (0); + return (err); } else if (err == EAGAIN) { /* * Continue emulating the rep-prefixed ins/outs, which has not @@ -1747,24 +1739,21 @@ repeat: */ vie_reset(vie); vme->exitcode = VM_EXITCODE_BOGUS; - *retu = true; - return (0); + return (-1); } } else if (err != 0) { /* Emulation failure. Bail all the way out to userspace. */ vme->exitcode = VM_EXITCODE_INST_EMUL; bzero(&vme->u.inst_emul, sizeof (vme->u.inst_emul)); - *retu = true; - return (0); + return (-1); } vie_advance_pc(vie, &vcpu->nextrip); - *retu = false; return (0); } static int -vm_handle_suspend(struct vm *vm, int vcpuid, bool *retu) +vm_handle_suspend(struct vm *vm, int vcpuid) { #ifdef __FreeBSD__ int error, i; @@ -1860,12 +1849,11 @@ vm_handle_suspend(struct vm *vm, int vcpuid, bool *retu) } } - *retu = true; - return (0); + return (-1); } static int -vm_handle_reqidle(struct vm *vm, int vcpuid, bool *retu) +vm_handle_reqidle(struct vm *vm, int vcpuid) { struct vcpu *vcpu = &vm->vcpu[vcpuid]; @@ -1873,8 +1861,7 @@ vm_handle_reqidle(struct vm *vm, int vcpuid, bool *retu) KASSERT(vcpu->reqidle, ("invalid vcpu reqidle %d", vcpu->reqidle)); vcpu->reqidle = 0; vcpu_unlock(vcpu); - *retu = true; - return (0); + return (-1); } #ifndef __FreeBSD__ @@ -2203,7 +2190,7 @@ vm_run(struct vm *vm, int vcpuid, const struct vm_entry *entry) #endif uint64_t tscval; struct vm_exit *vme; - bool retu, intr_disabled; + bool intr_disabled; pmap_t pmap; #ifndef __FreeBSD__ vm_thread_ctx_t vtc; @@ -2236,17 +2223,13 @@ vm_run(struct vm *vm, int vcpuid, const struct vm_entry *entry) #endif error = vm_entry_actions(vm, vcpuid, entry, vme); - if (error < 0) { - /* Exit condition to be serviced by userspace */ - error = 0; - goto exit; - } else if (error != 0) { + if (error != 0) { goto exit; } restart: - if (vm_loop_checks(vm, vcpuid, vme) != 0) { - error = 0; + error = vm_loop_checks(vm, vcpuid, vme); + if (error != 0) { goto exit; } @@ -2312,65 +2295,70 @@ restart: critical_exit(); - if (error == 0) { - retu = false; - vcpu->nextrip = vme->rip + vme->inst_length; - switch (vme->exitcode) { - case VM_EXITCODE_REQIDLE: - error = vm_handle_reqidle(vm, vcpuid, &retu); - break; - case VM_EXITCODE_SUSPENDED: - error = vm_handle_suspend(vm, vcpuid, &retu); - break; - case VM_EXITCODE_IOAPIC_EOI: - vioapic_process_eoi(vm, vcpuid, - vme->u.ioapic_eoi.vector); - break; - case VM_EXITCODE_RUNBLOCK: - break; - case VM_EXITCODE_HLT: - intr_disabled = ((vme->u.hlt.rflags & PSL_I) == 0); - error = vm_handle_hlt(vm, vcpuid, intr_disabled, &retu); - break; - case VM_EXITCODE_PAGING: - error = vm_handle_paging(vm, vcpuid, &retu); - break; - case VM_EXITCODE_MMIO_EMUL: - error = vm_handle_mmio_emul(vm, vcpuid, &retu); - break; - case VM_EXITCODE_INOUT: - error = vm_handle_inout(vm, vcpuid, vme, &retu); - break; - case VM_EXITCODE_MONITOR: - case VM_EXITCODE_MWAIT: - case VM_EXITCODE_VMINSN: - vm_inject_ud(vm, vcpuid); - break; -#ifndef __FreeBSD__ - case VM_EXITCODE_WRMSR: - if (vm_handle_wrmsr(vm, vcpuid, vme) != 0) { - retu = true; - } - break; + if (error != 0) { + /* Communicate out any error from VMRUN() above */ + goto exit; + } - case VM_EXITCODE_HT: { - affinity_type = CPU_BEST; - break; + vcpu->nextrip = vme->rip + vme->inst_length; + switch (vme->exitcode) { + case VM_EXITCODE_REQIDLE: + error = vm_handle_reqidle(vm, vcpuid); + break; + case VM_EXITCODE_SUSPENDED: + error = vm_handle_suspend(vm, vcpuid); + break; + case VM_EXITCODE_IOAPIC_EOI: + vioapic_process_eoi(vm, vcpuid, + vme->u.ioapic_eoi.vector); + break; + case VM_EXITCODE_RUNBLOCK: + break; + case VM_EXITCODE_HLT: + intr_disabled = ((vme->u.hlt.rflags & PSL_I) == 0); + error = vm_handle_hlt(vm, vcpuid, intr_disabled); + break; + case VM_EXITCODE_PAGING: + error = vm_handle_paging(vm, vcpuid); + break; + case VM_EXITCODE_MMIO_EMUL: + error = vm_handle_mmio_emul(vm, vcpuid); + break; + case VM_EXITCODE_INOUT: + error = vm_handle_inout(vm, vcpuid, vme); + break; + case VM_EXITCODE_MONITOR: + case VM_EXITCODE_MWAIT: + case VM_EXITCODE_VMINSN: + vm_inject_ud(vm, vcpuid); + break; +#ifndef __FreeBSD__ + case VM_EXITCODE_WRMSR: + if (vm_handle_wrmsr(vm, vcpuid, vme) != 0) { + error = -1; } + break; + + case VM_EXITCODE_HT: { + affinity_type = CPU_BEST; + break; + } #endif - case VM_EXITCODE_MTRAP: - vm_suspend_cpu(vm, vcpuid); - retu = true; - break; - default: - retu = true; /* handled in userland */ - break; - } + case VM_EXITCODE_MTRAP: + vm_suspend_cpu(vm, vcpuid); + error = -1; + break; + default: + /* handled in userland */ + error = -1; + break; } - if (error == 0 && retu == false) + if (error == 0) { + /* VM exit conditions handled in-kernel, continue running */ goto restart; + } exit: #ifndef __FreeBSD__ @@ -2720,12 +2708,10 @@ vm_inject_ss(struct vm *vm, int vcpuid, int errcode) } void -vm_inject_pf(void *vmarg, int vcpuid, int error_code, uint64_t cr2) +vm_inject_pf(struct vm *vm, int vcpuid, int error_code, uint64_t cr2) { - struct vm *vm; int error; - vm = vmarg; VCPU_CTR2(vm, vcpuid, "Injecting page fault: error_code %x, cr2 %lx", error_code, cr2); diff --git a/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c b/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c index f8bb7a1646..9f5bc59876 100644 --- a/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c +++ b/usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c @@ -433,7 +433,7 @@ vie_calc_bytereg(struct vie *vie, enum vm_reg_name *reg, int *lhbr) } static int -vie_read_bytereg(struct vie *vie, void *vm, int vcpuid, uint8_t *rval) +vie_read_bytereg(struct vie *vie, struct vm *vm, int vcpuid, uint8_t *rval) { uint64_t val; int error, lhbr; @@ -454,7 +454,7 @@ vie_read_bytereg(struct vie *vie, void *vm, int vcpuid, uint8_t *rval) } static int -vie_write_bytereg(struct vie *vie, void *vm, int vcpuid, uint8_t byte) +vie_write_bytereg(struct vie *vie, struct vm *vm, int vcpuid, uint8_t byte) { uint64_t origval, val, mask; int error, lhbr; @@ -480,8 +480,8 @@ vie_write_bytereg(struct vie *vie, void *vm, int vcpuid, uint8_t byte) } static int -vie_update_register(void *vm, int vcpuid, enum vm_reg_name reg, uint64_t val, - int size) +vie_update_register(struct vm *vm, int vcpuid, enum vm_reg_name reg, + uint64_t val, int size) { int error; uint64_t origval; @@ -639,7 +639,7 @@ getandflags(int opsize, uint64_t x, uint64_t y) } static int -emulate_mov(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_mov(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; enum vm_reg_name reg; @@ -753,7 +753,7 @@ emulate_mov(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_movx(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_movx(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; enum vm_reg_name reg; @@ -840,8 +840,9 @@ emulate_movx(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) * Helper function to calculate and validate a linear address. */ static int -vie_get_gla(struct vie *vie, void *vm, int vcpuid, int opsize, int addrsize, - int prot, enum vm_reg_name seg, enum vm_reg_name gpr, uint64_t *gla) +vie_get_gla(struct vie *vie, struct vm *vm, int vcpuid, int opsize, + int addrsize, int prot, enum vm_reg_name seg, enum vm_reg_name gpr, + uint64_t *gla) { struct seg_desc desc; uint64_t cr0, val, rflags; @@ -890,7 +891,7 @@ vie_get_gla(struct vie *vie, void *vm, int vcpuid, int opsize, int addrsize, } static int -emulate_movs(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_movs(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { struct vm_copyinfo copyinfo[2]; uint64_t dstaddr, srcaddr, dstgpa, srcgpa, val; @@ -1069,7 +1070,7 @@ done: } static int -emulate_stos(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_stos(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, opsize, repeat; uint64_t val; @@ -1129,7 +1130,7 @@ emulate_stos(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_and(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_and(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; enum vm_reg_name reg; @@ -1216,7 +1217,7 @@ emulate_and(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_or(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_or(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; enum vm_reg_name reg; @@ -1303,7 +1304,7 @@ emulate_or(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_cmp(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_cmp(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; uint64_t regop, memop, op1, op2, rflags, rflags2; @@ -1394,7 +1395,7 @@ emulate_cmp(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_test(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_test(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; uint64_t op1, rflags, rflags2; @@ -1442,7 +1443,7 @@ emulate_test(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_bextr(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_bextr(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { uint64_t src1, src2, dst, rflags; unsigned start, len; @@ -1519,7 +1520,7 @@ done: } static int -emulate_add(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_add(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; uint64_t nval, rflags, rflags2, val1, val2; @@ -1574,7 +1575,7 @@ emulate_add(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_sub(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_sub(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error, size; uint64_t nval, rflags, rflags2, val1, val2; @@ -1629,7 +1630,7 @@ emulate_sub(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_stack_op(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie) +vie_emulate_stack_op(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { struct vm_copyinfo copyinfo[2]; struct seg_desc ss_desc; @@ -1708,12 +1709,12 @@ emulate_stack_op(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie) return (error); if (pushop) { - error = vie_mmio_read(vie, vm, vcpuid, mmio_gpa, &val, size); + error = vie_mmio_read(vie, vm, vcpuid, gpa, &val, size); if (error == 0) vm_copyout(vm, vcpuid, &val, copyinfo, size); } else { vm_copyin(vm, vcpuid, copyinfo, &val, size); - error = vie_mmio_write(vie, vm, vcpuid, mmio_gpa, val, size); + error = vie_mmio_write(vie, vm, vcpuid, gpa, val, size); rsp += size; } vm_copy_teardown(vm, vcpuid, copyinfo, nitems(copyinfo)); @@ -1727,7 +1728,7 @@ emulate_stack_op(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie) } static int -emulate_push(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie) +vie_emulate_push(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error; @@ -1740,12 +1741,12 @@ emulate_push(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie) if ((vie->reg & 7) != 6) return (EINVAL); - error = emulate_stack_op(vm, vcpuid, mmio_gpa, vie); + error = vie_emulate_stack_op(vie, vm, vcpuid, gpa); return (error); } static int -emulate_pop(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie) +vie_emulate_pop(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error; @@ -1758,24 +1759,24 @@ emulate_pop(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie) if ((vie->reg & 7) != 0) return (EINVAL); - error = emulate_stack_op(vm, vcpuid, mmio_gpa, vie); + error = vie_emulate_stack_op(vie, vm, vcpuid, gpa); return (error); } static int -emulate_group1(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_group1(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { int error; switch (vie->reg & 7) { case 0x1: /* OR */ - error = emulate_or(vm, vcpuid, gpa, vie); + error = vie_emulate_or(vie, vm, vcpuid, gpa); break; case 0x4: /* AND */ - error = emulate_and(vm, vcpuid, gpa, vie); + error = vie_emulate_and(vie, vm, vcpuid, gpa); break; case 0x7: /* CMP */ - error = emulate_cmp(vm, vcpuid, gpa, vie); + error = vie_emulate_cmp(vie, vm, vcpuid, gpa); break; default: error = EINVAL; @@ -1786,7 +1787,7 @@ emulate_group1(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_bittest(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_bittest(struct vie *vie, struct vm *vm, int vcpuid, uint64_t gpa) { uint64_t val, rflags; int error, bitmask, bitoff; @@ -1827,7 +1828,8 @@ emulate_bittest(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) } static int -emulate_twob_group15(void *vm, int vcpuid, uint64_t gpa, struct vie *vie) +vie_emulate_twob_group15(struct vie *vie, struct vm *vm, int vcpuid, + uint64_t gpa) { int error; uint64_t buf; @@ -1931,7 +1933,7 @@ vie_mmio_write(struct vie *vie, struct vm *vm, int cpuid, uint64_t gpa, } int -vie_emulate_mmio(struct vie *vie, void *vm, int vcpuid) +vie_emulate_mmio(struct vie *vie, struct vm *vm, int vcpuid) { int error; uint64_t gpa; @@ -1945,53 +1947,53 @@ vie_emulate_mmio(struct vie *vie, void *vm, int vcpuid) switch (vie->op.op_type) { case VIE_OP_TYPE_GROUP1: - error = emulate_group1(vm, vcpuid, gpa, vie); + error = vie_emulate_group1(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_POP: - error = emulate_pop(vm, vcpuid, gpa, vie); + error = vie_emulate_pop(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_PUSH: - error = emulate_push(vm, vcpuid, gpa, vie); + error = vie_emulate_push(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_CMP: - error = emulate_cmp(vm, vcpuid, gpa, vie); + error = vie_emulate_cmp(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_MOV: - error = emulate_mov(vm, vcpuid, gpa, vie); + error = vie_emulate_mov(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_MOVSX: case VIE_OP_TYPE_MOVZX: - error = emulate_movx(vm, vcpuid, gpa, vie); + error = vie_emulate_movx(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_MOVS: - error = emulate_movs(vm, vcpuid, gpa, vie); + error = vie_emulate_movs(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_STOS: - error = emulate_stos(vm, vcpuid, gpa, vie); + error = vie_emulate_stos(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_AND: - error = emulate_and(vm, vcpuid, gpa, vie); + error = vie_emulate_and(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_OR: - error = emulate_or(vm, vcpuid, gpa, vie); + error = vie_emulate_or(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_SUB: - error = emulate_sub(vm, vcpuid, gpa, vie); + error = vie_emulate_sub(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_BITTEST: - error = emulate_bittest(vm, vcpuid, gpa, vie); + error = vie_emulate_bittest(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_TWOB_GRP15: - error = emulate_twob_group15(vm, vcpuid, gpa, vie); + error = vie_emulate_twob_group15(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_ADD: - error = emulate_add(vm, vcpuid, gpa, vie); + error = vie_emulate_add(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_TEST: - error = emulate_test(vm, vcpuid, gpa, vie); + error = vie_emulate_test(vie, vm, vcpuid, gpa); break; case VIE_OP_TYPE_BEXTR: - error = emulate_bextr(vm, vcpuid, gpa, vie); + error = vie_emulate_bextr(vie, vm, vcpuid, gpa); break; default: error = EINVAL; diff --git a/usr/src/uts/i86pc/io/vmm/vmm_lapic.c b/usr/src/uts/i86pc/io/vmm/vmm_lapic.c index 57e4cfddf3..f8d8970807 100644 --- a/usr/src/uts/i86pc/io/vmm/vmm_lapic.c +++ b/usr/src/uts/i86pc/io/vmm/vmm_lapic.c @@ -170,7 +170,7 @@ lapic_msr(u_int msr) } int -lapic_rdmsr(struct vm *vm, int cpu, u_int msr, uint64_t *rval, bool *retu) +lapic_rdmsr(struct vm *vm, int cpu, u_int msr, uint64_t *rval) { int error; u_int offset; @@ -183,14 +183,14 @@ lapic_rdmsr(struct vm *vm, int cpu, u_int msr, uint64_t *rval, bool *retu) error = 0; } else { offset = x2apic_msr_to_regoff(msr); - error = vlapic_read(vlapic, 0, offset, rval, retu); + error = vlapic_read(vlapic, 0, offset, rval); } return (error); } int -lapic_wrmsr(struct vm *vm, int cpu, u_int msr, uint64_t val, bool *retu) +lapic_wrmsr(struct vm *vm, int cpu, u_int msr, uint64_t val) { int error; u_int offset; @@ -202,15 +202,14 @@ lapic_wrmsr(struct vm *vm, int cpu, u_int msr, uint64_t val, bool *retu) error = vlapic_set_apicbase(vlapic, val); } else { offset = x2apic_msr_to_regoff(msr); - error = vlapic_write(vlapic, 0, offset, val, retu); + error = vlapic_write(vlapic, 0, offset, val); } return (error); } int -lapic_mmio_write(void *vm, int cpu, uint64_t gpa, uint64_t wval, int size, - void *arg) +lapic_mmio_write(struct vm *vm, int cpu, uint64_t gpa, uint64_t wval, int size) { int error; uint64_t off; @@ -226,13 +225,12 @@ lapic_mmio_write(void *vm, int cpu, uint64_t gpa, uint64_t wval, int size, return (EINVAL); vlapic = vm_lapic(vm, cpu); - error = vlapic_write(vlapic, 1, off, wval, arg); + error = vlapic_write(vlapic, 1, off, wval); return (error); } int -lapic_mmio_read(void *vm, int cpu, uint64_t gpa, uint64_t *rval, int size, - void *arg) +lapic_mmio_read(struct vm *vm, int cpu, uint64_t gpa, uint64_t *rval, int size) { int error; uint64_t off; @@ -250,6 +248,6 @@ lapic_mmio_read(void *vm, int cpu, uint64_t gpa, uint64_t *rval, int size, return (EINVAL); vlapic = vm_lapic(vm, cpu); - error = vlapic_read(vlapic, 1, off, rval, arg); + error = vlapic_read(vlapic, 1, off, rval); return (error); } diff --git a/usr/src/uts/i86pc/io/vmm/vmm_lapic.h b/usr/src/uts/i86pc/io/vmm/vmm_lapic.h index 58508ad70b..b0e877048e 100644 --- a/usr/src/uts/i86pc/io/vmm/vmm_lapic.h +++ b/usr/src/uts/i86pc/io/vmm/vmm_lapic.h @@ -45,22 +45,20 @@ struct vm; -bool lapic_msr(u_int num); -int lapic_rdmsr(struct vm *vm, int cpu, u_int msr, uint64_t *rval, - bool *retu); -int lapic_wrmsr(struct vm *vm, int cpu, u_int msr, uint64_t wval, - bool *retu); +bool lapic_msr(u_int num); +int lapic_rdmsr(struct vm *vm, int cpu, u_int msr, uint64_t *rval); +int lapic_wrmsr(struct vm *vm, int cpu, u_int msr, uint64_t wval); -int lapic_mmio_read(void *vm, int cpu, uint64_t gpa, - uint64_t *rval, int size, void *arg); -int lapic_mmio_write(void *vm, int cpu, uint64_t gpa, - uint64_t wval, int size, void *arg); +int lapic_mmio_read(struct vm *vm, int cpu, uint64_t gpa, uint64_t *rval, + int size); +int lapic_mmio_write(struct vm *vm, int cpu, uint64_t gpa, uint64_t wval, + int size); /* * Signals to the LAPIC that an interrupt at 'vector' needs to be generated * to the 'cpu', the state is recorded in IRR. */ -int lapic_set_intr(struct vm *vm, int cpu, int vector, bool trig); +int lapic_set_intr(struct vm *vm, int cpu, int vector, bool trig); #define LAPIC_TRIG_LEVEL true #define LAPIC_TRIG_EDGE false @@ -82,8 +80,8 @@ lapic_intr_edge(struct vm *vm, int cpu, int vector) * Triggers the LAPIC local interrupt (LVT) 'vector' on 'cpu'. 'cpu' can * be set to -1 to trigger the interrupt on all CPUs. */ -int lapic_set_local_intr(struct vm *vm, int cpu, int vector); +int lapic_set_local_intr(struct vm *vm, int cpu, int vector); -int lapic_intr_msi(struct vm *vm, uint64_t addr, uint64_t msg); +int lapic_intr_msi(struct vm *vm, uint64_t addr, uint64_t msg); #endif diff --git a/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c b/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c index 3fd7f862d1..6aa0bf200f 100644 --- a/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c +++ b/usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c @@ -512,14 +512,22 @@ vmmdev_do_ioctl(vmm_softc_t *sc, int cmd, intptr_t arg, int md, error = vm_run(sc->vmm_vm, vcpu, &entry); - if (error == 0) { + /* + * Unexpected states in vm_run() are expressed through positive + * errno-oriented return values. VM states which expect further + * processing in userspace (necessary context via exitinfo) are + * expressed through negative return values. For the time being + * a return value of 0 is not expected from vm_run(). + */ + ASSERT(error != 0); + if (error < 0) { const struct vm_exit *vme; void *outp = entry.exit_data; + error = 0; vme = vm_exitinfo(sc->vmm_vm, vcpu); if (ddi_copyout(vme, outp, sizeof (*vme), md)) { error = EFAULT; - break; } } break; diff --git a/usr/src/uts/i86pc/sys/vmm.h b/usr/src/uts/i86pc/sys/vmm.h index d6d24f0c37..2322919d29 100644 --- a/usr/src/uts/i86pc/sys/vmm.h +++ b/usr/src/uts/i86pc/sys/vmm.h @@ -382,8 +382,6 @@ struct vm_entry { } u; }; -void vm_inject_pf(void *vm, int vcpuid, int error_code, uint64_t cr2); - int vm_restart_instruction(void *vm, int vcpuid); #endif /* _VMM_H_ */ |