From: Matthew McClintock <msm@freescale.com>
To: kexec@lists.infradead.org
Cc: Matthew McClintock <msm@freescale.com>, linuxppc-dev@lists.ozlabs.org
Subject: [PATCH v2 4/7] Update Elf-ppc to support crash kernel and misc fixes
Date: Tue, 20 Jul 2010 15:14:57 -0500 [thread overview]
Message-ID: <1279656900-27458-4-git-send-email-msm@freescale.com> (raw)
In-Reply-To: <1279656900-27458-3-git-send-email-msm@freescale.com>
Use current command line if none given, specifically useful for
when arguments are added causing the use of the current cmdline
to not occur
We also try to load the dtb above the kernel, this is useful for
relocatable kernels where they device tree needs to reside just
above the kernel base address
Set the kernel entry address in the relocatable purgatory code
so we jump to the correct start address if not the default. Useful
for relocatable kernels
Signed-off-by: Matthew McClintock <msm@freescale.com>
---
kexec/arch/ppc/kexec-elf-ppc.c | 26 ++++++++++++++------------
kexec/arch/ppc/kexec-ppc.c | 7 ++++---
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/kexec/arch/ppc/kexec-elf-ppc.c b/kexec/arch/ppc/kexec-elf-ppc.c
index ab2d343..87e6507 100644
--- a/kexec/arch/ppc/kexec-elf-ppc.c
+++ b/kexec/arch/ppc/kexec-elf-ppc.c
@@ -182,6 +182,7 @@ int elf_ppc_load(int argc, char **argv, const char *buf, off_t len,
int target_is_gamecube = 0;
unsigned int addr;
unsigned long dtb_addr;
+ unsigned long kernel_addr;
#endif
#define FIXUP_ENTRYS (20)
char *fixup_nodes[FIXUP_ENTRYS + 1];
@@ -228,6 +229,9 @@ int elf_ppc_load(int argc, char **argv, const char *buf, off_t len,
command_line_len = 0;
if (command_line) {
command_line_len = strlen(command_line) + 1;
+ } else {
+ command_line = get_command_line();
+ command_line_len = strlen(command_line) + 1;
}
fixup_nodes[cur_fixup] = NULL;
@@ -264,11 +268,11 @@ int elf_ppc_load(int argc, char **argv, const char *buf, off_t len,
if (size > phdr->p_memsz)
size = phdr->p_memsz;
- hole_addr = locate_hole(info, size, 0, 0, max_addr, 1);
+ kernel_addr = locate_hole(info, size, 0, 0, max_addr, 1);
#ifdef CONFIG_PPC64
- ehdr.e_phdr[0].p_paddr = (Elf64_Addr)hole_addr;
+ ehdr.e_phdr[0].p_paddr = (Elf64_Addr)kernel_addr;
#else
- ehdr.e_phdr[0].p_paddr = hole_addr;
+ ehdr.e_phdr[0].p_paddr = kernel_addr;
#endif
/* Load the Elf data */
@@ -343,10 +347,11 @@ int elf_ppc_load(int argc, char **argv, const char *buf, off_t len,
blob_buf = slurp_file(dtb, &blob_size);
if (!blob_buf || !blob_size)
die("Device tree seems to be an empty file.\n");
+
blob_buf = fixup_dtb_nodes(blob_buf, &blob_size, fixup_nodes,
cmdline_buf);
- dtb_addr = add_buffer(info, blob_buf, blob_size, blob_size, 0, 0,
- KERNEL_ACCESS_TOP, -1);
+ dtb_addr = add_buffer(info, blob_buf, blob_size, blob_size, 0, kernel_addr,
+ kernel_addr + KERNEL_ACCESS_TOP, -1);
} else {
/* create from fs2dt */
seg_buf = NULL;
@@ -364,19 +369,16 @@ int elf_ppc_load(int argc, char **argv, const char *buf, off_t len,
if (dtb) {
- /* set various variables for the purgatory */
- addr = ehdr.e_entry;
+ /* set various variables for the purgatory ehdr.e_entry is a
+ * virtual address, we can use kernel_addr which
+ * should be the physical start address of the kernel */
+ addr = kernel_addr;
elf_rel_set_symbol(&info->rhdr, "kernel", &addr, sizeof(addr));
addr = dtb_addr;
elf_rel_set_symbol(&info->rhdr, "dt_offset",
&addr, sizeof(addr));
- addr = rmo_top;
-
- elf_rel_set_symbol(&info->rhdr, "mem_size",
- &addr, sizeof(addr));
-
#define PUL_STACK_SIZE (16 * 1024)
addr = locate_hole(info, PUL_STACK_SIZE, 0, 0,
elf_max_addr(&ehdr), 1);
diff --git a/kexec/arch/ppc/kexec-ppc.c b/kexec/arch/ppc/kexec-ppc.c
index d7afad6..d9f1d05 100644
--- a/kexec/arch/ppc/kexec-ppc.c
+++ b/kexec/arch/ppc/kexec-ppc.c
@@ -27,9 +27,10 @@
#include "config.h"
uint64_t rmo_top;
-unsigned long long crash_base, crash_size;
-unsigned long long initrd_base, initrd_size;
-unsigned long long devicetree_base, devicetree_size;
+unsigned long long crash_base = 0, crash_size = 0;
+unsigned long long initrd_base = 0, initrd_size = 0;
+unsigned long long ramdisk_base = 0, ramdisk_size = 0;
+unsigned long long devicetree_base = 0, devicetree_size = 0;
unsigned int rtas_base, rtas_size;
int max_memory_ranges;
--
1.6.0.6
next prev parent reply other threads:[~2010-07-20 20:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-20 20:14 [PATCH v2 1/7] Restore kexec uImage-ppc to working state Matthew McClintock
2010-07-20 20:14 ` [PATCH v2 2/7] Fix case where phys_addr_t != unsigned long when reading proc entries Matthew McClintock
2010-07-20 20:14 ` [PATCH v2 3/7] Update uImage to support crash kernel and misc fixes Matthew McClintock
2010-07-20 20:14 ` Matthew McClintock [this message]
2010-07-20 20:14 ` [PATCH v2 5/7] Add support for ramdisk on ppc32 for uImage-ppc and Elf-ppc Matthew McClintock
2010-07-20 20:14 ` [PATCH v2 6/7] Add support for reworking flat device tree support Matthew McClintock
2010-07-20 20:15 ` [PATCH v2 7/7] Add documentation/howto for mpc85xx systems Matthew McClintock
2010-07-29 8:33 ` [PATCH v2 5/7] Add support for ramdisk on ppc32 for uImage-ppc and Elf-ppc Simon Horman
2010-07-29 16:03 ` Matthew McClintock
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1279656900-27458-4-git-send-email-msm@freescale.com \
--to=msm@freescale.com \
--cc=kexec@lists.infradead.org \
--cc=linuxppc-dev@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).