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