123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /*
- * 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
- #
- .align 2
- .Lep_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...
- .align 8
- .Lrestart_psw:
- .quad 0x0000000080000000,0x0000000000000000 + startup
- #else
- .align 2
- .Lep_startup_kdump:
- larl %r13,startup_kdump_crash
- lpswe 0(%r13)
- .align 8
- startup_kdump_crash:
- .quad 0x0002000080000000,0x0000000000000000 + startup_kdump_crash
- #endif /* CONFIG_CRASH_DUMP */
|