[PATCH 2/3] kexec x86: Extract kernel version and convert it to KERNEL_VERSION() style

Thomas Renninger trenn at suse.de
Tue Jan 22 10:02:14 EST 2013


from the kernel which is going to be loaded.
This is needed if kexec wants to check for available features by kernel release
version.

Signed-off-by: Thomas Renninger <trenn at suse.de>
---
 kexec/arch/i386/kexec-bzImage.c |   13 +++++++++++--
 kexec/arch/i386/kexec-x86.h     |    1 +
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/kexec/arch/i386/kexec-bzImage.c b/kexec/arch/i386/kexec-bzImage.c
index 0605909..0c8c6bc 100644
--- a/kexec/arch/i386/kexec-bzImage.c
+++ b/kexec/arch/i386/kexec-bzImage.c
@@ -40,6 +40,7 @@
 #include <arch/options.h>
 
 static const int probe_debug = 0;
+long kv_to_load;
 
 int bzImage_probe(const char *buf, off_t len)
 {
@@ -107,7 +108,7 @@ int do_bzImage_load(struct kexec_info *info,
 	struct x86_linux_header setup_header;
 	struct x86_linux_param_header *real_mode;
 	int setup_sects;
-	char *kernel_version;
+	char kernel_release[12];
 	size_t size;
 	int kern16_size;
 	unsigned long setup_base, setup_size;
@@ -131,7 +132,15 @@ int do_bzImage_load(struct kexec_info *info,
 	}
 
 	kern16_size = (setup_sects +1) *512;
-	kernel_version = ((char *)&setup_header) + 512 + setup_header.kver_addr;
+
+	memcpy(kernel_release, kernel +  setup_header.kver_addr + 512, 12);
+	kernel_release[11] = '\0';
+	kv_to_load = kernel_version(kernel_release);
+	if (kv_to_load < 0)
+		die("Invalid kernel version\n");
+	dbgprintf("Kernel release: %s in long format: 0x%lx\n",
+		  kernel_release, kv_to_load);
+
 	if (kernel_len < kern16_size) {
 		fprintf(stderr, "BzImage truncated?\n");
 		return -1;
diff --git a/kexec/arch/i386/kexec-x86.h b/kexec/arch/i386/kexec-x86.h
index 5aa2a46..db80879 100644
--- a/kexec/arch/i386/kexec-x86.h
+++ b/kexec/arch/i386/kexec-x86.h
@@ -11,6 +11,7 @@ enum coretype {
 
 extern unsigned char compat_x86_64[];
 extern uint32_t compat_x86_64_size, compat_x86_64_entry32;
+extern long kv_to_load;
 
 struct entry32_regs {
 	uint32_t eax;
-- 
1.7.6.1




More information about the kexec mailing list