aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/smp.c
diff options
context:
space:
mode:
authorMichael Holzheu <holzheu@linux.vnet.ibm.com>2012-03-11 11:59:34 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2012-03-11 11:59:29 -0400
commit4857d4bbe9821c8d732cb84455e18e12b3d79add (patch)
tree54583e3ef5c84c04f92b7b15ea6aad8224781d9b /arch/s390/kernel/smp.c
parentad252ffa2a0fbb1f37e81688322034b3af037cee (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.c13
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
46enum { 47enum {
@@ -826,6 +827,17 @@ void __noreturn cpu_die(void)
826 827
827#endif /* CONFIG_HOTPLUG_CPU */ 828#endif /* CONFIG_HOTPLUG_CPU */
828 829
830static 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
829void __init smp_prepare_cpus(unsigned int max_cpus) 841void __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