head_kdump.S 2.8 KB

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