[PATCH] mips/crashdump put cmdline after the latest segment

Maxim Uvarov muvarov at gmail.com
Fri Sep 3 09:06:32 EDT 2010


From: Maxim Uvarov <muvarov at gmail.com>

Move cmdline from just after .bss segment to the just after
the latest segment to avoid segments overlap while loading
crashdump kernel. (new mips vmlinux has additional segments
after .bss).
Signed-off-by: Maxim Uvarov <muvarov at gmail.com>
---

 kexec/arch/mips/kexec-elf-mips.c |   35 +++++++++--------------------------
 1 files changed, 9 insertions(+), 26 deletions(-)

diff --git a/kexec/arch/mips/kexec-elf-mips.c b/kexec/arch/mips/kexec-elf-mips.c
index a9c865e..3e19ca2 100644
--- a/kexec/arch/mips/kexec-elf-mips.c
+++ b/kexec/arch/mips/kexec-elf-mips.c
@@ -80,7 +80,6 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
 	int result;
 	unsigned long cmdline_addr;
 	size_t i;
-	unsigned long bss_start = 0, bss_size = 0;
 
 	/* See options.h if adding any more options. */
 	static const struct option options[] = {
@@ -133,22 +132,6 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
 			phdr->p_paddr = virt_to_phys(phdr->p_paddr);
 	}
 
-	for (i = 0; i < ehdr.e_shnum; i++) {
-		struct mem_shdr *shdr;
-		unsigned char *strtab;
-		strtab = (unsigned char *)ehdr.e_shdr[ehdr.e_shstrndx].sh_data;
-
-		shdr = &ehdr.e_shdr[i];
-		if (shdr->sh_size &&
-				strcmp((char *)&strtab[shdr->sh_name],
-					".bss") == 0) {
-			bss_start = virt_to_phys(shdr->sh_addr);
-			bss_size = shdr->sh_size;
-			break;
-		}
-
-	}
-
 	/* Load the Elf data */
 	result = elf_exec_load(&ehdr, info);
 	if (result < 0)
@@ -156,15 +139,6 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
 
 	info->entry = (void *)virt_to_phys(ehdr.e_entry);
 
-	/* Put cmdline right after bss for crash*/
-	if (info->kexec_flags & KEXEC_ON_CRASH)
-		cmdline_addr = bss_start + bss_size;
-	else
-		cmdline_addr = 0;
-
-	if (!bss_size)
-		die("No .bss segment present\n");
-
 	if (command_line)
 		command_line_len = strlen(command_line) + 1;
 
@@ -183,6 +157,15 @@ int elf_mips_load(int argc, char **argv, const char *buf, off_t len,
 		strncat(cmdline_buf, crash_cmdline,
 				sizeof(crash_cmdline) -
 				strlen(crash_cmdline) - 1);
+
+	if (info->kexec_flags & KEXEC_ON_CRASH)
+		/* In case of crashdump segment[0] is kernel.
+		 * Put cmdline just after it. */
+		cmdline_addr = info->segment[0].mem +
+				info->segment[0].memsz;
+	else
+		cmdline_addr = 0;
+
 	add_buffer(info, cmdline_buf, sizeof(cmdline_buf),
 			sizeof(cmdline_buf), sizeof(void *),
 			cmdline_addr, 0x0fffffff, 1);


Best regards,
Maxim Uvarov.





More information about the kexec mailing list