Module Name: src Committed By: christos Date: Sat Aug 13 21:04:07 UTC 2011
Modified Files: src/sys/arch/sandpoint/sandpoint: machdep.c src/sys/arch/x86/x86: x86_machdep.c src/sys/kern: kern_module.c subr_kobj.c subr_kobj_vfs.c src/sys/sys: kobj.h kobj_impl.h module.h Log Message: Always provide a meaningful short name for the kobj in the error message, as well as the function name and the linenumber, without extra line feeds. To generate a diff of this commit: cvs rdiff -u -r1.57 -r1.58 src/sys/arch/sandpoint/sandpoint/machdep.c cvs rdiff -u -r1.55 -r1.56 src/sys/arch/x86/x86/x86_machdep.c cvs rdiff -u -r1.79 -r1.80 src/sys/kern/kern_module.c cvs rdiff -u -r1.43 -r1.44 src/sys/kern/subr_kobj.c cvs rdiff -u -r1.5 -r1.6 src/sys/kern/subr_kobj_vfs.c cvs rdiff -u -r1.15 -r1.16 src/sys/sys/kobj.h cvs rdiff -u -r1.2 -r1.3 src/sys/sys/kobj_impl.h cvs rdiff -u -r1.26 -r1.27 src/sys/sys/module.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sandpoint/sandpoint/machdep.c diff -u src/sys/arch/sandpoint/sandpoint/machdep.c:1.57 src/sys/arch/sandpoint/sandpoint/machdep.c:1.58 --- src/sys/arch/sandpoint/sandpoint/machdep.c:1.57 Mon Jun 20 03:18:07 2011 +++ src/sys/arch/sandpoint/sandpoint/machdep.c Sat Aug 13 17:04:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.57 2011/06/20 07:18:07 matt Exp $ */ +/* $NetBSD: machdep.c,v 1.58 2011/08/13 21:04:05 christos Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.57 2011/06/20 07:18:07 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.58 2011/08/13 21:04:05 christos Exp $"); #include "opt_compat_netbsd.h" #include "opt_ddb.h" @@ -420,7 +420,7 @@ while (bi < biend) { printf("module %s at 0x%08x size %x\n", bi->kmod, bi->base, bi->len); - /* module_prime((void *)bi->base, bi->len); */ + /* module_prime(bi->kmod, (void *)bi->base, bi->len); */ bi += 1; } } Index: src/sys/arch/x86/x86/x86_machdep.c diff -u src/sys/arch/x86/x86/x86_machdep.c:1.55 src/sys/arch/x86/x86/x86_machdep.c:1.56 --- src/sys/arch/x86/x86/x86_machdep.c:1.55 Thu Aug 11 14:11:17 2011 +++ src/sys/arch/x86/x86/x86_machdep.c Sat Aug 13 17:04:05 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: x86_machdep.c,v 1.55 2011/08/11 18:11:17 cherry Exp $ */ +/* $NetBSD: x86_machdep.c,v 1.56 2011/08/13 21:04:05 christos Exp $ */ /*- * Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi, @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.55 2011/08/11 18:11:17 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.56 2011/08/13 21:04:05 christos Exp $"); #include "opt_modular.h" #include "opt_physmem.h" @@ -160,7 +160,8 @@ aprint_debug("Prep module path=%s len=%d pa=%x\n", bi->path, bi->len, bi->base); KASSERT(trunc_page(bi->base) == bi->base); - module_prime((void *)((uintptr_t)bi->base + KERNBASE), + module_prime(bi->path, + (void *)((uintptr_t)bi->base + KERNBASE), bi->len); break; case BI_MODULE_IMAGE: Index: src/sys/kern/kern_module.c diff -u src/sys/kern/kern_module.c:1.79 src/sys/kern/kern_module.c:1.80 --- src/sys/kern/kern_module.c:1.79 Sun Jul 17 16:54:52 2011 +++ src/sys/kern/kern_module.c Sat Aug 13 17:04:06 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_module.c,v 1.79 2011/07/17 20:54:52 joerg Exp $ */ +/* $NetBSD: kern_module.c,v 1.80 2011/08/13 21:04:06 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.79 2011/07/17 20:54:52 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.80 2011/08/13 21:04:06 christos Exp $"); #define _MODULE_INTERNAL @@ -1179,7 +1179,7 @@ * list. */ int -module_prime(void *base, size_t size) +module_prime(const char *name, void *base, size_t size) { module_t *mod; int error; @@ -1189,7 +1189,7 @@ return ENOMEM; } - error = kobj_load_mem(&mod->mod_kobj, base, size); + error = kobj_load_mem(&mod->mod_kobj, name, base, size); if (error != 0) { kmem_free(mod, sizeof(*mod)); module_error("unable to load object pushed by boot loader"); Index: src/sys/kern/subr_kobj.c diff -u src/sys/kern/subr_kobj.c:1.43 src/sys/kern/subr_kobj.c:1.44 --- src/sys/kern/subr_kobj.c:1.43 Sun Jul 17 16:54:52 2011 +++ src/sys/kern/subr_kobj.c Sat Aug 13 17:04:06 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_kobj.c,v 1.43 2011/07/17 20:54:52 joerg Exp $ */ +/* $NetBSD: subr_kobj.c,v 1.44 2011/08/13 21:04:06 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.43 2011/07/17 20:54:52 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.44 2011/08/13 21:04:06 christos Exp $"); #include "opt_modular.h" @@ -82,7 +82,8 @@ static int kobj_relocate(kobj_t, bool); static int kobj_checksyms(kobj_t, bool); -static void kobj_error(const char *, ...); +static void kobj_error(const char *, int, kobj_t, const char *, ...) + __printflike(4, 5); static void kobj_jettison(kobj_t); static void kobj_free(kobj_t, void *, size_t); static void kobj_close(kobj_t); @@ -98,7 +99,7 @@ * the complete size of the object is known. */ int -kobj_load_mem(kobj_t *kop, void *base, ssize_t size) +kobj_load_mem(kobj_t *kop, const char *name, void *base, ssize_t size) { kobj_t ko; @@ -108,6 +109,7 @@ } ko->ko_type = KT_MEMORY; + kobj_setname(ko, name); ko->ko_source = base; ko->ko_memsize = size; ko->ko_read = kobj_read_mem; @@ -176,22 +178,26 @@ * Read the elf header from the file. */ error = ko->ko_read(ko, (void **)&hdr, sizeof(*hdr), 0, true); - if (error != 0) + if (error != 0) { + kobj_error(__func__, __LINE__, ko, "read failed %d", error); goto out; + } if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0) { - kobj_error("not an ELF object"); + kobj_error(__func__, __LINE__, ko, "not an ELF object"); error = ENOEXEC; goto out; } if (hdr->e_ident[EI_VERSION] != EV_CURRENT || hdr->e_version != EV_CURRENT) { - kobj_error("unsupported file version"); + kobj_error(__func__, __LINE__, ko, + "unsupported file version %d", hdr->e_ident[EI_VERSION]); error = ENOEXEC; goto out; } if (hdr->e_type != ET_REL) { - kobj_error("unsupported file type"); + kobj_error(__func__, __LINE__, ko, "unsupported file type %d", + hdr->e_type); error = ENOEXEC; goto out; } @@ -204,7 +210,8 @@ #error not defined #endif default: - kobj_error("unsupported machine"); + kobj_error(__func__, __LINE__, ko, "unsupported machine %d", + hdr->e_machine); error = ENOEXEC; goto out; } @@ -220,12 +227,14 @@ ko->ko_shdrsz = hdr->e_shnum * hdr->e_shentsize; if (ko->ko_shdrsz == 0 || hdr->e_shoff == 0 || hdr->e_shentsize != sizeof(Elf_Shdr)) { + kobj_error(__func__, __LINE__, ko, "bad sizes"); error = ENOEXEC; goto out; } error = ko->ko_read(ko, (void **)&shdr, ko->ko_shdrsz, hdr->e_shoff, true); if (error != 0) { + kobj_error(__func__, __LINE__, ko, "read failed %d", error); goto out; } ko->ko_shdr = shdr; @@ -258,19 +267,21 @@ } } if (ko->ko_nprogtab == 0) { - kobj_error("file has no contents"); + kobj_error(__func__, __LINE__, ko, "file has no contents"); error = ENOEXEC; goto out; } if (nsym != 1) { /* Only allow one symbol table for now */ - kobj_error("file has no valid symbol table"); + kobj_error(__func__, __LINE__, ko, + "file has no valid symbol table"); error = ENOEXEC; goto out; } if (symstrindex < 0 || symstrindex > hdr->e_shnum || shdr[symstrindex].sh_type != SHT_STRTAB) { - kobj_error("file has invalid symbol strings"); + kobj_error(__func__, __LINE__, ko, + "file has invalid symbol strings"); error = ENOEXEC; goto out; } @@ -283,6 +294,7 @@ sizeof(*ko->ko_progtab), KM_SLEEP); if (ko->ko_progtab == NULL) { error = ENOMEM; + kobj_error(__func__, __LINE__, ko, "out of memory"); goto out; } } @@ -291,6 +303,7 @@ sizeof(*ko->ko_reltab), KM_SLEEP); if (ko->ko_reltab == NULL) { error = ENOMEM; + kobj_error(__func__, __LINE__, ko, "out of memory"); goto out; } } @@ -299,11 +312,12 @@ sizeof(*ko->ko_relatab), KM_SLEEP); if (ko->ko_relatab == NULL) { error = ENOMEM; + kobj_error(__func__, __LINE__, ko, "out of memory"); goto out; } } if (symtabindex == -1) { - kobj_error("lost symbol table index"); + kobj_error(__func__, __LINE__, ko, "lost symbol table index"); goto out; } @@ -312,13 +326,14 @@ */ ko->ko_symcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); if (ko->ko_symcnt == 0) { - kobj_error("no symbol table"); + kobj_error(__func__, __LINE__, ko, "no symbol table"); goto out; } error = ko->ko_read(ko, (void **)&ko->ko_symtab, ko->ko_symcnt * sizeof(Elf_Sym), shdr[symtabindex].sh_offset, true); if (error != 0) { + kobj_error(__func__, __LINE__, ko, "read failed %d", error); goto out; } @@ -327,12 +342,13 @@ */ ko->ko_strtabsz = shdr[symstrindex].sh_size; if (ko->ko_strtabsz == 0) { - kobj_error("no symbol strings"); + kobj_error(__func__, __LINE__, ko, "no symbol strings"); goto out; } error = ko->ko_read(ko, (void *)&ko->ko_strtab, ko->ko_strtabsz, shdr[symstrindex].sh_offset, true); if (error != 0) { + kobj_error(__func__, __LINE__, ko, "read failed %d", error); goto out; } @@ -342,6 +358,8 @@ error = kobj_renamespace(ko->ko_symtab, ko->ko_symcnt, &ko->ko_strtab, &ko->ko_strtabsz); if (error != 0) { + kobj_error(__func__, __LINE__, ko, "renamespace failed %d", + error); goto out; } @@ -355,6 +373,8 @@ shdr[hdr->e_shstrndx].sh_size, shdr[hdr->e_shstrndx].sh_offset, true); if (error != 0) { + kobj_error(__func__, __LINE__, ko, "read failed %d", + error); goto out; } } @@ -384,7 +404,7 @@ * can get the bounds and gdb can associate offsets with modules. */ if (mapsize == 0) { - kobj_error("no text/data/bss"); + kobj_error(__func__, __LINE__, ko, "no text/data/bss"); goto out; } if (ko->ko_type == KT_MEMORY) { @@ -393,6 +413,7 @@ mapbase = uvm_km_alloc(module_map, round_page(mapsize), 0, UVM_KMF_WIRED | UVM_KMF_EXEC); if (mapbase == 0) { + kobj_error(__func__, __LINE__, ko, "out of memory"); error = ENOMEM; goto out; } @@ -417,7 +438,8 @@ addr = (void *)(shdr[i].sh_offset + (vaddr_t)ko->ko_source); if (((vaddr_t)addr & alignmask) != 0) { - kobj_error("section %d not aligned\n", + kobj_error(__func__, __LINE__, ko, + "section %d not aligned", i); goto out; } @@ -433,12 +455,15 @@ error = ko->ko_read(ko, &addr, shdr[i].sh_size, shdr[i].sh_offset, false); if (error != 0) { + kobj_error(__func__, __LINE__, ko, + "read failed %d", error); goto out; } } else if (ko->ko_type == KT_MEMORY && shdr[i].sh_size != 0) { - kobj_error("non-loadable BSS section in " - "pre-loaded module"); + kobj_error(__func__, __LINE__, ko, + "non-loadable BSS " + "section in pre-loaded module"); error = EINVAL; goto out; } else { @@ -475,6 +500,8 @@ ko->ko_reltab[rl].size, shdr[i].sh_offset, true); if (error != 0) { + kobj_error(__func__, __LINE__, ko, + "read failed %d", error); goto out; } } @@ -493,6 +520,8 @@ shdr[i].sh_size, shdr[i].sh_offset, true); if (error != 0) { + kobj_error(__func__, __LINE__, ko, + "read failed %d", error); goto out; } } @@ -556,9 +585,9 @@ if (ko->ko_loaded) { error = kobj_machdep(ko, (void *)ko->ko_address, ko->ko_size, false); - if (error != 0) { - kobj_error("machine dependent deinit failed"); - } + if (error != 0) + kobj_error(__func__, __LINE__, ko, + "machine dependent deinit failed %d", error); } if (ko->ko_address != 0 && ko->ko_type != KT_MEMORY) { uvm_km_free(module_map, ko->ko_address, round_page(ko->ko_size), @@ -618,7 +647,7 @@ KASSERT(ko->ko_ksyms == false); KASSERT(ko->ko_loaded == false); - strlcpy(ko->ko_name, name, sizeof(ko->ko_name)); + kobj_setname(ko, name); /* Cache addresses of undefined symbols. */ error = kobj_checksyms(ko, true); @@ -649,9 +678,9 @@ if (error == 0) { error = kobj_machdep(ko, (void *)ko->ko_address, ko->ko_size, true); - if (error != 0) { - kobj_error("machine dependent init failed"); - } + if (error != 0) + kobj_error(__func__, __LINE__, ko, + "machine dependent init failed %d", error); ko->ko_loaded = true; } @@ -758,7 +787,7 @@ switch (ELF_ST_BIND(sym->st_info)) { case STB_LOCAL: /* Local, but undefined? huh? */ - kobj_error("local symbol undefined"); + kobj_error(__func__, __LINE__, ko, "local symbol undefined"); return 0; case STB_GLOBAL: @@ -767,14 +796,15 @@ /* Force a lookup failure if the symbol name is bogus. */ if (*symbol == 0) { - kobj_error("bad symbol name"); + kobj_error(__func__, __LINE__, ko, "bad symbol name"); return 0; } return (uintptr_t)sym->st_value; case STB_WEAK: - kobj_error("weak symbols not supported\n"); + kobj_error(__func__, __LINE__, ko, + "weak symbols not supported"); return 0; default: @@ -834,7 +864,8 @@ if (ksyms_getval_unlocked(NULL, name, &rval, KSYMS_EXTERN) != 0) { if (undefined) { - kobj_error("symbol `%s' not found", name); + kobj_error(__func__, __LINE__, ko, + "symbol `%s' not found", name); error = ENOEXEC; } continue; @@ -862,7 +893,8 @@ strncmp(name, "__stop_link_set_", 16)) { continue; } - kobj_error("global symbol `%s' redefined\n", name); + kobj_error(__func__, __LINE__, ko, + "global symbol `%s' redefined", name); error = ENOEXEC; } @@ -953,35 +985,35 @@ * Utility function: log an error. */ static void -kobj_error(const char *fmt, ...) +kobj_error(const char *fname, int lnum, kobj_t ko, const char *fmt, ...) { va_list ap; + printf("%s, %d: [%s]: linker error: ", fname, lnum, ko->ko_name); va_start(ap, fmt); - printf("WARNING: linker error: "); vprintf(fmt, ap); - printf("\n"); va_end(ap); + printf("\n"); } static int kobj_read_mem(kobj_t ko, void **basep, size_t size, off_t off, - bool allocate) + bool allocate) { void *base = *basep; int error; if (ko->ko_memsize != -1 && off + size > ko->ko_memsize) { - kobj_error("kobj_read_mem: preloaded object short"); + kobj_error(__func__, __LINE__, ko, "preloaded object short"); error = EINVAL; base = NULL; } else if (allocate) { base = (uint8_t *)ko->ko_source + off; error = 0; } else if ((uint8_t *)base != (uint8_t *)ko->ko_source + off) { - kobj_error("kobj_read_mem: object not aligned"); - kobj_error("source=%p base=%p off=%d size=%zd", - ko->ko_source, base, (int)off, size); + kobj_error(__func__, __LINE__, ko, "object not aligned"); + kobj_error(__func__, __LINE__, ko, "source=%p base=%p off=%d " + "size=%zd", ko->ko_source, base, (int)off, size); error = EINVAL; } else { /* Nothing to do. Loading in-situ. */ @@ -1007,10 +1039,37 @@ kmem_free(base, size); } +extern char module_base[]; + +void +kobj_setname(kobj_t ko, const char *name) +{ + const char *d = name, *dots = ""; + size_t len, dlen; + + for (char *s = module_base; *d == *s; d++, s++) + continue; + + if (d == name) + name = ""; + else + name = "%M"; + dlen = strlen(d); + len = dlen + strlen(name); + if (len >= sizeof(ko->ko_name)) { + len = (len - sizeof(ko->ko_name)) + 5; /* dots + NUL */ + if (dlen >= len) { + d += len; + dots = "/..."; + } + } + snprintf(ko->ko_name, sizeof(ko->ko_name), "%s%s%s", name, dots, d); +} + #else /* MODULAR */ int -kobj_load_mem(kobj_t *kop, void *base, ssize_t size) +kobj_load_mem(kobj_t *kop, const char *name, void *base, ssize_t size) { return ENOSYS; @@ -1044,4 +1103,11 @@ panic("not modular"); } +void +kobj_setname(kobj_t ko, const char *name) +{ + + panic("not modular"); +} + #endif /* MODULAR */ Index: src/sys/kern/subr_kobj_vfs.c diff -u src/sys/kern/subr_kobj_vfs.c:1.5 src/sys/kern/subr_kobj_vfs.c:1.6 --- src/sys/kern/subr_kobj_vfs.c:1.5 Sat Aug 6 04:11:09 2011 +++ src/sys/kern/subr_kobj_vfs.c Sat Aug 13 17:04:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_kobj_vfs.c,v 1.5 2011/08/06 08:11:09 mbalmer Exp $ */ +/* $NetBSD: subr_kobj_vfs.c,v 1.6 2011/08/13 21:04:07 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -72,7 +72,7 @@ #include <sys/vnode.h> #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_kobj_vfs.c,v 1.5 2011/08/06 08:11:09 mbalmer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_kobj_vfs.c,v 1.6 2011/08/13 21:04:07 christos Exp $"); static void kobj_close_vfs(kobj_t ko) @@ -166,6 +166,7 @@ } ko->ko_type = KT_VNODE; + kobj_setname(ko, path); ko->ko_source = nd.ni_vp; ko->ko_read = kobj_read_vfs; ko->ko_close = kobj_close_vfs; Index: src/sys/sys/kobj.h diff -u src/sys/sys/kobj.h:1.15 src/sys/sys/kobj.h:1.16 --- src/sys/sys/kobj.h:1.15 Mon Apr 26 20:38:42 2010 +++ src/sys/sys/kobj.h Sat Aug 13 17:04:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kobj.h,v 1.15 2010/04/27 00:38:42 pooka Exp $ */ +/* $NetBSD: kobj.h,v 1.16 2011/08/13 21:04:07 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ /* External interface. */ int kobj_load_vfs(kobj_t *, const char *, const bool); -int kobj_load_mem(kobj_t *, void *, ssize_t); +int kobj_load_mem(kobj_t *, const char *, void *, ssize_t); int kobj_affix(kobj_t, const char *); void kobj_unload(kobj_t); int kobj_stat(kobj_t, vaddr_t *, size_t *); Index: src/sys/sys/kobj_impl.h diff -u src/sys/sys/kobj_impl.h:1.2 src/sys/sys/kobj_impl.h:1.3 --- src/sys/sys/kobj_impl.h:1.2 Fri Nov 27 12:54:11 2009 +++ src/sys/sys/kobj_impl.h Sat Aug 13 17:04:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: kobj_impl.h,v 1.2 2009/11/27 17:54:11 pooka Exp $ */ +/* $NetBSD: kobj_impl.h,v 1.3 2011/08/13 21:04:07 christos Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -131,6 +131,7 @@ #ifdef _KERNEL int kobj_load(kobj_t); +void kobj_setname(kobj_t, const char *); #endif #endif /* _SYS_KOBJ_IMPL_H_ */ Index: src/sys/sys/module.h diff -u src/sys/sys/module.h:1.26 src/sys/sys/module.h:1.27 --- src/sys/sys/module.h:1.26 Sun Apr 17 01:16:29 2011 +++ src/sys/sys/module.h Sat Aug 13 17:04:07 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: module.h,v 1.26 2011/04/17 05:16:29 mrg Exp $ */ +/* $NetBSD: module.h,v 1.27 2011/08/13 21:04:07 christos Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -126,7 +126,7 @@ void module_builtin_require_force(void); void module_init_md(void); void module_init_class(modclass_t); -int module_prime(void *, size_t); +int module_prime(const char *, void *, size_t); bool module_compatible(int, int); int module_load(const char *, int, prop_dictionary_t, modclass_t);