summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuzuki K. Poulose <suzuki@in.ibm.com>2013-03-06 14:11:37 +0530
committerSimon Horman <horms@verge.net.au>2013-03-08 13:57:30 +0900
commite73d481c4add17ee953c80bb4be72372d90d93d3 (patch)
tree0b4bedfeaec66990df2366584d9c7f0d0e63bdf1
parent99a3a977990619cbd179b2b1435989785c9ee919 (diff)
downloadkexec-tools-e73d481c4add17ee953c80bb4be72372d90d93d3.tar.gz
ppc/uImage: Add support for RAM Disks
Handle the RAM Disks in uImage format Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/arch/ppc/kexec-uImage-ppc.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/kexec/arch/ppc/kexec-uImage-ppc.c b/kexec/arch/ppc/kexec-uImage-ppc.c
index ccaf6d7f..900cd166 100644
--- a/kexec/arch/ppc/kexec-uImage-ppc.c
+++ b/kexec/arch/ppc/kexec-uImage-ppc.c
@@ -46,6 +46,31 @@ void uImage_ppc_usage(void)
);
}
+/*
+ * Load the ramdisk into buffer.
+ * If the supplied image is in uImage format use
+ * uImage_load() to read the payload from the image.
+ */
+char *slurp_ramdisk_ppc(const char *filename, off_t *r_size)
+{
+ struct Image_info img;
+ off_t size;
+ const unsigned char *buf = slurp_file(filename, &size);
+
+ /* Check if this is a uImage RAMDisk */
+ if (buf &&
+ uImage_probe_ramdisk(buf, size, IH_ARCH_PPC) == 0) {
+ if (uImage_load(buf, size, &img) != 0)
+ die("uImage: Reading %ld bytes from %s failed\n",
+ size, filename);
+ buf = img.buf;
+ size = img.len;
+ }
+
+ *r_size = size;
+ return buf;
+}
+
int uImage_ppc_probe(const char *buf, off_t len)
{
return uImage_probe_kernel(buf, len, IH_ARCH_PPC);
@@ -194,7 +219,7 @@ static int ppc_load_bare_bits(int argc, char **argv, const char *buf,
blob_buf = fixup_dtb_init(info, blob_buf, &blob_size, load_addr, &dtb_addr);
if (ramdisk) {
- seg_buf = slurp_file(ramdisk, &seg_size);
+ seg_buf = slurp_ramdisk_ppc(ramdisk, &seg_size);
/* Load ramdisk at top of memory */
hole_addr = add_buffer(info, seg_buf, seg_size, seg_size,
0, dtb_addr + blob_size, max_addr, -1);