Subversion Repositories Kolibri OS

Rev

Rev 7130 | Rev 8150 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;*********************************************************************
  2. ;*                                                                   *
  3. ;*          UEFI library for fasm by bzt, Public Domain              *
  4. ;*                                                                   *
  5. ;*********************************************************************
  6.  
  7. ; EFI_MEMORY_TYPE
  8. EFI_RESERVED_MEMORY_TYPE        = 0
  9. EFI_LOADER_CODE                 = 1
  10. EFI_LOADER_DATA                 = 2
  11. EFI_BOOT_SERVICES_CODE          = 3
  12. EFI_BOOT_SERVICES_DATA          = 4
  13. EFI_RUNTIME_SERVICES_CODE       = 5
  14. EFI_RUNTIME_SERVICES_DATA       = 6
  15. EFI_CONVENTIONAL_MEMORY         = 7
  16. EFI_UNUSABLE_MEMORY             = 8
  17. EFI_ACPI_RECLAIM_MEMORY         = 9
  18. EFI_ACPI_MEMORY_NVS             = 10
  19. EFI_MEMORY_MAPPED_IO            = 11
  20. EFI_MEMORY_MAPPED_IO_PORT_SPACE = 12
  21. EFI_PAL_CODE                    = 13
  22. EFI_PERSISTENT_MEMORY           = 14
  23. EFI_MAX_MEMORY_TYPE             = 15
  24.  
  25. ; EFI_ALLOCATE_TYPE
  26. EFI_ALLOCATE_ANY_PAGES   = 0
  27. EFI_ALLOCATE_MAX_ADDRESS = 1
  28. EFI_ALLOCATE_ADDRESS     = 2
  29.  
  30. EFI_MEMORY_UC                   = 0x0000000000000001
  31. EFI_MEMORY_WC                   = 0x0000000000000002
  32. EFI_MEMORY_WT                   = 0x0000000000000004
  33. EFI_MEMORY_WB                   = 0x0000000000000008
  34. EFI_MEMORY_UCE                  = 0x0000000000000010
  35. EFI_MEMORY_WP                   = 0x0000000000001000
  36. EFI_MEMORY_RP                   = 0x0000000000002000
  37. EFI_MEMORY_XP                   = 0x0000000000004000
  38. EFI_MEMORY_NV                   = 0x0000000000008000
  39. EFI_MEMORY_MORE_RELIABLE        = 0x0000000000010000
  40. EFI_MEMORY_RO                   = 0x0000000000020000
  41. EFI_MEMORY_RUNTIME              = 0x8000000000000000
  42.  
  43. EFIERR                          = 0x8000000000000000
  44. EFI_SUCCESS                     = 0
  45. EFI_LOAD_ERROR                  = EFIERR or 1
  46. EFI_INVALID_PARAMETER           = EFIERR or 2
  47. EFI_UNSUPPORTED                 = EFIERR or 3
  48. EFI_BAD_BUFFER_SIZE             = EFIERR or 4
  49. EFI_BUFFER_TOO_SMALL            = EFIERR or 5
  50. EFI_NOT_READY                   = EFIERR or 6
  51. EFI_DEVICE_ERROR                = EFIERR or 7
  52. EFI_WRITE_PROTECTED             = EFIERR or 8
  53. EFI_OUT_OF_RESOURCES            = EFIERR or 9
  54. EFI_VOLUME_CORRUPTED            = EFIERR or 10
  55. EFI_VOLUME_FULL                 = EFIERR or 11
  56. EFI_NO_MEDIA                    = EFIERR or 12
  57. EFI_MEDIA_CHANGED               = EFIERR or 13
  58. EFI_NOT_FOUND                   = EFIERR or 14
  59. EFI_ACCESS_DENIED               = EFIERR or 15
  60. EFI_NO_RESPONSE                 = EFIERR or 16
  61. EFI_NO_MAPPING                  = EFIERR or 17
  62. EFI_TIMEOUT                     = EFIERR or 18
  63. EFI_NOT_STARTED                 = EFIERR or 19
  64. EFI_ALREADY_STARTED             = EFIERR or 20
  65. EFI_ABORTED                     = EFIERR or 21
  66. EFI_ICMP_ERROR                  = EFIERR or 22
  67. EFI_TFTP_ERROR                  = EFIERR or 23
  68. EFI_PROTOCOL_ERROR              = EFIERR or 24
  69.  
  70. struct EFI_FILE_SYSTEM_INFO
  71.   Size          dq ?
  72.   ReadOnly      db ?
  73.                 rb 7
  74.   VolumeSize    dq ?
  75.   FreeSpace     dq ?
  76.   BlockSize     dd ?
  77.   VolumeLabel   rw 32
  78. ends
  79.  
  80. EFI_FILE_SYSTEM_INFO_ID equ 0x93,0x6e,0x57,0x09,0x3f,0x6d,0xd2,0x11, \
  81.                             0x39,0x8e,0x00,0xa0,0xc9,0x69,0x72,0x3b
  82.  
  83. EFI_SYSTEM_TABLE_SIGNATURE      equ     0x49,0x42,0x49,0x20,0x53,0x59,0x53,0x54
  84. struct EFI_TABLE_HEADER
  85.   Signature             dq ?
  86.   Revision              dd ?
  87.   HeaderSize            dd ?
  88.   CRC32                 dd ?
  89.   Reserved              dd ?
  90. ends
  91.  
  92. struct EFI_SYSTEM_TABLE
  93.   Hdr                   EFI_TABLE_HEADER
  94.   FirmwareVendor        dq ?
  95.   FirmwareRevision      dd ?
  96.                         dd ?
  97.   ConsoleInHandle       dq ?
  98.   ConIn                 dq ?
  99.   ConsoleOutHandle      dq ?
  100.   ConOut                dq ?
  101.   StandardErrorHandle   dq ?
  102.   StdErr                dq ?
  103.   RuntimeServices       dq ?
  104.   BootServices          dq ?
  105.   NumberOfTableEntries  dq ?
  106.   ConfigurationTable    dq ?
  107. ends
  108.  
  109. struct SIMPLE_TEXT_OUTPUT_INTERFACE
  110.   Reset                 dq ?
  111.   OutputString          dq ?
  112.   TestString            dq ?
  113.   QueryMode             dq ?
  114.   SetMode               dq ?
  115.   SetAttribute          dq ?
  116.   ClearScreen           dq ?
  117.   SetCursorPosition     dq ?
  118.   EnableCursor          dq ?
  119.   Mode                  dq ?
  120. ends
  121.  
  122.  
  123. struct SIMPLE_INPUT_INTERFACE
  124.   Reset                 dq ?
  125.   ReadKeyStroke         dq ?
  126.   WaitForKey            dq ?
  127. ends
  128.  
  129. struct EFI_BOOT_SERVICES_TABLE
  130.   Hdr                   EFI_TABLE_HEADER
  131.   RaisePriority         dq ?
  132.   RestorePriority       dq ?
  133.   AllocatePages         dq ?
  134.   FreePages             dq ?
  135.   GetMemoryMap          dq ?
  136.   AllocatePool          dq ?
  137.   FreePool              dq ?
  138.   CreateEvent           dq ?
  139.   SetTimer              dq ?
  140.   WaitForEvent          dq ?
  141.   SignalEvent           dq ?
  142.   CloseEvent            dq ?
  143.   CheckEvent            dq ?
  144.   InstallProtocolInterface dq ?
  145.   ReInstallProtocolInterface dq ?
  146.   UnInstallProtocolInterface dq ?
  147.   HandleProtocol        dq ?
  148.   Void                  dq ?
  149.   RegisterProtocolNotify dq ?
  150.   LocateHandle          dq ?
  151.   LocateDevicePath      dq ?
  152.   InstallConfigurationTable dq ?
  153.   ImageLoad             dq ?
  154.   ImageStart            dq ?
  155.   Exit                  dq ?
  156.   ImageUnLoad           dq ?
  157.   ExitBootServices      dq ?
  158.   GetNextMonotonicCount dq ?
  159.   Stall                 dq ?
  160.   SetWatchdogTimer      dq ?
  161.   ConnectController     dq ?
  162.   DisConnectController  dq ?
  163.   OpenProtocol          dq ?
  164.   CloseProtocol         dq ?
  165.   OpenProtocolInformation dq ?
  166.   ProtocolsPerHandle    dq ?
  167.   LocateHandleBuffer    dq ?
  168.   LocateProtocol        dq ?
  169.   InstallMultipleProtocolInterfaces dq ?
  170.   UnInstallMultipleProtocolInterfaces dq ?
  171.   CalculateCrc32        dq ?
  172.   CopyMem               dq ?
  173.   SetMem                dq ?
  174. ends
  175.  
  176. struct EFI_RUNTIME_SERVICES_TABLE
  177.   Hdr                   EFI_TABLE_HEADER
  178.   GetTime               dq ?
  179.   SetTime               dq ?
  180.   GetWakeUpTime         dq ?
  181.   SetWakeUpTime         dq ?
  182.   SetVirtualAddressMap  dq ?
  183.   ConvertPointer        dq ?
  184.   GetVariable           dq ?
  185.   GetNextVariableName   dq ?
  186.   SetVariable           dq ?
  187.   GetNextHighMonoCount  dq ?
  188.   ResetSystem           dq ?
  189. ends
  190.  
  191. struct EFI_TIME
  192.   Year                  dw ?
  193.   Month                 db ?
  194.   Day                   db ?
  195.   Hour                  db ?
  196.   Minute                db ?
  197.   Second                db ?
  198.   Pad1                  db ?
  199.   Nanosecond            dd ?
  200.   TimeZone              dw ?
  201.   Daylight              db ?
  202.   Pad2                  db ?
  203.   sizeof                db ?
  204. ends
  205.  
  206. EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID equ 0x22,0x5b,0x4e,0x96,0x59,0x64,0xd2,0x11, \
  207.                                          0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b
  208.  
  209. struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
  210.   Revision              dq ?
  211.   OpenVolume            dq ?
  212. ends
  213.  
  214. EFI_FILE_MODE_READ   = 1
  215. EFI_FILE_MODE_WRITE  = 2
  216. EFI_FILE_MODE_CREATE = 0x8000000000000000
  217.  
  218. struct EFI_FILE_PROTOCOL
  219.   Revision              dq ?
  220.   Open                  dq ?
  221.   Close                 dq ?
  222.   Delete                dq ?
  223.   Read                  dq ?
  224.   Write                 dq ?
  225.   GetPosition           dq ?
  226.   SetPosition           dq ?
  227.   GetInfo               dq ?
  228.   SetInfo               dq ?
  229.   Flush                 dq ?
  230.   OpenEx                dq ?
  231.   ReadEx                dq ?
  232.   WriteEx               dq ?
  233.   FlushEx               dq ?
  234. ends
  235.  
  236. EFI_LOADED_IMAGE_PROTOCOL_GUID  equ     0xA1,0x31,0x1b,0x5b,0x62,0x95,0xd2,0x11, \
  237.                                         0x8E,0x3F,0x00,0xA0,0xC9,0x69,0x72,0x3B
  238. struct EFI_LOADED_IMAGE_PROTOCOL
  239.   Revision              dd ?
  240.                         dd ?
  241.   ParentHandle          dq ?
  242.   SystemTable           dq ?
  243.   DeviceHandle          dq ?
  244.   FilePath              dq ?
  245.   Reserved              dq ?
  246.   LoadOptionsSize       dd ?
  247.                         dd ?
  248.   ImageBase             dq ?
  249.   ImageSize             dq ?
  250.   ImageCodeType         dd ?
  251.   ImageDataType         dd ?
  252.   UnLoad                dq ?
  253. ends
  254.  
  255. EFI_BLOCK_IO_PROTOCOL_GUID      equ     0x21,0x5b,0x4e,0x96,0x59,0x64,0xd2,0x11, \
  256.                                         0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b
  257. struct EFI_BLOCK_IO_PROTOCOL
  258.   Revision              dq ?
  259.   Media                 dq ?
  260.   Reset                 dq ?
  261.   ReadBlocks            dq ?
  262.   WriteBlocks           dq ?
  263.   FlushBlocks           dq ?
  264. ends
  265.  
  266. struct EFI_BLOCK_IO_MEDIA
  267.   MediaId               dd ?
  268.   RemovableMedia        db ?
  269.   MediaPresent          db ?
  270.   LogicalPartition      db ?
  271.   ReadOnly              db ?
  272.   WriteCaching          db ?
  273.                         rb 3
  274.   BlockSize             dd ?
  275.   IoAlign               dd ?
  276.   LastBlock             dq ?
  277. ends
  278.  
  279. EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID equ   0xde,0xa9,0x42,0x90,0xdc,0x23,0x38,0x4a, \
  280.                                         0x96,0xfb,0x7a,0xde,0xd0,0x80,0x51,0x6a
  281. struct EFI_GRAPHICS_OUTPUT_PROTOCOL
  282.   QueryMode             dq ?
  283.   SetMode               dq ?
  284.   Blt                   dq ?
  285.   Mode                  dq ?
  286. ends
  287.  
  288. struct EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE
  289.   MaxMode               dd ?
  290.   Mode                  dd ?
  291.   nfo                   dq ?
  292.   SizeOfInfo            dq ?
  293.   FrameBufferBase       dq ?
  294.   FrameBufferSize       dq ?
  295. ends
  296.  
  297. struct EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
  298.   Version               dd ?
  299.   HorizontalResolution  dd ?
  300.   VerticalResolution    dd ?
  301.   PixelFormat           dd ?
  302.   RedMask               dd ?
  303.   GreenMask             dd ?
  304.   BlueMask              dd ?
  305.   Reserved              dd ?
  306.   PixelsPerScanLine     dd ?
  307. ends
  308.  
  309. ;---macros to make life easier---
  310. ;call it early, after entry point is the best
  311. macro InitializeLib
  312. {
  313.         clc
  314.         test    rdx, rdx
  315.         jz      .badout
  316.         cmp     dword[rdx], 'IBI '      ; 20494249h
  317.         jz      @f
  318.   .badout:
  319.         xor     ecx, ecx
  320.         xor     edx, edx
  321.         stc
  322.     @@:
  323.         mov     [efi_handler], rcx      ; ImageHandle
  324.         mov     [efi_ptr], rdx          ; pointer to SystemTable
  325. }
  326.  
  327. ;invoke an UEFI function
  328. macro eficall interface,function,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11
  329. {
  330. numarg = 0
  331.  
  332. if ~ arg11 eq
  333.   numarg = numarg + 1
  334.   if ~ arg11 eq rdi
  335.         mov     rdi, arg11
  336.   end if
  337. end if
  338.  
  339. if ~ arg10 eq
  340.   numarg = numarg + 1
  341.   if ~ arg10 eq rsi
  342.         mov     rsi, arg10
  343.   end if
  344. end if
  345.  
  346. if ~ arg9 eq
  347.   numarg = numarg + 1
  348.   if ~ arg9 eq r14
  349.         mov     r14, arg9
  350.   end if
  351. end if
  352.  
  353. if ~ arg8 eq
  354.   numarg = numarg + 1
  355.   if ~ arg8 eq r13
  356.         mov     r13, arg8
  357.   end if
  358. end if
  359.  
  360. if ~ arg7 eq
  361.   numarg = numarg + 1
  362.   if ~ arg7 eq r12
  363.         mov     r12, arg7
  364.   end if
  365. end if
  366.  
  367. if ~ arg6 eq
  368.   numarg = numarg + 1
  369.   if ~ arg6 eq r11
  370.         mov     r11, arg6
  371.   end if
  372. end if
  373.  
  374. if ~ arg5 eq
  375.   numarg = numarg + 1
  376.   if ~ arg5 eq r10
  377.         mov     r10, arg5
  378.   end if
  379. end if
  380.  
  381. if ~ arg4 eq
  382.   numarg = numarg + 1
  383.   if ~ arg4 eq r9
  384.         mov     r9, arg4
  385.   end if
  386. end if
  387.  
  388. if ~ arg3 eq
  389.   numarg = numarg + 1
  390.   if ~ arg3 eq r8
  391.         mov     r8, arg3
  392.   end if
  393. end if
  394.  
  395. if ~ arg2 eq
  396.   numarg = numarg + 1
  397.   if ~ arg2 eq rdx
  398.         mov     rdx, arg2
  399.   end if
  400. end if
  401.  
  402. if ~ arg1 eq
  403.   numarg = numarg + 1
  404.   if ~ arg1 eq rcx
  405.     if ~ arg1 in <ConsoleInHandle,ConIn,ConsoleOutHandle,ConOut,StandardErrorHandle,StdErr,RuntimeServices,BootServices>
  406.         mov     rcx, arg1
  407.     end if
  408.   end if
  409. end if
  410.  
  411.         xor     rax, rax
  412.         mov     al, numarg
  413.  
  414. if interface in <ConsoleInHandle,ConIn,ConsoleOutHandle,ConOut,StandardErrorHandle,StdErr,RuntimeServices,BootServices>
  415.         mov     rbx, [efi_ptr]
  416.         mov     rbx, [rbx + EFI_SYSTEM_TABLE.#interface]
  417. else
  418.   if ~ interface eq rbx
  419.         mov     rbx, interface
  420.   end if
  421. end if
  422.  
  423. if arg1 in <ConsoleInHandle,ConIn,ConsoleOutHandle,ConOut,StandardErrorHandle,StdErr,RuntimeServices,BootServices>
  424.         mov     rcx, rbx
  425. end if
  426.  
  427. if defined SIMPLE_INPUT_INTERFACE.#function
  428.         mov     rbx, [rbx + SIMPLE_INPUT_INTERFACE.#function]
  429. else
  430.  if defined SIMPLE_TEXT_OUTPUT_INTERFACE.#function
  431.         mov     rbx, [rbx + SIMPLE_TEXT_OUTPUT_INTERFACE.#function]
  432.  else
  433.   if defined EFI_BOOT_SERVICES_TABLE.#function
  434.         mov     rbx, [rbx + EFI_BOOT_SERVICES_TABLE.#function]
  435.   else
  436.    if defined EFI_RUNTIME_SERVICES_TABLE.#function
  437.         mov     rbx, [rbx + EFI_RUNTIME_SERVICES_TABLE.#function]
  438.    else
  439.     if defined EFI_GRAPHICS_OUTPUT_PROTOCOL.#function
  440.         mov     rbx, [rbx + EFI_GRAPHICS_OUTPUT_PROTOCOL.#function]
  441.     else
  442.      if defined EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.#function
  443.         mov     rbx, [rbx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.#function]
  444.      else
  445.         mov     rbx, [rbx + function]
  446.      end if
  447.     end if
  448.    end if
  449.   end if
  450.  end if
  451. end if
  452.         call    uefifunc
  453. }
  454.  
  455. ;*********************************************************************
  456. ;*                       Library functions                           *
  457. ;*********************************************************************
  458.  
  459. section '.text' code executable readable
  460.  
  461. uefifunc:
  462.         ;save stack pointer
  463.         mov     qword [uefi_rsptmp], rsp
  464.         ;set up new aligned stack
  465.         and     esp, 0xFFFFFFF0
  466.         ;alignment check on arguments
  467.         bt      eax, 0
  468.         jnc     @f
  469.         push    rax
  470.         ;arguments
  471. @@:
  472.         cmp     al, 11
  473.         jb      @f
  474.         push    rdi
  475. @@:
  476.         cmp     al, 10
  477.         jb      @f
  478.         push    rsi
  479. @@:
  480.         cmp     al, 9
  481.         jb      @f
  482.         push    r14
  483. @@:
  484.         cmp     al, 8
  485.         jb      @f
  486.         push    r13
  487. @@:
  488.         cmp     al, 7
  489.         jb      @f
  490.         push    r12
  491. @@:
  492.         cmp     al, 6
  493.         jb      @f
  494.         push    r11
  495. @@:
  496.         cmp     al, 5
  497.         jb      @f
  498.         push    r10
  499. @@:
  500.         ;space for
  501.         ;r9
  502.         ;r8
  503.         ;rdx
  504.         ;rcx
  505.         sub     rsp, 4*8
  506.         ;call function
  507.         call    rbx
  508.         ;restore old stack
  509.         mov     rsp, qword [uefi_rsptmp]
  510.         ret
  511.  
  512. section '.data' data readable writeable
  513. efi_handler     dq 0
  514. efi_ptr         dq 0
  515. uefi_rsptmp     dq 0
  516.