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