blob: 61fca549a93bde472e8427219ba85f85172112bb [file] [log] [blame]
Heiko Carstensab14de62007-02-05 21:18:37 +01001/*
2 * arch/s390/kernel/base.S
3 *
Heiko Carstensa53c8fa2012-07-20 11:15:04 +02004 * Copyright IBM Corp. 2006, 2007
Heiko Carstensab14de62007-02-05 21:18:37 +01005 * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
6 * Michael Holzheu <holzheu@de.ibm.com>
7 */
8
Jan Glauber144d6342011-07-24 10:48:19 +02009#include <linux/linkage.h>
Heiko Carstenscbb870c2010-02-26 22:37:43 +010010#include <asm/asm-offsets.h>
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020011#include <asm/nospec-insn.h>
Heiko Carstensab14de62007-02-05 21:18:37 +010012#include <asm/ptrace.h>
Heiko Carstenseb546192012-06-04 15:05:43 +020013#include <asm/sigp.h>
Heiko Carstensab14de62007-02-05 21:18:37 +010014
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020015 GEN_BR_THUNK %r9
16 GEN_BR_THUNK %r14
17
Jan Glauber144d6342011-07-24 10:48:19 +020018ENTRY(s390_base_mcck_handler)
Heiko Carstensab14de62007-02-05 21:18:37 +010019 basr %r13,0
200: lg %r15,__LC_PANIC_STACK # load panic stack
21 aghi %r15,-STACK_FRAME_OVERHEAD
22 larl %r1,s390_base_mcck_handler_fn
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020023 lg %r9,0(%r1)
24 ltgr %r9,%r9
Heiko Carstensab14de62007-02-05 21:18:37 +010025 jz 1f
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020026 BASR_EX %r14,%r9
Heiko Carstensab14de62007-02-05 21:18:37 +0100271: la %r1,4095
28 lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
29 lpswe __LC_MCK_OLD_PSW
30
31 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +020032 .align 8
Heiko Carstensab14de62007-02-05 21:18:37 +010033 .globl s390_base_mcck_handler_fn
34s390_base_mcck_handler_fn:
35 .quad 0
36 .previous
37
Jan Glauber144d6342011-07-24 10:48:19 +020038ENTRY(s390_base_ext_handler)
Martin Schwidefskyc5328902011-12-27 11:27:15 +010039 stmg %r0,%r15,__LC_SAVE_AREA_ASYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010040 basr %r13,0
410: aghi %r15,-STACK_FRAME_OVERHEAD
42 larl %r1,s390_base_ext_handler_fn
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020043 lg %r9,0(%r1)
44 ltgr %r9,%r9
Heiko Carstensab14de62007-02-05 21:18:37 +010045 jz 1f
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020046 BASR_EX %r14,%r9
Martin Schwidefskyc5328902011-12-27 11:27:15 +0100471: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010048 ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
49 lpswe __LC_EXT_OLD_PSW
50
51 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +020052 .align 8
Heiko Carstensab14de62007-02-05 21:18:37 +010053 .globl s390_base_ext_handler_fn
54s390_base_ext_handler_fn:
55 .quad 0
56 .previous
57
Jan Glauber144d6342011-07-24 10:48:19 +020058ENTRY(s390_base_pgm_handler)
Martin Schwidefskyc5328902011-12-27 11:27:15 +010059 stmg %r0,%r15,__LC_SAVE_AREA_SYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010060 basr %r13,0
610: aghi %r15,-STACK_FRAME_OVERHEAD
62 larl %r1,s390_base_pgm_handler_fn
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020063 lg %r9,0(%r1)
64 ltgr %r9,%r9
Heiko Carstensab14de62007-02-05 21:18:37 +010065 jz 1f
Martin Schwidefskyb35421a2018-05-23 18:21:49 +020066 BASR_EX %r14,%r9
Martin Schwidefskyc5328902011-12-27 11:27:15 +010067 lmg %r0,%r15,__LC_SAVE_AREA_SYNC
Heiko Carstensab14de62007-02-05 21:18:37 +010068 lpswe __LC_PGM_OLD_PSW
691: lpswe disabled_wait_psw-0b(%r13)
70
71 .align 8
72disabled_wait_psw:
73 .quad 0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler
74
75 .section .bss
Jan Glauber144d6342011-07-24 10:48:19 +020076 .align 8
Heiko Carstensab14de62007-02-05 21:18:37 +010077 .globl s390_base_pgm_handler_fn
78s390_base_pgm_handler_fn:
79 .quad 0
80 .previous
81
Michael Holzheu9dc73562011-08-03 16:44:22 +020082#
83# Calls diag 308 subcode 1 and continues execution
84#
Michael Holzheu9dc73562011-08-03 16:44:22 +020085ENTRY(diag308_reset)
86 larl %r4,.Lctlregs # Save control registers
87 stctg %c0,%c15,0(%r4)
Michael Holzheu1592a8e2015-05-26 19:05:23 +020088 lg %r2,0(%r4) # Disable lowcore protection
89 nilh %r2,0xefff
90 larl %r4,.Lctlreg0
91 stg %r2,0(%r4)
92 lctlg %c0,%c0,0(%r4)
Michael Holzheu60a0c682011-10-30 15:16:40 +010093 larl %r4,.Lfpctl # Floating point control register
94 stfpc 0(%r4)
Michael Holzheu1592a8e2015-05-26 19:05:23 +020095 larl %r4,.Lprefix # Save prefix register
96 stpx 0(%r4)
97 larl %r4,.Lprefix_zero # Set prefix register to 0
98 spx 0(%r4)
Michael Holzheufa7c0042012-05-21 11:30:30 +020099 larl %r4,.Lcontinue_psw # Save PSW flags
100 epsw %r2,%r3
101 stm %r2,%r3,0(%r4)
Michael Holzheu9dc73562011-08-03 16:44:22 +0200102 larl %r4,.Lrestart_psw # Setup restart PSW at absolute 0
103 lghi %r3,0
104 lg %r4,0(%r4) # Save PSW
105 sturg %r4,%r3 # Use sturg, because of large pages
106 lghi %r1,1
Martin Schwidefsky10ad34b2015-01-14 17:52:10 +0100107 lghi %r0,0
108 diag %r0,%r1,0x308
Michael Holzheu9dc73562011-08-03 16:44:22 +0200109.Lrestart_part2:
110 lhi %r0,0 # Load r0 with zero
111 lhi %r1,2 # Use mode 2 = ESAME (dump)
Heiko Carstenseb546192012-06-04 15:05:43 +0200112 sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to ESAME mode
Michael Holzheu9dc73562011-08-03 16:44:22 +0200113 sam64 # Switch to 64 bit addressing mode
114 larl %r4,.Lctlregs # Restore control registers
115 lctlg %c0,%c15,0(%r4)
Michael Holzheu60a0c682011-10-30 15:16:40 +0100116 larl %r4,.Lfpctl # Restore floating point ctl register
117 lfpc 0(%r4)
Michael Holzheu1592a8e2015-05-26 19:05:23 +0200118 larl %r4,.Lprefix # Restore prefix register
119 spx 0(%r4)
Michael Holzheufa7c0042012-05-21 11:30:30 +0200120 larl %r4,.Lcontinue_psw # Restore PSW flags
121 lpswe 0(%r4)
122.Lcontinue:
Martin Schwidefskyb35421a2018-05-23 18:21:49 +0200123 BR_EX %r14
Michael Holzheu9dc73562011-08-03 16:44:22 +0200124.align 16
125.Lrestart_psw:
126 .long 0x00080000,0x80000000 + .Lrestart_part2
127
Michael Holzheufa7c0042012-05-21 11:30:30 +0200128 .section .data..nosave,"aw",@progbits
129.align 8
130.Lcontinue_psw:
131 .quad 0,.Lcontinue
132 .previous
133
Michael Holzheu9dc73562011-08-03 16:44:22 +0200134 .section .bss
135.align 8
Michael Holzheu1592a8e2015-05-26 19:05:23 +0200136.Lctlreg0:
137 .quad 0
Michael Holzheu9dc73562011-08-03 16:44:22 +0200138.Lctlregs:
139 .rept 16
140 .quad 0
141 .endr
Michael Holzheu60a0c682011-10-30 15:16:40 +0100142.Lfpctl:
143 .long 0
Michael Holzheu1592a8e2015-05-26 19:05:23 +0200144.Lprefix:
145 .long 0
146.Lprefix_zero:
147 .long 0
Michael Holzheu9dc73562011-08-03 16:44:22 +0200148 .previous