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: Anton Blanchard <anton@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
04a341138d
commit
ea961a828f
|
@ -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 = {
|
||||||
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 = {
|
||||||
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)
|
||||||
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)
|
||||||
* 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)
|
||||||
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)
|
||||||
|
|
||||||
/* 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 = {
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue