Deleted Added
full compact
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 ---