From 1f322d546cc6270f2514a729f36970fc939df32e Mon Sep 17 00:00:00 2001 From: green Date: Sun, 8 May 2005 20:22:48 +0000 Subject: [PATCH] kallsyms patch for 2.4.29 Separated uml & non-uml 2.4.29 series --- .../kernel_patches/patches/kallsyms-2.4.29.patch | 689 +++++++++++++++++++++ lustre/kernel_patches/series/vanilla-2.4.29 | 5 +- lustre/kernel_patches/series/vanilla-2.4.29-uml | 46 ++ 3 files changed, 736 insertions(+), 4 deletions(-) create mode 100644 lustre/kernel_patches/patches/kallsyms-2.4.29.patch create mode 100644 lustre/kernel_patches/series/vanilla-2.4.29-uml diff --git a/lustre/kernel_patches/patches/kallsyms-2.4.29.patch b/lustre/kernel_patches/patches/kallsyms-2.4.29.patch new file mode 100644 index 0000000..3cd5b23 --- /dev/null +++ b/lustre/kernel_patches/patches/kallsyms-2.4.29.patch @@ -0,0 +1,689 @@ +Index: linux-2.4.29/arch/arm/vmlinux-armo.lds.in +=================================================================== +--- linux-2.4.29.orig/arch/arm/vmlinux-armo.lds.in 2005-05-08 23:06:26.916055656 +0300 ++++ linux-2.4.29/arch/arm/vmlinux-armo.lds.in 2005-05-08 23:07:11.214321296 +0300 +@@ -62,6 +62,10 @@ + *(__ksymtab) + __stop___ksymtab = .; + ++ __start___kallsyms = .; /* All kernel symbols */ ++ *(__kallsyms) ++ __stop___kallsyms = .; ++ + *(.got) /* Global offset table */ + + _etext = .; /* End of text section */ +Index: linux-2.4.29/arch/arm/vmlinux-armv.lds.in +=================================================================== +--- linux-2.4.29.orig/arch/arm/vmlinux-armv.lds.in 2005-05-08 23:06:26.917055504 +0300 ++++ linux-2.4.29/arch/arm/vmlinux-armv.lds.in 2005-05-08 23:07:11.215321144 +0300 +@@ -67,6 +67,12 @@ + __stop___ksymtab = .; + } + ++ __kallsyms : { /* Kernel debugging table */ ++ __start___kallsyms = .; /* All kernel symbols */ ++ *(__kallsyms) ++ __stop___kallsyms = .; ++ } ++ + . = ALIGN(8192); + + .data : { +Index: linux-2.4.29/arch/ppc/config.in +=================================================================== +--- linux-2.4.29.orig/arch/ppc/config.in 2005-05-08 23:06:26.933053072 +0300 ++++ linux-2.4.29/arch/ppc/config.in 2005-05-08 23:07:11.216320992 +0300 +@@ -655,6 +655,7 @@ + fi + fi + fi ++bool 'Load all symbols for debugging/kksymoops' CONFIG_KALLSYMS + + if [ "$CONFIG_ALL_PPC" = "y" ]; then + bool 'Support for early boot text console (BootX or OpenFirmware only)' CONFIG_BOOTX_TEXT +Index: linux-2.4.29/arch/ppc/vmlinux.lds +=================================================================== +--- linux-2.4.29.orig/arch/ppc/vmlinux.lds 2005-05-08 23:06:26.934052920 +0300 ++++ linux-2.4.29/arch/ppc/vmlinux.lds 2005-05-08 23:07:11.217320840 +0300 +@@ -74,6 +74,10 @@ + __ksymtab : { *(__ksymtab) } + __stop___ksymtab = .; + ++ __start___kallsyms = .; /* All kernel symbols */ ++ __kallsyms : { *(__kallsyms) } ++ __stop___kallsyms = .; ++ + . = ALIGN(8); + __start___ftr_fixup = .; + __ftr_fixup : { *(__ftr_fixup) } +Index: linux-2.4.29/arch/i386/config.in +=================================================================== +--- linux-2.4.29.orig/arch/i386/config.in 2005-05-08 23:07:09.946514032 +0300 ++++ linux-2.4.29/arch/i386/config.in 2005-05-08 23:07:11.218320688 +0300 +@@ -449,6 +449,7 @@ + if [ "$CONFIG_ISDN" != "n" ]; then + source drivers/isdn/Config.in + fi ++ bool ' Load all symbols for debugging/kksymoops' CONFIG_KALLSYMS + fi + endmenu + +Index: linux-2.4.29/arch/ia64/config.in +=================================================================== +--- linux-2.4.29.orig/arch/ia64/config.in 2005-05-08 23:06:26.936052616 +0300 ++++ linux-2.4.29/arch/ia64/config.in 2005-05-08 23:07:11.219320536 +0300 +@@ -318,4 +318,6 @@ + + int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + ++bool ' Load all symbols for debugging/kksymoops' CONFIG_KALLSYMS ++ + endmenu +Index: linux-2.4.29/arch/alpha/vmlinux.lds.in +=================================================================== +--- linux-2.4.29.orig/arch/alpha/vmlinux.lds.in 2005-05-08 23:06:26.937052464 +0300 ++++ linux-2.4.29/arch/alpha/vmlinux.lds.in 2005-05-08 23:07:11.220320384 +0300 +@@ -28,6 +28,10 @@ + __stop___ksymtab = .; + .kstrtab : { *(.kstrtab) } + ++ __start___kallsyms = .; /* All kernel symbols */ ++ __kallsyms : { *(__kallsyms) } ++ __stop___kallsyms = .; ++ + /* Startup code */ + . = ALIGN(8192); + __init_begin = .; +Index: linux-2.4.29/Makefile +=================================================================== +--- linux-2.4.29.orig/Makefile 2005-05-08 22:59:19.203077912 +0300 ++++ linux-2.4.29/Makefile 2005-05-08 23:07:11.222320080 +0300 +@@ -37,6 +37,7 @@ + MAKEFILES = $(TOPDIR)/.config + GENKSYMS = /sbin/genksyms + DEPMOD = /sbin/depmod ++KALLSYMS = /sbin/kallsyms + MODFLAGS = -DMODULE + CFLAGS_KERNEL = + PERL = perl +@@ -44,6 +45,8 @@ + RPM := $(shell if [ -x "/usr/bin/rpmbuild" ]; then echo rpmbuild; \ + else echo rpm; fi) + ++TMPPREFIX = ++ + export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \ + CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \ + CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL AWK +@@ -202,7 +205,7 @@ + CLEAN_FILES = \ + kernel/ksyms.lst include/linux/compile.h \ + vmlinux System.map \ +- .tmp* \ ++ $(TMPPREFIX).tmp* \ + drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c \ + drivers/char/conmakehash \ + drivers/char/drm/*-mod.c \ +@@ -285,16 +288,39 @@ + boot: vmlinux + @$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C arch/$(ARCH)/boot + ++LD_VMLINUX := $(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o init/do_mounts.o \ ++ --start-group \ ++ $(CORE_FILES) \ ++ $(DRIVERS) \ ++ $(NETWORKS) \ ++ $(LIBS) \ ++ --end-group ++ifeq ($(CONFIG_KALLSYMS),y) ++LD_VMLINUX_KALLSYMS := $(TMPPREFIX).tmp_kallsyms3.o ++else ++LD_VMLINUX_KALLSYMS := ++endif ++ + vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o init/do_mounts.o linuxsubdirs +- $(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o init/do_mounts.o \ +- --start-group \ +- $(CORE_FILES) \ +- $(DRIVERS) \ +- $(NETWORKS) \ +- $(LIBS) \ +- --end-group \ +- -o vmlinux ++ @$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" kallsyms ++ ++.PHONY: kallsyms ++ ++kallsyms: ++ifeq ($(CONFIG_KALLSYMS),y) ++ @echo kallsyms pass 1 ++ $(LD_VMLINUX) -o $(TMPPREFIX).tmp_vmlinux1 ++ @$(KALLSYMS) $(TMPPREFIX).tmp_vmlinux1 > $(TMPPREFIX).tmp_kallsyms1.o ++ @echo kallsyms pass 2 ++ @$(LD_VMLINUX) $(TMPPREFIX).tmp_kallsyms1.o -o $(TMPPREFIX).tmp_vmlinux2 ++ @$(KALLSYMS) $(TMPPREFIX).tmp_vmlinux2 > $(TMPPREFIX).tmp_kallsyms2.o ++ @echo kallsyms pass 3 ++ @$(LD_VMLINUX) $(TMPPREFIX).tmp_kallsyms2.o -o $(TMPPREFIX).tmp_vmlinux3 ++ @$(KALLSYMS) $(TMPPREFIX).tmp_vmlinux3 > $(TMPPREFIX).tmp_kallsyms3.o ++endif ++ $(LD_VMLINUX) $(LD_VMLINUX_KALLSYMS) -o vmlinux + $(NM) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map ++ @rm -f $(TMPPREFIX).tmp_vmlinux* $(TMPPREFIX).tmp_kallsyms* + + symlinks: + rm -f include/asm +Index: linux-2.4.29/kernel/Makefile +=================================================================== +--- linux-2.4.29.orig/kernel/Makefile 2005-05-08 23:06:26.939052160 +0300 ++++ linux-2.4.29/kernel/Makefile 2005-05-08 23:07:11.223319928 +0300 +@@ -19,6 +19,7 @@ + obj-$(CONFIG_UID16) += uid16.o + obj-$(CONFIG_MODULES) += ksyms.o + obj-$(CONFIG_PM) += pm.o ++obj-$(CONFIG_KALLSYMS) += kallsyms.o + + ifneq ($(CONFIG_IA64),y) + # According to Alan Modra , the -fno-omit-frame-pointer is +Index: linux-2.4.29/kernel/ksyms.c +=================================================================== +--- linux-2.4.29.orig/kernel/ksyms.c 2005-05-08 23:07:10.878372368 +0300 ++++ linux-2.4.29/kernel/ksyms.c 2005-05-08 23:07:11.224319776 +0300 +@@ -59,6 +59,9 @@ + #ifdef CONFIG_KMOD + #include + #endif ++#ifdef CONFIG_KALLSYMS ++#include ++#endif + + extern void set_device_ro(kdev_t dev,int flag); + +@@ -87,6 +90,15 @@ + EXPORT_SYMBOL(inter_module_put); + EXPORT_SYMBOL(try_inc_mod_count); + ++#ifdef CONFIG_KALLSYMS ++extern const char __start___kallsyms[]; ++extern const char __stop___kallsyms[]; ++EXPORT_SYMBOL(__start___kallsyms); ++EXPORT_SYMBOL(__stop___kallsyms); ++ ++ ++#endif ++ + /* process memory management */ + EXPORT_SYMBOL(do_mmap_pgoff); + EXPORT_SYMBOL(do_munmap); +Index: linux-2.4.29/kernel/kallsyms.c +=================================================================== +--- linux-2.4.29.orig/kernel/kallsyms.c 2005-05-08 23:07:11.196324032 +0300 ++++ linux-2.4.29/kernel/kallsyms.c 2005-05-08 23:07:11.226319472 +0300 +@@ -0,0 +1,306 @@ ++/* An example of using kallsyms data in a kernel debugger. ++ ++ Copyright 2000 Keith Owens April 2000 ++ ++ This file is part of the Linux modutils. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License as published by the ++ Free Software Foundation; either version 2 of the License, or (at your ++ option) any later version. ++ ++ This program is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software Foundation, ++ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ */ ++ ++#ident "$Id: kallsyms-2.4-bgl.patch,v 1.1.20.1 2005/03/24 22:50:28 jacob Exp $" ++ ++/* ++ This code uses the list of all kernel and module symbols to :- ++ ++ * Find any non-stack symbol in a kernel or module. Symbols do ++ not have to be exported for debugging. ++ ++ * Convert an address to the module (or kernel) that owns it, the ++ section it is in and the nearest symbol. This finds all non-stack ++ symbols, not just exported ones. ++ ++ You need modutils >= 2.3.11 and a kernel with the kallsyms patch ++ which was compiled with CONFIG_KALLSYMS. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/* These external symbols are only set on kernels compiled with ++ * CONFIG_KALLSYMS. ++ */ ++ ++extern const char __start___kallsyms[]; ++extern const char __stop___kallsyms[]; ++ ++static struct module **kallsyms_module_list; ++ ++static void kallsyms_get_module_list(void) ++{ ++ const struct kallsyms_header *ka_hdr; ++ const struct kallsyms_section *ka_sec; ++ const struct kallsyms_symbol *ka_sym; ++ const char *ka_str; ++ int i; ++ const char *p; ++ ++ if (__start___kallsyms >= __stop___kallsyms) ++ return; ++ ka_hdr = (struct kallsyms_header *)__start___kallsyms; ++ ka_sec = (struct kallsyms_section *) ++ ((char *)(ka_hdr) + ka_hdr->section_off); ++ ka_sym = (struct kallsyms_symbol *) ++ ((char *)(ka_hdr) + ka_hdr->symbol_off); ++ ka_str = ++ ((char *)(ka_hdr) + ka_hdr->string_off); ++ ++ for (i = 0; i < ka_hdr->symbols; kallsyms_next_sym(ka_hdr, ka_sym), ++i) { ++ p = ka_str + ka_sym->name_off; ++ if (strcmp(p, "module_list") == 0) { ++ if (ka_sym->symbol_addr) ++ kallsyms_module_list = (struct module **)(ka_sym->symbol_addr); ++ break; ++ } ++ } ++} ++ ++static inline void kallsyms_do_first_time(void) ++{ ++ static int first_time = 1; ++ if (first_time) ++ kallsyms_get_module_list(); ++ first_time = 0; ++} ++ ++/* A symbol can appear in more than one module. A token is used to ++ * restart the scan at the next module, set the token to 0 for the ++ * first scan of each symbol. ++ */ ++ ++int kallsyms_symbol_to_address( ++ const char *name, /* Name to lookup */ ++ unsigned long *token, /* Which module to start at */ ++ const char **mod_name, /* Set to module name */ ++ unsigned long *mod_start, /* Set to start address of module */ ++ unsigned long *mod_end, /* Set to end address of module */ ++ const char **sec_name, /* Set to section name */ ++ unsigned long *sec_start, /* Set to start address of section */ ++ unsigned long *sec_end, /* Set to end address of section */ ++ const char **sym_name, /* Set to full symbol name */ ++ unsigned long *sym_start, /* Set to start address of symbol */ ++ unsigned long *sym_end /* Set to end address of symbol */ ++ ) ++{ ++ const struct kallsyms_header *ka_hdr = NULL; /* stupid gcc */ ++ const struct kallsyms_section *ka_sec; ++ const struct kallsyms_symbol *ka_sym = NULL; ++ const char *ka_str = NULL; ++ const struct module *m; ++ int i = 0, l; ++ const char *p, *pt_R; ++ char *p2; ++ ++ kallsyms_do_first_time(); ++ if (!kallsyms_module_list) ++ return(0); ++ ++ /* Restart? */ ++ m = *kallsyms_module_list; ++ if (token && *token) { ++ for (; m; m = m->next) ++ if ((unsigned long)m == *token) ++ break; ++ if (m) ++ m = m->next; ++ } ++ ++ for (; m; m = m->next) { ++ if (!mod_member_present(m, kallsyms_start) || ++ !mod_member_present(m, kallsyms_end) || ++ m->kallsyms_start >= m->kallsyms_end) ++ continue; ++ ka_hdr = (struct kallsyms_header *)m->kallsyms_start; ++ ka_sym = (struct kallsyms_symbol *) ++ ((char *)(ka_hdr) + ka_hdr->symbol_off); ++ ka_str = ++ ((char *)(ka_hdr) + ka_hdr->string_off); ++ for (i = 0; i < ka_hdr->symbols; ++i, kallsyms_next_sym(ka_hdr, ka_sym)) { ++ p = ka_str + ka_sym->name_off; ++ if (strcmp(p, name) == 0) ++ break; ++ /* Unversioned requests match versioned names */ ++ if (!(pt_R = strstr(p, "_R"))) ++ continue; ++ l = strlen(pt_R); ++ if (l < 10) ++ continue; /* Not _R.*xxxxxxxx */ ++ (void)simple_strtoul(pt_R+l-8, &p2, 16); ++ if (*p2) ++ continue; /* Not _R.*xxxxxxxx */ ++ if (strncmp(p, name, pt_R-p) == 0) ++ break; /* Match with version */ ++ } ++ if (i < ka_hdr->symbols) ++ break; ++ } ++ ++ if (token) ++ *token = (unsigned long)m; ++ if (!m) ++ return(0); /* not found */ ++ ++ ka_sec = (const struct kallsyms_section *) ++ ((char *)ka_hdr + ka_hdr->section_off + ka_sym->section_off); ++ *mod_name = *(m->name) ? m->name : "kernel"; ++ *mod_start = ka_hdr->start; ++ *mod_end = ka_hdr->end; ++ *sec_name = ka_sec->name_off + ka_str; ++ *sec_start = ka_sec->start; ++ *sec_end = ka_sec->start + ka_sec->size; ++ *sym_name = ka_sym->name_off + ka_str; ++ *sym_start = ka_sym->symbol_addr; ++ if (i < ka_hdr->symbols-1) { ++ const struct kallsyms_symbol *ka_symn = ka_sym; ++ kallsyms_next_sym(ka_hdr, ka_symn); ++ *sym_end = ka_symn->symbol_addr; ++ } ++ else ++ *sym_end = *sec_end; ++ return(1); ++} ++ ++int kallsyms_address_to_symbol( ++ unsigned long address, /* Address to lookup */ ++ const char **mod_name, /* Set to module name */ ++ unsigned long *mod_start, /* Set to start address of module */ ++ unsigned long *mod_end, /* Set to end address of module */ ++ const char **sec_name, /* Set to section name */ ++ unsigned long *sec_start, /* Set to start address of section */ ++ unsigned long *sec_end, /* Set to end address of section */ ++ const char **sym_name, /* Set to full symbol name */ ++ unsigned long *sym_start, /* Set to start address of symbol */ ++ unsigned long *sym_end /* Set to end address of symbol */ ++ ) ++{ ++ const struct kallsyms_header *ka_hdr = NULL; /* stupid gcc */ ++ const struct kallsyms_section *ka_sec = NULL; ++ const struct kallsyms_symbol *ka_sym; ++ const char *ka_str; ++ const struct module *m; ++ int i; ++ unsigned long end; ++ ++ kallsyms_do_first_time(); ++ if (!kallsyms_module_list) ++ return(0); ++ ++ for (m = *kallsyms_module_list; m; m = m->next) { ++ if (!mod_member_present(m, kallsyms_start) || ++ !mod_member_present(m, kallsyms_end) || ++ m->kallsyms_start >= m->kallsyms_end) ++ continue; ++ ka_hdr = (struct kallsyms_header *)m->kallsyms_start; ++ ka_sec = (const struct kallsyms_section *) ++ ((char *)ka_hdr + ka_hdr->section_off); ++ /* Is the address in any section in this module? */ ++ for (i = 0; i < ka_hdr->sections; ++i, kallsyms_next_sec(ka_hdr, ka_sec)) { ++ if (ka_sec->start <= address && ++ (ka_sec->start + ka_sec->size) > address) ++ break; ++ } ++ if (i < ka_hdr->sections) ++ break; /* Found a matching section */ ++ } ++ ++ if (!m) ++ return(0); /* not found */ ++ ++ ka_sym = (struct kallsyms_symbol *) ++ ((char *)(ka_hdr) + ka_hdr->symbol_off); ++ ka_str = ++ ((char *)(ka_hdr) + ka_hdr->string_off); ++ *mod_name = *(m->name) ? m->name : "kernel"; ++ *mod_start = ka_hdr->start; ++ *mod_end = ka_hdr->end; ++ *sec_name = ka_sec->name_off + ka_str; ++ *sec_start = ka_sec->start; ++ *sec_end = ka_sec->start + ka_sec->size; ++ *sym_name = *sec_name; /* In case we find no matching symbol */ ++ *sym_start = *sec_start; ++ *sym_end = *sec_end; ++ ++ for (i = 0; i < ka_hdr->symbols; ++i, kallsyms_next_sym(ka_hdr, ka_sym)) { ++ if (ka_sym->symbol_addr > address) ++ continue; ++ if (i < ka_hdr->symbols-1) { ++ const struct kallsyms_symbol *ka_symn = ka_sym; ++ kallsyms_next_sym(ka_hdr, ka_symn); ++ end = ka_symn->symbol_addr; ++ } ++ else ++ end = *sec_end; ++ if (end <= address) ++ continue; ++ if ((char *)ka_hdr + ka_hdr->section_off + ka_sym->section_off ++ != (char *)ka_sec) ++ continue; /* wrong section */ ++ *sym_name = ka_str + ka_sym->name_off; ++ *sym_start = ka_sym->symbol_addr; ++ *sym_end = end; ++ break; ++ } ++ return(1); ++} ++ ++/* List all sections in all modules. The callback routine is invoked with ++ * token, module name, section name, section start, section end, section flags. ++ */ ++int kallsyms_sections(void *token, ++ int (*callback)(void *, const char *, const char *, ElfW(Addr), ElfW(Addr), ElfW(Word))) ++{ ++ const struct kallsyms_header *ka_hdr = NULL; /* stupid gcc */ ++ const struct kallsyms_section *ka_sec = NULL; ++ const char *ka_str; ++ const struct module *m; ++ int i; ++ ++ kallsyms_do_first_time(); ++ if (!kallsyms_module_list) ++ return(0); ++ ++ for (m = *kallsyms_module_list; m; m = m->next) { ++ if (!mod_member_present(m, kallsyms_start) || ++ !mod_member_present(m, kallsyms_end) || ++ m->kallsyms_start >= m->kallsyms_end) ++ continue; ++ ka_hdr = (struct kallsyms_header *)m->kallsyms_start; ++ ka_sec = (const struct kallsyms_section *) ((char *)ka_hdr + ka_hdr->section_off); ++ ka_str = ((char *)(ka_hdr) + ka_hdr->string_off); ++ for (i = 0; i < ka_hdr->sections; ++i, kallsyms_next_sec(ka_hdr, ka_sec)) { ++ if (callback( ++ token, ++ *(m->name) ? m->name : "kernel", ++ ka_sec->name_off + ka_str, ++ ka_sec->start, ++ ka_sec->start + ka_sec->size, ++ ka_sec->flags)) ++ return(0); ++ } ++ } ++ return(1); ++} +Index: linux-2.4.29/include/linux/kallsyms.h +=================================================================== +--- linux-2.4.29.orig/include/linux/kallsyms.h 2005-05-08 23:07:11.196324032 +0300 ++++ linux-2.4.29/include/linux/kallsyms.h 2005-05-08 23:08:04.316248576 +0300 +@@ -0,0 +1,141 @@ ++/* kallsyms headers ++ Copyright 2000 Keith Owens ++ ++ This file is part of the Linux modutils. It is exported to kernel ++ space so debuggers can access the kallsyms data. ++ ++ The kallsyms data contains all the non-stack symbols from a kernel ++ or a module. The kernel symbols are held between __start___kallsyms ++ and __stop___kallsyms. The symbols for a module are accessed via ++ the struct module chain which is based at module_list. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License as published by the ++ Free Software Foundation; either version 2 of the License, or (at your ++ option) any later version. ++ ++ This program is distributed in the hope that it will be useful, but ++ WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software Foundation, ++ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ */ ++ ++#ident "$Id: kallsyms-2.4-bgl.patch,v 1.1.20.1 2005/03/24 22:50:28 jacob Exp $" ++ ++#ifndef MODUTILS_KALLSYMS_H ++#define MODUTILS_KALLSYMS_H 1 ++ ++/* Have to (re)define these ElfW entries here because external kallsyms ++ * code does not have access to modutils/include/obj.h. This code is ++ * included from user spaces tools (modutils) and kernel, they need ++ * different includes. ++ */ ++ ++#ifndef ELFCLASS32 ++#ifdef __KERNEL__ ++#include ++#else /* __KERNEL__ */ ++#include ++#endif /* __KERNEL__ */ ++#endif /* ELFCLASS32 */ ++ ++#ifndef ELFCLASSM ++#define ELFCLASSM ELF_CLASS ++#endif ++ ++#ifndef ElfW ++# if ELFCLASSM == ELFCLASS32 ++# define ElfW(x) Elf32_ ## x ++# define ELFW(x) ELF32_ ## x ++# else ++# define ElfW(x) Elf64_ ## x ++# define ELFW(x) ELF64_ ## x ++# endif ++#endif ++ ++/* Format of data in the kallsyms section. ++ * Most of the fields are small numbers but the total size and all ++ * offsets can be large so use the 32/64 bit types for these fields. ++ * ++ * Do not use sizeof() on these structures, modutils may be using extra ++ * fields. Instead use the size fields in the header to access the ++ * other bits of data. ++ */ ++ ++struct kallsyms_header { ++ int size; /* Size of this header */ ++ ElfW(Word) total_size; /* Total size of kallsyms data */ ++ int sections; /* Number of section entries */ ++ ElfW(Off) section_off; /* Offset to first section entry */ ++ int section_size; /* Size of one section entry */ ++ int symbols; /* Number of symbol entries */ ++ ElfW(Off) symbol_off; /* Offset to first symbol entry */ ++ int symbol_size; /* Size of one symbol entry */ ++ ElfW(Off) string_off; /* Offset to first string */ ++ ElfW(Addr) start; /* Start address of first section */ ++ ElfW(Addr) end; /* End address of last section */ ++}; ++ ++struct kallsyms_section { ++ ElfW(Addr) start; /* Start address of section */ ++ ElfW(Word) size; /* Size of this section */ ++ ElfW(Off) name_off; /* Offset to section name */ ++ ElfW(Word) flags; /* Flags from section */ ++}; ++ ++struct kallsyms_symbol { ++ ElfW(Off) section_off; /* Offset to section that owns this symbol */ ++ ElfW(Addr) symbol_addr; /* Address of symbol */ ++ ElfW(Off) name_off; /* Offset to symbol name */ ++}; ++ ++#define KALLSYMS_SEC_NAME "__kallsyms" ++#define KALLSYMS_IDX 2 /* obj_kallsyms creates kallsyms as section 2 */ ++ ++#define kallsyms_next_sec(h,s) \ ++ ((s) = (struct kallsyms_section *)((char *)(s) + (h)->section_size)) ++#define kallsyms_next_sym(h,s) \ ++ ((s) = (struct kallsyms_symbol *)((char *)(s) + (h)->symbol_size)) ++ ++int kallsyms_symbol_to_address( ++ const char *name, /* Name to lookup */ ++ unsigned long *token, /* Which module to start with */ ++ const char **mod_name, /* Set to module name or "kernel" */ ++ unsigned long *mod_start, /* Set to start address of module */ ++ unsigned long *mod_end, /* Set to end address of module */ ++ const char **sec_name, /* Set to section name */ ++ unsigned long *sec_start, /* Set to start address of section */ ++ unsigned long *sec_end, /* Set to end address of section */ ++ const char **sym_name, /* Set to full symbol name */ ++ unsigned long *sym_start, /* Set to start address of symbol */ ++ unsigned long *sym_end /* Set to end address of symbol */ ++ ); ++ ++int kallsyms_address_to_symbol( ++ unsigned long address, /* Address to lookup */ ++ const char **mod_name, /* Set to module name */ ++ unsigned long *mod_start, /* Set to start address of module */ ++ unsigned long *mod_end, /* Set to end address of module */ ++ const char **sec_name, /* Set to section name */ ++ unsigned long *sec_start, /* Set to start address of section */ ++ unsigned long *sec_end, /* Set to end address of section */ ++ const char **sym_name, /* Set to full symbol name */ ++ unsigned long *sym_start, /* Set to start address of symbol */ ++ unsigned long *sym_end /* Set to end address of symbol */ ++ ); ++ ++int kallsyms_sections(void *token, ++ int (*callback)(void *, /* token */ ++ const char *, /* module name */ ++ const char *, /* section name */ ++ ElfW(Addr), /* Section start */ ++ ElfW(Addr), /* Section end */ ++ ElfW(Word) /* Section flags */ ++ ) ++ ); ++ ++#endif /* kallsyms.h */ +Index: linux-2.4.29/arch/i386/vmlinux.lds.S +=================================================================== +--- linux-2.4.29.orig/arch/i386/vmlinux.lds.S 2005-05-08 23:07:09.948513728 +0300 ++++ linux-2.4.29/arch/i386/vmlinux.lds.S 2005-05-08 23:14:24.128508336 +0300 +@@ -28,6 +28,10 @@ + __ksymtab : { *(__ksymtab) } + __stop___ksymtab = .; + ++ __start___kallsyms = .; /* All kernel symbols */ ++ __kallsyms : { *(__kallsyms) } ++ __stop___kallsyms = .; ++ + .data : { /* Data */ + *(.data) + CONSTRUCTORS diff --git a/lustre/kernel_patches/series/vanilla-2.4.29 b/lustre/kernel_patches/series/vanilla-2.4.29 index 0780a65..a19694f 100644 --- a/lustre/kernel_patches/series/vanilla-2.4.29 +++ b/lustre/kernel_patches/series/vanilla-2.4.29 @@ -1,7 +1,3 @@ -uml-patch-2.4.29-1.patch -uml-2.4.20-do_mmap_pgoff-fix.patch -uml-export-end_iomem.patch -uml-exprt-clearuser.patch configurable-x86-stack-2.4.20.patch configurable-x86_64-2.4.21.patch dev_read_only_2.4.20-rh.patch @@ -43,3 +39,4 @@ ext3-nlinks-2.4.24.patch export-show_task-2.4-vanilla.patch export-zap-page-range.patch remove-suid-2.4-rhel.patch +kallsyms-2.4.29.patch diff --git a/lustre/kernel_patches/series/vanilla-2.4.29-uml b/lustre/kernel_patches/series/vanilla-2.4.29-uml new file mode 100644 index 0000000..4152580 --- /dev/null +++ b/lustre/kernel_patches/series/vanilla-2.4.29-uml @@ -0,0 +1,46 @@ +uml-patch-2.4.29-1.patch +uml-2.4.20-do_mmap_pgoff-fix.patch +uml-export-end_iomem.patch +uml-exprt-clearuser.patch +configurable-x86-stack-2.4.20.patch +configurable-x86_64-2.4.21.patch +dev_read_only_2.4.20-rh.patch +exports_2.4.20-rh-hp.patch +lustre_version.patch +vfs_intent-2.4.29-vanilla.patch +invalidate_show-2.4.29.patch +export-truncate.patch +iod-stock-exports-2.4.22.patch +ext3-htree-2.4.29.patch +linux-2.4.29-xattr-0.8.54.patch +ext3-orphan_lock-2.4.22-rh.patch +ext3-noread-2.4.20.patch +ext3-delete_thread-2.4.29.patch +extN-wantedi.patch +ext3-san-2.4.20.patch +ext3-map_inode_page.patch +ext3-error-export.patch +iopen-2.4.20.patch +tcp-zero-copy-2.4.22-rh.patch +jbd-dont-account-blocks-twice.patch +jbd-commit-tricks.patch +ext3-no-write-super-chaos.patch +add_page_private.patch +nfs_export_kernel-2.4.29.patch +ext3-raw-lookup.patch +ext3-ea-in-inode-2.4.29.patch +listman-2.4.20.patch +ext3-trusted_ea-2.4.20.patch +ext3-xattr-ptr-arith-fix.patch +3.5G-address-space-2.4.22-vanilla.patch +procfs-ndynamic-2.4.patch +ext3-truncate-buffer-head.patch +inode-max-readahead-2.4.24.patch +ext3-extents-2.4.29.patch +ext3-extents-asyncdel-2.4.24.patch +export_num_siblings.patch +ext3-nlinks-2.4.24.patch +export-show_task-2.4-vanilla.patch +export-zap-page-range.patch +remove-suid-2.4-rhel.patch +kallsyms-2.4.29.patch -- 1.8.3.1