Blame SOURCES/kexec-tools-2.0.14-kexec-generalize-and-rename-get_kernel_stext_sym.patch

766e0d
From d8e8090a66891eb114f31ed0d4c006a161efc109 Mon Sep 17 00:00:00 2001
766e0d
Message-Id: <d8e8090a66891eb114f31ed0d4c006a161efc109.1489676829.git.panand@redhat.com>
766e0d
In-Reply-To: <f85183096d31d865c97565614535d84943b12908.1489676829.git.panand@redhat.com>
766e0d
References: <f85183096d31d865c97565614535d84943b12908.1489676829.git.panand@redhat.com>
766e0d
From: Pratyush Anand <panand@redhat.com>
766e0d
Date: Wed, 15 Mar 2017 18:38:17 +0900
766e0d
Subject: [PATCH 03/10] kexec: generalize and rename get_kernel_stext_sym()
766e0d
766e0d
get_kernel_stext_sym() has been defined for both arm and i386. Other
766e0d
architecture might need some other kernel symbol address. Therefore rewrite
766e0d
this function as generic function to get any kernel symbol address.
766e0d
766e0d
More over, kallsyms is not arch specific representation, therefore have
766e0d
common function for all arches.
766e0d
766e0d
Signed-off-by: Pratyush Anand <panand@redhat.com>
766e0d
[created symbols.c]
766e0d
Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
766e0d
---
766e0d
 kexec/Makefile                  |  1 +
766e0d
 kexec/arch/arm/crashdump-arm.c  | 40 +---------------------------------------
766e0d
 kexec/arch/i386/crashdump-x86.c | 29 -----------------------------
766e0d
 kexec/kexec.h                   |  2 ++
766e0d
 kexec/symbols.c                 | 34 ++++++++++++++++++++++++++++++++++
766e0d
 5 files changed, 38 insertions(+), 68 deletions(-)
766e0d
 create mode 100644 kexec/symbols.c
766e0d
766e0d
diff --git a/kexec/Makefile b/kexec/Makefile
766e0d
index 39f365f543d7..2b4fb3d162ec 100644
766e0d
--- a/kexec/Makefile
766e0d
+++ b/kexec/Makefile
766e0d
@@ -26,6 +26,7 @@ KEXEC_SRCS_base += kexec/kernel_version.c
766e0d
 KEXEC_SRCS_base += kexec/lzma.c
766e0d
 KEXEC_SRCS_base += kexec/zlib.c
766e0d
 KEXEC_SRCS_base += kexec/kexec-xen.c
766e0d
+KEXEC_SRCS_base += kexec/symbols.c
766e0d
 
766e0d
 KEXEC_GENERATED_SRCS += $(PURGATORY_HEX_C)
766e0d
 
766e0d
diff --git a/kexec/arch/arm/crashdump-arm.c b/kexec/arch/arm/crashdump-arm.c
766e0d
index 4a89b5ea9645..245c21af5e32 100644
766e0d
--- a/kexec/arch/arm/crashdump-arm.c
766e0d
+++ b/kexec/arch/arm/crashdump-arm.c
766e0d
@@ -73,48 +73,10 @@ static struct crash_elf_info elf_info = {
766e0d
 
766e0d
 extern unsigned long long user_page_offset;
766e0d
 
766e0d
-/* Retrieve kernel _stext symbol virtual address from /proc/kallsyms */
766e0d
-static unsigned long long get_kernel_stext_sym(void)
766e0d
-{
766e0d
-	const char *kallsyms = "/proc/kallsyms";
766e0d
-	const char *stext = "_stext";
766e0d
-	char sym[128];
766e0d
-	char line[128];
766e0d
-	FILE *fp;
766e0d
-	unsigned long long vaddr = 0;
766e0d
-	char type;
766e0d
-
766e0d
-	fp = fopen(kallsyms, "r");
766e0d
-	if (!fp) {
766e0d
-		fprintf(stderr, "Cannot open %s\n", kallsyms);
766e0d
-		return 0;
766e0d
-	}
766e0d
-
766e0d
-	while(fgets(line, sizeof(line), fp) != NULL) {
766e0d
-		unsigned long long addr;
766e0d
-
766e0d
-		if (sscanf(line, "%Lx %c %s", &addr, &type, sym) != 3)
766e0d
-			continue;
766e0d
-
766e0d
-		if (strcmp(sym, stext) == 0) {
766e0d
-			dbgprintf("kernel symbol %s vaddr = %#llx\n", stext, addr);
766e0d
-			vaddr = addr;
766e0d
-			break;
766e0d
-		}
766e0d
-	}
766e0d
-
766e0d
-	fclose(fp);
766e0d
-
766e0d
-	if (vaddr == 0)
766e0d
-		fprintf(stderr, "Cannot get kernel %s symbol address\n", stext);
766e0d
-
766e0d
-	return vaddr;
766e0d
-}
766e0d
-
766e0d
 static int get_kernel_page_offset(struct kexec_info *info,
766e0d
 		struct crash_elf_info *elf_info)
766e0d
 {
766e0d
-	unsigned long long stext_sym_addr = get_kernel_stext_sym();
766e0d
+	unsigned long long stext_sym_addr = get_kernel_sym("_stext");
766e0d
 	if (stext_sym_addr == 0) {
766e0d
 		if (user_page_offset != (-1ULL)) {
766e0d
 			elf_info->page_offset = user_page_offset;
766e0d
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
766e0d
index c4cf2013a001..a324c6c9074f 100644
766e0d
--- a/kexec/arch/i386/crashdump-x86.c
766e0d
+++ b/kexec/arch/i386/crashdump-x86.c
766e0d
@@ -102,35 +102,6 @@ static int get_kernel_paddr(struct kexec_info *UNUSED(info),
766e0d
 	return -1;
766e0d
 }
766e0d
 
766e0d
-/* Retrieve kernel symbol virtual address from /proc/kallsyms */
766e0d
-static unsigned long long get_kernel_sym(const char *symbol)
766e0d
-{
766e0d
-	const char *kallsyms = "/proc/kallsyms";
766e0d
-	char sym[128];
766e0d
-	char line[128];
766e0d
-	FILE *fp;
766e0d
-	unsigned long long vaddr;
766e0d
-	char type;
766e0d
-
766e0d
-	fp = fopen(kallsyms, "r");
766e0d
-	if (!fp) {
766e0d
-		fprintf(stderr, "Cannot open %s\n", kallsyms);
766e0d
-		return 0;
766e0d
-	}
766e0d
-
766e0d
-	while(fgets(line, sizeof(line), fp) != NULL) {
766e0d
-		if (sscanf(line, "%Lx %c %s", &vaddr, &type, sym) != 3)
766e0d
-			continue;
766e0d
-		if (strcmp(sym, symbol) == 0) {
766e0d
-			dbgprintf("kernel symbol %s vaddr = %16llx\n", symbol, vaddr);
766e0d
-			return vaddr;
766e0d
-		}
766e0d
-	}
766e0d
-
766e0d
-	dbgprintf("Cannot get kernel %s symbol address\n", symbol);
766e0d
-	return 0;
766e0d
-}
766e0d
-
766e0d
 /* Retrieve info regarding virtual address kernel has been compiled for and
766e0d
  * size of the kernel from /proc/kcore. Current /proc/kcore parsing from
766e0d
  * from kexec-tools fails because of malformed elf notes. A kernel patch has
766e0d
diff --git a/kexec/kexec.h b/kexec/kexec.h
766e0d
index 9194f1c87c91..b4fafad9487b 100644
766e0d
--- a/kexec/kexec.h
766e0d
+++ b/kexec/kexec.h
766e0d
@@ -312,4 +312,6 @@ int xen_kexec_load(struct kexec_info *info);
766e0d
 int xen_kexec_unload(uint64_t kexec_flags);
766e0d
 void xen_kexec_exec(void);
766e0d
 
766e0d
+extern unsigned long long get_kernel_sym(const char *text);
766e0d
+
766e0d
 #endif /* KEXEC_H */
766e0d
diff --git a/kexec/symbols.c b/kexec/symbols.c
766e0d
new file mode 100644
766e0d
index 000000000000..5e42de98de32
766e0d
--- /dev/null
766e0d
+++ b/kexec/symbols.c
766e0d
@@ -0,0 +1,34 @@
766e0d
+#include <stdio.h>
766e0d
+#include <string.h>
766e0d
+#include "kexec.h"
766e0d
+
766e0d
+/* Retrieve kernel symbol virtual address from /proc/kallsyms */
766e0d
+unsigned long long get_kernel_sym(const char *symbol)
766e0d
+{
766e0d
+	const char *kallsyms = "/proc/kallsyms";
766e0d
+	char sym[128];
766e0d
+	char line[128];
766e0d
+	FILE *fp;
766e0d
+	unsigned long long vaddr;
766e0d
+	char type;
766e0d
+
766e0d
+	fp = fopen(kallsyms, "r");
766e0d
+	if (!fp) {
766e0d
+		fprintf(stderr, "Cannot open %s\n", kallsyms);
766e0d
+		return 0;
766e0d
+	}
766e0d
+
766e0d
+	while (fgets(line, sizeof(line), fp) != NULL) {
766e0d
+		if (sscanf(line, "%Lx %c %s", &vaddr, &type, sym) != 3)
766e0d
+			continue;
766e0d
+		if (strcmp(sym, symbol) == 0) {
766e0d
+			dbgprintf("kernel symbol %s vaddr = %16llx\n",
766e0d
+					symbol, vaddr);
766e0d
+			return vaddr;
766e0d
+		}
766e0d
+	}
766e0d
+
766e0d
+	dbgprintf("Cannot get kernel %s symbol address\n", symbol);
766e0d
+
766e0d
+	return 0;
766e0d
+}
766e0d
-- 
766e0d
2.9.3
766e0d