diff options
Diffstat (limited to 'kexec')
-rw-r--r-- | kexec/Makefile | 1 | ||||
-rw-r--r-- | kexec/arch/arm/crashdump-arm.c | 40 | ||||
-rw-r--r-- | kexec/arch/i386/crashdump-x86.c | 29 | ||||
-rw-r--r-- | kexec/kexec.h | 2 | ||||
-rw-r--r-- | kexec/symbols.c | 34 |
5 files changed, 38 insertions, 68 deletions
diff --git a/kexec/Makefile b/kexec/Makefile index 39f365f..2b4fb3d 100644 --- a/kexec/Makefile +++ b/kexec/Makefile @@ -26,6 +26,7 @@ KEXEC_SRCS_base += kexec/kernel_version.c KEXEC_SRCS_base += kexec/lzma.c KEXEC_SRCS_base += kexec/zlib.c KEXEC_SRCS_base += kexec/kexec-xen.c +KEXEC_SRCS_base += kexec/symbols.c KEXEC_GENERATED_SRCS += $(PURGATORY_HEX_C) diff --git a/kexec/arch/arm/crashdump-arm.c b/kexec/arch/arm/crashdump-arm.c index ac76e0a..daa4788 100644 --- a/kexec/arch/arm/crashdump-arm.c +++ b/kexec/arch/arm/crashdump-arm.c @@ -73,48 +73,10 @@ static struct crash_elf_info elf_info = { extern unsigned long long user_page_offset; -/* Retrieve kernel _stext symbol virtual address from /proc/kallsyms */ -static unsigned long long get_kernel_stext_sym(void) -{ - const char *kallsyms = "/proc/kallsyms"; - const char *stext = "_stext"; - char sym[128]; - char line[128]; - FILE *fp; - unsigned long long vaddr = 0; - char type; - - fp = fopen(kallsyms, "r"); - if (!fp) { - fprintf(stderr, "Cannot open %s\n", kallsyms); - return 0; - } - - while(fgets(line, sizeof(line), fp) != NULL) { - unsigned long long addr; - - if (sscanf(line, "%Lx %c %s", &addr, &type, sym) != 3) - continue; - - if (strcmp(sym, stext) == 0) { - dbgprintf("kernel symbol %s vaddr = %#llx\n", stext, addr); - vaddr = addr; - break; - } - } - - fclose(fp); - - if (vaddr == 0) - fprintf(stderr, "Cannot get kernel %s symbol address\n", stext); - - return vaddr; -} - static int get_kernel_page_offset(struct kexec_info *info, struct crash_elf_info *elf_info) { - unsigned long long stext_sym_addr = get_kernel_stext_sym(); + unsigned long long stext_sym_addr = get_kernel_sym("_stext"); if (stext_sym_addr == 0) { if (user_page_offset != (-1ULL)) { elf_info->page_offset = user_page_offset; diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c index 285dea9..69a063a 100644 --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -102,35 +102,6 @@ static int get_kernel_paddr(struct kexec_info *UNUSED(info), return -1; } -/* Retrieve kernel symbol virtual address from /proc/kallsyms */ -static unsigned long long get_kernel_sym(const char *symbol) -{ - const char *kallsyms = "/proc/kallsyms"; - char sym[128]; - char line[128]; - FILE *fp; - unsigned long long vaddr; - char type; - - fp = fopen(kallsyms, "r"); - if (!fp) { - fprintf(stderr, "Cannot open %s\n", kallsyms); - return 0; - } - - while(fgets(line, sizeof(line), fp) != NULL) { - if (sscanf(line, "%llx %c %s", &vaddr, &type, sym) != 3) - continue; - if (strcmp(sym, symbol) == 0) { - dbgprintf("kernel symbol %s vaddr = %16llx\n", symbol, vaddr); - return vaddr; - } - } - - dbgprintf("Cannot get kernel %s symbol address\n", symbol); - return 0; -} - /* Retrieve info regarding virtual address kernel has been compiled for and * size of the kernel from /proc/kcore. Current /proc/kcore parsing from * from kexec-tools fails because of malformed elf notes. A kernel patch has diff --git a/kexec/kexec.h b/kexec/kexec.h index 52bef9b..26225d2 100644 --- a/kexec/kexec.h +++ b/kexec/kexec.h @@ -317,4 +317,6 @@ int xen_kexec_unload(uint64_t kexec_flags); void xen_kexec_exec(void); int xen_kexec_status(uint64_t kexec_flags); +extern unsigned long long get_kernel_sym(const char *text); + #endif /* KEXEC_H */ diff --git a/kexec/symbols.c b/kexec/symbols.c new file mode 100644 index 0000000..e88f7f3 --- /dev/null +++ b/kexec/symbols.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include <string.h> +#include "kexec.h" + +/* Retrieve kernel symbol virtual address from /proc/kallsyms */ +unsigned long long get_kernel_sym(const char *symbol) +{ + const char *kallsyms = "/proc/kallsyms"; + char sym[128]; + char line[128]; + FILE *fp; + unsigned long long vaddr; + char type; + + fp = fopen(kallsyms, "r"); + if (!fp) { + fprintf(stderr, "Cannot open %s\n", kallsyms); + return 0; + } + + while (fgets(line, sizeof(line), fp) != NULL) { + if (sscanf(line, "%llx %c %s", &vaddr, &type, sym) != 3) + continue; + if (strcmp(sym, symbol) == 0) { + dbgprintf("kernel symbol %s vaddr = %16llx\n", + symbol, vaddr); + return vaddr; + } + } + + dbgprintf("Cannot get kernel %s symbol address\n", symbol); + + return 0; +} |