diff options
author | Michael Holzheu <holzheu@linux.vnet.ibm.com> | 2012-03-11 11:59:34 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2012-03-11 11:59:29 -0400 |
commit | 4857d4bbe9821c8d732cb84455e18e12b3d79add (patch) | |
tree | 54583e3ef5c84c04f92b7b15ea6aad8224781d9b /arch/s390/kernel/smp.c | |
parent | ad252ffa2a0fbb1f37e81688322034b3af037cee (diff) |
[S390] kernel: Add OS info memory interface
In order to allow kdump based stand-alone dump, some information
has to be passed from the old kernel to the new dump kernel. This
is done via a the struct "os_info" that contains the following fields:
* crashkernel base and size
* reipl block
* vmcoreinfo
* init function
A pointer to os_info is stored at a well known storage location
and the whole structure as well as all fields are secured with
checksums.
Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/smp.c')
-rw-r--r-- | arch/s390/kernel/smp.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index d15b6c937088..3b9e5c9f4c0b 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <asm/sclp.h> | 41 | #include <asm/sclp.h> |
42 | #include <asm/vdso.h> | 42 | #include <asm/vdso.h> |
43 | #include <asm/debug.h> | 43 | #include <asm/debug.h> |
44 | #include <asm/os_info.h> | ||
44 | #include "entry.h" | 45 | #include "entry.h" |
45 | 46 | ||
46 | enum { | 47 | enum { |
@@ -826,6 +827,17 @@ void __noreturn cpu_die(void) | |||
826 | 827 | ||
827 | #endif /* CONFIG_HOTPLUG_CPU */ | 828 | #endif /* CONFIG_HOTPLUG_CPU */ |
828 | 829 | ||
830 | static void smp_call_os_info_init_fn(void) | ||
831 | { | ||
832 | int (*init_fn)(void); | ||
833 | unsigned long size; | ||
834 | |||
835 | init_fn = os_info_old_entry(OS_INFO_INIT_FN, &size); | ||
836 | if (!init_fn) | ||
837 | return; | ||
838 | init_fn(); | ||
839 | } | ||
840 | |||
829 | void __init smp_prepare_cpus(unsigned int max_cpus) | 841 | void __init smp_prepare_cpus(unsigned int max_cpus) |
830 | { | 842 | { |
831 | /* request the 0x1201 emergency signal external interrupt */ | 843 | /* request the 0x1201 emergency signal external interrupt */ |
@@ -834,6 +846,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
834 | /* request the 0x1202 external call external interrupt */ | 846 | /* request the 0x1202 external call external interrupt */ |
835 | if (register_external_interrupt(0x1202, do_ext_call_interrupt) != 0) | 847 | if (register_external_interrupt(0x1202, do_ext_call_interrupt) != 0) |
836 | panic("Couldn't request external interrupt 0x1202"); | 848 | panic("Couldn't request external interrupt 0x1202"); |
849 | smp_call_os_info_init_fn(); | ||
837 | smp_detect_cpus(); | 850 | smp_detect_cpus(); |
838 | } | 851 | } |
839 | 852 | ||