_kernel_format_bss.s 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. .xdef __handle_bss_AND___kernel_format_bss_AND___nostub,__ld_insert_kernel_bss_refs
  2. | This file requires cleanup code.
  3. .xdef __ref_all___complex_main
  4. | This file is optimized using the jump table in %a5.
  5. .xdef __ref_all___optimize_rom_calls
  6. .section _st100
  7. __kernel_format_bss:
  8. | Allocate space for the BSS section.
  9. move.l %d3,-(%sp)
  10. pea.l __ld_bss_size
  11. move.l (%a5,0xA2*4),%a0 /* HeapAllocPtr */
  12. jsr (%a0)
  13. pea.l __kernel_format_bss_cleanup_almost_end(%pc)
  14. move.l %a0,%d3
  15. beq __out_of_memory
  16. addq.l #4,%sp
  17. | Relocate the program.
  18. lea.l __ld_insert_kernel_bss_refs(%pc),%a0
  19. lea.l __ld_entry_point(%pc),%a1
  20. moveq.l #0,%d1
  21. __kernel_format_bss_refs_loop_1:
  22. move.w (%a0)+,%d1
  23. beq.s __kernel_format_bss_refs_done_1
  24. add.l %d3,(%a1,%d1.l)
  25. bra.s __kernel_format_bss_refs_loop_1
  26. __kernel_format_bss_refs_done_1:
  27. .section _st1060
  28. __kernel_format_bss_cleanup:
  29. | Unrelocate the program.
  30. lea.l __ld_insert_kernel_bss_refs(%pc),%a0
  31. lea.l __ld_entry_point(%pc),%a1
  32. moveq.l #0,%d1
  33. __kernel_format_bss_refs_loop_2:
  34. move.w (%a0)+,%d1
  35. beq.s __kernel_format_bss_refs_done_2
  36. sub.l %d3,(%a1,%d1.l)
  37. bra.s __kernel_format_bss_refs_loop_2
  38. __kernel_format_bss_refs_done_2:
  39. | Free the memory block.
  40. move.l %d3,(%sp)
  41. move.l (%a5,0xA3*4),%a0 /* HeapFreePtr */
  42. jsr (%a0)
  43. __kernel_format_bss_cleanup_almost_end:
  44. | Clean up the stack and registers.
  45. movem.l (%sp)+,%d2-%d3
  46. __kernel_format_bss_cleanup_end:
  47. .section _st10000, "d"
  48. __ld_insert_kernel_bss_refs:
  49. | The format for the BSS table is as follows:
  50. | For each reloc...
  51. | 2 bytes: offset into the program
  52. | 2 bytes: 0