Commit 593e537b authored by Michael Ellerman's avatar Michael Ellerman Committed by Paul Mackerras

[PATCH] powerpc: Export htab start/end via device tree

The userspace kexec-tools need to know the location of the htab on non-lpar
machines, as well as the end of the kernel. Export via the device tree.

NB. This patch has been updated to use "linux,x" property names. You may
need to update your kexec-tools to match.
Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent c5e24354
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#include <asm/firmware.h> #include <asm/firmware.h>
#include <asm/xmon.h> #include <asm/xmon.h>
#include <asm/udbg.h> #include <asm/udbg.h>
#include <asm/kexec.h>
#include "setup.h" #include "setup.h"
...@@ -415,6 +416,10 @@ void __init setup_system(void) ...@@ -415,6 +416,10 @@ void __init setup_system(void)
*/ */
unflatten_device_tree(); unflatten_device_tree();
#ifdef CONFIG_KEXEC
kexec_setup(); /* requires unflattened device tree. */
#endif
/* /*
* Fill the ppc64_caches & systemcfg structures with informations * Fill the ppc64_caches & systemcfg structures with informations
* retreived from the device-tree. Need to be called before * retreived from the device-tree. Need to be called before
......
...@@ -305,3 +305,54 @@ void machine_kexec(struct kimage *image) ...@@ -305,3 +305,54 @@ void machine_kexec(struct kimage *image)
ppc_md.hpte_clear_all); ppc_md.hpte_clear_all);
/* NOTREACHED */ /* NOTREACHED */
} }
/* Values we need to export to the second kernel via the device tree. */
static unsigned long htab_base, htab_size, kernel_end;
static struct property htab_base_prop = {
.name = "linux,htab-base",
.length = sizeof(unsigned long),
.value = (unsigned char *)&htab_base,
};
static struct property htab_size_prop = {
.name = "linux,htab-size",
.length = sizeof(unsigned long),
.value = (unsigned char *)&htab_size,
};
static struct property kernel_end_prop = {
.name = "linux,kernel-end",
.length = sizeof(unsigned long),
.value = (unsigned char *)&kernel_end,
};
static void __init export_htab_values(void)
{
struct device_node *node;
node = of_find_node_by_path("/chosen");
if (!node)
return;
kernel_end = __pa(_end);
prom_add_property(node, &kernel_end_prop);
/* On machines with no htab htab_address is NULL */
if (NULL == htab_address)
goto out;
htab_base = __pa(htab_address);
prom_add_property(node, &htab_base_prop);
htab_size = 1UL << ppc64_pft_size;
prom_add_property(node, &htab_size_prop);
out:
of_node_put(node);
}
void __init kexec_setup(void)
{
export_htab_values();
}
...@@ -40,6 +40,7 @@ extern note_buf_t crash_notes[]; ...@@ -40,6 +40,7 @@ extern note_buf_t crash_notes[];
#ifdef __powerpc64__ #ifdef __powerpc64__
extern void kexec_smp_wait(void); /* get and clear naca physid, wait for extern void kexec_smp_wait(void); /* get and clear naca physid, wait for
master to copy new code to 0 */ master to copy new code to 0 */
extern void __init kexec_setup(void);
#else #else
struct kimage; struct kimage;
extern void machine_kexec_simple(struct kimage *image); extern void machine_kexec_simple(struct kimage *image);
......
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