0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <asm/sigp.h>
0010
0011 #define DATAMOVER_ADDR 0x4000
0012 #define COPY_PAGE_ADDR 0x6000
0013
0014 #ifdef CONFIG_CRASH_DUMP
0015
0016 #
0017 # kdump entry (new kernel - not yet relocated)
0018 #
0019 # Note: This code has to be position independent
0020 #
0021
0022 SYM_CODE_START_LOCAL(startup_kdump)
0023 lhi %r1,2 # mode 2 = esame (dump)
0024 sigp %r1,%r0,SIGP_SET_ARCHITECTURE # Switch to esame mode
0025 sam64 # Switch to 64 bit addressing
0026 basr %r13,0
0027 .Lbase:
0028 larl %r2,.Lbase_addr # Check, if we have been
0029 lg %r2,0(%r2) # already relocated:
0030 clgr %r2,%r13 #
0031 jne .Lrelocate # No : Start data mover
0032 lghi %r2,0 # Yes: Start kdump kernel
0033 brasl %r14,startup_kdump_relocated
0034
0035 .Lrelocate:
0036 larl %r4,startup
0037 lg %r2,0x418(%r4) # Get kdump base
0038 lg %r3,0x420(%r4) # Get kdump size
0039
0040 larl %r10,.Lcopy_start # Source of data mover
0041 lghi %r8,DATAMOVER_ADDR # Target of data mover
0042 mvc 0(256,%r8),0(%r10) # Copy data mover code
0043
0044 agr %r8,%r2 # Copy data mover to
0045 mvc 0(256,%r8),0(%r10) # reserved mem
0046
0047 lghi %r14,DATAMOVER_ADDR # Jump to copied data mover
0048 basr %r14,%r14
0049 .Lbase_addr:
0050 .quad .Lbase
0051
0052 #
0053 # kdump data mover code (runs at address DATAMOVER_ADDR)
0054 #
0055 # r2: kdump base address
0056 # r3: kdump size
0057 #
0058 .Lcopy_start:
0059 basr %r13,0 # Base
0060 0:
0061 lgr %r11,%r2 # Save kdump base address
0062 lgr %r12,%r2
0063 agr %r12,%r3 # Compute kdump end address
0064
0065 lghi %r5,0
0066 lghi %r10,COPY_PAGE_ADDR # Load copy page address
0067 1:
0068 mvc 0(256,%r10),0(%r5) # Copy old kernel to tmp
0069 mvc 0(256,%r5),0(%r11) # Copy new kernel to old
0070 mvc 0(256,%r11),0(%r10) # Copy tmp to new
0071 aghi %r11,256
0072 aghi %r5,256
0073 clgr %r11,%r12
0074 jl 1b
0075
0076 lg %r14,.Lstartup_kdump-0b(%r13)
0077 basr %r14,%r14 # Start relocated kernel
0078 .Lstartup_kdump:
0079 .long 0x00000000,0x00000000 + startup_kdump_relocated
0080 .Lcopy_end:
0081
0082 #
0083 # Startup of kdump (relocated new kernel)
0084 #
0085 .align 2
0086 startup_kdump_relocated:
0087 basr %r13,0
0088 0: lpswe .Lrestart_psw-0b(%r13) # Start new kernel...
0089 SYM_CODE_END(startup_kdump)
0090 .align 8
0091 .Lrestart_psw:
0092 .quad 0x0000000080000000,0x0000000000000000 + startup
0093 #else
0094 SYM_CODE_START_LOCAL(startup_kdump)
0095 larl %r13,startup_kdump_crash
0096 lpswe 0(%r13)
0097 SYM_CODE_END(startup_kdump)
0098 .align 8
0099 startup_kdump_crash:
0100 .quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash
0101 #endif