xref: /openbmc/linux/arch/s390/boot/head_kdump.S (revision b8d312aa)
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
610:
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
681:
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
87startup_kdump_relocated:
88	basr	%r13,0
890:	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
99startup_kdump_crash:
100	.quad	0x0002000080000000,0x0000000000000000 + startup_kdump_crash
101#endif /* CONFIG_CRASH_DUMP */
102