relocate_kernel.S 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. #define PAGE_SIZE 4096 /* must be same value as in <asm/page.h> */
  12. .globl relocate_new_kernel
  13. relocate_new_kernel:
  14. /* r4 = indirection_page */
  15. /* r5 = reboot_code_buffer */
  16. /* r6 = start_address */
  17. /* r7 = vbr_reg */
  18. mov.l 10f,r8 /* 4096 */
  19. mov.l 11f,r9 /* 0xa0000000 */
  20. /* stack setting */
  21. add r8,r5
  22. mov r5,r15
  23. bra 1f
  24. mov r4,r0 /* cmd = indirection_page */
  25. 0:
  26. mov.l @r4+,r0 /* cmd = *ind++ */
  27. 1: /* addr = (cmd | 0xa0000000) & 0xfffffff0 */
  28. mov r0,r2
  29. or r9,r2
  30. mov #-16,r1
  31. and r1,r2
  32. /* if(cmd & IND_DESTINATION) dst = addr */
  33. tst #1,r0
  34. bt 2f
  35. bra 0b
  36. mov r2,r5
  37. 2: /* else if(cmd & IND_INDIRECTION) ind = addr */
  38. tst #2,r0
  39. bt 3f
  40. bra 0b
  41. mov r2,r4
  42. 3: /* else if(cmd & IND_DONE) goto 6 */
  43. tst #4,r0
  44. bt 4f
  45. bra 6f
  46. nop
  47. 4: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */
  48. tst #8,r0
  49. bt 0b
  50. mov r8,r3
  51. shlr2 r3
  52. shlr2 r3
  53. 5:
  54. dt r3
  55. mov.l @r2+,r1 /* 16n+0 */
  56. mov.l r1,@r5
  57. add #4,r5
  58. mov.l @r2+,r1 /* 16n+4 */
  59. mov.l r1,@r5
  60. add #4,r5
  61. mov.l @r2+,r1 /* 16n+8 */
  62. mov.l r1,@r5
  63. add #4,r5
  64. mov.l @r2+,r1 /* 16n+12 */
  65. mov.l r1,@r5
  66. add #4,r5
  67. bf 5b
  68. bra 0b
  69. nop
  70. 6:
  71. #ifdef CONFIG_SH_STANDARD_BIOS
  72. ldc r7, vbr
  73. #endif
  74. jmp @r6
  75. nop
  76. .align 2
  77. 10:
  78. .long PAGE_SIZE
  79. 11:
  80. .long 0xa0000000
  81. relocate_new_kernel_end:
  82. .globl relocate_new_kernel_size
  83. relocate_new_kernel_size:
  84. .long relocate_new_kernel_end - relocate_new_kernel