fw_reloc_payload.S 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2021
  5. * Authors: Tekkaman Ninja <tekkamanninja@163.com>
  6. *
  7. * t0 --> payload text base addr
  8. * t1 --> payload end addr in fw_payload.bin
  9. * t2 --> payload start addr in fw_payload.bin
  10. * t3 --> payload text end addr (ti - t2 + t0)
  11. * t4 --> _relocate_payload_done
  12. * t2 t1 t0 t3
  13. * +-----------+-----------+----------+-------------+-------+
  14. * | fw_base + fw_payload| -------> |*fw_payload* | |
  15. * +-----------+-----------+----------+-------------+-------+
  16. *
  17. */
  18. _relocate_payload:
  19. li t0, (FW_TEXT_START + FW_PAYLOAD_OFFSET)
  20. lla t1, _pl_end
  21. REG_L t1, 0(t1)
  22. lla t2, _pl_start
  23. REG_L t2, 0(t2)
  24. sub t3, t1, t2
  25. add t3, t3, t0
  26. beq t0, t2, _relocate_payload_done
  27. lla t4, _relocate_payload_done
  28. lla t5, _load_start
  29. REG_L t5, 0(t5)
  30. sub t4, t4, t5
  31. lla t5, _link_start
  32. REG_L t5, 0(t5)
  33. add t4, t4, t5
  34. blt t2, t0, _relocate_payload_copy_to_upper_loop
  35. _relocate_payload_copy_to_lower_loop:
  36. REG_L t3, 0(t2)
  37. REG_S t3, 0(t0)
  38. add t0, t0, __SIZEOF_POINTER__
  39. add t2, t2, __SIZEOF_POINTER__
  40. blt t2, t1, _relocate_payload_copy_to_lower_loop
  41. jr t4
  42. _relocate_payload_copy_to_upper_loop:
  43. add t3, t3, -__SIZEOF_POINTER__
  44. add t1, t1, -__SIZEOF_POINTER__
  45. REG_L t0, 0(t1)
  46. REG_S t0, 0(t3)
  47. blt t2, t1, _relocate_payload_copy_to_upper_loop
  48. jr t4
  49. .align 3
  50. _pl_end:
  51. RISCV_PTR _payload_end
  52. _pl_start:
  53. RISCV_PTR _payload_start