system.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2017 by Olivier Coursière
  4. FPC Pascal system unit for UEFI target.
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit System;
  12. interface
  13. {$define DISABLE_NO_THREAD_MANAGER}
  14. { include system-independent routine headers }
  15. {$I systemh.inc}
  16. const
  17. LineEnding = #13#10;
  18. LFNSupport = true;
  19. DirectorySeparator = '\';
  20. DriveSeparator = ':';
  21. ExtensionSeparator = '.';
  22. PathSeparator = ';';
  23. AllowDirectorySeparators : set of char = ['\'];
  24. AllowDriveSeparators : set of char = [];
  25. var
  26. { C compatible arguments }
  27. argc: LongWord;
  28. argvw: PPWideChar;
  29. argv: PPChar;
  30. const
  31. { Default filehandles }
  32. UnusedHandle : THandle = -1;
  33. StdInputHandle : THandle = 0;
  34. StdOutputHandle : THandle = 1;
  35. StdErrorHandle : THandle = 2;
  36. { FileNameCaseSensitive and FileNameCasePreserving are defined separately below!!! }
  37. maxExitCode = High(ErrorCode);
  38. MaxPathLen = High(Word);
  39. AllFilesMask = '*';
  40. const
  41. // UEFI is not case sensitive because of defaut FAT32 file system
  42. FileNameCaseSensitive : boolean = false;
  43. FileNameCasePreserving: boolean = true;
  44. // todo: check whether this is really the case on UEFI...
  45. CtrlZMarksEOF: boolean = true; (* #26 is considered as end of file *)
  46. sLineBreak = LineEnding;
  47. DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsCRLF;
  48. { Basic EFI definitions }
  49. {$IFDEF FPC}
  50. {$PACKRECORDS C}
  51. {$ENDIF}
  52. const
  53. EFI_SYSTEM_TABLE_SIGNATURE = $5453595320494249;
  54. EFI_RUNTIME_SERVICES_SIGNATURE = $56524553544e5552;
  55. EFI_BOOT_SERVICES_SIGNATURE = $56524553544f4f42;
  56. const
  57. EFI_SUCCESS = 0;
  58. EFI_LOAD_ERROR = 1;
  59. EFI_INVALID_PARAMETER = 2;
  60. EFI_UNSUPPORTED = 3;
  61. EFI_OUT_OF_RESOURCES = 9;
  62. EFI_NOT_FOUND = 14;
  63. type
  64. EFI_HANDLE = Cardinal;
  65. EFI_EVENT = pointer;
  66. EFI_STATUS = Cardinal;
  67. type
  68. EFI_INPUT_KEY = record
  69. ScanCode : UINT16;
  70. UnicodeChar : WideChar;
  71. end;
  72. Type
  73. PCHAR16 = ^WideChar;
  74. PEFI_INPUT_KEY = ^EFI_INPUT_KEY;
  75. UINTN = Cardinal;
  76. PUINTN = ^UINTN;
  77. P_SIMPLE_TEXT_OUTPUT_INTERFACE = ^_SIMPLE_TEXT_OUTPUT_INTERFACE;
  78. P_SIMPLE_INPUT_INTERFACE = ^_SIMPLE_INPUT_INTERFACE;
  79. EFI_TEXT_RESET = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; ExtendedVerification:BOOLEAN):EFI_STATUS;cdecl;
  80. {EFIAPI } {IN } {IN }
  81. EFI_TEXT_OUTPUT_STRING = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; _String:PCHAR16):EFI_STATUS;cdecl;
  82. {EFIAPI } {IN } {IN }
  83. EFI_TEXT_TEST_STRING = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; _String:PCHAR16):EFI_STATUS;cdecl;
  84. {EFIAPI } {IN } {IN } {OUT } {OUT }
  85. EFI_TEXT_QUERY_MODE = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; ModeNumber:UINTN; Columns:PUINTN; Rows:PUINTN):EFI_STATUS;cdecl;
  86. {EFIAPI } {IN } {IN }
  87. EFI_TEXT_SET_MODE = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; ModeNumber:UINTN):EFI_STATUS;cdecl;
  88. {EFIAPI } {IN } {IN }
  89. EFI_TEXT_SET_ATTRIBUTE = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; Attribute:UINTN):EFI_STATUS;cdecl;
  90. EFI_TEXT_CLEAR_SCREEN = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE):EFI_STATUS;cdecl;
  91. {EFIAPI } {IN } {IN } {IN }
  92. EFI_TEXT_SET_CURSOR_POSITION = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; Column:UINTN; Row:UINTN):EFI_STATUS;cdecl;
  93. {EFIAPI } {IN } {IN }
  94. EFI_TEXT_ENABLE_CURSOR = function (This:P_SIMPLE_TEXT_OUTPUT_INTERFACE; Enable:BOOLEAN):EFI_STATUS;cdecl;
  95. { current settings }
  96. SIMPLE_TEXT_OUTPUT_MODE = record
  97. MaxMode : INT32;
  98. Mode : INT32;
  99. Attribute : INT32;
  100. CursorColumn : INT32;
  101. CursorRow : INT32;
  102. CursorVisible : BOOLEAN;
  103. end;
  104. { Current mode }
  105. _SIMPLE_TEXT_OUTPUT_INTERFACE = record
  106. Reset : EFI_TEXT_RESET;
  107. OutputString : EFI_TEXT_OUTPUT_STRING;
  108. TestString : EFI_TEXT_TEST_STRING;
  109. QueryMode : EFI_TEXT_QUERY_MODE;
  110. SetMode : EFI_TEXT_SET_MODE;
  111. SetAttribute : EFI_TEXT_SET_ATTRIBUTE;
  112. ClearScreen : EFI_TEXT_CLEAR_SCREEN;
  113. SetCursorPosition : EFI_TEXT_SET_CURSOR_POSITION;
  114. EnableCursor : EFI_TEXT_ENABLE_CURSOR;
  115. Mode : ^SIMPLE_TEXT_OUTPUT_MODE;
  116. end;
  117. SIMPLE_TEXT_OUTPUT_INTERFACE = _SIMPLE_TEXT_OUTPUT_INTERFACE;
  118. // P_SIMPLE_TEXT_OUTPUT_INTERFACE = ^_SIMPLE_TEXT_OUTPUT_INTERFACE;
  119. EFI_INPUT_RESET = function (This:P_SIMPLE_INPUT_INTERFACE; ExtendedVerification:BOOLEAN):EFI_STATUS;cdecl;
  120. {EFIAPI } {IN } {OUT }
  121. EFI_INPUT_READ_KEY = function (This:P_SIMPLE_INPUT_INTERFACE; Key:PEFI_INPUT_KEY):EFI_STATUS;cdecl;
  122. _SIMPLE_INPUT_INTERFACE = record
  123. Reset : EFI_INPUT_RESET;
  124. ReadKeyStroke : EFI_INPUT_READ_KEY;
  125. WaitForKey : EFI_EVENT;
  126. end;
  127. SIMPLE_INPUT_INTERFACE = _SIMPLE_INPUT_INTERFACE;
  128. // P_SIMPLE_INPUT_INTERFACE = ^_SIMPLE_INPUT_INTERFACE;
  129. type
  130. _EFI_TABLE_HEARDER = record
  131. Signature : UINT64;
  132. Revision : UINT32;
  133. HeaderSize : UINT32;
  134. CRC32 : UINT32;
  135. Reserved : UINT32;
  136. end;
  137. EFI_TABLE_HEADER = _EFI_TABLE_HEARDER;
  138. type
  139. EFI_GET_TIME = function ((* TODO *)):EFI_STATUS;cdecl;
  140. EFI_SET_TIME = function ((* TODO *)):EFI_STATUS;cdecl;
  141. EFI_GET_WAKEUP_TIME = function ((* TODO *)):EFI_STATUS;cdecl;
  142. EFI_SET_WAKEUP_TIME = function ((* TODO *)):EFI_STATUS;cdecl;
  143. EFI_SET_VIRTUAL_ADDRESS_MAP = function ((* TODO *)):EFI_STATUS;cdecl;
  144. EFI_CONVERT_POINTER = function ((* TODO *)):EFI_STATUS;cdecl;
  145. EFI_GET_VARIABLE = function ((* TODO *)):EFI_STATUS;cdecl;
  146. EFI_GET_NEXT_VARIABLE_NAME = function ((* TODO *)):EFI_STATUS;cdecl;
  147. EFI_SET_VARIABLE = function ((* TODO *)):EFI_STATUS;cdecl;
  148. EFI_GET_NEXT_HIGH_MONO_COUNT = function ((* TODO *)):EFI_STATUS;cdecl;
  149. EFI_RESET_SYSTEM = function ((* TODO *)):EFI_STATUS;cdecl;
  150. type
  151. EFI_RUNTIME_SERVICES = record
  152. Hdr : EFI_TABLE_HEADER;
  153. GetTime : EFI_GET_TIME;
  154. SetTime : EFI_SET_TIME;
  155. GetWakeupTime : EFI_GET_WAKEUP_TIME;
  156. SetWakeupTime : EFI_SET_WAKEUP_TIME;
  157. SetVirtualAddressMap : EFI_SET_VIRTUAL_ADDRESS_MAP;
  158. ConvertPointer : EFI_CONVERT_POINTER;
  159. GetVariable : EFI_GET_VARIABLE;
  160. GetNextVariableName : EFI_GET_NEXT_VARIABLE_NAME;
  161. SetVariable : EFI_SET_VARIABLE;
  162. GetNextHighMonotonicCount : EFI_GET_NEXT_HIGH_MONO_COUNT;
  163. ResetSystem : EFI_RESET_SYSTEM;
  164. end;
  165. EFI_ALLOCATE_TYPE = (AllocateAnyPages,AllocateMaxAddress,AllocateAddress,
  166. MaxAllocateType);
  167. {Preseve the attr on any range supplied. }
  168. {ConventialMemory must have WB,SR,SW when supplied. }
  169. {When allocating from ConventialMemory always make it WB,SR,SW }
  170. {When returning to ConventialMemory always make it WB,SR,SW }
  171. {When getting the memory map, or on RT for runtime types }
  172. EFI_MEMORY_TYPE = (EfiReservedMemoryType,EfiLoaderCode,EfiLoaderData,
  173. EfiBootServicesCode,EfiBootServicesData,
  174. EfiRuntimeServicesCode,EfiRuntimeServicesData,
  175. EfiConventionalMemory,EfiUnusableMemory,
  176. EfiACPIReclaimMemory,EfiACPIMemoryNVS,
  177. EfiMemoryMappedIO,EfiMemoryMappedIOPortSpace,
  178. EfiPalCode,EfiMaxMemoryType);
  179. type
  180. EFI_PHYSICAL_ADDRESS = UINT64;
  181. type
  182. EFI_RAISE_TPL = function ((* TODO *)):EFI_STATUS;cdecl;
  183. EFI_RESTORE_TPL = function ((* TODO *)):EFI_STATUS;cdecl;
  184. EFI_ALLOCATE_PAGES = function (aType : EFI_ALLOCATE_TYPE;
  185. MemoryType : EFI_MEMORY_TYPE; NoPages : UINTN;
  186. var Memory : EFI_PHYSICAL_ADDRESS(* TODO *)):EFI_STATUS;cdecl;
  187. EFI_FREE_PAGES = function ((* TODO *)):EFI_STATUS;cdecl;
  188. EFI_GET_MEMORY_MAP = function ((* TODO *)):EFI_STATUS;cdecl;
  189. EFI_ALLOCATE_POOL = function (PoolType : EFI_MEMORY_TYPE; Size : UINT32;
  190. var Buffer : Pointer):EFI_STATUS;cdecl;
  191. EFI_FREE_POOL = function ((* TODO *)):EFI_STATUS;cdecl;
  192. EFI_CREATE_EVENT = function ((* TODO *)):EFI_STATUS;cdecl;
  193. EFI_SET_TIMER = function ((* TODO *)):EFI_STATUS;cdecl;
  194. EFI_WAIT_FOR_EVENT = function ((* TODO *)):EFI_STATUS;cdecl;
  195. EFI_SIGNAL_EVENT = function ((* TODO *)):EFI_STATUS;cdecl;
  196. EFI_CLOSE_EVENT = function ((* TODO *)):EFI_STATUS;cdecl;
  197. EFI_CHECK_EVENT = function ((* TODO *)):EFI_STATUS;cdecl;
  198. EFI_INSTALL_PROTOCOL_INTERFACE = function ((* TODO *)):EFI_STATUS;cdecl;
  199. EFI_REINSTALL_PROTOCOL_INTERFACE = function ((* TODO *)):EFI_STATUS;cdecl;
  200. EFI_UNINSTALL_PROTOCOL_INTERFACE = function ((* TODO *)):EFI_STATUS;cdecl;
  201. EFI_HANDLE_PROTOCOL = function ((* TODO *)):EFI_STATUS;cdecl;
  202. EFI_REGISTER_PROTOCOL_NOTIFY = function ((* TODO *)):EFI_STATUS;cdecl;
  203. EFI_LOCATE_HANDLE = function ((* TODO *)):EFI_STATUS;cdecl;
  204. EFI_LOCATE_DEVICE_PATH = function ((* TODO *)):EFI_STATUS;cdecl;
  205. EFI_INSTALL_CONFIGURATION_TABLE = function ((* TODO *)):EFI_STATUS;cdecl;
  206. EFI_IMAGE_LOAD = function ((* TODO *)):EFI_STATUS;cdecl;
  207. EFI_IMAGE_START = function ((* TODO *)):EFI_STATUS;cdecl;
  208. EFI_EXIT = function ((* TODO *)):EFI_STATUS;cdecl;
  209. EFI_IMAGE_UNLOAD = function ((* TODO *)):EFI_STATUS;cdecl;
  210. EFI_EXIT_BOOT_SERVICES = function ((* TODO *)):EFI_STATUS;cdecl;
  211. EFI_GET_NEXT_MONOTONIC_COUNT = function ((* TODO *)):EFI_STATUS;cdecl;
  212. EFI_STALL = function (Microseconds : UINT32):EFI_STATUS;cdecl;
  213. EFI_SET_WATCHDOG_TIMER = function ((* TODO *)):EFI_STATUS;cdecl;
  214. EFI_CONNECT_CONTROLLER = function ((* TODO *)):EFI_STATUS;cdecl;
  215. EFI_DISCONNECT_CONTROLLER = function ((* TODO *)):EFI_STATUS;cdecl;
  216. EFI_OPEN_PROTOCOL = function ((* TODO *)):EFI_STATUS;cdecl;
  217. EFI_CLOSE_PROTOCOL = function ((* TODO *)):EFI_STATUS;cdecl;
  218. EFI_OPEN_PROTOCOL_INFORMATION = function ((* TODO *)):EFI_STATUS;cdecl;
  219. EFI_PROTOCOLS_PER_HANDLE = function ((* TODO *)):EFI_STATUS;cdecl;
  220. EFI_LOCATE_HANDLE_BUFFER = function ((* TODO *)):EFI_STATUS;cdecl;
  221. EFI_LOCATE_PROTOCOL = function ((* TODO *)):EFI_STATUS;cdecl;
  222. EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES = function ((* TODO *)):EFI_STATUS;cdecl;
  223. EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES = function ((* TODO *)):EFI_STATUS;cdecl;
  224. EFI_CALCULATE_CRC32 = function ((* TODO *)):EFI_STATUS;cdecl;
  225. EFI_COPY_MEM = function ((* TODO *)):EFI_STATUS;cdecl;
  226. EFI_SET_MEM = function ((* TODO *)):EFI_STATUS;cdecl;
  227. EFI_CREATE_EVENT_EX = function ((* TODO *)):EFI_STATUS;cdecl;
  228. type
  229. _EFI_BOOT_SERVICES = record
  230. Hdr : EFI_TABLE_HEADER;
  231. RaiseTPL : EFI_RAISE_TPL;
  232. RestoreTPL : EFI_RESTORE_TPL;
  233. AllocatePages : EFI_ALLOCATE_PAGES;
  234. FreePages : EFI_FREE_PAGES;
  235. GetMemoryMap : EFI_GET_MEMORY_MAP;
  236. AllocatePool : EFI_ALLOCATE_POOL;
  237. FreePool : EFI_FREE_POOL;
  238. CreateEvent : EFI_CREATE_EVENT;
  239. SetTimer : EFI_SET_TIMER;
  240. WaitForEvent : EFI_WAIT_FOR_EVENT;
  241. SignalEvent : EFI_SIGNAL_EVENT;
  242. CloseEvent : EFI_CLOSE_EVENT;
  243. CheckEvent : EFI_CHECK_EVENT;
  244. InstallProtocolInterface : EFI_INSTALL_PROTOCOL_INTERFACE;
  245. ReinstallProtocolInterface : EFI_REINSTALL_PROTOCOL_INTERFACE;
  246. UninstallProtocolInterface : EFI_UNINSTALL_PROTOCOL_INTERFACE;
  247. HandleProtocol : EFI_HANDLE_PROTOCOL;
  248. PCHandleProtocol : EFI_HANDLE_PROTOCOL;
  249. RegisterProtocolNotify : EFI_REGISTER_PROTOCOL_NOTIFY;
  250. LocateHandle : EFI_LOCATE_HANDLE;
  251. LocateDevicePath : EFI_LOCATE_DEVICE_PATH;
  252. InstallConfigurationTable : EFI_INSTALL_CONFIGURATION_TABLE;
  253. LoadImage : EFI_IMAGE_LOAD;
  254. StartImage : EFI_IMAGE_START;
  255. Exit : EFI_EXIT;
  256. UnloadImage : EFI_IMAGE_UNLOAD;
  257. ExitBootServices : EFI_EXIT_BOOT_SERVICES;
  258. GetNextMonotonicCount : EFI_GET_NEXT_MONOTONIC_COUNT;
  259. Stall : EFI_STALL;
  260. SetWatchdogTimer : EFI_SET_WATCHDOG_TIMER;
  261. ConnectController : EFI_CONNECT_CONTROLLER;
  262. DisconnectController : EFI_DISCONNECT_CONTROLLER;
  263. OpenProtocol : EFI_OPEN_PROTOCOL;
  264. CloseProtocol : EFI_CLOSE_PROTOCOL;
  265. OpenProtocolInformation : EFI_OPEN_PROTOCOL_INFORMATION;
  266. ProtocolsPerHandle : EFI_PROTOCOLS_PER_HANDLE;
  267. LocateHandleBuffer : EFI_LOCATE_HANDLE_BUFFER;
  268. LocateProtocol : EFI_LOCATE_PROTOCOL;
  269. InstallMultipleProtocolInterfaces : EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES;
  270. UninstallMultipleProtocolInterfaces : EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES;
  271. CalculateCrc32 : EFI_CALCULATE_CRC32;
  272. CopyMem : EFI_COPY_MEM;
  273. SetMem : EFI_SET_MEM;
  274. CreateEventEx : EFI_CREATE_EVENT_EX;
  275. end;
  276. EFI_BOOT_SERVICES = _EFI_BOOT_SERVICES;
  277. type
  278. _EFI_SYSTEM_TABLE = record
  279. Hdr : EFI_TABLE_HEADER;
  280. FirmwareVendor : ^WideChar;
  281. FirmwareRevision : UINT32;
  282. ConsoleInHandle : EFI_HANDLE;
  283. ConIn : ^SIMPLE_INPUT_INTERFACE;
  284. ConsoleOutHandle : EFI_HANDLE;
  285. ConOut : ^SIMPLE_TEXT_OUTPUT_INTERFACE;
  286. StandardErrorHandle : EFI_HANDLE;
  287. StdErr : ^SIMPLE_TEXT_OUTPUT_INTERFACE;
  288. RuntimeServices : ^EFI_RUNTIME_SERVICES;
  289. BootServices : ^EFI_BOOT_SERVICES;
  290. { NumberOfTableEntries : UINTN;
  291. ConfigurationTable : ^EFI_CONFIGURATION_TABLE;}
  292. end;
  293. EFI_SYSTEM_TABLE = _EFI_SYSTEM_TABLE;
  294. PEFI_SYSTEM_TABLE = ^EFI_SYSTEM_TABLE;
  295. procedure Check(systemTable : EFI_SYSTEM_TABLE; status : EFI_STATUS);
  296. procedure Check(status : EFI_STATUS);
  297. var
  298. sysTable : EFI_SYSTEM_TABLE;
  299. //PSysTable : PEFI_SYSTEM_TABLE = nil;
  300. StdOutput : ^SIMPLE_TEXT_OUTPUT_INTERFACE;
  301. type
  302. THeapPointer = ^pointer;
  303. var
  304. heapstartpointer : THeapPointer;
  305. heapstart : pointer;//external;//external name 'HEAP';
  306. myheapsize : longint; //external;//external name 'HEAPSIZE';
  307. myheaprealsize : longint;
  308. heap_handle : longint;
  309. procedure Init(systemTable : EFI_SYSTEM_TABLE);
  310. procedure PascalMain;stdcall;external name 'PASCALMAIN';
  311. implementation
  312. { include system independent routines }
  313. {$I system.inc}
  314. function paramcount : longint;
  315. begin
  316. Result := 0;
  317. end;
  318. function paramstr(l : longint) : string;
  319. begin
  320. Result := '';
  321. end;
  322. procedure randomize;
  323. begin
  324. end;
  325. procedure Check(status : EFI_STATUS);
  326. begin
  327. Check(sysTable, status);
  328. end;
  329. procedure Check(systemTable : EFI_SYSTEM_TABLE; status : EFI_STATUS);
  330. var
  331. msg : string;
  332. begin
  333. msg := 'Error';
  334. case status of
  335. EFI_SUCCESS:
  336. begin
  337. // Success
  338. msg := 'Success';
  339. end;
  340. EFI_INVALID_PARAMETER:
  341. begin
  342. // Invalid
  343. msg := 'Invalid';
  344. end;
  345. EFI_OUT_OF_RESOURCES:
  346. begin
  347. // Out of resources
  348. msg := 'Out of resources';
  349. end;
  350. 1, 3..8, 10 :
  351. begin
  352. msg := 'Error 1';
  353. end;
  354. 11..20 :
  355. begin
  356. msg := 'Error 11';
  357. end;
  358. 21..30 :
  359. begin
  360. msg := 'Error 21';
  361. end;
  362. 31..40 :
  363. begin
  364. msg := 'Error 31';
  365. end;
  366. 41..50 :
  367. begin
  368. msg := 'Error 41';
  369. end;
  370. 51..60 :
  371. begin
  372. msg := 'Error 51';
  373. end;
  374. 61..70 :
  375. begin
  376. msg := 'Error 61';
  377. end;
  378. 71..80 :
  379. begin
  380. msg := 'Error 71';
  381. end;
  382. 81..90 :
  383. begin
  384. msg := 'Error 81';
  385. end;
  386. 91..100 :
  387. begin
  388. msg := 'Error 91';
  389. end;
  390. 101..MaxInt :
  391. begin
  392. msg := 'Error 101';
  393. end;
  394. else
  395. begin
  396. // Error
  397. msg := 'Error';
  398. end;
  399. end;
  400. WriteLn('');
  401. WriteLn(msg);
  402. end;
  403. procedure Init(systemTable : EFI_SYSTEM_TABLE);
  404. begin
  405. DefaultSystemCodePage := CP_UTF16;
  406. DefaultRTLFileSystemCodePage := CP_UTF16;
  407. DefaultFileSystemCodePage := CP_UTF16;
  408. SetMultiByteConversionCodePage(CP_UTF16);
  409. SysTable := systemTable;
  410. { Setup heap }
  411. myheapsize:=4096*100;// $ 20000;
  412. myheaprealsize:=4096*100;// $ 20000;
  413. heapstart:=nil;
  414. heapstartpointer := nil;
  415. heapstartpointer := SysOSAlloc(4096*100);
  416. if heapstartpointer <> nil then
  417. begin
  418. SysTable.ConOut^.OutputString(SysTable.ConOut, 'heapStartPointer initialization' + #13#10);
  419. FillChar(heapstartpointer^, 4096*100, #0);
  420. end
  421. else
  422. begin
  423. SysTable.ConOut^.OutputString(SysTable.ConOut, 'heapStartPointer not initialized' + #13#10);
  424. end;
  425. WriteLn('Init');
  426. SysInitExceptions;
  427. initunicodestringmanager;
  428. { Setup IO }
  429. SysInitStdIO;
  430. { Reset IO Error }
  431. InOutRes:=0;
  432. SysTable.ConOut^.OutputString(SysTable.ConOut, #13#10);
  433. end;
  434. function EFI_MAIN( imageHandle: EFI_HANDLE; systemTable : PEFI_SYSTEM_TABLE): EFI_STATUS; cdecl; [public, alias: 'EFI_MAIN'];
  435. begin
  436. try
  437. SysTable := systemTable^;
  438. SysTable.ConOut^.OutputString(SysTable.ConOut, 'EFI_MAIN start' + #13#10);
  439. StackLength := CheckInitialStkLen ($1000000);
  440. StackBottom := StackTop - StackLength;
  441. { Setup heap }
  442. myheapsize:=4096*100;// $ 20000;
  443. myheaprealsize:=4096*100;// $ 20000;
  444. heapstart:=nil;
  445. heapstartpointer := nil;
  446. heapstartpointer := SysOSAlloc(4096*100);
  447. FillChar(heapstartpointer^, myheaprealsize, #0);
  448. InitHeap;
  449. DefaultSystemCodePage := CP_UTF16;
  450. DefaultRTLFileSystemCodePage := CP_UTF16;
  451. DefaultFileSystemCodePage := CP_UTF16;
  452. SetMultiByteConversionCodePage(CP_UTF16);
  453. WriteLn('start');
  454. if heapstartpointer <> nil then
  455. begin
  456. SysTable.ConOut^.OutputString(SysTable.ConOut, 'heapStartPointer initialization' + #13#10);
  457. FillChar(heapstartpointer^, 4096*100, #0);
  458. end
  459. else
  460. begin
  461. SysTable.ConOut^.OutputString(SysTable.ConOut, 'heapStartPointer not initialized' + #13#10);
  462. end;
  463. SysInitExceptions;
  464. initunicodestringmanager;
  465. { Setup IO }
  466. SysInitStdIO;
  467. { Reset IO Error }
  468. InOutRes:=0;
  469. SysTable.ConOut^.OutputString(SysTable.ConOut, #13#10);
  470. PascalMain;
  471. WriteLn('End of EFI_MAIN');
  472. except
  473. WriteLn('Exception in EFI_MAIN');
  474. end;
  475. end;
  476. {*****************************************************************************
  477. System Dependent Exit code
  478. *****************************************************************************}
  479. Procedure system_exit;
  480. begin
  481. WriteLn('system_exit');
  482. end;
  483. procedure SysInitStdIO;
  484. begin
  485. { Setup stdin, stdout and stderr, for GUI apps redirect stderr,stdout to be
  486. displayed in and messagebox }
  487. OpenStdIO(Input,fmInput,StdInputHandle);
  488. OpenStdIO(Output,fmOutput,StdOutputHandle);
  489. OpenStdIO(StdOut,fmOutput,StdOutputHandle);
  490. OpenStdIO(StdErr,fmOutput,StdErrorHandle);
  491. end;
  492. function GetProcessID: SizeUInt;
  493. begin
  494. Result := 0;
  495. end;
  496. function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;
  497. begin
  498. result := stklen;
  499. end;
  500. begin
  501. end.