head.S 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * linux/arch/sh/boot/romimage/head.S
  4. *
  5. * Board specific setup code, executed before zImage loader
  6. */
  7. .text
  8. #include <asm/page.h>
  9. .global romstart
  10. romstart:
  11. /* include board specific setup code */
  12. #include <mach/romimage.h>
  13. #ifdef CONFIG_ROMIMAGE_MMCIF
  14. /* load the romImage to above the empty zero page */
  15. mov.l empty_zero_page_dst, r4
  16. mov.l empty_zero_page_dst_adj, r5
  17. add r5, r4
  18. mov.l bytes_to_load, r5
  19. mov.l loader_function, r7
  20. jsr @r7
  21. mov r4, r15
  22. mov.l empty_zero_page_dst, r4
  23. mov.l empty_zero_page_dst_adj, r5
  24. add r5, r4
  25. mov.l loaded_code_offs, r5
  26. add r5, r4
  27. jmp @r4
  28. nop
  29. .balign 4
  30. empty_zero_page_dst_adj:
  31. .long PAGE_SIZE
  32. bytes_to_load:
  33. .long end_data - romstart
  34. loader_function:
  35. .long mmcif_loader
  36. loaded_code_offs:
  37. .long loaded_code - romstart
  38. loaded_code:
  39. #endif /* CONFIG_ROMIMAGE_MMCIF */
  40. /* copy the empty_zero_page contents to where vmlinux expects it */
  41. mova extra_data_pos, r0
  42. mov.l extra_data_size, r1
  43. add r1, r0
  44. mov.l empty_zero_page_dst, r1
  45. mov #(PAGE_SHIFT - 4), r4
  46. mov #1, r3
  47. shld r4, r3 /* r3 = PAGE_SIZE / 16 */
  48. 1:
  49. mov.l @r0, r4
  50. mov.l @(4, r0), r5
  51. mov.l @(8, r0), r6
  52. mov.l @(12, r0), r7
  53. add #16,r0
  54. mov.l r4, @r1
  55. mov.l r5, @(4, r1)
  56. mov.l r6, @(8, r1)
  57. mov.l r7, @(12, r1)
  58. dt r3
  59. add #16,r1
  60. bf 1b
  61. /* jump to the zImage entry point located after the zero page data */
  62. mov #PAGE_SHIFT, r4
  63. mov #1, r1
  64. shld r4, r1
  65. mova extra_data_pos, r0
  66. add r1, r0
  67. mov.l extra_data_size, r1
  68. add r1, r0
  69. jmp @r0
  70. nop
  71. .align 2
  72. empty_zero_page_dst:
  73. .long _text
  74. extra_data_pos:
  75. extra_data_size:
  76. .long zero_page_pos - extra_data_pos