summaryrefslogtreecommitdiff
path: root/usr/src/uts/intel/io
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/intel/io')
-rw-r--r--usr/src/uts/intel/io/vmm/vmm.c21
-rw-r--r--usr/src/uts/intel/io/vmm/vmm_sol_dev.c12
2 files changed, 19 insertions, 14 deletions
diff --git a/usr/src/uts/intel/io/vmm/vmm.c b/usr/src/uts/intel/io/vmm/vmm.c
index e28c235b4c..6f85f13be6 100644
--- a/usr/src/uts/intel/io/vmm/vmm.c
+++ b/usr/src/uts/intel/io/vmm/vmm.c
@@ -1516,20 +1516,19 @@ vm_handle_paging(struct vm *vm, int vcpuid)
struct vcpu *vcpu = &vm->vcpu[vcpuid];
vm_client_t *vmc = vcpu->vmclient;
struct vm_exit *vme = &vcpu->exitinfo;
- int rv, ftype;
+ const int ftype = vme->u.paging.fault_type;
- KASSERT(vme->inst_length == 0, ("%s: invalid inst_length %d",
- __func__, vme->inst_length));
+ ASSERT0(vme->inst_length);
+ ASSERT(ftype == PROT_READ || ftype == PROT_WRITE || ftype == PROT_EXEC);
- ftype = vme->u.paging.fault_type;
- KASSERT(ftype == PROT_READ ||
- ftype == PROT_WRITE || ftype == PROT_EXEC,
- ("vm_handle_paging: invalid fault_type %d", ftype));
-
- rv = vmc_fault(vmc, vme->u.paging.gpa, ftype);
+ if (vmc_fault(vmc, vme->u.paging.gpa, ftype) != 0) {
+ /*
+ * If the fault cannot be serviced, kick it out to userspace for
+ * handling (or more likely, halting the instance).
+ */
+ return (-1);
+ }
- if (rv != 0)
- return (EFAULT);
return (0);
}
diff --git a/usr/src/uts/intel/io/vmm/vmm_sol_dev.c b/usr/src/uts/intel/io/vmm/vmm_sol_dev.c
index 26b58dff79..882d22b435 100644
--- a/usr/src/uts/intel/io/vmm/vmm_sol_dev.c
+++ b/usr/src/uts/intel/io/vmm/vmm_sol_dev.c
@@ -2935,9 +2935,6 @@ vmm_ctl_ioctl(int cmd, intptr_t arg, int md, cred_t *cr, int *rvalp)
}
case VMM_VM_SUPPORTED:
return (vmm_is_supported(arg));
- case VMM_INTERFACE_VERSION:
- *rvalp = VMM_CURRENT_INTERFACE_VERSION;
- return (0);
case VMM_CHECK_IOMMU:
if (!vmm_check_iommu()) {
return (ENXIO);
@@ -2974,6 +2971,15 @@ vmm_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
return (ENOTSUP);
}
+ /*
+ * Regardless of minor (vmmctl or instance), we respond to queries of
+ * the interface version.
+ */
+ if (cmd == VMM_INTERFACE_VERSION) {
+ *rvalp = VMM_CURRENT_INTERFACE_VERSION;
+ return (0);
+ }
+
minor = getminor(dev);
if (minor == VMM_CTL_MINOR) {