Commit ea961a82 authored by Anton Blanchard's avatar Anton Blanchard Committed by Benjamin Herrenschmidt

powerpc: Fix endian issues in kexec and crash dump code

We expose a number of OF properties in the kexec and crash dump code
and these need to be big endian.

Cc: stable@vger.kernel.org # v3.13
Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 04a34113
...@@ -196,7 +196,9 @@ int overlaps_crashkernel(unsigned long start, unsigned long size) ...@@ -196,7 +196,9 @@ int overlaps_crashkernel(unsigned long start, unsigned long size)
/* Values we need to export to the second kernel via the device tree. */ /* Values we need to export to the second kernel via the device tree. */
static phys_addr_t kernel_end; static phys_addr_t kernel_end;
static phys_addr_t crashk_base;
static phys_addr_t crashk_size; static phys_addr_t crashk_size;
static unsigned long long mem_limit;
static struct property kernel_end_prop = { static struct property kernel_end_prop = {
.name = "linux,kernel-end", .name = "linux,kernel-end",
...@@ -207,7 +209,7 @@ static struct property kernel_end_prop = { ...@@ -207,7 +209,7 @@ static struct property kernel_end_prop = {
static struct property crashk_base_prop = { static struct property crashk_base_prop = {
.name = "linux,crashkernel-base", .name = "linux,crashkernel-base",
.length = sizeof(phys_addr_t), .length = sizeof(phys_addr_t),
.value = &crashk_res.start, .value = &crashk_base
}; };
static struct property crashk_size_prop = { static struct property crashk_size_prop = {
...@@ -219,9 +221,11 @@ static struct property crashk_size_prop = { ...@@ -219,9 +221,11 @@ static struct property crashk_size_prop = {
static struct property memory_limit_prop = { static struct property memory_limit_prop = {
.name = "linux,memory-limit", .name = "linux,memory-limit",
.length = sizeof(unsigned long long), .length = sizeof(unsigned long long),
.value = &memory_limit, .value = &mem_limit,
}; };
#define cpu_to_be_ulong __PASTE(cpu_to_be, BITS_PER_LONG)
static void __init export_crashk_values(struct device_node *node) static void __init export_crashk_values(struct device_node *node)
{ {
struct property *prop; struct property *prop;
...@@ -237,8 +241,9 @@ static void __init export_crashk_values(struct device_node *node) ...@@ -237,8 +241,9 @@ static void __init export_crashk_values(struct device_node *node)
of_remove_property(node, prop); of_remove_property(node, prop);
if (crashk_res.start != 0) { if (crashk_res.start != 0) {
crashk_base = cpu_to_be_ulong(crashk_res.start),
of_add_property(node, &crashk_base_prop); of_add_property(node, &crashk_base_prop);
crashk_size = resource_size(&crashk_res); crashk_size = cpu_to_be_ulong(resource_size(&crashk_res));
of_add_property(node, &crashk_size_prop); of_add_property(node, &crashk_size_prop);
} }
...@@ -246,6 +251,7 @@ static void __init export_crashk_values(struct device_node *node) ...@@ -246,6 +251,7 @@ static void __init export_crashk_values(struct device_node *node)
* memory_limit is required by the kexec-tools to limit the * memory_limit is required by the kexec-tools to limit the
* crash regions to the actual memory used. * crash regions to the actual memory used.
*/ */
mem_limit = cpu_to_be_ulong(memory_limit);
of_update_property(node, &memory_limit_prop); of_update_property(node, &memory_limit_prop);
} }
...@@ -264,7 +270,7 @@ static int __init kexec_setup(void) ...@@ -264,7 +270,7 @@ static int __init kexec_setup(void)
of_remove_property(node, prop); of_remove_property(node, prop);
/* information needed by userspace when using default_machine_kexec */ /* information needed by userspace when using default_machine_kexec */
kernel_end = __pa(_end); kernel_end = cpu_to_be_ulong(__pa(_end));
of_add_property(node, &kernel_end_prop); of_add_property(node, &kernel_end_prop);
export_crashk_values(node); export_crashk_values(node);
......
...@@ -369,6 +369,7 @@ void default_machine_kexec(struct kimage *image) ...@@ -369,6 +369,7 @@ void default_machine_kexec(struct kimage *image)
/* Values we need to export to the second kernel via the device tree. */ /* Values we need to export to the second kernel via the device tree. */
static unsigned long htab_base; static unsigned long htab_base;
static unsigned long htab_size;
static struct property htab_base_prop = { static struct property htab_base_prop = {
.name = "linux,htab-base", .name = "linux,htab-base",
...@@ -379,7 +380,7 @@ static struct property htab_base_prop = { ...@@ -379,7 +380,7 @@ static struct property htab_base_prop = {
static struct property htab_size_prop = { static struct property htab_size_prop = {
.name = "linux,htab-size", .name = "linux,htab-size",
.length = sizeof(unsigned long), .length = sizeof(unsigned long),
.value = &htab_size_bytes, .value = &htab_size,
}; };
static int __init export_htab_values(void) static int __init export_htab_values(void)
...@@ -403,8 +404,9 @@ static int __init export_htab_values(void) ...@@ -403,8 +404,9 @@ static int __init export_htab_values(void)
if (prop) if (prop)
of_remove_property(node, prop); of_remove_property(node, prop);
htab_base = __pa(htab_address); htab_base = cpu_to_be64(__pa(htab_address));
of_add_property(node, &htab_base_prop); of_add_property(node, &htab_base_prop);
htab_size = cpu_to_be64(htab_size_bytes);
of_add_property(node, &htab_size_prop); of_add_property(node, &htab_size_prop);
of_node_put(node); of_node_put(node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment