diff options
Diffstat (limited to 'usr/src/uts/intel/io/vmm/vmm.c')
-rw-r--r-- | usr/src/uts/intel/io/vmm/vmm.c | 21 |
1 files changed, 10 insertions, 11 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); } |