From owner-p4-projects@FreeBSD.ORG Thu Apr 1 18:44:46 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 60D2516A4D0; Thu, 1 Apr 2004 18:44:46 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 347FC16A4CE for ; Thu, 1 Apr 2004 18:44:46 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1630043D45 for ; Thu, 1 Apr 2004 18:44:46 -0800 (PST) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i322ijGe030321 for ; Thu, 1 Apr 2004 18:44:45 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i322ij0p030318 for perforce@freebsd.org; Thu, 1 Apr 2004 18:44:45 -0800 (PST) (envelope-from peter@freebsd.org) Date: Thu, 1 Apr 2004 18:44:45 -0800 (PST) Message-Id: <200404020244.i322ij0p030318@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 50159 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Apr 2004 02:44:47 -0000 http://perforce.freebsd.org/chv.cgi?CH=50159 Change 50159 by peter@peter_hammer on 2004/04/01 18:44:07 ok, we need the sparse_mapping code from link_elf.c to control the final address. Otherwise we end up with the module out in the direct map region, which is out of PC32 reach of the kernel. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#19 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#19 (text+ko) ==== @@ -48,6 +48,9 @@ #include #include +#include +#include +#include #include #include @@ -86,6 +89,7 @@ typedef struct elf_file { struct linker_file lf; /* Common fields */ caddr_t address; /* Relocation address */ + vm_object_t object; /* VM object to hold file pages */ Elf_progent *progtab; int nprogtab; @@ -458,11 +462,21 @@ * This stuff needs to be in a single chunk so that profiling etc * can get the bounds and gdb can associate offsets with modules */ - mapbase = malloc(mapsize, M_LINKER, M_WAITOK | M_ZERO); - if (mapbase == NULL) { + ef->object = vm_object_allocate(OBJT_DEFAULT, round_page(mapsize) >> PAGE_SHIFT); + if (ef->object == NULL) { error = ENOMEM; goto out; } + vm_object_reference(ef->object); + ef->address = (caddr_t) vm_map_min(kernel_map); + error = vm_map_find(kernel_map, ef->object, 0, + (vm_offset_t *) &ef->address, mapsize, 1, VM_PROT_ALL, VM_PROT_ALL, 0); + if (error) { + vm_object_deallocate(ef->object); + ef->object = 0; + goto out; + } + mapbase = ef->address; printf("final mapbase %p, final mapsize %ld\n", mapbase, mapsize); /* Add the base address to the previously calculated/aligned offsets */ @@ -504,6 +518,10 @@ &resid, td); if (error) goto out; + /* Wire the pages */ + vm_map_wire(kernel_map, (vm_offset_t)ef->progtab[i].addr, + (vm_offset_t)ef->progtab[i].addr + ef->progtab[i].filesz, + VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES); } /* @@ -586,6 +604,11 @@ /* Notify MD code that a module is being unloaded. */ elf_cpu_unload_file(file); + if (ef->object) { + vm_map_remove(kernel_map, (vm_offset_t) ef->address, + (vm_offset_t) ef->address + (ef->object->size << PAGE_SHIFT)); + vm_object_deallocate(ef->object); + } if (ef->address) free(ef->address, M_LINKER); if (ef->ddbsymtab)