xref: /openbmc/linux/arch/s390/boot/head_kdump.S (revision 8282cd64)
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
228282cd64SVasily Gorbik.align 2
238282cd64SVasily Gorbik.Lep_startup_kdump:
248282cd64SVasily Gorbik	lhi	%r1,2				# mode 2 = esame (dump)
258282cd64SVasily Gorbik	sigp	%r1,%r0,SIGP_SET_ARCHITECTURE	# Switch to esame mode
268282cd64SVasily Gorbik	sam64					# Switch to 64 bit addressing
278282cd64SVasily Gorbik	basr	%r13,0
288282cd64SVasily Gorbik.Lbase:
298282cd64SVasily Gorbik	larl	%r2,.Lbase_addr			# Check, if we have been
308282cd64SVasily Gorbik	lg	%r2,0(%r2)			# already relocated:
318282cd64SVasily Gorbik	clgr	%r2,%r13			#
328282cd64SVasily Gorbik	jne	.Lrelocate			# No : Start data mover
338282cd64SVasily Gorbik	lghi	%r2,0				# Yes: Start kdump kernel
348282cd64SVasily Gorbik	brasl	%r14,startup_kdump_relocated
358282cd64SVasily Gorbik
368282cd64SVasily Gorbik.Lrelocate:
378282cd64SVasily Gorbik	larl	%r4,startup
388282cd64SVasily Gorbik	lg	%r2,0x418(%r4)			# Get kdump base
398282cd64SVasily Gorbik	lg	%r3,0x420(%r4)			# Get kdump size
408282cd64SVasily Gorbik
418282cd64SVasily Gorbik	larl	%r10,.Lcopy_start		# Source of data mover
428282cd64SVasily Gorbik	lghi	%r8,DATAMOVER_ADDR		# Target of data mover
438282cd64SVasily Gorbik	mvc	0(256,%r8),0(%r10)		# Copy data mover code
448282cd64SVasily Gorbik
458282cd64SVasily Gorbik	agr	%r8,%r2				# Copy data mover to
468282cd64SVasily Gorbik	mvc	0(256,%r8),0(%r10)		# reserved mem
478282cd64SVasily Gorbik
488282cd64SVasily Gorbik	lghi	%r14,DATAMOVER_ADDR		# Jump to copied data mover
498282cd64SVasily Gorbik	basr	%r14,%r14
508282cd64SVasily Gorbik.Lbase_addr:
518282cd64SVasily Gorbik	.quad	.Lbase
528282cd64SVasily Gorbik
538282cd64SVasily Gorbik#
548282cd64SVasily Gorbik# kdump data mover code (runs at address DATAMOVER_ADDR)
558282cd64SVasily Gorbik#
568282cd64SVasily Gorbik# r2: kdump base address
578282cd64SVasily Gorbik# r3: kdump size
588282cd64SVasily Gorbik#
598282cd64SVasily Gorbik.Lcopy_start:
608282cd64SVasily Gorbik	basr	%r13,0				# Base
618282cd64SVasily Gorbik0:
628282cd64SVasily Gorbik	lgr	%r11,%r2			# Save kdump base address
638282cd64SVasily Gorbik	lgr	%r12,%r2
648282cd64SVasily Gorbik	agr	%r12,%r3			# Compute kdump end address
658282cd64SVasily Gorbik
668282cd64SVasily Gorbik	lghi	%r5,0
678282cd64SVasily Gorbik	lghi	%r10,COPY_PAGE_ADDR		# Load copy page address
688282cd64SVasily Gorbik1:
698282cd64SVasily Gorbik	mvc	0(256,%r10),0(%r5)		# Copy old kernel to tmp
708282cd64SVasily Gorbik	mvc	0(256,%r5),0(%r11)		# Copy new kernel to old
718282cd64SVasily Gorbik	mvc	0(256,%r11),0(%r10)		# Copy tmp to new
728282cd64SVasily Gorbik	aghi	%r11,256
738282cd64SVasily Gorbik	aghi	%r5,256
748282cd64SVasily Gorbik	clgr	%r11,%r12
758282cd64SVasily Gorbik	jl	1b
768282cd64SVasily Gorbik
778282cd64SVasily Gorbik	lg	%r14,.Lstartup_kdump-0b(%r13)
788282cd64SVasily Gorbik	basr	%r14,%r14			# Start relocated kernel
798282cd64SVasily Gorbik.Lstartup_kdump:
808282cd64SVasily Gorbik	.long	0x00000000,0x00000000 + startup_kdump_relocated
818282cd64SVasily Gorbik.Lcopy_end:
828282cd64SVasily Gorbik
838282cd64SVasily Gorbik#
848282cd64SVasily Gorbik# Startup of kdump (relocated new kernel)
858282cd64SVasily Gorbik#
868282cd64SVasily Gorbik.align 2
878282cd64SVasily Gorbikstartup_kdump_relocated:
888282cd64SVasily Gorbik	basr	%r13,0
898282cd64SVasily Gorbik0:	lpswe	.Lrestart_psw-0b(%r13)		# Start new kernel...
908282cd64SVasily Gorbik.align	8
918282cd64SVasily Gorbik.Lrestart_psw:
928282cd64SVasily Gorbik	.quad	0x0000000080000000,0x0000000000000000 + startup
938282cd64SVasily Gorbik#else
948282cd64SVasily Gorbik.align 2
958282cd64SVasily Gorbik.Lep_startup_kdump:
968282cd64SVasily Gorbik	larl	%r13,startup_kdump_crash
978282cd64SVasily Gorbik	lpswe	0(%r13)
988282cd64SVasily Gorbik.align 8
998282cd64SVasily Gorbikstartup_kdump_crash:
1008282cd64SVasily Gorbik	.quad	0x0002000080000000,0x0000000000000000 + startup_kdump_crash
1018282cd64SVasily Gorbik#endif /* CONFIG_CRASH_DUMP */
102