1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * S390 kdump lowlevel functions (new kernel)
4  *
5  * Copyright IBM Corp. 2011
6  * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com>
7  */
8 
9 #include <asm/sigp.h>
10 
11 #define DATAMOVER_ADDR	0x4000
12 #define COPY_PAGE_ADDR	0x6000
13 
14 #ifdef CONFIG_CRASH_DUMP
15 
16 #
17 # kdump entry (new kernel - not yet relocated)
18 #
19 # Note: This code has to be position independent
20 #
21 
22 .align 2
23 .Lep_startup_kdump:
24 	lhi	%r1,2				# mode 2 = esame (dump)
25 	sigp	%r1,%r0,SIGP_SET_ARCHITECTURE	# Switch to esame mode
26 	sam64					# Switch to 64 bit addressing
27 	basr	%r13,0
28 .Lbase:
29 	larl	%r2,.Lbase_addr			# Check, if we have been
30 	lg	%r2,0(%r2)			# already relocated:
31 	clgr	%r2,%r13			#
32 	jne	.Lrelocate			# No : Start data mover
33 	lghi	%r2,0				# Yes: Start kdump kernel
34 	brasl	%r14,startup_kdump_relocated
35 
36 .Lrelocate:
37 	larl	%r4,startup
38 	lg	%r2,0x418(%r4)			# Get kdump base
39 	lg	%r3,0x420(%r4)			# Get kdump size
40 
41 	larl	%r10,.Lcopy_start		# Source of data mover
42 	lghi	%r8,DATAMOVER_ADDR		# Target of data mover
43 	mvc	0(256,%r8),0(%r10)		# Copy data mover code
44 
45 	agr	%r8,%r2				# Copy data mover to
46 	mvc	0(256,%r8),0(%r10)		# reserved mem
47 
48 	lghi	%r14,DATAMOVER_ADDR		# Jump to copied data mover
49 	basr	%r14,%r14
50 .Lbase_addr:
51 	.quad	.Lbase
52 
53 #
54 # kdump data mover code (runs at address DATAMOVER_ADDR)
55 #
56 # r2: kdump base address
57 # r3: kdump size
58 #
59 .Lcopy_start:
60 	basr	%r13,0				# Base
61 0:
62 	lgr	%r11,%r2			# Save kdump base address
63 	lgr	%r12,%r2
64 	agr	%r12,%r3			# Compute kdump end address
65 
66 	lghi	%r5,0
67 	lghi	%r10,COPY_PAGE_ADDR		# Load copy page address
68 1:
69 	mvc	0(256,%r10),0(%r5)		# Copy old kernel to tmp
70 	mvc	0(256,%r5),0(%r11)		# Copy new kernel to old
71 	mvc	0(256,%r11),0(%r10)		# Copy tmp to new
72 	aghi	%r11,256
73 	aghi	%r5,256
74 	clgr	%r11,%r12
75 	jl	1b
76 
77 	lg	%r14,.Lstartup_kdump-0b(%r13)
78 	basr	%r14,%r14			# Start relocated kernel
79 .Lstartup_kdump:
80 	.long	0x00000000,0x00000000 + startup_kdump_relocated
81 .Lcopy_end:
82 
83 #
84 # Startup of kdump (relocated new kernel)
85 #
86 .align 2
87 startup_kdump_relocated:
88 	basr	%r13,0
89 0:	lpswe	.Lrestart_psw-0b(%r13)		# Start new kernel...
90 .align	8
91 .Lrestart_psw:
92 	.quad	0x0000000080000000,0x0000000000000000 + startup
93 #else
94 .align 2
95 .Lep_startup_kdump:
96 	larl	%r13,startup_kdump_crash
97 	lpswe	0(%r13)
98 .align 8
99 startup_kdump_crash:
100 	.quad	0x0002000080000000,0x0000000000000000 + startup_kdump_crash
101 #endif /* CONFIG_CRASH_DUMP */
102