root/arch/s390/boot/head_kdump.S

/* [<][>][^][v][top][bottom][index][help] */
   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 */

/* [<][>][^][v][top][bottom][index][help] */