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