relocate_kernel.S 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * relocate_kernel.S - put the kernel image in place to boot
  3. * 2005.9.17 kogiidena@eggplant.ddo.jp
  4. *
  5. * LANDISK/sh4 is supported. Maybe, SH archtecture works well.
  6. *
  7. * This source code is licensed under the GNU General Public License,
  8. * Version 2. See the file COPYING for more details.
  9. */
  10. #include <linux/linkage.h>
  11. #include <asm/addrspace.h>
  12. #include <asm/page.h>
  13. .globl relocate_new_kernel
  14. relocate_new_kernel:
  15. /* r4 = indirection_page */
  16. /* r5 = reboot_code_buffer */
  17. /* r6 = start_address */
  18. /* r7 = vbr_reg */
  19. mov.l 10f,r8 /* PAGE_SIZE */
  20. mov.l 11f,r9 /* P2SEG */
  21. /* stack setting */
  22. add r8,r5
  23. mov r5,r15
  24. bra 1f
  25. mov r4,r0 /* cmd = indirection_page */
  26. 0:
  27. mov.l @r4+,r0 /* cmd = *ind++ */
  28. 1: /* addr = (cmd | P2SEG) & 0xfffffff0 */
  29. mov r0,r2
  30. or r9,r2
  31. mov #-16,r1
  32. and r1,r2
  33. /* if(cmd & IND_DESTINATION) dst = addr */
  34. tst #1,r0
  35. bt 2f
  36. bra 0b
  37. mov r2,r5
  38. 2: /* else if(cmd & IND_INDIRECTION) ind = addr */
  39. tst #2,r0
  40. bt 3f
  41. bra 0b
  42. mov r2,r4
  43. 3: /* else if(cmd & IND_DONE) goto 6 */
  44. tst #4,r0
  45. bt 4f
  46. bra 6f
  47. nop
  48. 4: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */
  49. tst #8,r0
  50. bt 0b
  51. mov r8,r3
  52. shlr2 r3
  53. shlr2 r3
  54. 5:
  55. dt r3
  56. mov.l @r2+,r1 /* 16n+0 */
  57. mov.l r1,@r5
  58. add #4,r5
  59. mov.l @r2+,r1 /* 16n+4 */
  60. mov.l r1,@r5
  61. add #4,r5
  62. mov.l @r2+,r1 /* 16n+8 */
  63. mov.l r1,@r5
  64. add #4,r5
  65. mov.l @r2+,r1 /* 16n+12 */
  66. mov.l r1,@r5
  67. add #4,r5
  68. bf 5b
  69. bra 0b
  70. nop
  71. 6:
  72. #ifdef CONFIG_SH_STANDARD_BIOS
  73. ldc r7, vbr
  74. #endif
  75. jmp @r6
  76. nop
  77. .align 2
  78. 10:
  79. .long PAGE_SIZE
  80. 11:
  81. .long P2SEG
  82. relocate_new_kernel_end:
  83. .globl relocate_new_kernel_size
  84. relocate_new_kernel_size:
  85. .long relocate_new_kernel_end - relocate_new_kernel