* uboot ramdisk image support for arm
@ 2015-12-14 13:18 Michele Dionisio
0 siblings, 0 replies; only message in thread
From: Michele Dionisio @ 2015-12-14 13:18 UTC (permalink / raw)
To: kexec
[-- Attachment #1: Type: text/plain, Size: 365 bytes --]
Hi, I have add support for uboot ramdisk support in the patch attached.
the new features is implemented in:
kexec/arch/arm/kexec-uImage-arm.c
kexec/arch/arm/kexec-zImage-arm.c
but there is also a fix in
kexec/kexec-uImage.c where there is a endianes bug.
If someone can review the patch I think that it can be usefull to be
added in the next version.
Regards.
[-- Attachment #2: 0000-fix-ramdisk-uimage.patch --]
[-- Type: text/x-patch, Size: 2880 bytes --]
diff --git a/kexec/arch/arm/kexec-uImage-arm.c b/kexec/arch/arm/kexec-uImage-arm.c
index 03c2f4d..20d71a2 100644
--- a/kexec/arch/arm/kexec-uImage-arm.c
+++ b/kexec/arch/arm/kexec-uImage-arm.c
@@ -17,6 +17,12 @@ int uImage_arm_probe(const char *buf, off_t len)
int uImage_arm_load(int argc, char **argv, const char *buf, off_t len,
struct kexec_info *info)
{
- return zImage_arm_load(argc, argv, buf + sizeof(struct image_header),
- len - sizeof(struct image_header), info);
+ struct Image_info img;
+ int ret;
+
+ ret = uImage_load(buf, len, &img);
+ if (ret)
+ return ret;
+
+ return zImage_arm_load(argc, argv, img.buf, img.len, info);
}
diff --git a/kexec/arch/arm/kexec-zImage-arm.c b/kexec/arch/arm/kexec-zImage-arm.c
index d85ab9b..fda30f8 100644
--- a/kexec/arch/arm/kexec-zImage-arm.c
+++ b/kexec/arch/arm/kexec-zImage-arm.c
@@ -14,6 +14,8 @@
#include <getopt.h>
#include <unistd.h>
#include <libfdt.h>
+#include <image.h>
+#include <kexec-uImage.h>
#include <arch/options.h>
#include "../../kexec.h"
#include "../../kexec-syscall.h"
@@ -318,6 +320,36 @@ static int setup_dtb_prop(char **bufp, off_t *sizep, const char *node_name,
return 0;
}
+/*
+ * 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_arm(const char *filename, off_t *r_size)
+{
+ struct Image_info img;
+ off_t size;
+ const unsigned char *buf = slurp_file(filename, &size);
+ int rc;
+
+ /* Check if this is a uImage RAMDisk */
+ if (!buf)
+ return buf;
+ rc = uImage_probe_ramdisk(buf, size, IH_ARCH_ARM);
+ if (rc < 0)
+ die("uImage: Corrupted ramdisk file %s\n", filename);
+ else if (rc == 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 zImage_arm_load(int argc, char **argv, const char *buf, off_t len,
struct kexec_info *info)
{
@@ -410,7 +442,7 @@ int zImage_arm_load(int argc, char **argv, const char *buf, off_t len,
command_line_len = COMMAND_LINE_SIZE;
}
if (ramdisk)
- ramdisk_buf = slurp_file(ramdisk, &initrd_size);
+ ramdisk_buf = slurp_ramdisk_arm(ramdisk, &initrd_size);
if (dtb_file)
dtb_buf = slurp_file(dtb_file, &dtb_length);
diff --git a/kexec/kexec-uImage.c b/kexec/kexec-uImage.c
index 9df601b..5b85e86 100644
--- a/kexec/kexec-uImage.c
+++ b/kexec/kexec-uImage.c
@@ -235,7 +235,7 @@ int uImage_load(const unsigned char *buf, off_t len, struct Image_info *image)
{
const struct image_header *header = (const struct image_header *)buf;
const unsigned char *img_buf = buf + sizeof(struct image_header);
- off_t img_len = header->ih_size;
+ off_t img_len = cpu_to_be32(header->ih_size);
/*
* Prevent loading a modified image.
[-- Attachment #3: Type: text/plain, Size: 143 bytes --]
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2015-12-14 13:19 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-14 13:18 uboot ramdisk image support for arm Michele Dionisio
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox