Module Name: src Committed By: chs Date: Wed Jun 14 00:52:37 UTC 2017
Modified Files: src/sys/kern: kern_ksyms.c Log Message: create an nmap table for module symtabs too. needed by dtrace. To generate a diff of this commit: cvs rdiff -u -r1.84 -r1.85 src/sys/kern/kern_ksyms.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_ksyms.c diff -u src/sys/kern/kern_ksyms.c:1.84 src/sys/kern/kern_ksyms.c:1.85 --- src/sys/kern/kern_ksyms.c:1.84 Thu Jul 7 06:55:43 2016 +++ src/sys/kern/kern_ksyms.c Wed Jun 14 00:52:37 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ksyms.c,v 1.84 2016/07/07 06:55:43 msaitoh Exp $ */ +/* $NetBSD: kern_ksyms.c,v 1.85 2017/06/14 00:52:37 chs Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.84 2016/07/07 06:55:43 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.85 2017/06/14 00:52:37 chs Exp $"); #if defined(_KERNEL) && defined(_KERNEL_OPT) #include "opt_copy_symtab.h" @@ -336,8 +336,9 @@ addsymtab(const char *name, void *symsta nglob = 0; for (i = n = 0; i < nsyms; i++) { - /* This breaks CTF mapping, so don't do it when - * DTrace is enabled + /* + * This breaks CTF mapping, so don't do it when + * DTrace is enabled. */ #ifndef KDTRACE_HOOKS /* @@ -396,6 +397,7 @@ addsymtab(const char *name, void *symsta tab->sd_symstart = nsym; tab->sd_symsize = n * sizeof(Elf_Sym); tab->sd_nglob = nglob; + addsymtab_strstart = str; if (kheapsort(nsym, n, sizeof(Elf_Sym), addsymtab_compar, &ts) != 0) panic("addsymtab"); @@ -731,11 +733,14 @@ ksyms_modload(const char *name, void *sy char *strstart, vsize_t strsize) { struct ksyms_symtab *st; + void *nmap; st = kmem_zalloc(sizeof(*st), KM_SLEEP); + nmap = kmem_zalloc(symsize / sizeof(Elf_Sym) * sizeof (uint32_t), + KM_SLEEP); mutex_enter(&ksyms_lock); addsymtab(name, symstart, symsize, strstart, strsize, st, symstart, - NULL, 0, NULL); + NULL, 0, nmap); mutex_exit(&ksyms_lock); } @@ -757,6 +762,8 @@ ksyms_modunload(const char *name) if (!ksyms_isopen) { TAILQ_REMOVE(&ksyms_symtabs, st, sd_queue); ksyms_sizes_calc(); + kmem_free(st->sd_nmap, + st->sd_nmapsize * sizeof(uint32_t)); kmem_free(st, sizeof(*st)); } break; @@ -984,6 +991,8 @@ ksymsclose(dev_t dev, int oflags, int de next = TAILQ_NEXT(st, sd_queue); if (st->sd_gone) { TAILQ_REMOVE(&ksyms_symtabs, st, sd_queue); + kmem_free(st->sd_nmap, + st->sd_nmapsize * sizeof(uint32_t)); kmem_free(st, sizeof(*st)); resize = true; }