riscv32_start.inc 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. var
  2. _stack_top: record end; external name '_stack_top';
  3. _data: record end; external name '_data';
  4. _edata: record end; external name '_edata';
  5. _text_start: record end; external name '_text_start';
  6. _etext: record end; external name '_etext';
  7. _bss_start: record end; external name '_bss_start';
  8. _bss_end: record end; external name '_bss_end';
  9. procedure Pascalmain; external name 'PASCALMAIN';
  10. procedure _haltproc; external Name '_haltproc';
  11. procedure HaltProc; noreturn;
  12. begin
  13. while true do;
  14. end;
  15. procedure InitMemAndStart; noreturn;
  16. var
  17. pdest, psrc, pend: PLongWord;
  18. begin
  19. pdest:=@_data;
  20. psrc:=@_etext;
  21. pend:=@_bss_start;
  22. while pdest<pend do
  23. begin
  24. pdest^:=psrc^;
  25. inc(pdest);
  26. inc(psrc);
  27. end;
  28. pend:=@_bss_end;
  29. while pdest<pend do
  30. begin
  31. pdest^:=0;
  32. inc(pdest);
  33. end;
  34. PASCALMAIN;
  35. HaltProc;
  36. end;
  37. procedure LowlevelStartup; assembler; nostackframe; [public, alias: '_START'];
  38. asm
  39. .weak ResetISR
  40. .set ResetISR, InitMemAndStart;
  41. .weak _haltproc
  42. .set _haltproc, HaltProc
  43. { Initialize global Pointer }
  44. .option push
  45. .option norelax
  46. lui gp, %hi(_bss_start+0x800)
  47. addi gp, gp, %lo(_bss_start+0x800)
  48. .option pop
  49. { Initialize Stack Pointer }
  50. .L1:
  51. auipc sp, %pcrel_hi(_stack_top)
  52. addi sp, sp, %pcrel_lo(.L1)
  53. { Initialise FP to zero }
  54. addi fp, x0, 0
  55. jal x0, HandleArchSpecificReset
  56. end;