diff options
Diffstat (limited to 'usr/src/uts/intel/io')
-rw-r--r-- | usr/src/uts/intel/io/vmm/vmm.c | 21 | ||||
-rw-r--r-- | usr/src/uts/intel/io/vmm/vmm_sol_dev.c | 12 |
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) { |