head_kdump.S 2.3 KB

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