linux/arch/s390/kernel/head_kdump.S
<<
>>
Prefs
   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        sam31                                   # Switch to 31 bit addr mode
  89        sr      %r1,%r1                         # Erase register r1
  90        sr      %r2,%r2                         # Erase register r2
  91        sigp    %r1,%r2,0x12                    # Switch to 31 bit arch mode
  92        lpsw    0                               # Start new kernel...
  93.align  8
  94.Lrestart_psw:
  95        .long   0x00080000,0x80000000 + startup
  96#else
  97.align 2
  98.Lep_startup_kdump:
  99#ifdef CONFIG_64BIT
 100        larl    %r13,startup_kdump_crash
 101        lpswe   0(%r13)
 102.align 8
 103startup_kdump_crash:
 104        .quad   0x0002000080000000,0x0000000000000000 + startup_kdump_crash
 105#else
 106        basr    %r13,0
 1070:      lpsw    startup_kdump_crash-0b(%r13)
 108.align 8
 109startup_kdump_crash:
 110        .long   0x000a0000,0x00000000 + startup_kdump_crash
 111#endif /* CONFIG_64BIT */
 112#endif /* CONFIG_CRASH_DUMP */
 113