diff options
Diffstat (limited to 'sys/dev/vmm')
| -rw-r--r-- | sys/dev/vmm/vmm_dev.c | 23 | ||||
| -rw-r--r-- | sys/dev/vmm/vmm_dev.h | 1 | ||||
| -rw-r--r-- | sys/dev/vmm/vmm_mem.c | 13 | 
3 files changed, 24 insertions, 13 deletions
| diff --git a/sys/dev/vmm/vmm_dev.c b/sys/dev/vmm/vmm_dev.c index 4961b21180e1..ebbceb25b69e 100644 --- a/sys/dev/vmm/vmm_dev.c +++ b/sys/dev/vmm/vmm_dev.c @@ -14,6 +14,7 @@  #include <sys/kernel.h>  #include <sys/malloc.h>  #include <sys/mman.h> +#include <sys/priv.h>  #include <sys/proc.h>  #include <sys/queue.h>  #include <sys/sx.h> @@ -470,6 +471,12 @@ vmmdev_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag,  	if (ioctl == NULL)  		return (ENOTTY); +	if ((ioctl->flags & VMMDEV_IOCTL_PRIV_CHECK_DRIVER) != 0) { +		error = priv_check(td, PRIV_DRIVER); +		if (error != 0) +			return (error); +	} +  	if ((ioctl->flags & VMMDEV_IOCTL_XLOCK_MEMSEGS) != 0)  		vm_xlock_memsegs(sc->vm);  	else if ((ioctl->flags & VMMDEV_IOCTL_SLOCK_MEMSEGS) != 0) @@ -656,10 +663,10 @@ vmmdev_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag,  			error = EINVAL;  			break;  		} -		regvals = malloc(sizeof(regvals[0]) * vmregset->count, M_VMMDEV, -		    M_WAITOK); -		regnums = malloc(sizeof(regnums[0]) * vmregset->count, M_VMMDEV, -		    M_WAITOK); +		regvals = mallocarray(vmregset->count, sizeof(regvals[0]), +		    M_VMMDEV, M_WAITOK); +		regnums = mallocarray(vmregset->count, sizeof(regnums[0]), +		    M_VMMDEV, M_WAITOK);  		error = copyin(vmregset->regnums, regnums, sizeof(regnums[0]) *  		    vmregset->count);  		if (error == 0) @@ -682,10 +689,10 @@ vmmdev_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag,  			error = EINVAL;  			break;  		} -		regvals = malloc(sizeof(regvals[0]) * vmregset->count, M_VMMDEV, -		    M_WAITOK); -		regnums = malloc(sizeof(regnums[0]) * vmregset->count, M_VMMDEV, -		    M_WAITOK); +		regvals = mallocarray(vmregset->count, sizeof(regvals[0]), +		    M_VMMDEV, M_WAITOK); +		regnums = mallocarray(vmregset->count, sizeof(regnums[0]), +		    M_VMMDEV, M_WAITOK);  		error = copyin(vmregset->regnums, regnums, sizeof(regnums[0]) *  		    vmregset->count);  		if (error == 0) diff --git a/sys/dev/vmm/vmm_dev.h b/sys/dev/vmm/vmm_dev.h index 410066c49cf2..2881a7063565 100644 --- a/sys/dev/vmm/vmm_dev.h +++ b/sys/dev/vmm/vmm_dev.h @@ -44,6 +44,7 @@ struct vmmdev_ioctl {  #define	VMMDEV_IOCTL_LOCK_ALL_VCPUS	0x08  #define	VMMDEV_IOCTL_ALLOC_VCPU		0x10  #define	VMMDEV_IOCTL_MAYBE_ALLOC_VCPU	0x20 +#define	VMMDEV_IOCTL_PRIV_CHECK_DRIVER	0x40  	int		flags;  }; diff --git a/sys/dev/vmm/vmm_mem.c b/sys/dev/vmm/vmm_mem.c index 9df31c9ba133..5ae944713c81 100644 --- a/sys/dev/vmm/vmm_mem.c +++ b/sys/dev/vmm/vmm_mem.c @@ -279,8 +279,10 @@ vm_mmap_memseg(struct vm *vm, vm_paddr_t gpa, int segid, vm_ooffset_t first,  	if (seg->object == NULL)  		return (EINVAL); +	if (first + len < first || gpa + len < gpa) +		return (EINVAL);  	last = first + len; -	if (first < 0 || first >= last || last > seg->len) +	if (first >= last || last > seg->len)  		return (EINVAL);  	if ((gpa | first | last) & PAGE_MASK) @@ -298,11 +300,12 @@ vm_mmap_memseg(struct vm *vm, vm_paddr_t gpa, int segid, vm_ooffset_t first,  		return (ENOSPC);  	vmmap = &mem->mem_vmspace->vm_map; -	error = vm_map_find(vmmap, seg->object, first, &gpa, len, 0, -	    VMFS_NO_SPACE, prot, prot, 0); +	vm_map_lock(vmmap); +	error = vm_map_insert(vmmap, seg->object, first, gpa, gpa + len, +	    prot, prot, 0); +	vm_map_unlock(vmmap);  	if (error != KERN_SUCCESS) -		return (EFAULT); - +		return (vm_mmap_to_errno(error));  	vm_object_reference(seg->object);  	if (flags & VM_MEMMAP_F_WIRED) { | 
