PERFORCE change 125372 for review
Jesper Brix Rosenkilde
jbr at FreeBSD.org
Sun Aug 19 19:01:39 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125372
Change 125372 by jbr at jbr_bob on 2007/08/20 02:01:34
backup
Affected files ...
.. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#17 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_fork.c#2 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_glue.c#3 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#11 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.h#7 edit
.. //depot/projects/soc2007/jbr-syscall/tests/fork.c#2 edit
Differences ...
==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#17 (text+ko) ====
@@ -445,8 +445,7 @@
goto exec_fail_dealloc;
}
- if (exec_map_sysshm(imgp))
- goto exec_fail_dealloc;
+ exec_map_sysshm(imgp);
/*
* Special interpreter operation, cleanup and loop up to try to
@@ -909,18 +908,21 @@
exec_map_sysshm(imgp)
struct image_params *imgp;
{
- int error;
+ int error = 0;
struct proc *p = imgp->proc;
- vm_map_t map = &imgp->proc->p_vmspace->vm_map;
- vm_offset_t *addr = &imgp->proc->p_usrsysshm;
+ //vm_offset_t *addr = &imgp->proc->p_usrsysshm;
struct sysshm outsysshm;
- error = vm_map_sysshm(map, addr, 42);
-
+ //if (addr) {
+ //vm_unmap_sysshm(p);
+ error = vm_map_sysshm(p);
+ //}
+
+ PROC_LOCK(p);
outsysshm.pid = p->p_pid;
- strncpy(outsysshm.progtitle, p->p_comm, MAXCOMLEN);
- strncpy(outsysshm.proctitle, "\0", 1);
- copyout((caddr_t) &outsysshm, (caddr_t) *addr, sizeof(struct sysshm));
+ copyout(&outsysshm, (vm_offset_t *) p->p_usrsysshm,
+ sizeof(struct sysshm));
+ PROC_UNLOCK(p);
return(error);
}
==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_fork.c#2 (text+ko) ====
@@ -96,6 +96,18 @@
td->td_retval[0] = p2->p_pid;
td->td_retval[1] = 0;
}
+
+ vm_map_sysshm(p2);
+
+ struct sysshm outsysshm;
+
+ PROC_LOCK(p2);
+ outsysshm.pid = p2->p_pid;
+ printf("%d\n", outsysshm.pid);
+ copyout(&outsysshm, (vm_offset_t *) p2->p_usrsysshm,
+ sizeof(struct sysshm));
+ PROC_UNLOCK(p2);
+
return (error);
}
@@ -217,7 +229,7 @@
}
PROC_UNLOCK(p1);
}
-
+
vm_forkproc(td, NULL, NULL, flags);
/*
@@ -405,6 +417,7 @@
td2 = FIRST_THREAD_IN_PROC(newproc);
p2->p_state = PRS_NEW; /* protect against others */
p2->p_pid = trypid;
+
/*
* Allow the scheduler to initialize the child.
*/
@@ -735,6 +748,7 @@
* Return child proc pointer to parent.
*/
*procp = p2;
+
return (0);
fail:
sx_sunlock(&proctree_lock);
==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_glue.c#3 (text+ko) ====
@@ -511,7 +511,6 @@
int flags;
{
struct proc *p1 = td->td_proc;
- struct sysshm sysshm;
if ((flags & RFPROC) == 0) {
/*
@@ -543,16 +542,9 @@
shmfork(p1, p2);
}
-
- p2->p_usrsysshm = p1->p_usrsysshm -
- (vm_offset_t) p1->p_vmspace->vm_daddr +
- (vm_offset_t) p2->p_vmspace->vm_daddr;
+ p2->p_usrsysshm = (vm_offset_t) p1->p_vmspace->vm_taddr -
+ p1->p_usrsysshm + (vm_offset_t) p2->p_vmspace->vm_taddr;
- copyin((caddr_t) p1->p_usrsysshm, (caddr_t) &sysshm,
- sizeof(struct sysshm));
- sysshm.pid = p2->p_pid;
- copyout((caddr_t) &sysshm, (caddr_t) p2->p_usrsysshm,
- sizeof(struct sysshm));
/*
* cpu_fork will copy and update the pcb, set up the kernel stack,
* and make the child ready to run.
==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#11 (text+ko) ====
@@ -2988,21 +2988,64 @@
* process.
*/
int
-vm_map_sysshm(vm_map_t map, vm_offset_t *usr_addr, vm_size_t size)
+vm_map_sysshm(struct proc *p)
{
- size = round_page(size);
+ vm_offset_t *addr = &p->p_usrsysshm;
+ vm_map_t map = &p->p_vmspace->vm_map;
+ size_t size = round_page(sizeof(struct sysshm));
- PROC_LOCK(curthread->td_proc);
-
- *usr_addr = round_page((vm_offset_t)
- curthread->td_proc->p_vmspace->vm_daddr) +
- lim_cur(curthread->td_proc, RLIMIT_DATA);
- PROC_UNLOCK(curthread->td_proc);
+ PROC_LOCK(p);
+ *addr = round_page((vm_offset_t) p->p_vmspace->vm_daddr) +
+ lim_cur(p, RLIMIT_DATA);
+ PROC_UNLOCK(p);
- if (vm_map_find(map, NULL, *usr_addr, usr_addr, size, TRUE, VM_PROT_RW,
+ if (vm_map_find(map, NULL, *addr, addr, size, TRUE, VM_PROT_RW,
VM_PROT_RW, 0))
panic("vm_map_sysshm: cannot allocated sysshm.");
+ if (vm_map_wire(map, *addr, *addr + size, VM_MAP_WIRE_USER)
+ != KERN_SUCCESS)
+ panic("vm_map_sysshm: cannot wire page.");
+
+ vm_map_t *tmap = ↦
+ vm_map_entry_t entry;
+ vm_object_t object;
+ vm_pindex_t pindex;
+ vm_prot_t prot;
+ boolean_t wired;
+ vm_page_t page;
+
+ if (vm_map_lookup(tmap, *addr, VM_PROT_READ|VM_PROT_WRITE, &entry,
+ &object, &pindex, &prot, &wired))
+ panic("vm_map_sysshm: cannot lookup vm_object.");
+
+ VM_OBJECT_LOCK(object);
+ page = vm_page_lookup(object, pindex);
+ vm_page_lock_queues();
+ vm_page_wire(page);
+ vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(object);
+ vm_map_lookup_done(*tmap, entry);
+
+ return (0);
+}
+
+/*
+ * Deallocate a page which holds data shared between the kernel and user
+ * process.
+ */
+int
+vm_unmap_sysshm(struct proc *p)
+{
+ size_t size = round_page(sizeof(struct sysshm));
+ vm_offset_t *addr = &p->p_usrsysshm;
+ vm_map_t map = &p->p_vmspace->vm_map;
+
+ if (vm_map_remove(map, *addr, *addr + size))
+ panic("vm_map_sysshm: cannot deallocated sysshm.");
+
+ addr = NULL;
+
return (0);
}
==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.h#7 (text+ko) ====
@@ -354,7 +354,8 @@
void vm_map_simplify_entry (vm_map_t, vm_map_entry_t);
void vm_init2 (void);
int vm_map_stack (vm_map_t, vm_offset_t, vm_size_t, vm_prot_t, vm_prot_t, int);
-int vm_map_sysshm(vm_map_t, vm_offset_t *, vm_size_t);
+int vm_map_sysshm(struct proc *);
+int vm_unmap_sysshm(struct proc *);
int vm_map_growstack (struct proc *p, vm_offset_t addr);
int vm_map_unwire(vm_map_t map, vm_offset_t start, vm_offset_t end,
int flags);
==== //depot/projects/soc2007/jbr-syscall/tests/fork.c#2 (text+ko) ====
@@ -1,12 +1,22 @@
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
+#include <sys/wait.h>
#include "mlibc/mlibc.h"
int main(void)
{
- fork();
- printf("pid: %d\n", getpid2());
+ pid_t child;
+
+ printf("Parent -- getpid(): %d\tgetpid2(): %d\n", getpid(), getpid2());
+ if(!(child = fork())) {
+ printf("Child -- getpid(): %d\tgetpid2(): %d\n",
+ getpid(), getpid2());
+ } else {
+ waitpid(child, NULL, 0);
+ printf("Parent-- getpid(): %d\tgetpid2(): %d\n", getpid(),
+ getpid2());
+ }
return(0);
}
More information about the p4-projects
mailing list