1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * S390 kdump lowlevel functions (new kernel) 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright IBM Corp. 2011 6*4882a593Smuzhiyun * Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun#include <asm/sigp.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun#define DATAMOVER_ADDR 0x4000 12*4882a593Smuzhiyun#define COPY_PAGE_ADDR 0x6000 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun#ifdef CONFIG_CRASH_DUMP 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun# 17*4882a593Smuzhiyun# kdump entry (new kernel - not yet relocated) 18*4882a593Smuzhiyun# 19*4882a593Smuzhiyun# Note: This code has to be position independent 20*4882a593Smuzhiyun# 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun.align 2 23*4882a593Smuzhiyun.Lep_startup_kdump: 24*4882a593Smuzhiyun lhi %r1,2 # mode 2 = esame (dump) 25*4882a593Smuzhiyun sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode 26*4882a593Smuzhiyun sam64 # Switch to 64 bit addressing 27*4882a593Smuzhiyun basr %r13,0 28*4882a593Smuzhiyun.Lbase: 29*4882a593Smuzhiyun larl %r2,.Lbase_addr # Check, if we have been 30*4882a593Smuzhiyun lg %r2,0(%r2) # already relocated: 31*4882a593Smuzhiyun clgr %r2,%r13 # 32*4882a593Smuzhiyun jne .Lrelocate # No : Start data mover 33*4882a593Smuzhiyun lghi %r2,0 # Yes: Start kdump kernel 34*4882a593Smuzhiyun brasl %r14,startup_kdump_relocated 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun.Lrelocate: 37*4882a593Smuzhiyun larl %r4,startup 38*4882a593Smuzhiyun lg %r2,0x418(%r4) # Get kdump base 39*4882a593Smuzhiyun lg %r3,0x420(%r4) # Get kdump size 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun larl %r10,.Lcopy_start # Source of data mover 42*4882a593Smuzhiyun lghi %r8,DATAMOVER_ADDR # Target of data mover 43*4882a593Smuzhiyun mvc 0(256,%r8),0(%r10) # Copy data mover code 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun agr %r8,%r2 # Copy data mover to 46*4882a593Smuzhiyun mvc 0(256,%r8),0(%r10) # reserved mem 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun lghi %r14,DATAMOVER_ADDR # Jump to copied data mover 49*4882a593Smuzhiyun basr %r14,%r14 50*4882a593Smuzhiyun.Lbase_addr: 51*4882a593Smuzhiyun .quad .Lbase 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun# 54*4882a593Smuzhiyun# kdump data mover code (runs at address DATAMOVER_ADDR) 55*4882a593Smuzhiyun# 56*4882a593Smuzhiyun# r2: kdump base address 57*4882a593Smuzhiyun# r3: kdump size 58*4882a593Smuzhiyun# 59*4882a593Smuzhiyun.Lcopy_start: 60*4882a593Smuzhiyun basr %r13,0 # Base 61*4882a593Smuzhiyun0: 62*4882a593Smuzhiyun lgr %r11,%r2 # Save kdump base address 63*4882a593Smuzhiyun lgr %r12,%r2 64*4882a593Smuzhiyun agr %r12,%r3 # Compute kdump end address 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun lghi %r5,0 67*4882a593Smuzhiyun lghi %r10,COPY_PAGE_ADDR # Load copy page address 68*4882a593Smuzhiyun1: 69*4882a593Smuzhiyun mvc 0(256,%r10),0(%r5) # Copy old kernel to tmp 70*4882a593Smuzhiyun mvc 0(256,%r5),0(%r11) # Copy new kernel to old 71*4882a593Smuzhiyun mvc 0(256,%r11),0(%r10) # Copy tmp to new 72*4882a593Smuzhiyun aghi %r11,256 73*4882a593Smuzhiyun aghi %r5,256 74*4882a593Smuzhiyun clgr %r11,%r12 75*4882a593Smuzhiyun jl 1b 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun lg %r14,.Lstartup_kdump-0b(%r13) 78*4882a593Smuzhiyun basr %r14,%r14 # Start relocated kernel 79*4882a593Smuzhiyun.Lstartup_kdump: 80*4882a593Smuzhiyun .long 0x00000000,0x00000000 + startup_kdump_relocated 81*4882a593Smuzhiyun.Lcopy_end: 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun# 84*4882a593Smuzhiyun# Startup of kdump (relocated new kernel) 85*4882a593Smuzhiyun# 86*4882a593Smuzhiyun.align 2 87*4882a593Smuzhiyunstartup_kdump_relocated: 88*4882a593Smuzhiyun basr %r13,0 89*4882a593Smuzhiyun0: lpswe .Lrestart_psw-0b(%r13) # Start new kernel... 90*4882a593Smuzhiyun.align 8 91*4882a593Smuzhiyun.Lrestart_psw: 92*4882a593Smuzhiyun .quad 0x0000000080000000,0x0000000000000000 + startup 93*4882a593Smuzhiyun#else 94*4882a593Smuzhiyun.align 2 95*4882a593Smuzhiyun.Lep_startup_kdump: 96*4882a593Smuzhiyun larl %r13,startup_kdump_crash 97*4882a593Smuzhiyun lpswe 0(%r13) 98*4882a593Smuzhiyun.align 8 99*4882a593Smuzhiyunstartup_kdump_crash: 100*4882a593Smuzhiyun .quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash 101*4882a593Smuzhiyun#endif /* CONFIG_CRASH_DUMP */ 102