diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/kernel/ipl.c | 10 | ||||
-rw-r--r-- | arch/s390/kernel/reset.S | 42 |
2 files changed, 51 insertions, 1 deletions
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c index a36bea1188d9..d2e6a0a56ade 100644 --- a/arch/s390/kernel/ipl.c +++ b/arch/s390/kernel/ipl.c | |||
@@ -1037,13 +1037,15 @@ static void do_reset_calls(void) | |||
1037 | } | 1037 | } |
1038 | 1038 | ||
1039 | extern void reset_mcck_handler(void); | 1039 | extern void reset_mcck_handler(void); |
1040 | extern void reset_pgm_handler(void); | ||
1040 | 1041 | ||
1041 | void s390_reset_system(void) | 1042 | void s390_reset_system(void) |
1042 | { | 1043 | { |
1043 | struct _lowcore *lc; | 1044 | struct _lowcore *lc; |
1044 | 1045 | ||
1045 | /* Stack for interrupt/machine check handler */ | ||
1046 | lc = (struct _lowcore *)(unsigned long) store_prefix(); | 1046 | lc = (struct _lowcore *)(unsigned long) store_prefix(); |
1047 | |||
1048 | /* Stack for interrupt/machine check handler */ | ||
1047 | lc->panic_stack = S390_lowcore.panic_stack; | 1049 | lc->panic_stack = S390_lowcore.panic_stack; |
1048 | 1050 | ||
1049 | /* Disable prefixing */ | 1051 | /* Disable prefixing */ |
@@ -1056,5 +1058,11 @@ void s390_reset_system(void) | |||
1056 | S390_lowcore.mcck_new_psw.mask = PSW_KERNEL_BITS & ~PSW_MASK_MCHECK; | 1058 | S390_lowcore.mcck_new_psw.mask = PSW_KERNEL_BITS & ~PSW_MASK_MCHECK; |
1057 | S390_lowcore.mcck_new_psw.addr = | 1059 | S390_lowcore.mcck_new_psw.addr = |
1058 | PSW_ADDR_AMODE | (unsigned long) &reset_mcck_handler; | 1060 | PSW_ADDR_AMODE | (unsigned long) &reset_mcck_handler; |
1061 | |||
1062 | /* Set new program check handler */ | ||
1063 | S390_lowcore.program_new_psw.mask = PSW_KERNEL_BITS & ~PSW_MASK_MCHECK; | ||
1064 | S390_lowcore.program_new_psw.addr = | ||
1065 | PSW_ADDR_AMODE | (unsigned long) &reset_pgm_handler; | ||
1066 | |||
1059 | do_reset_calls(); | 1067 | do_reset_calls(); |
1060 | } | 1068 | } |
diff --git a/arch/s390/kernel/reset.S b/arch/s390/kernel/reset.S index be8688c0665c..8a87355161fa 100644 --- a/arch/s390/kernel/reset.S +++ b/arch/s390/kernel/reset.S | |||
@@ -3,6 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) IBM Corp. 2006 | 4 | * Copyright (C) IBM Corp. 2006 |
5 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | 5 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> |
6 | * Michael Holzheu <holzheu@de.ibm.com> | ||
6 | */ | 7 | */ |
7 | 8 | ||
8 | #include <asm/ptrace.h> | 9 | #include <asm/ptrace.h> |
@@ -27,6 +28,26 @@ reset_mcck_handler: | |||
27 | s390_reset_mcck_handler: | 28 | s390_reset_mcck_handler: |
28 | .quad 0 | 29 | .quad 0 |
29 | 30 | ||
31 | .globl reset_pgm_handler | ||
32 | reset_pgm_handler: | ||
33 | stmg %r0,%r15,__LC_SAVE_AREA | ||
34 | basr %r13,0 | ||
35 | 0: lg %r15,__LC_PANIC_STACK # load panic stack | ||
36 | aghi %r15,-STACK_FRAME_OVERHEAD | ||
37 | lg %r1,s390_reset_pgm_handler-0b(%r13) | ||
38 | ltgr %r1,%r1 | ||
39 | jz 1f | ||
40 | basr %r14,%r1 | ||
41 | lmg %r0,%r15,__LC_SAVE_AREA | ||
42 | lpswe __LC_PGM_OLD_PSW | ||
43 | 1: lpswe disabled_wait_psw-0b(%r13) | ||
44 | .globl s390_reset_pgm_handler | ||
45 | s390_reset_pgm_handler: | ||
46 | .quad 0 | ||
47 | .align 8 | ||
48 | disabled_wait_psw: | ||
49 | .quad 0x0002000180000000,0x0000000000000000 + reset_pgm_handler | ||
50 | |||
30 | #else /* CONFIG_64BIT */ | 51 | #else /* CONFIG_64BIT */ |
31 | 52 | ||
32 | .globl reset_mcck_handler | 53 | .globl reset_mcck_handler |
@@ -45,4 +66,25 @@ reset_mcck_handler: | |||
45 | s390_reset_mcck_handler: | 66 | s390_reset_mcck_handler: |
46 | .long 0 | 67 | .long 0 |
47 | 68 | ||
69 | .globl reset_pgm_handler | ||
70 | reset_pgm_handler: | ||
71 | stm %r0,%r15,__LC_SAVE_AREA | ||
72 | basr %r13,0 | ||
73 | 0: l %r15,__LC_PANIC_STACK # load panic stack | ||
74 | ahi %r15,-STACK_FRAME_OVERHEAD | ||
75 | l %r1,s390_reset_pgm_handler-0b(%r13) | ||
76 | ltr %r1,%r1 | ||
77 | jz 1f | ||
78 | basr %r14,%r1 | ||
79 | lm %r0,%r15,__LC_SAVE_AREA | ||
80 | lpsw __LC_PGM_OLD_PSW | ||
81 | |||
82 | 1: lpsw disabled_wait_psw-0b(%r13) | ||
83 | .globl s390_reset_pgm_handler | ||
84 | s390_reset_pgm_handler: | ||
85 | .long 0 | ||
86 | disabled_wait_psw: | ||
87 | .align 8 | ||
88 | .long 0x000a0000,0x00000000 + reset_pgm_handler | ||
89 | |||
48 | #endif /* CONFIG_64BIT */ | 90 | #endif /* CONFIG_64BIT */ |