diff options
Diffstat (limited to 'arch/arm/kernel/setup.c')
-rw-r--r-- | arch/arm/kernel/setup.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index efac7df72d65..bf56eb337df1 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/smp.h> | 25 | #include <linux/smp.h> |
26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
27 | #include <linux/kexec.h> | ||
27 | 28 | ||
28 | #include <asm/cpu.h> | 29 | #include <asm/cpu.h> |
29 | #include <asm/elf.h> | 30 | #include <asm/elf.h> |
@@ -783,6 +784,23 @@ static int __init customize_machine(void) | |||
783 | } | 784 | } |
784 | arch_initcall(customize_machine); | 785 | arch_initcall(customize_machine); |
785 | 786 | ||
787 | #ifdef CONFIG_KEXEC | ||
788 | |||
789 | /* Physical addr of where the boot params should be for this machine */ | ||
790 | extern unsigned long kexec_boot_params_address; | ||
791 | |||
792 | /* Physical addr of the buffer into which the boot params are copied */ | ||
793 | extern unsigned long kexec_boot_params_copy; | ||
794 | |||
795 | /* Pointer to the boot params buffer, for manipulation and display */ | ||
796 | unsigned long kexec_boot_params; | ||
797 | EXPORT_SYMBOL(kexec_boot_params); | ||
798 | |||
799 | /* The buffer itself - make sure it is sized correctly */ | ||
800 | static unsigned long kexec_boot_params_buf[(KEXEC_BOOT_PARAMS_SIZE + 3) / 4]; | ||
801 | |||
802 | #endif | ||
803 | |||
786 | void __init setup_arch(char **cmdline_p) | 804 | void __init setup_arch(char **cmdline_p) |
787 | { | 805 | { |
788 | struct tag *tags = (struct tag *)&init_tags; | 806 | struct tag *tags = (struct tag *)&init_tags; |
@@ -801,6 +819,18 @@ void __init setup_arch(char **cmdline_p) | |||
801 | else if (mdesc->boot_params) | 819 | else if (mdesc->boot_params) |
802 | tags = phys_to_virt(mdesc->boot_params); | 820 | tags = phys_to_virt(mdesc->boot_params); |
803 | 821 | ||
822 | #ifdef CONFIG_KEXEC | ||
823 | kexec_boot_params_copy = virt_to_phys(kexec_boot_params_buf); | ||
824 | kexec_boot_params = (unsigned long)kexec_boot_params_buf; | ||
825 | if (__atags_pointer) { | ||
826 | kexec_boot_params_address = __atags_pointer; | ||
827 | memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||
828 | } else if (mdesc->boot_params) { | ||
829 | kexec_boot_params_address = mdesc->boot_params; | ||
830 | memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||
831 | } | ||
832 | #endif | ||
833 | |||
804 | /* | 834 | /* |
805 | * If we have the old style parameters, convert them to | 835 | * If we have the old style parameters, convert them to |
806 | * a tag list. | 836 | * a tag list. |