From owner-p4-projects@FreeBSD.ORG Mon Jul 9 23:09:44 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 81F4016A468; Mon, 9 Jul 2007 23:09:44 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6024816A400 for ; Mon, 9 Jul 2007 23:09:44 +0000 (UTC) (envelope-from jbr@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 513F113C447 for ; Mon, 9 Jul 2007 23:09:44 +0000 (UTC) (envelope-from jbr@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l69N9i5q029960 for ; Mon, 9 Jul 2007 23:09:44 GMT (envelope-from jbr@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l69N9hUX029957 for perforce@freebsd.org; Mon, 9 Jul 2007 23:09:43 GMT (envelope-from jbr@FreeBSD.org) Date: Mon, 9 Jul 2007 23:09:43 GMT Message-Id: <200707092309.l69N9hUX029957@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jbr@FreeBSD.org using -f From: Jesper Brix Rosenkilde To: Perforce Change Reviews Cc: Subject: PERFORCE change 123238 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Jul 2007 23:09:44 -0000 http://perforce.freebsd.org/chv.cgi?CH=123238 Change 123238 by jbr@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);