multiboot.pp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. {$IFNDEF FPC_DOTTEDUNITS}
  2. unit multiboot;
  3. {$ENDIF FPC_DOTTEDUNITS}
  4. interface
  5. type
  6. PMBModule = ^TMBModule;
  7. TMBModule = packed record
  8. mod_start,
  9. mod_end: PtrUInt;
  10. name: PAnsiChar;
  11. reserved: DWord;
  12. end;
  13. PMemoryMap = ^TMemoryMap;
  14. TMemoryMap = packed record
  15. size,
  16. base_lower,
  17. base_upper,
  18. length_lower,
  19. length_upper,
  20. mtype: DWord;
  21. end;
  22. PElfSectionHeaderTable = ^TElfSectionHeaderTable;
  23. TElfSectionHeaderTable = packed record
  24. num,
  25. size,
  26. addr,
  27. shndx: DWord;
  28. end;
  29. PMultibootinfo = ^TMultibootinfo;
  30. TMultiBootInfo = packed record
  31. Flags,
  32. MemLower, MemUpper,
  33. BootDevice,
  34. CmdLine,
  35. ModuleCount: DWord;
  36. ModuleAddress: PMBModule;
  37. ElfSection: TElfSectionHeaderTable;
  38. MMapLength: longint;
  39. MMapAddress: PMemoryMap;
  40. end;
  41. var MultibootTable: PMultibootinfo;
  42. implementation
  43. {$asmmode att}
  44. procedure MultibootHeader; nostackframe; assembler;
  45. const
  46. MULTIBOOT_PAGE_ALIGN = 1; // Align modules on a 4kB boundary
  47. MULTIBOOT_MEMORY_INFO = 2; // Memory info table is valid
  48. MULTIBOOT_AOUT_KLUDGE = 1 shl 16; // A.OUT kludge follows the header
  49. MultibootSig = $1BADB002;
  50. MultibootFlags = MULTIBOOT_MEMORY_INFO;
  51. MultibootChksum = -(MultibootSig + MultibootFlags);
  52. asm
  53. .init
  54. .long MultibootSig
  55. .long MultibootFlags
  56. .long MultibootChksum
  57. .text
  58. end;
  59. procedure haltproc; assembler; nostackframe; public name '_haltproc';
  60. asm
  61. .Lloop:
  62. jmp .Lloop
  63. end;
  64. procedure PASCALMAIN; external name 'PASCALMAIN';
  65. procedure Start; assembler; nostackframe; public name '_START';
  66. asm
  67. cli
  68. movl %ebx, MultibootTable
  69. jmp PASCALMAIN
  70. end;
  71. end.