summaryrefslogtreecommitdiffstats
path: root/sys/fs/procfs/procfs_mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/procfs/procfs_mem.c')
-rw-r--r--sys/fs/procfs/procfs_mem.c49
1 files changed, 34 insertions, 15 deletions
diff --git a/sys/fs/procfs/procfs_mem.c b/sys/fs/procfs/procfs_mem.c
index f772c4b..04b3a37 100644
--- a/sys/fs/procfs/procfs_mem.c
+++ b/sys/fs/procfs/procfs_mem.c
@@ -37,7 +37,7 @@
*
* @(#)procfs_mem.c 8.4 (Berkeley) 1/21/94
*
- * $Id: procfs_mem.c,v 1.15 1996/01/19 03:58:32 dyson Exp $
+ * $Id: procfs_mem.c,v 1.16 1996/01/24 18:41:06 peter Exp $
*/
/*
@@ -96,20 +96,6 @@ procfs_rwmem(p, uio)
int fix_prot;
uva = (vm_offset_t) uio->uio_offset;
- if (uva >= VM_MAXUSER_ADDRESS) {
-
- if (writing || (uva >= (VM_MAXUSER_ADDRESS + UPAGES * PAGE_SIZE))) {
- error = 0;
- break;
- }
- /* we are reading the "U area", fill it in */
- PHOLD(p);
- if (p->p_flag & P_INMEM) {
- p->p_addr->u_kproc.kp_proc = *p;
- fill_eproc (p, &p->p_addr->u_kproc.kp_eproc);
- }
- PRELE(p);
- }
/*
* Get the page number of this segment.
@@ -122,6 +108,39 @@ procfs_rwmem(p, uio)
*/
len = min(PAGE_SIZE - page_offset, uio->uio_resid);
+ if (uva >= VM_MAXUSER_ADDRESS) {
+ if (writing || (uva >= (VM_MAXUSER_ADDRESS + UPAGES * PAGE_SIZE))) {
+ error = 0;
+ break;
+ }
+
+ /* we are reading the "U area", force it into core */
+ PHOLD(p);
+
+ /* sanity check */
+ if (!(p->p_flag & P_INMEM)) {
+ /* aiee! */
+ error = EFAULT;
+ break;
+ }
+
+ /* populate the ptrace/procfs area */
+ p->p_addr->u_kproc.kp_proc = *p;
+ fill_eproc (p, &p->p_addr->u_kproc.kp_eproc);
+
+ /* locate the in-core address */
+ kva = (u_int)p->p_addr + uva - VM_MAXUSER_ADDRESS;
+
+ /* transfer it */
+ error = uiomove((caddr_t)kva, len, uio);
+
+ /* let the pages go */
+ PRELE(p);
+
+ continue;
+ }
+
+
/*
* The map we want...
*/
OpenPOWER on IntegriCloud