/* SPDX-License-Identifier: GPL-2.0 */1/*2* S390 kdump lowlevel functions (new kernel)3*4* Copyright IBM Corp. 20115* Author(s): Michael Holzheu <[email protected]>6*/78#include <asm/sigp.h>910#define DATAMOVER_ADDR 0x400011#define COPY_PAGE_ADDR 0x60001213#ifdef CONFIG_CRASH_DUMP1415#16# kdump entry (new kernel - not yet relocated)17#18# Note: This code has to be position independent19#2021SYM_CODE_START_LOCAL(startup_kdump)22lhi %r1,2 # mode 2 = esame (dump)23sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode24sam64 # Switch to 64 bit addressing25basr %r13,026.Lbase:27larl %r2,.Lbase_addr # Check, if we have been28lg %r2,0(%r2) # already relocated:29clgr %r2,%r13 #30jne .Lrelocate # No : Start data mover31lghi %r2,0 # Yes: Start kdump kernel32brasl %r14,startup_kdump_relocated3334.Lrelocate:35larl %r4,startup36lg %r2,0x418(%r4) # Get kdump base37lg %r3,0x420(%r4) # Get kdump size3839larl %r10,.Lcopy_start # Source of data mover40lghi %r8,DATAMOVER_ADDR # Target of data mover41mvc 0(256,%r8),0(%r10) # Copy data mover code4243agr %r8,%r2 # Copy data mover to44mvc 0(256,%r8),0(%r10) # reserved mem4546lghi %r14,DATAMOVER_ADDR # Jump to copied data mover47basr %r14,%r1448.Lbase_addr:49.quad .Lbase5051#52# kdump data mover code (runs at address DATAMOVER_ADDR)53#54# r2: kdump base address55# r3: kdump size56#57.Lcopy_start:58basr %r13,0 # Base590:60lgr %r11,%r2 # Save kdump base address61lgr %r12,%r262agr %r12,%r3 # Compute kdump end address6364lghi %r5,065lghi %r10,COPY_PAGE_ADDR # Load copy page address661:67mvc 0(256,%r10),0(%r5) # Copy old kernel to tmp68mvc 0(256,%r5),0(%r11) # Copy new kernel to old69mvc 0(256,%r11),0(%r10) # Copy tmp to new70aghi %r11,25671aghi %r5,25672clgr %r11,%r1273jl 1b7475lg %r14,.Lstartup_kdump-0b(%r13)76basr %r14,%r14 # Start relocated kernel77.Lstartup_kdump:78.long 0x00000000,0x00000000 + startup_kdump_relocated79.Lcopy_end:8081#82# Startup of kdump (relocated new kernel)83#84.balign 285startup_kdump_relocated:86basr %r13,0870: lpswe .Lrestart_psw-0b(%r13) # Start new kernel...88SYM_CODE_END(startup_kdump)89.balign 890.Lrestart_psw:91.quad 0x0000000080000000,0x0000000000000000 + startup92#else93SYM_CODE_START_LOCAL(startup_kdump)94larl %r13,startup_kdump_crash95lpswe 0(%r13)96SYM_CODE_END(startup_kdump)97.balign 898startup_kdump_crash:99.quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash100#endif /* CONFIG_CRASH_DUMP */101102103