mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.4 KiB
101 lines
2.4 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
/* |
|
* S390 kdump lowlevel functions (new kernel) |
|
* |
|
* Copyright IBM Corp. 2011 |
|
* Author(s): Michael Holzheu <holzheu@linux.vnet.ibm.com> |
|
*/ |
|
|
|
#include <asm/sigp.h> |
|
|
|
#define DATAMOVER_ADDR 0x4000 |
|
#define COPY_PAGE_ADDR 0x6000 |
|
|
|
#ifdef CONFIG_CRASH_DUMP |
|
|
|
# |
|
# kdump entry (new kernel - not yet relocated) |
|
# |
|
# Note: This code has to be position independent |
|
# |
|
|
|
SYM_CODE_START_LOCAL(startup_kdump) |
|
lhi %r1,2 # mode 2 = esame (dump) |
|
sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode |
|
sam64 # Switch to 64 bit addressing |
|
basr %r13,0 |
|
.Lbase: |
|
larl %r2,.Lbase_addr # Check, if we have been |
|
lg %r2,0(%r2) # already relocated: |
|
clgr %r2,%r13 # |
|
jne .Lrelocate # No : Start data mover |
|
lghi %r2,0 # Yes: Start kdump kernel |
|
brasl %r14,startup_kdump_relocated |
|
|
|
.Lrelocate: |
|
larl %r4,startup |
|
lg %r2,0x418(%r4) # Get kdump base |
|
lg %r3,0x420(%r4) # Get kdump size |
|
|
|
larl %r10,.Lcopy_start # Source of data mover |
|
lghi %r8,DATAMOVER_ADDR # Target of data mover |
|
mvc 0(256,%r8),0(%r10) # Copy data mover code |
|
|
|
agr %r8,%r2 # Copy data mover to |
|
mvc 0(256,%r8),0(%r10) # reserved mem |
|
|
|
lghi %r14,DATAMOVER_ADDR # Jump to copied data mover |
|
basr %r14,%r14 |
|
.Lbase_addr: |
|
.quad .Lbase |
|
|
|
# |
|
# kdump data mover code (runs at address DATAMOVER_ADDR) |
|
# |
|
# r2: kdump base address |
|
# r3: kdump size |
|
# |
|
.Lcopy_start: |
|
basr %r13,0 # Base |
|
0: |
|
lgr %r11,%r2 # Save kdump base address |
|
lgr %r12,%r2 |
|
agr %r12,%r3 # Compute kdump end address |
|
|
|
lghi %r5,0 |
|
lghi %r10,COPY_PAGE_ADDR # Load copy page address |
|
1: |
|
mvc 0(256,%r10),0(%r5) # Copy old kernel to tmp |
|
mvc 0(256,%r5),0(%r11) # Copy new kernel to old |
|
mvc 0(256,%r11),0(%r10) # Copy tmp to new |
|
aghi %r11,256 |
|
aghi %r5,256 |
|
clgr %r11,%r12 |
|
jl 1b |
|
|
|
lg %r14,.Lstartup_kdump-0b(%r13) |
|
basr %r14,%r14 # Start relocated kernel |
|
.Lstartup_kdump: |
|
.long 0x00000000,0x00000000 + startup_kdump_relocated |
|
.Lcopy_end: |
|
|
|
# |
|
# Startup of kdump (relocated new kernel) |
|
# |
|
.align 2 |
|
startup_kdump_relocated: |
|
basr %r13,0 |
|
0: lpswe .Lrestart_psw-0b(%r13) # Start new kernel... |
|
SYM_CODE_END(startup_kdump) |
|
.align 8 |
|
.Lrestart_psw: |
|
.quad 0x0000000080000000,0x0000000000000000 + startup |
|
#else |
|
SYM_CODE_START_LOCAL(startup_kdump) |
|
larl %r13,startup_kdump_crash |
|
lpswe 0(%r13) |
|
SYM_CODE_END(startup_kdump) |
|
.align 8 |
|
startup_kdump_crash: |
|
.quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash |
|
#endif /* CONFIG_CRASH_DUMP */
|
|
|