From 2fdaace4e3a3fbb8d43b0469ad663c8c677d1056 Mon Sep 17 00:00:00 2001 From: Diego Ongaro Date: Tue, 28 Oct 2008 21:56:34 -0500 Subject: [PATCH] adds fkvm_guest_check_range --- sys/kern/kern_fkvm.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/sys/kern/kern_fkvm.c b/sys/kern/kern_fkvm.c index 27ee128e538..f7cf0a1904a 100644 --- a/sys/kern/kern_fkvm.c +++ b/sys/kern/kern_fkvm.c @@ -908,8 +908,43 @@ fkvm_mem_has_entry(vm_map_entry_t expected_entry, vm_map_t vm_map, vm_offset_t v return (lookup_entry == expected_entry); } +static int +fkvm_guest_check_range(struct guestvm *guest_vm, uint64_t start, uint64_t end) +{ + vm_map_t guest_vm_map; + vm_map_entry_t lookup_entry; + vm_object_t throwaway_object; + vm_pindex_t throwaway_pindex; + vm_prot_t throwaway_prot; + boolean_t throwaway_wired; + int ret; + int error; + + guest_vm_map = &guest_vm->sp->vm_map; + + error = vm_map_lookup(&guest_vm_map, /* IN/OUT */ + start, + VM_PROT_READ|VM_PROT_WRITE, + &lookup_entry, /* OUT */ + &throwaway_object, /* OUT */ + &throwaway_pindex, /* OUT */ + &throwaway_prot, /* OUT */ + &throwaway_wired); /* OUT */ + if (error != KERN_SUCCESS) + return EFAULT; + + if (fkvm_mem_has_entry(lookup_entry, guest_vm_map, end)) + ret = 0; + else + ret = EFAULT; + + vm_map_lookup_done(guest_vm_map, lookup_entry); + return ret; +} + /* System Calls */ /* This function can only be called with multiples of page sizes */ +/* vaddr as NULL overloads to fkvm_guest_check_range */ int fkvm_set_user_mem_region(struct thread *td, struct fkvm_set_user_mem_region_args *uap) { @@ -935,6 +970,9 @@ fkvm_set_user_mem_region(struct thread *td, struct fkvm_set_user_mem_region_args printf("start: 0x%" PRIx64 " bytes\n", start); printf("end: 0x%" PRIx64 " bytes\n", end); + if (uap->vaddr == 0) + return fkvm_guest_check_range(guest_vm, start, end); + user_vm_space = td->td_proc->p_vmspace; user_vm_map = &user_vm_space->vm_map; printf("user vm space: %p\n", user_vm_space); -- 2.11.4.GIT