PERFORCE change 123238 for review

Jesper Brix Rosenkilde jbr at FreeBSD.org
Mon Jul 9 23:09:44 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=123238

Change 123238 by jbr at jbr_bob on 2007/07/09 23:09:37

	added sanity checking to vm_mapsysshm, mostly borrowed from vm_map_stack

Affected files ...

.. //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#3 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#4 edit
.. //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.h#3 edit

Differences ...

==== //depot/projects/soc2007/jbr-syscall/src/sys/kern/kern_exec.c#3 (text+ko) ====

@@ -919,7 +919,7 @@
 	}
 
 	/* Allocate memory shared between process and kernel */
-	  error = vm_map_sysshm(map, sv->sv_minuser);
+	  error = vm_map_sysshm(map, sv->sv_minuser, 8);
 	  if (error)
 		  return (error);
 

==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.c#4 (text+ko) ====

@@ -2987,9 +2987,50 @@
  * process.
  */
 int
-vm_map_sysshm(vm_map_t map, vm_offset_t addr)
+vm_map_sysshm(vm_map_t map, vm_offset_t addr, vm_size_t size)
 {
-        return (KERN_SUCCESS);
+	int error = 0;
+	vm_offset_t osize;
+	vm_map_entry_t new_entry, prev_entry;
+	rlim_t vmemlim;
+
+ 	PROC_LOCK(curthread->td_proc);
+ 	vmemlim = lim_cur(curthread->td_proc, RLIMIT_VMEM);
+ 	PROC_UNLOCK(curthread->td_proc);
+
+	vm_map_lock(map);
+	
+	/* if address is already mapped unlock and return with error */
+	if (vm_map_lookup_entry(map, addr, &prev_entry)) {
+    		vm_map_unlock(map);
+    		return (KERN_NO_SPACE);
+    	}
+
+	osize = addr + round_page(size);
+
+ 	/* check that we are within vmlimit */
+ 	if (map->size + osize > vmemlim) {
+ 		vm_map_unlock(map);
+ 		return (KERN_NO_SPACE);
+ 	}
+
+	error = vm_map_insert(map, NULL, 0, addr, osize, 
+	    VM_PROT_EXECUTE, VM_PROT_ALL, MAP_NOFAULT);
+
+	if (error) {
+ 		if (prev_entry != &map->header)
+			vm_map_clip_end(map, prev_entry, addr);
+
+ 		new_entry = prev_entry->next;
+
+ 		if (new_entry->end != osize || new_entry->start != addr)
+ 			panic("Bad entry start/end for new sysshm");
+		
+ 		new_entry->avail_ssize = round_page(size) - round_page(size);
+ 	}
+
+ 	vm_map_unlock(map);
+	return (error);
 }
 
 /*

==== //depot/projects/soc2007/jbr-syscall/src/sys/vm/vm_map.h#3 (text+ko) ====

@@ -354,7 +354,7 @@
 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);
+int vm_map_sysshm(vm_map_t, vm_offset_t, vm_size_t);
 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);


More information about the p4-projects mailing list