xref: /openbmc/linux/arch/s390/boot/head_kdump.S (revision 27d45655)
18282cd64SVasily Gorbik/* SPDX-License-Identifier: GPL-2.0 */
28282cd64SVasily Gorbik/*
38282cd64SVasily Gorbik * S390 kdump lowlevel functions (new kernel)
48282cd64SVasily Gorbik *
58282cd64SVasily Gorbik * Copyright IBM Corp. 2011
68282cd64SVasily Gorbik * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com>
78282cd64SVasily Gorbik */
88282cd64SVasily Gorbik
98282cd64SVasily Gorbik#include <asm/sigp.h>
108282cd64SVasily Gorbik
118282cd64SVasily Gorbik#define DATAMOVER_ADDR	0x4000
128282cd64SVasily Gorbik#define COPY_PAGE_ADDR	0x6000
138282cd64SVasily Gorbik
148282cd64SVasily Gorbik#ifdef CONFIG_CRASH_DUMP
158282cd64SVasily Gorbik
168282cd64SVasily Gorbik#
178282cd64SVasily Gorbik# kdump entry (new kernel - not yet relocated)
188282cd64SVasily Gorbik#
198282cd64SVasily Gorbik# Note: This code has to be position independent
208282cd64SVasily Gorbik#
218282cd64SVasily Gorbik
22ec55d1e1SVasily GorbikSYM_CODE_START_LOCAL(startup_kdump)
238282cd64SVasily Gorbik	lhi	%r1,2				# mode 2 = esame (dump)
248282cd64SVasily Gorbik	sigp	%r1,%r0,SIGP_SET_ARCHITECTURE	# Switch to esame mode
258282cd64SVasily Gorbik	sam64					# Switch to 64 bit addressing
268282cd64SVasily Gorbik	basr	%r13,0
278282cd64SVasily Gorbik.Lbase:
288282cd64SVasily Gorbik	larl	%r2,.Lbase_addr			# Check, if we have been
298282cd64SVasily Gorbik	lg	%r2,0(%r2)			# already relocated:
308282cd64SVasily Gorbik	clgr	%r2,%r13			#
318282cd64SVasily Gorbik	jne	.Lrelocate			# No : Start data mover
328282cd64SVasily Gorbik	lghi	%r2,0				# Yes: Start kdump kernel
338282cd64SVasily Gorbik	brasl	%r14,startup_kdump_relocated
348282cd64SVasily Gorbik
358282cd64SVasily Gorbik.Lrelocate:
368282cd64SVasily Gorbik	larl	%r4,startup
378282cd64SVasily Gorbik	lg	%r2,0x418(%r4)			# Get kdump base
388282cd64SVasily Gorbik	lg	%r3,0x420(%r4)			# Get kdump size
398282cd64SVasily Gorbik
408282cd64SVasily Gorbik	larl	%r10,.Lcopy_start		# Source of data mover
418282cd64SVasily Gorbik	lghi	%r8,DATAMOVER_ADDR		# Target of data mover
428282cd64SVasily Gorbik	mvc	0(256,%r8),0(%r10)		# Copy data mover code
438282cd64SVasily Gorbik
448282cd64SVasily Gorbik	agr	%r8,%r2				# Copy data mover to
458282cd64SVasily Gorbik	mvc	0(256,%r8),0(%r10)		# reserved mem
468282cd64SVasily Gorbik
478282cd64SVasily Gorbik	lghi	%r14,DATAMOVER_ADDR		# Jump to copied data mover
488282cd64SVasily Gorbik	basr	%r14,%r14
498282cd64SVasily Gorbik.Lbase_addr:
508282cd64SVasily Gorbik	.quad	.Lbase
518282cd64SVasily Gorbik
528282cd64SVasily Gorbik#
538282cd64SVasily Gorbik# kdump data mover code (runs at address DATAMOVER_ADDR)
548282cd64SVasily Gorbik#
558282cd64SVasily Gorbik# r2: kdump base address
568282cd64SVasily Gorbik# r3: kdump size
578282cd64SVasily Gorbik#
588282cd64SVasily Gorbik.Lcopy_start:
598282cd64SVasily Gorbik	basr	%r13,0				# Base
608282cd64SVasily Gorbik0:
618282cd64SVasily Gorbik	lgr	%r11,%r2			# Save kdump base address
628282cd64SVasily Gorbik	lgr	%r12,%r2
638282cd64SVasily Gorbik	agr	%r12,%r3			# Compute kdump end address
648282cd64SVasily Gorbik
658282cd64SVasily Gorbik	lghi	%r5,0
668282cd64SVasily Gorbik	lghi	%r10,COPY_PAGE_ADDR		# Load copy page address
678282cd64SVasily Gorbik1:
688282cd64SVasily Gorbik	mvc	0(256,%r10),0(%r5)		# Copy old kernel to tmp
698282cd64SVasily Gorbik	mvc	0(256,%r5),0(%r11)		# Copy new kernel to old
708282cd64SVasily Gorbik	mvc	0(256,%r11),0(%r10)		# Copy tmp to new
718282cd64SVasily Gorbik	aghi	%r11,256
728282cd64SVasily Gorbik	aghi	%r5,256
738282cd64SVasily Gorbik	clgr	%r11,%r12
748282cd64SVasily Gorbik	jl	1b
758282cd64SVasily Gorbik
768282cd64SVasily Gorbik	lg	%r14,.Lstartup_kdump-0b(%r13)
778282cd64SVasily Gorbik	basr	%r14,%r14			# Start relocated kernel
788282cd64SVasily Gorbik.Lstartup_kdump:
798282cd64SVasily Gorbik	.long	0x00000000,0x00000000 + startup_kdump_relocated
808282cd64SVasily Gorbik.Lcopy_end:
818282cd64SVasily Gorbik
828282cd64SVasily Gorbik#
838282cd64SVasily Gorbik# Startup of kdump (relocated new kernel)
848282cd64SVasily Gorbik#
85*27d45655SHeiko Carstens	.balign	2
868282cd64SVasily Gorbikstartup_kdump_relocated:
878282cd64SVasily Gorbik	basr	%r13,0
888282cd64SVasily Gorbik0:	lpswe	.Lrestart_psw-0b(%r13)		# Start new kernel...
89ec55d1e1SVasily GorbikSYM_CODE_END(startup_kdump)
90*27d45655SHeiko Carstens	.balign	8
918282cd64SVasily Gorbik.Lrestart_psw:
928282cd64SVasily Gorbik	.quad	0x0000000080000000,0x0000000000000000 + startup
938282cd64SVasily Gorbik#else
94ec55d1e1SVasily GorbikSYM_CODE_START_LOCAL(startup_kdump)
958282cd64SVasily Gorbik	larl	%r13,startup_kdump_crash
968282cd64SVasily Gorbik	lpswe	0(%r13)
97ec55d1e1SVasily GorbikSYM_CODE_END(startup_kdump)
98*27d45655SHeiko Carstens	.balign	8
998282cd64SVasily Gorbikstartup_kdump_crash:
1008282cd64SVasily Gorbik	.quad	0x0002000080000000,0x0000000000000000 + startup_kdump_crash
1018282cd64SVasily Gorbik#endif /* CONFIG_CRASH_DUMP */
102