base.S 4.2 KB
Newer Older
1 2 3
/*
 *  arch/s390/kernel/base.S
 *
4
 *    Copyright IBM Corp. 2006, 2007
5 6 7 8
 *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
 *		 Michael Holzheu <holzheu@de.ibm.com>
 */

9
#include <linux/linkage.h>
10
#include <asm/asm-offsets.h>
11
#include <asm/ptrace.h>
12
#include <asm/sigp.h>
13 14 15

#ifdef CONFIG_64BIT

16
ENTRY(s390_base_mcck_handler)
17 18 19 20 21 22 23 24 25 26 27 28 29
	basr	%r13,0
0:	lg	%r15,__LC_PANIC_STACK	# load panic stack
	aghi	%r15,-STACK_FRAME_OVERHEAD
	larl	%r1,s390_base_mcck_handler_fn
	lg	%r1,0(%r1)
	ltgr	%r1,%r1
	jz	1f
	basr	%r14,%r1
1:	la	%r1,4095
	lmg	%r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
	lpswe	__LC_MCK_OLD_PSW

	.section .bss
30
	.align 8
31 32 33 34 35
	.globl	s390_base_mcck_handler_fn
s390_base_mcck_handler_fn:
	.quad	0
	.previous

36
ENTRY(s390_base_ext_handler)
37
	stmg	%r0,%r15,__LC_SAVE_AREA_ASYNC
38 39 40 41 42 43 44
	basr	%r13,0
0:	aghi	%r15,-STACK_FRAME_OVERHEAD
	larl	%r1,s390_base_ext_handler_fn
	lg	%r1,0(%r1)
	ltgr	%r1,%r1
	jz	1f
	basr	%r14,%r1
45
1:	lmg	%r0,%r15,__LC_SAVE_AREA_ASYNC
46 47 48 49
	ni	__LC_EXT_OLD_PSW+1,0xfd	# clear wait state bit
	lpswe	__LC_EXT_OLD_PSW

	.section .bss
50
	.align 8
51 52 53 54 55
	.globl s390_base_ext_handler_fn
s390_base_ext_handler_fn:
	.quad	0
	.previous

56
ENTRY(s390_base_pgm_handler)
57
	stmg	%r0,%r15,__LC_SAVE_AREA_SYNC
58 59 60 61 62 63 64
	basr	%r13,0
0:	aghi	%r15,-STACK_FRAME_OVERHEAD
	larl	%r1,s390_base_pgm_handler_fn
	lg	%r1,0(%r1)
	ltgr	%r1,%r1
	jz	1f
	basr	%r14,%r1
65
	lmg	%r0,%r15,__LC_SAVE_AREA_SYNC
66 67 68 69 70 71 72 73
	lpswe	__LC_PGM_OLD_PSW
1:	lpswe	disabled_wait_psw-0b(%r13)

	.align	8
disabled_wait_psw:
	.quad	0x0002000180000000,0x0000000000000000 + s390_base_pgm_handler

	.section .bss
74
	.align 8
75 76 77 78 79
	.globl s390_base_pgm_handler_fn
s390_base_pgm_handler_fn:
	.quad	0
	.previous

80 81 82 83 84 85 86 87 88 89
#
# Calls diag 308 subcode 1 and continues execution
#
# The following conditions must be ensured before calling this function:
# * Prefix register = 0
# * Lowcore protection is disabled
#
ENTRY(diag308_reset)
	larl	%r4,.Lctlregs		# Save control registers
	stctg	%c0,%c15,0(%r4)
M
Michael Holzheu 已提交
90 91
	larl	%r4,.Lfpctl		# Floating point control register
	stfpc	0(%r4)
92 93 94
	larl	%r4,.Lcontinue_psw	# Save PSW flags
	epsw	%r2,%r3
	stm	%r2,%r3,0(%r4)
95 96 97 98 99 100 101 102 103
	larl	%r4,.Lrestart_psw	# Setup restart PSW at absolute 0
	lghi	%r3,0
	lg	%r4,0(%r4)		# Save PSW
	sturg	%r4,%r3			# Use sturg, because of large pages
	lghi	%r1,1
	diag	%r1,%r1,0x308
.Lrestart_part2:
	lhi	%r0,0			# Load r0 with zero
	lhi	%r1,2			# Use mode 2 = ESAME (dump)
104
	sigp	%r1,%r0,SIGP_SET_ARCHITECTURE	# Switch to ESAME mode
105 106 107
	sam64				# Switch to 64 bit addressing mode
	larl	%r4,.Lctlregs		# Restore control registers
	lctlg	%c0,%c15,0(%r4)
M
Michael Holzheu 已提交
108 109
	larl	%r4,.Lfpctl		# Restore floating point ctl register
	lfpc	0(%r4)
110 111 112
	larl	%r4,.Lcontinue_psw	# Restore PSW flags
	lpswe	0(%r4)
.Lcontinue:
113 114 115 116 117
	br	%r14
.align 16
.Lrestart_psw:
	.long	0x00080000,0x80000000 + .Lrestart_part2

118 119 120 121 122 123
	.section .data..nosave,"aw",@progbits
.align 8
.Lcontinue_psw:
	.quad	0,.Lcontinue
	.previous

124 125 126 127 128 129
	.section .bss
.align 8
.Lctlregs:
	.rept	16
	.quad	0
	.endr
M
Michael Holzheu 已提交
130 131
.Lfpctl:
	.long	0
132 133
	.previous

134 135
#else /* CONFIG_64BIT */

136
ENTRY(s390_base_mcck_handler)
137 138 139 140 141 142 143 144 145 146 147 148 149 150
	basr	%r13,0
0:	l	%r15,__LC_PANIC_STACK	# load panic stack
	ahi	%r15,-STACK_FRAME_OVERHEAD
	l	%r1,2f-0b(%r13)
	l	%r1,0(%r1)
	ltr	%r1,%r1
	jz	1f
	basr	%r14,%r1
1:	lm	%r0,%r15,__LC_GPREGS_SAVE_AREA
	lpsw	__LC_MCK_OLD_PSW

2:	.long	s390_base_mcck_handler_fn

	.section .bss
151
	.align 4
152 153 154 155 156
	.globl	s390_base_mcck_handler_fn
s390_base_mcck_handler_fn:
	.long	0
	.previous

157
ENTRY(s390_base_ext_handler)
158
	stm	%r0,%r15,__LC_SAVE_AREA_ASYNC
159 160 161 162 163 164 165
	basr	%r13,0
0:	ahi	%r15,-STACK_FRAME_OVERHEAD
	l	%r1,2f-0b(%r13)
	l	%r1,0(%r1)
	ltr	%r1,%r1
	jz	1f
	basr	%r14,%r1
166
1:	lm	%r0,%r15,__LC_SAVE_AREA_ASYNC
167 168 169 170 171 172
	ni	__LC_EXT_OLD_PSW+1,0xfd	# clear wait state bit
	lpsw	__LC_EXT_OLD_PSW

2:	.long	s390_base_ext_handler_fn

	.section .bss
173
	.align 4
174 175 176 177 178
	.globl	s390_base_ext_handler_fn
s390_base_ext_handler_fn:
	.long	0
	.previous

179
ENTRY(s390_base_pgm_handler)
180
	stm	%r0,%r15,__LC_SAVE_AREA_SYNC
181 182 183 184 185 186 187
	basr	%r13,0
0:	ahi	%r15,-STACK_FRAME_OVERHEAD
	l	%r1,2f-0b(%r13)
	l	%r1,0(%r1)
	ltr	%r1,%r1
	jz	1f
	basr	%r14,%r1
188
	lm	%r0,%r15,__LC_SAVE_AREA_SYNC
189 190 191 192 193 194 195 196 197 198 199
	lpsw	__LC_PGM_OLD_PSW

1:	lpsw	disabled_wait_psw-0b(%r13)

2:	.long	s390_base_pgm_handler_fn

disabled_wait_psw:
	.align	8
	.long	0x000a0000,0x00000000 + s390_base_pgm_handler

	.section .bss
200
	.align 4
201 202 203 204 205 206
	.globl	s390_base_pgm_handler_fn
s390_base_pgm_handler_fn:
	.long	0
	.previous

#endif /* CONFIG_64BIT */