From owner-p4-projects@FreeBSD.ORG Tue Mar 30 16:55:52 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3FE8416A4D0; Tue, 30 Mar 2004 16:55:52 -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 DB5AA16A4CE for ; Tue, 30 Mar 2004 16:55:51 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id D1C1043D39 for ; Tue, 30 Mar 2004 16:55:51 -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 i2V0toGe082308 for ; Tue, 30 Mar 2004 16:55:51 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i2V0tooS082305 for perforce@freebsd.org; Tue, 30 Mar 2004 16:55:50 -0800 (PST) (envelope-from peter@freebsd.org) Date: Tue, 30 Mar 2004 16:55:50 -0800 (PST) Message-Id: <200403310055.i2V0tooS082305@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 50021 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: Wed, 31 Mar 2004 00:55:52 -0000 http://perforce.freebsd.org/chv.cgi?CH=50021 Change 50021 by peter@peter_daintree on 2004/03/30 16:55:34 begin debugging this stuff (real kernel hackers only need printf!) Affected files ... .. //depot/projects/hammer/sys/kern/link_elf_obj.c#13 edit Differences ... ==== //depot/projects/hammer/sys/kern/link_elf_obj.c#13 (text+ko) ==== @@ -87,7 +87,7 @@ typedef struct elf_file { struct linker_file lf; /* Common fields */ - caddr_t address; /* Relocation address */ /* XXX OBE */ + caddr_t address; /* Relocation address */ Elf_progent *progtab; int nprogtab; @@ -229,7 +229,7 @@ error = ENOMEM; goto out; } - error = vn_rdwr(UIO_READ, nd.ni_vp, hdr, PAGE_SIZE, 0, + error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)hdr, PAGE_SIZE, 0, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, &resid, td); if (error) @@ -267,6 +267,8 @@ goto out; } +printf("elf_load_obj: initial checks look ok!\n"); + /* Allocate and read in the section header */ nbytes = hdr->e_shnum * hdr->e_shentsize; if (nbytes == 0 || hdr->e_shoff == 0 || @@ -275,6 +277,7 @@ goto out; } shdr = malloc(nbytes, M_LINKER, M_WAITOK | M_ZERO); +printf("section table %d bytes allocated at %p\n", nbytes, shdr); if (shdr == NULL) { error = ENOMEM; goto out; @@ -288,6 +291,7 @@ goto out; } +printf("section table read in ok\n"); lf = linker_make_file(filename, &link_elf_class); if (!lf) { error = ENOMEM; @@ -295,6 +299,7 @@ } ef = (elf_file_t) lf; +printf("scan header1\n"); /* Scan the section header for information and table sizing. */ ef->nprogtab = 0; ef->nnobittab = 0; @@ -306,22 +311,31 @@ for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { case SHT_PROGBITS: +printf("scan: progbits!\n"); ef->nprogtab++; break; case SHT_NOBITS: +printf("scan: nobits!\n"); ef->nnobittab++; break; case SHT_SYMTAB: +printf("scan: symtab!\n"); nsym++; symtabindex = i; symstrindex = shdr[i].sh_link; +printf("[symtab peer is %d]\n", symstrindex); break; case SHT_REL: +printf("scan: rel!\n"); ef->nrel++; break; case SHT_RELA: +printf("scan: rela!\n"); ef->nrela++; break; + default: +printf("scan: unknown section type %d\n", shdr[i].sh_type); + break; } } if (ef->nprogtab == 0 && ef->nnobittab == 0) { @@ -372,13 +386,16 @@ rl = 0; ra = 0; alignmask = 0; +printf("scan pass 2\n"); for (i = 0; i < hdr->e_shnum; i++) { switch (shdr[i].sh_type) { case SHT_PROGBITS: case SHT_NOBITS: alignmask = (1u << shdr[i].sh_addralign) - 1; +printf("addralign %ld mask %d\n", shdr[i].sh_addralign, alignmask); mapsize += alignmask; mapsize &= ~alignmask; +printf("mapsize now at %ld\n", mapsize); break; } @@ -388,6 +405,7 @@ ef->progtab[pb].fileoff = shdr[i].sh_offset; ef->progtab[pb].filesz = shdr[i].sh_size; ef->progtab[pb].align = shdr[i].sh_addralign; +printf("progbits at %ld\n", mapsize); mapsize += shdr[i].sh_size; pb++; break; @@ -395,17 +413,20 @@ ef->nobittab[nb].addr = (void *)(uintptr_t)mapsize; ef->nobittab[nb].memsz = shdr[i].sh_size; ef->nobittab[nb].align = shdr[i].sh_addralign; +printf("nobits at %ld\n", mapsize); mapsize += shdr[i].sh_size; nb++; break; case SHT_REL: ef->reltab[rl].rel = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK); +printf("rel %ld allocated at %p\n", shdr[i].sh_size, ef->reltab[rl].rel); ef->reltab[rl].fileoff = shdr[i].sh_offset; ef->reltab[rl].filesz = shdr[i].sh_size; rl++; break; case SHT_RELA: ef->relatab[ra].rela = malloc(shdr[i].sh_size, M_LINKER, M_WAITOK); +printf("rela %ld allocated at %p\n", shdr[i].sh_size, ef->relatab[ra].rela); ef->relatab[ra].fileoff = shdr[i].sh_offset; ef->relatab[ra].filesz = shdr[i].sh_size; ra++; @@ -431,14 +452,20 @@ error = ENOMEM; goto out; } +printf("final mapbase %p, final mapsize %ld\n", mapbase, mapsize); /* Add the base address to the previously calculated/aligned offsets */ - for (i = 0; i < ef->nprogtab; i++) + for (i = 0; i < ef->nprogtab; i++) { ef->progtab[i].addr = mapbase + (uintptr_t)ef->progtab[i].addr; - for (i = 0; i < ef->nnobittab; i++) +printf("progtab[%d] at %p\n", i, ef->progtab[i].addr); + } + for (i = 0; i < ef->nnobittab; i++) { ef->nobittab[i].addr = mapbase + (uintptr_t)ef->nobittab[i].addr; +printf("nobittab[%d] at %p\n", i, ef->nobittab[i].addr); + } +printf("reading symbols\n"); /* Load the symbol table. */ error = vn_rdwr(UIO_READ, nd.ni_vp, ef->symbase, ef->ddbsymcnt, shdr[symtabindex].sh_offset, @@ -446,6 +473,7 @@ &resid, td); if (error) goto out; +printf("reading strings\n"); error = vn_rdwr(UIO_READ, nd.ni_vp, ef->strbase, ef->ddbstrcnt, shdr[symstrindex].sh_offset, UIO_SYSSPACE, IO_NODELOCKED, td->td_ucred, NOCRED, @@ -453,8 +481,10 @@ if (error) goto out; +printf("reading progbits\n"); /* Read in the text/data/set/etc sections */ for (i = 0; i < ef->nprogtab; i++) { +printf("reading progbits %d\n", i); error = vn_rdwr(UIO_READ, nd.ni_vp, ef->progtab[pb].addr, ef->progtab[pb].filesz, @@ -469,6 +499,7 @@ * Read in relocation tables. Platforms use rel or rela, but * usually not both. */ +printf("reading rel\n"); for (i = 0; i < ef->nrel; i++) { error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)ef->reltab[pb].rel, @@ -479,6 +510,7 @@ if (error) goto out; } +printf("reading rela\n"); for (i = 0; i < ef->nrela; i++) { error = vn_rdwr(UIO_READ, nd.ni_vp, (void *)ef->relatab[pb].rela, @@ -491,31 +523,38 @@ } +printf("now do post link stuff\n"); /* Inform the kld system about the situation */ lf->address = ef->address; lf->size = mapsize; +printf("do intra-module relocs\n"); /* Local intra-module relocations */ link_elf_reloc_local(lf); +printf("load dependencies\n"); /* Pull in dependencies */ error = linker_load_dependencies(lf); if (error) goto out; +printf("do external relocs\n"); /* External relocations */ error = relocate_file(ef); if (error) goto out; +printf("notify MD code\n"); /* Notify MD code that a module is being loaded. */ error = elf_cpu_load_file(lf); if (error) goto out; +printf("HOLY SHIT! WE MADE IT!!!\n"); *result = lf; out: +printf("link_elf_obj: finishing up! error = %d\n", error); if (error && lf) linker_file_unload(lf); if (shdr)