summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Dufour <ldufour@linux.vnet.ibm.com>2014-04-11 12:10:30 +0200
committerSimon Horman <horms@verge.net.au>2014-04-14 11:19:29 +0900
commitdb3c32babc5279816344be8210ca91a64331f0fe (patch)
tree935e237803b885f551106eef39194f5da40a2165
parentc4b3823071e4e852b23e11938c9ffd7d4cc3a0ed (diff)
downloadkexec-tools-db3c32babc5279816344be8210ca91a64331f0fe.tar.gz
kexec/fs2dt : Fix endianess issue with initrd base and size
The initrd values exposed in the device tree of the kexeced kernel must be encoded in Big Endian format. Without this patch, kexeced LE kernel are expected to panic when dealing with the initrd image. Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/fs2dt.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/kexec/fs2dt.c b/kexec/fs2dt.c
index 5e6b98d..2a90979 100644
--- a/kexec/fs2dt.c
+++ b/kexec/fs2dt.c
@@ -531,7 +531,7 @@ static void putnode(void)
/* Add initrd entries to the second kernel */
if (initrd_base && initrd_size && !strcmp(basename,"chosen/")) {
int len = 8;
- unsigned long long initrd_end;
+ uint64_t bevalue;
dt_reserve(&dt, 12); /* both props, of 6 words ea. */
*dt++ = cpu_to_be32(3);
@@ -539,7 +539,8 @@ static void putnode(void)
*dt++ = cpu_to_be32(propnum("linux,initrd-start"));
pad_structure_block(len);
- memcpy(dt,&initrd_base,len);
+ bevalue = cpu_to_be64(initrd_base);
+ memcpy(dt, &bevalue, len);
dt += (len + 3)/4;
len = 8;
@@ -547,10 +548,10 @@ static void putnode(void)
*dt++ = cpu_to_be32(len);
*dt++ = cpu_to_be32(propnum("linux,initrd-end"));
- initrd_end = initrd_base + initrd_size;
+ bevalue = cpu_to_be64(initrd_base + initrd_size);
pad_structure_block(len);
- memcpy(dt,&initrd_end,len);
+ memcpy(dt, &bevalue, len);
dt += (len + 3)/4;
reserve(initrd_base, initrd_size);