diff options
Diffstat (limited to 'arch/powerpc/kernel')
| -rw-r--r-- | arch/powerpc/kernel/machine_kexec.c | 34 | ||||
| -rw-r--r-- | arch/powerpc/kernel/machine_kexec_64.c | 24 | 
2 files changed, 39 insertions, 19 deletions
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index ac2a21f45c7..037ade74a99 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c @@ -13,8 +13,10 @@  #include <linux/reboot.h>  #include <linux/threads.h>  #include <linux/lmb.h> +#include <linux/of.h>  #include <asm/machdep.h>  #include <asm/prom.h> +#include <asm/sections.h>  void machine_crash_shutdown(struct pt_regs *regs)  { @@ -118,3 +120,35 @@ int overlaps_crashkernel(unsigned long start, unsigned long size)  {  	return (start + size) > crashk_res.start && start <= crashk_res.end;  } + +/* Values we need to export to the second kernel via the device tree. */ +static unsigned long kernel_end; + +static struct property kernel_end_prop = { +	.name = "linux,kernel-end", +	.length = sizeof(unsigned long), +	.value = &kernel_end, +}; + +static int __init kexec_setup(void) +{ +	struct device_node *node; +	struct property *prop; + +	node = of_find_node_by_path("/chosen"); +	if (!node) +		return -ENOENT; + +	/* remove any stale properties so ours can be found */ +	prop = of_find_property(node, kernel_end_prop.name, NULL); +	if (prop) +		prom_remove_property(node, prop); + +	/* information needed by userspace when using default_machine_kexec */ +	kernel_end = __pa(_end); +	prom_add_property(node, &kernel_end_prop); + +	of_node_put(node); +	return 0; +} +late_initcall(kexec_setup); diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index 3c4ca046e85..a89bce834a5 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c @@ -289,7 +289,7 @@ void default_machine_kexec(struct kimage *image)  }  /* Values we need to export to the second kernel via the device tree. */ -static unsigned long htab_base, kernel_end; +static unsigned long htab_base;  static struct property htab_base_prop = {  	.name = "linux,htab-base", @@ -303,25 +303,20 @@ static struct property htab_size_prop = {  	.value = &htab_size_bytes,  }; -static struct property kernel_end_prop = { -	.name = "linux,kernel-end", -	.length = sizeof(unsigned long), -	.value = &kernel_end, -}; -  static void __init export_htab_values(void)  {  	struct device_node *node;  	struct property *prop; +	/* On machines with no htab htab_address is NULL */ +	if (!htab_address) +		return; +  	node = of_find_node_by_path("/chosen");  	if (!node)  		return;  	/* remove any stale propertys so ours can be found */ -	prop = of_find_property(node, kernel_end_prop.name, NULL); -	if (prop) -		prom_remove_property(node, prop);  	prop = of_find_property(node, htab_base_prop.name, NULL);  	if (prop)  		prom_remove_property(node, prop); @@ -329,19 +324,10 @@ static void __init export_htab_values(void)  	if (prop)  		prom_remove_property(node, prop); -	/* information needed by userspace when using default_machine_kexec */ -	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);  	prom_add_property(node, &htab_size_prop); - out:  	of_node_put(node);  }  |