summaryrefslogtreecommitdiff
path: root/kexec
diff options
context:
space:
mode:
authorLaurent Dufour <ldufour@linux.vnet.ibm.com>2013-10-15 19:05:28 +0200
committerSimon Horman <horms@verge.net.au>2013-10-17 10:43:16 +0900
commit1cbddc80ddfe34cdcdac11c0562e4d8395c48b16 (patch)
treed684e2a0f5233fa862e60cfbff6298e663b39d6d /kexec
parent6d4e7f0c9679a7e6742b85ca09e2f29ec6c45ee5 (diff)
kexec/fs2dt: fix endianess conversion
While reviewing fs2dt.c in the common kexec directory, in order to use it to support little endian ppc64 architecture, I found some endianess conversion's issues. In dt_reserve, dt_base is a pointer and thus should not be converted. In checkprop, values read from the device tree are big endian encoded and should be converted if CPU is running in little endian mode. In add_dyn_reconf_usable_mem_property__, fix extraneous endianess conversion of rlen which should be natively used to increase the dt pointer. Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com> Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec')
-rw-r--r--kexec/fs2dt.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/kexec/fs2dt.c b/kexec/fs2dt.c
index 242a15e..5d774ae 100644
--- a/kexec/fs2dt.c
+++ b/kexec/fs2dt.c
@@ -84,7 +84,7 @@ static void dt_reserve(unsigned **dt_ptr, unsigned words)
offset = *dt_ptr - dt_base;
dt_base = new_dt;
dt_cur_size = new_size;
- *dt_ptr = cpu_to_be32((unsigned)dt_base + offset);
+ *dt_ptr = dt_base + offset;
memset(*dt_ptr, 0, (new_size - offset)*4);
}
}
@@ -112,19 +112,22 @@ static void checkprop(char *name, unsigned *data, int len)
if ((data == NULL) && (base || size || end))
die("unrecoverable error: no property data");
else if (!strcmp(name, "linux,rtas-base"))
- base = *data;
+ base = be32_to_cpu(*data);
else if (!strcmp(name, "linux,tce-base"))
- base = *(unsigned long long *) data;
+ base = be64_to_cpu(*(unsigned long long *) data);
else if (!strcmp(name, "rtas-size") ||
!strcmp(name, "linux,tce-size"))
- size = *data;
+ size = be32_to_cpu(*data);
else if (reuse_initrd && !strcmp(name, "linux,initrd-start"))
if (len == 8)
- base = *(unsigned long long *) data;
+ base = be64_to_cpu(*(unsigned long long *) data);
else
- base = *data;
+ base = be32_to_cpu(*data);
else if (reuse_initrd && !strcmp(name, "linux,initrd-end"))
- end = *(unsigned long long *) data;
+ if (len == 8)
+ end = be64_to_cpu(*(unsigned long long *) data);
+ else
+ end = be32_to_cpu(*data);
if (size && end)
die("unrecoverable error: size and end set at same time\n");
@@ -267,7 +270,7 @@ static void add_dyn_reconf_usable_mem_property__(int fd)
pad_structure_block(rlen);
memcpy(dt, ranges, rlen);
free(ranges);
- dt += cpu_to_be32((rlen + 3)/4);
+ dt += (rlen + 3)/4;
}
static void add_dyn_reconf_usable_mem_property(struct dirent *dp, int fd)