PERFORCE change 125453 for review
Jesper Brix Rosenkilde
jbr at FreeBSD.org
Mon Aug 20 14:30:27 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125453
Change 125453 by jbr at jbr_bob on 2007/08/20 21:29:29
fork and exec, sort of working
Affected files ...
.. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#18 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_fork.c#5 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/sys/proc.h#6 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/sys/types.h#3 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_glue.c#4 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#12 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.h#8 edit
.. //depot/projects/soc2007/jbr-syscall/tests/fork.c#3 edit
.. //depot/projects/soc2007/jbr-syscall/tests/mlibc/mlibc.c#2 edit
Differences ...
==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#18 (text+ko) ====
@@ -910,17 +910,13 @@
{
int error = 0;
struct proc *p = imgp->proc;
- //vm_offset_t *addr = &imgp->proc->p_usrsysshm;
struct sysshm outsysshm;
- //if (addr) {
- //vm_unmap_sysshm(p);
- error = vm_map_sysshm(p);
- //}
-
+ error = vm_map_sysshm(p);
+
PROC_LOCK(p);
outsysshm.pid = p->p_pid;
- copyout(&outsysshm, (vm_offset_t *) p->p_usrsysshm,
+ copyout(&outsysshm, (vm_offset_t *) p->p_usrsysshm,
sizeof(struct sysshm));
PROC_UNLOCK(p);
==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_fork.c#5 (text+ko) ====
@@ -90,24 +90,12 @@
{
int error;
struct proc *p2;
+ error = fork1(td, RFFDG | RFPROC, 0, &p2);
- error = fork1(td, RFFDG | RFPROC, 0, &p2);
if (error == 0) {
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);
}
@@ -742,7 +730,6 @@
thread_single_end();
PROC_UNLOCK(p1);
}
-
/*
* Return child proc pointer to parent.
*/
==== //depot/projects/soc2007/jbr-syscall/src/sys/sys/proc.h#6 (text+ko) ====
@@ -824,6 +824,7 @@
void faultin(struct proc *p);
void fixjobc(struct proc *p, struct pgrp *pgrp, int entering);
int fork1(struct thread *, int, int, struct proc **);
+void fork_map_sysshm(struct proc *, struct proc *, int);
void fork_exit(void (*)(void *, struct trapframe *), void *,
struct trapframe *);
void fork_return(struct thread *, struct trapframe *);
==== //depot/projects/soc2007/jbr-syscall/src/sys/sys/types.h#3 (text+ko) ====
==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_glue.c#4 (text+ko) ====
@@ -523,6 +523,7 @@
vmspace_unshare(p1);
}
}
+ fork_map_sysshm(p1, p2, flags);
cpu_fork(td, p2, td2, flags);
return;
}
@@ -541,17 +542,31 @@
if (p1->p_vmspace->vm_shm)
shmfork(p1, p2);
}
-
- p2->p_usrsysshm = (vm_offset_t) p1->p_vmspace->vm_taddr -
- p1->p_usrsysshm + (vm_offset_t) p2->p_vmspace->vm_taddr;
-
/*
* cpu_fork will copy and update the pcb, set up the kernel stack,
* and make the child ready to run.
*/
+ fork_map_sysshm(p1, p2, flags);
cpu_fork(td, p2, td2, flags);
}
+void
+fork_map_sysshm(struct proc *old, struct proc *new, int flags)
+{
+ struct sysshm outsysshm;
+
+ new->p_usrsysshm = (vm_offset_t) old->p_vmspace->vm_taddr -
+ old->p_usrsysshm + (vm_offset_t) new->p_vmspace->vm_taddr;
+
+ vm_map_sysshm(new);
+
+ PROC_LOCK(new);
+ outsysshm.pid = new->p_pid;
+ PROC_UNLOCK(new);
+ copyout(&outsysshm, (vm_offset_t *) new->p_usrsysshm,
+ sizeof(struct sysshm));
+}
+
/*
* Called after process has been wait(2)'ed apon and is being reaped.
* The idea is to reclaim resources that we could not reclaim while
==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#12 (text+ko) ====
@@ -2990,24 +2990,24 @@
int
vm_map_sysshm(struct proc *p)
{
- vm_offset_t *addr = &p->p_usrsysshm;
+ vm_offset_t addr;
vm_map_t map = &p->p_vmspace->vm_map;
size_t size = round_page(sizeof(struct sysshm));
PROC_LOCK(p);
- *addr = round_page((vm_offset_t) p->p_vmspace->vm_daddr) +
+ 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, *addr, 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)
+ 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_t tmap = map;
vm_map_entry_t entry;
vm_object_t object;
vm_pindex_t pindex;
@@ -3015,19 +3015,22 @@
boolean_t wired;
vm_page_t page;
- if (vm_map_lookup(tmap, *addr, VM_PROT_READ|VM_PROT_WRITE, &entry,
+ 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);
+ if(!(page = vm_page_lookup(object, pindex)))
+ panic("vm_map_sysshm: cannot wire page.");
vm_page_lock_queues();
vm_page_wire(page);
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
- vm_map_lookup_done(*tmap, entry);
+ vm_map_lookup_done(tmap, entry);
+
+ p->p_usrsysshm = addr;
- return (0);
+ return (addr);
}
/*
==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.h#8 (text+ko) ====
==== //depot/projects/soc2007/jbr-syscall/tests/fork.c#3 (text+ko) ====
==== //depot/projects/soc2007/jbr-syscall/tests/mlibc/mlibc.c#2 (text+ko) ====
@@ -1,4 +1,5 @@
#include "mlibc.h"
+#include <stdio.h>
struct sysshm * sysshm = NULL;
@@ -11,9 +12,11 @@
sysctlbyname("kern.usrsysshm", &addr, &size, NULL, 0);
sysshm = (struct sysshm * ) addr;
+ printf("%d\n", addr);
}
pid_t getpid2(void)
{
+ __mlibc_init();
return(sysshm->pid);
}
More information about the p4-projects
mailing list