Date: Thu, 25 Mar 2004 18:02:03 -0800 (PST) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 49694 for review Message-ID: <200403260202.i2Q223Qo011195@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=49694 Change 49694 by peter@peter_daintree on 2004/03/25 18:01:36 lose SPARSE_MAPPING. Not that it doesn't work, but rather its code to work around. It might work out that it has to come back, but thats what we have a SCM for. Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#4 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#4 (text+ko) ==== @@ -47,11 +47,6 @@ #include <vm/vm.h> #include <vm/vm_param.h> -#ifdef SPARSE_MAPPING -#include <vm/vm_object.h> -#include <vm/vm_kern.h> -#include <vm/vm_extern.h> -#endif #include <vm/pmap.h> #include <vm/vm_map.h> @@ -59,23 +54,36 @@ #include "linker_if.h" +typedef struct { + Elf_Addr base_vaddr; + Elf_Off base_offset; + Elf_Off filesz; + int flags; +} Elf_loadent; + +typedef struct { + const Elf_Rel *rel; + int relsize; +} Elf_relent; + +typedef struct { + const Elf_Rela *rela; + int relasize; +} Elf_relaent; + + typedef struct elf_file { struct linker_file lf; /* Common fields */ caddr_t address; /* Relocation address */ -#ifdef SPARSE_MAPPING - vm_object_t object; /* VM object to hold file pages */ -#endif - caddr_t strtab; /* DT_STRTAB */ - int strsz; /* DT_STRSZ */ - const Elf_Sym* symtab; /* DT_SYMTAB */ - const Elf_Rel* pltrel; /* DT_JMPREL */ - int pltrelsize; /* DT_PLTRELSZ */ - const Elf_Rela* pltrela; /* DT_JMPREL */ - int pltrelasize; /* DT_PLTRELSZ */ - const Elf_Rel* rel; /* DT_REL */ - int relsize; /* DT_RELSZ */ - const Elf_Rela* rela; /* DT_RELA */ - int relasize; /* DT_RELASZ */ + + Elf_loadseg *segtab; + int nsegtab; + Elf_relaent *relatab; + int nrela; + + Elf_relent *reltab; + int nrel; + caddr_t modptr; const Elf_Sym* ddbsymtab; /* The symbol table we are using */ long ddbsymcnt; /* Number of symbols */ @@ -87,20 +95,21 @@ static int link_elf_link_common_finish(linker_file_t); static int link_elf_link_preload(linker_class_t cls, - const char*, linker_file_t*); + const char*, linker_file_t*); static int link_elf_link_preload_finish(linker_file_t); static int link_elf_load_file(linker_class_t, const char*, linker_file_t*); static int link_elf_lookup_symbol(linker_file_t, const char*, - c_linker_sym_t*); -static int link_elf_symbol_values(linker_file_t, c_linker_sym_t, linker_symval_t*); + c_linker_sym_t*); +static int link_elf_symbol_values(linker_file_t, c_linker_sym_t, + linker_symval_t*); static int link_elf_search_symbol(linker_file_t, caddr_t value, - c_linker_sym_t* sym, long* diffp); + c_linker_sym_t* sym, long* diffp); static void link_elf_unload_file(linker_file_t); static int link_elf_lookup_set(linker_file_t, const char *, - void ***, void ***, int *); + void ***, void ***, int *); static int link_elf_each_function_name(linker_file_t, - int (*)(const char *, void *), void *); + int (*)(const char *, void *), void *); static void link_elf_reloc_local(linker_file_t); static kobj_method_t link_elf_methods[] = { @@ -300,14 +309,16 @@ * XXX 3) read the string and symbol tables so we can do relocations etc * XXX 4) (later on) load the rest of the entries. */ -/* XXX *************** STEP 1 GOES HERE ************* XXX */ shdr = (Elf_Shdr *)shtbuf; shlimit = shdr + hdr->e_phnum; + nbits = 0; nnobits = 0; nsym = 0; nrel = 0; nrela = 0; + symtabindex = -1; + symstrindex = -1; for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { case SHT_PROGBITS: @@ -318,6 +329,7 @@ break; case SHT_SYMTAB: nsym++; + symtabindex = i; symstrindex = shdr[i].sh_link; break; case SHT_REL: @@ -346,16 +358,9 @@ } /* XXX *************** STEP 2 GOES HERE ************* XXX */ - symtabindex = -1; - symstrindex = -1; for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { - case SHT_SYMTAB: - symtabindex = i; - symstrindex = shdr[i].sh_link; - break; - } } /* XXX *************** STEP 3 GOES HERE ************* XXX */ @@ -408,30 +413,11 @@ } ef = (elf_file_t) lf; -#ifdef SPARSE_MAPPING - ef->object = vm_object_allocate(OBJT_DEFAULT, 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; - } -#else ef->address = malloc(mapsize, M_LINKER, M_WAITOK); if (!ef->address) { error = ENOMEM; goto out; } -#endif mapbase = ef->address; /* @@ -448,16 +434,6 @@ } bzero(segbase + segs[i]->p_filesz, segs[i]->p_memsz - segs[i]->p_filesz); - -#ifdef SPARSE_MAPPING - /* - * Wire down the pages - */ - vm_map_wire(kernel_map, - (vm_offset_t) segbase, - (vm_offset_t) segbase + segs[i]->p_memsz, - VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES); -#endif } lf->address = ef->address; @@ -501,17 +477,8 @@ /* Notify MD code that a module is being unloaded. */ elf_cpu_unload_file(file); -#ifdef SPARSE_MAPPING - 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); - } -#else if (ef->address) free(ef->address, M_LINKER); -#endif if (ef->symbase) free(ef->symbase, M_LINKER); if (ef->strbase)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403260202.i2Q223Qo011195>