aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/setup.c
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@rpsys.net>2008-01-01 18:56:46 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-02-04 08:21:03 -0500
commit4cd9d6f774c7e0578bbc4409d4490d8f2097d40a (patch)
treec910cfc0def573a681fe8c75e1e35abd93496151 /arch/arm/kernel/setup.c
parentae9458d6a0956aa21cb49e1251e35a8d4dacbe6e (diff)
[ARM] 4736/1: Export atags to userspace and allow kexec to use customised atags
Currently, the atags used by kexec are fixed to the ones originally used to boot the kernel. This is less than ideal as changing the commandline, initrd and other options would be a useful feature. This patch exports the atags used for the current kernel to userspace through an "atags" file in procfs. The presence of the file is controlled by its own Kconfig option and cleans up several ifdef blocks into a separate file. The tags for the new kernel are assumed to be at a fixed location before the kernel image itself. The location of the tags used to boot the original kernel is unimportant and no longer saved. Based on a patch from Uli Luckas <u.luckas@road.de> Signed-off-by: Richard Purdie <rpurdie@rpsys.net> Acked-by: Uli Luckas <u.luckas@road.de> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/setup.c')
-rw-r--r--arch/arm/kernel/setup.c32
1 files changed, 2 insertions, 30 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index bf56eb337df1..ae3712d39ab7 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -24,7 +24,6 @@
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>
28 27
29#include <asm/cpu.h> 28#include <asm/cpu.h>
30#include <asm/elf.h> 29#include <asm/elf.h>
@@ -39,6 +38,7 @@
39#include <asm/mach/time.h> 38#include <asm/mach/time.h>
40 39
41#include "compat.h" 40#include "compat.h"
41#include "atags.h"
42 42
43#ifndef MEM_SIZE 43#ifndef MEM_SIZE
44#define MEM_SIZE (16*1024*1024) 44#define MEM_SIZE (16*1024*1024)
@@ -784,23 +784,6 @@ static int __init customize_machine(void)
784} 784}
785arch_initcall(customize_machine); 785arch_initcall(customize_machine);
786 786
787#ifdef CONFIG_KEXEC
788
789/* Physical addr of where the boot params should be for this machine */
790extern unsigned long kexec_boot_params_address;
791
792/* Physical addr of the buffer into which the boot params are copied */
793extern unsigned long kexec_boot_params_copy;
794
795/* Pointer to the boot params buffer, for manipulation and display */
796unsigned long kexec_boot_params;
797EXPORT_SYMBOL(kexec_boot_params);
798
799/* The buffer itself - make sure it is sized correctly */
800static unsigned long kexec_boot_params_buf[(KEXEC_BOOT_PARAMS_SIZE + 3) / 4];
801
802#endif
803
804void __init setup_arch(char **cmdline_p) 787void __init setup_arch(char **cmdline_p)
805{ 788{
806 struct tag *tags = (struct tag *)&init_tags; 789 struct tag *tags = (struct tag *)&init_tags;
@@ -819,18 +802,6 @@ void __init setup_arch(char **cmdline_p)
819 else if (mdesc->boot_params) 802 else if (mdesc->boot_params)
820 tags = phys_to_virt(mdesc->boot_params); 803 tags = phys_to_virt(mdesc->boot_params);
821 804
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
834 /* 805 /*
835 * If we have the old style parameters, convert them to 806 * If we have the old style parameters, convert them to
836 * a tag list. 807 * a tag list.
@@ -846,6 +817,7 @@ void __init setup_arch(char **cmdline_p)
846 if (tags->hdr.tag == ATAG_CORE) { 817 if (tags->hdr.tag == ATAG_CORE) {
847 if (meminfo.nr_banks != 0) 818 if (meminfo.nr_banks != 0)
848 squash_mem_tags(tags); 819 squash_mem_tags(tags);
820 save_atags(tags);
849 parse_tags(tags); 821 parse_tags(tags);
850 } 822 }
851 823