18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * S390 kdump lowlevel functions (new kernel)
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2011
68c2ecf20Sopenharmony_ci * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <asm/sigp.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define DATAMOVER_ADDR	0x4000
128c2ecf20Sopenharmony_ci#define COPY_PAGE_ADDR	0x6000
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#ifdef CONFIG_CRASH_DUMP
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#
178c2ecf20Sopenharmony_ci# kdump entry (new kernel - not yet relocated)
188c2ecf20Sopenharmony_ci#
198c2ecf20Sopenharmony_ci# Note: This code has to be position independent
208c2ecf20Sopenharmony_ci#
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci.align 2
238c2ecf20Sopenharmony_ci.Lep_startup_kdump:
248c2ecf20Sopenharmony_ci	lhi	%r1,2				# mode 2 = esame (dump)
258c2ecf20Sopenharmony_ci	sigp	%r1,%r0,SIGP_SET_ARCHITECTURE	# Switch to esame mode
268c2ecf20Sopenharmony_ci	sam64					# Switch to 64 bit addressing
278c2ecf20Sopenharmony_ci	basr	%r13,0
288c2ecf20Sopenharmony_ci.Lbase:
298c2ecf20Sopenharmony_ci	larl	%r2,.Lbase_addr			# Check, if we have been
308c2ecf20Sopenharmony_ci	lg	%r2,0(%r2)			# already relocated:
318c2ecf20Sopenharmony_ci	clgr	%r2,%r13			#
328c2ecf20Sopenharmony_ci	jne	.Lrelocate			# No : Start data mover
338c2ecf20Sopenharmony_ci	lghi	%r2,0				# Yes: Start kdump kernel
348c2ecf20Sopenharmony_ci	brasl	%r14,startup_kdump_relocated
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci.Lrelocate:
378c2ecf20Sopenharmony_ci	larl	%r4,startup
388c2ecf20Sopenharmony_ci	lg	%r2,0x418(%r4)			# Get kdump base
398c2ecf20Sopenharmony_ci	lg	%r3,0x420(%r4)			# Get kdump size
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	larl	%r10,.Lcopy_start		# Source of data mover
428c2ecf20Sopenharmony_ci	lghi	%r8,DATAMOVER_ADDR		# Target of data mover
438c2ecf20Sopenharmony_ci	mvc	0(256,%r8),0(%r10)		# Copy data mover code
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	agr	%r8,%r2				# Copy data mover to
468c2ecf20Sopenharmony_ci	mvc	0(256,%r8),0(%r10)		# reserved mem
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	lghi	%r14,DATAMOVER_ADDR		# Jump to copied data mover
498c2ecf20Sopenharmony_ci	basr	%r14,%r14
508c2ecf20Sopenharmony_ci.Lbase_addr:
518c2ecf20Sopenharmony_ci	.quad	.Lbase
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci#
548c2ecf20Sopenharmony_ci# kdump data mover code (runs at address DATAMOVER_ADDR)
558c2ecf20Sopenharmony_ci#
568c2ecf20Sopenharmony_ci# r2: kdump base address
578c2ecf20Sopenharmony_ci# r3: kdump size
588c2ecf20Sopenharmony_ci#
598c2ecf20Sopenharmony_ci.Lcopy_start:
608c2ecf20Sopenharmony_ci	basr	%r13,0				# Base
618c2ecf20Sopenharmony_ci0:
628c2ecf20Sopenharmony_ci	lgr	%r11,%r2			# Save kdump base address
638c2ecf20Sopenharmony_ci	lgr	%r12,%r2
648c2ecf20Sopenharmony_ci	agr	%r12,%r3			# Compute kdump end address
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci	lghi	%r5,0
678c2ecf20Sopenharmony_ci	lghi	%r10,COPY_PAGE_ADDR		# Load copy page address
688c2ecf20Sopenharmony_ci1:
698c2ecf20Sopenharmony_ci	mvc	0(256,%r10),0(%r5)		# Copy old kernel to tmp
708c2ecf20Sopenharmony_ci	mvc	0(256,%r5),0(%r11)		# Copy new kernel to old
718c2ecf20Sopenharmony_ci	mvc	0(256,%r11),0(%r10)		# Copy tmp to new
728c2ecf20Sopenharmony_ci	aghi	%r11,256
738c2ecf20Sopenharmony_ci	aghi	%r5,256
748c2ecf20Sopenharmony_ci	clgr	%r11,%r12
758c2ecf20Sopenharmony_ci	jl	1b
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	lg	%r14,.Lstartup_kdump-0b(%r13)
788c2ecf20Sopenharmony_ci	basr	%r14,%r14			# Start relocated kernel
798c2ecf20Sopenharmony_ci.Lstartup_kdump:
808c2ecf20Sopenharmony_ci	.long	0x00000000,0x00000000 + startup_kdump_relocated
818c2ecf20Sopenharmony_ci.Lcopy_end:
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci#
848c2ecf20Sopenharmony_ci# Startup of kdump (relocated new kernel)
858c2ecf20Sopenharmony_ci#
868c2ecf20Sopenharmony_ci.align 2
878c2ecf20Sopenharmony_cistartup_kdump_relocated:
888c2ecf20Sopenharmony_ci	basr	%r13,0
898c2ecf20Sopenharmony_ci0:	lpswe	.Lrestart_psw-0b(%r13)		# Start new kernel...
908c2ecf20Sopenharmony_ci.align	8
918c2ecf20Sopenharmony_ci.Lrestart_psw:
928c2ecf20Sopenharmony_ci	.quad	0x0000000080000000,0x0000000000000000 + startup
938c2ecf20Sopenharmony_ci#else
948c2ecf20Sopenharmony_ci.align 2
958c2ecf20Sopenharmony_ci.Lep_startup_kdump:
968c2ecf20Sopenharmony_ci	larl	%r13,startup_kdump_crash
978c2ecf20Sopenharmony_ci	lpswe	0(%r13)
988c2ecf20Sopenharmony_ci.align 8
998c2ecf20Sopenharmony_cistartup_kdump_crash:
1008c2ecf20Sopenharmony_ci	.quad	0x0002000080000000,0x0000000000000000 + startup_kdump_crash
1018c2ecf20Sopenharmony_ci#endif /* CONFIG_CRASH_DUMP */
102