procfs_mem.c (77031) | procfs_mem.c (79224) |
---|---|
1/* 2 * Copyright (c) 1993 Jan-Simon Pendry 3 * Copyright (c) 1993 Sean Eric Fagan 4 * Copyright (c) 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Jan-Simon Pendry and Sean Eric Fagan. --- 23 unchanged lines hidden (view full) --- 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)procfs_mem.c 8.5 (Berkeley) 6/15/94 39 * | 1/* 2 * Copyright (c) 1993 Jan-Simon Pendry 3 * Copyright (c) 1993 Sean Eric Fagan 4 * Copyright (c) 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Jan-Simon Pendry and Sean Eric Fagan. --- 23 unchanged lines hidden (view full) --- 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)procfs_mem.c 8.5 (Berkeley) 6/15/94 39 * |
40 * $FreeBSD: head/sys/fs/procfs/procfs_mem.c 77031 2001-05-23 09:42:29Z ru $ | 40 * $FreeBSD: head/sys/fs/procfs/procfs_mem.c 79224 2001-07-04 16:20:28Z dillon $ |
41 */ 42 43/* 44 * This is a lightly hacked and merged version 45 * of sef's pread/pwrite functions 46 */ 47 48#include <sys/param.h> --- 29 unchanged lines hidden (view full) --- 78 int writing; 79 struct vmspace *vm; 80 vm_map_t map; 81 vm_object_t object = NULL; 82 vm_offset_t pageno = 0; /* page number */ 83 vm_prot_t reqprot; 84 vm_offset_t kva; 85 | 41 */ 42 43/* 44 * This is a lightly hacked and merged version 45 * of sef's pread/pwrite functions 46 */ 47 48#include <sys/param.h> --- 29 unchanged lines hidden (view full) --- 78 int writing; 79 struct vmspace *vm; 80 vm_map_t map; 81 vm_object_t object = NULL; 82 vm_offset_t pageno = 0; /* page number */ 83 vm_prot_t reqprot; 84 vm_offset_t kva; 85 |
86 GIANT_REQUIRED; 87 |
|
86 /* 87 * if the vmspace is in the midst of being deallocated or the 88 * process is exiting, don't try to grab anything. The page table 89 * usage in that process can be messed up. 90 */ 91 vm = p->p_vmspace; 92 if ((p->p_flag & P_WEXIT)) 93 return EFAULT; | 88 /* 89 * if the vmspace is in the midst of being deallocated or the 90 * process is exiting, don't try to grab anything. The page table 91 * usage in that process can be messed up. 92 */ 93 vm = p->p_vmspace; 94 if ((p->p_flag & P_WEXIT)) 95 return EFAULT; |
94 95 mtx_lock(&vm_mtx); 96 if (vm->vm_refcnt < 1) { 97 mtx_unlock(&vm_mtx); | 96 if (vm->vm_refcnt < 1) |
98 return EFAULT; | 97 return EFAULT; |
99 } | |
100 ++vm->vm_refcnt; 101 /* 102 * The map we want... 103 */ 104 map = &vm->vm_map; 105 106 writing = uio->uio_rw == UIO_WRITE; 107 reqprot = writing ? (VM_PROT_WRITE | VM_PROT_OVERRIDE_WRITE) : VM_PROT_READ; --- 101 unchanged lines hidden (view full) --- 209 vm_object_reference(object); 210 vm_map_lookup_done(tmap, out_entry); 211 212 pmap_kenter(kva, VM_PAGE_TO_PHYS(m)); 213 214 /* 215 * Now do the i/o move. 216 */ | 98 ++vm->vm_refcnt; 99 /* 100 * The map we want... 101 */ 102 map = &vm->vm_map; 103 104 writing = uio->uio_rw == UIO_WRITE; 105 reqprot = writing ? (VM_PROT_WRITE | VM_PROT_OVERRIDE_WRITE) : VM_PROT_READ; --- 101 unchanged lines hidden (view full) --- 207 vm_object_reference(object); 208 vm_map_lookup_done(tmap, out_entry); 209 210 pmap_kenter(kva, VM_PAGE_TO_PHYS(m)); 211 212 /* 213 * Now do the i/o move. 214 */ |
217 mtx_unlock(&vm_mtx); | |
218 error = uiomove((caddr_t)(kva + page_offset), len, uio); | 215 error = uiomove((caddr_t)(kva + page_offset), len, uio); |
219 mtx_lock(&vm_mtx); | |
220 221 pmap_kremove(kva); 222 223 /* 224 * release the page and the object 225 */ 226 vm_page_unwire(m, 1); 227 vm_object_deallocate(object); 228 229 object = NULL; 230 231 } while (error == 0 && uio->uio_resid > 0); 232 233 if (object) 234 vm_object_deallocate(object); 235 236 kmem_free(kernel_map, kva, PAGE_SIZE); 237 vmspace_free(vm); | 216 217 pmap_kremove(kva); 218 219 /* 220 * release the page and the object 221 */ 222 vm_page_unwire(m, 1); 223 vm_object_deallocate(object); 224 225 object = NULL; 226 227 } while (error == 0 && uio->uio_resid > 0); 228 229 if (object) 230 vm_object_deallocate(object); 231 232 kmem_free(kernel_map, kva, PAGE_SIZE); 233 vmspace_free(vm); |
238 mtx_unlock(&vm_mtx); | |
239 return (error); 240} 241 242/* 243 * Copy data in and out of the target process. 244 * We do this by mapping the process's page into 245 * the kernel and then doing a uiomove direct 246 * from the kernel address space. --- 82 unchanged lines hidden --- | 234 return (error); 235} 236 237/* 238 * Copy data in and out of the target process. 239 * We do this by mapping the process's page into 240 * the kernel and then doing a uiomove direct 241 * from the kernel address space. --- 82 unchanged lines hidden --- |