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