PERFORCE change 125216 for review
Jesper Brix Rosenkilde
jbr at FreeBSD.org
Thu Aug 16 08:22:37 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125216
Change 125216 by jbr at jbr_bob on 2007/08/16 15:21:38
now with wired page
Affected files ...
.. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#13 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/sys/imgact.h#3 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/sys/proc.h#4 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#8 edit
Differences ...
==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#13 (text+ko) ====
@@ -158,12 +158,12 @@
#ifdef SCTL_MASK32
if (req->flags & SCTL_MASK32) {
unsigned int val;
- val = (unsigned int)p->p_sysshm;
+ val = (unsigned int)p->p_usrsysshm;
error = SYSCTL_OUT(req, &val, sizeof(val));
} else
#endif
- error = SYSCTL_OUT(req, &p->p_sysshm,
- sizeof(p->p_sysshm));
+ error = SYSCTL_OUT(req, &p->p_usrsysshm,
+ sizeof(p->p_usrsysshm));
return error;
}
@@ -789,7 +789,7 @@
if (imgp->firstpage != NULL)
exec_unmap_first_page(imgp);
- if (imgp->sysshm != NULL)
+ if (p->p_kernsysshm != NULL)
exec_unmap_sysshm(imgp);
if (imgp->vp != NULL) {
@@ -914,24 +914,15 @@
struct image_params *imgp;
{
int error;
+ struct proc *p = imgp->proc;
vm_map_t map = &imgp->proc->p_vmspace->vm_map;
- vm_offset_t *addr = &imgp->proc->p_sysshm;
-/*
- vm_map_t tmap;
- vm_object_t object;
- vm_map_entry_t entry;
- vm_pindex_t pindex;
-*/
- if (imgp->sysshm != NULL)
+ vm_offset_t *addr = &imgp->proc->p_usrsysshm;
+
+ if (p->p_kernsysshm != NULL)
exec_unmap_sysshm(imgp);
error = vm_map_sysshm(map, addr, 42);
-/*
- tmap = map;
- vm_map_lookup(&tmap, *addr, VM_PROT_READ, &entry, &object, &pindex, NULL,
- NULL);
- vm_map_lookup_done(tmap, entry);
-*/
+
return(error);
}
==== //depot/projects/soc2007/jbr-syscall/src/sys/sys/imgact.h#3 (text+ko) ====
@@ -60,7 +60,6 @@
char *interpreter_name; /* name of the interpreter */
void *auxargs; /* ELF Auxinfo structure pointer */
struct sf_buf *firstpage; /* first page that we mapped */
- struct sf_buf *sysshm;
unsigned long ps_strings; /* PS_STRINGS for BSD/OS binaries */
size_t auxarg_size;
struct image_args *args; /* system call arguments */
==== //depot/projects/soc2007/jbr-syscall/src/sys/sys/proc.h#4 (text+ko) ====
@@ -576,7 +576,8 @@
void *p_emuldata; /* (c) Emulator state data. */
struct label *p_label; /* (*) Proc (not subject) MAC label. */
struct p_sched *p_sched; /* (*) Scheduler-specific data. */
- vm_offset_t p_sysshm;
+ vm_offset_t p_usrsysshm;
+ struct sf_buf *p_kernsysshm;
STAILQ_HEAD(, ktr_request) p_ktr; /* (o) KTR event queue. */
LIST_HEAD(, mqueue_notifier) p_mqnotifier; /* (c) mqueue notifiers.*/
};
==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#8 (text+ko) ====
@@ -2989,20 +2989,51 @@
int
vm_map_sysshm(vm_map_t map, vm_offset_t *addr, vm_size_t size)
{
- int error = 0;
+ vm_object_t object;
+ vm_page_t sysshm_page;
size = round_page(size);
+ PROC_LOCK(curthread->td_proc);
- PROC_LOCK(curthread->td_proc);
*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);
+ /*
error = vm_map_find(map, NULL, 0, addr, size, TRUE, VM_PROT_RW,
- VM_PROT_RW, 0);
+ VM_PROT_RW, MAP_NOFAULT);
+ */
+
+ object = vm_object_allocate(OBJT_DEFAULT, 1);
+ if (!object)
+ panic("vm_map_sysshm: cannot allocate object");
+
+ VM_OBJECT_LOCK(object);
+ sysshm_page = vm_page_alloc(object, 0, VM_ALLOC_NORMAL);
+ if (!sysshm_page)
+ panic("vm_page_alloc: cannot allocate sysshm_page");
+
+ sysshm_page->valid = VM_PAGE_BITS_ALL;
+ VM_OBJECT_UNLOCK(object);
+
+ if (vm_map_findspace(map, *addr, size, addr))
+ return (1);
+
+ if (vm_map_insert(map, object, 0, *addr, *addr + size, VM_PROT_RW,
+ VM_PROT_RW, 0))
+ panic("vm_map_sysshm: cannot insert object into vm_map.");
+
+ pmap_enter(map->pmap, *addr, sysshm_page, VM_PROT_RW, TRUE);
+
+ VM_OBJECT_LOCK(object);
+ vm_page_lock_queues();
+ vm_page_activate(sysshm_page);
+ vm_page_unlock_queues();
+ vm_page_wakeup(sysshm_page);
+ VM_OBJECT_UNLOCK(object);
- return (error);
+ return (0);
}
/*
More information about the p4-projects
mailing list