Skip site navigation (1)Skip section navigation (2)
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>