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