summaryrefslogtreecommitdiff
path: root/usr/src/uts
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts')
-rw-r--r--usr/src/uts/i86pc/io/vmm/amd/svm.c36
-rw-r--r--usr/src/uts/i86pc/io/vmm/amd/svm_msr.c5
-rw-r--r--usr/src/uts/i86pc/io/vmm/amd/svm_msr.h6
-rw-r--r--usr/src/uts/i86pc/io/vmm/intel/vmx.c39
-rw-r--r--usr/src/uts/i86pc/io/vmm/intel/vmx_msr.c4
-rw-r--r--usr/src/uts/i86pc/io/vmm/intel/vmx_msr.h4
-rw-r--r--usr/src/uts/i86pc/io/vmm/io/vhpet.c8
-rw-r--r--usr/src/uts/i86pc/io/vmm/io/vhpet.h12
-rw-r--r--usr/src/uts/i86pc/io/vmm/io/vioapic.c8
-rw-r--r--usr/src/uts/i86pc/io/vmm/io/vioapic.h20
-rw-r--r--usr/src/uts/i86pc/io/vmm/io/vlapic.c14
-rw-r--r--usr/src/uts/i86pc/io/vmm/io/vlapic.h6
-rw-r--r--usr/src/uts/i86pc/io/vmm/sys/vmm_instruction_emul.h2
-rw-r--r--usr/src/uts/i86pc/io/vmm/sys/vmm_kernel.h2
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm.c178
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_instruction_emul.c96
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_lapic.c18
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_lapic.h22
-rw-r--r--usr/src/uts/i86pc/io/vmm/vmm_sol_dev.c12
-rw-r--r--usr/src/uts/i86pc/sys/vmm.h2
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_ */