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