;********************************************************************* ;* * ;* UEFI library for fasm by bzt, Public Domain * ;* * ;********************************************************************* ; EFI_MEMORY_TYPE EFI_RESERVED_MEMORY_TYPE = 0 EFI_LOADER_CODE = 1 EFI_LOADER_DATA = 2 EFI_BOOT_SERVICES_CODE = 3 EFI_BOOT_SERVICES_DATA = 4 EFI_RUNTIME_SERVICES_CODE = 5 EFI_RUNTIME_SERVICES_DATA = 6 EFI_CONVENTIONAL_MEMORY = 7 EFI_UNUSABLE_MEMORY = 8 EFI_ACPI_RECLAIM_MEMORY = 9 EFI_ACPI_MEMORY_NVS = 10 EFI_MEMORY_MAPPED_IO = 11 EFI_MEMORY_MAPPED_IO_PORT_SPACE = 12 EFI_PAL_CODE = 13 EFI_PERSISTENT_MEMORY = 14 EFI_MAX_MEMORY_TYPE = 15 ; EFI_ALLOCATE_TYPE EFI_ALLOCATE_ANY_PAGES = 0 EFI_ALLOCATE_MAX_ADDRESS = 1 EFI_ALLOCATE_ADDRESS = 2 EFI_MEMORY_UC = 0x0000000000000001 EFI_MEMORY_WC = 0x0000000000000002 EFI_MEMORY_WT = 0x0000000000000004 EFI_MEMORY_WB = 0x0000000000000008 EFI_MEMORY_UCE = 0x0000000000000010 EFI_MEMORY_WP = 0x0000000000001000 EFI_MEMORY_RP = 0x0000000000002000 EFI_MEMORY_XP = 0x0000000000004000 EFI_MEMORY_NV = 0x0000000000008000 EFI_MEMORY_MORE_RELIABLE = 0x0000000000010000 EFI_MEMORY_RO = 0x0000000000020000 EFI_MEMORY_RUNTIME = 0x8000000000000000 EFIERR = 0x8000000000000000 EFI_SUCCESS = 0 EFI_LOAD_ERROR = EFIERR or 1 EFI_INVALID_PARAMETER = EFIERR or 2 EFI_UNSUPPORTED = EFIERR or 3 EFI_BAD_BUFFER_SIZE = EFIERR or 4 EFI_BUFFER_TOO_SMALL = EFIERR or 5 EFI_NOT_READY = EFIERR or 6 EFI_DEVICE_ERROR = EFIERR or 7 EFI_WRITE_PROTECTED = EFIERR or 8 EFI_OUT_OF_RESOURCES = EFIERR or 9 EFI_VOLUME_CORRUPTED = EFIERR or 10 EFI_VOLUME_FULL = EFIERR or 11 EFI_NO_MEDIA = EFIERR or 12 EFI_MEDIA_CHANGED = EFIERR or 13 EFI_NOT_FOUND = EFIERR or 14 EFI_ACCESS_DENIED = EFIERR or 15 EFI_NO_RESPONSE = EFIERR or 16 EFI_NO_MAPPING = EFIERR or 17 EFI_TIMEOUT = EFIERR or 18 EFI_NOT_STARTED = EFIERR or 19 EFI_ALREADY_STARTED = EFIERR or 20 EFI_ABORTED = EFIERR or 21 EFI_ICMP_ERROR = EFIERR or 22 EFI_TFTP_ERROR = EFIERR or 23 EFI_PROTOCOL_ERROR = EFIERR or 24 struct EFI_FILE_SYSTEM_INFO Size dq ? ReadOnly db ? rb 7 VolumeSize dq ? FreeSpace dq ? BlockSize dd ? VolumeLabel rw 32 ends EFI_FILE_SYSTEM_INFO_ID equ 0x93,0x6e,0x57,0x09,0x3f,0x6d,0xd2,0x11, \ 0x39,0x8e,0x00,0xa0,0xc9,0x69,0x72,0x3b EFI_SYSTEM_TABLE_SIGNATURE equ 0x49,0x42,0x49,0x20,0x53,0x59,0x53,0x54 struct EFI_TABLE_HEADER Signature dq ? Revision dd ? HeaderSize dd ? CRC32 dd ? Reserved dd ? ends struct EFI_SYSTEM_TABLE Hdr EFI_TABLE_HEADER FirmwareVendor dq ? FirmwareRevision dd ? dd ? ConsoleInHandle dq ? ConIn dq ? ConsoleOutHandle dq ? ConOut dq ? StandardErrorHandle dq ? StdErr dq ? RuntimeServices dq ? BootServices dq ? NumberOfTableEntries dq ? ConfigurationTable dq ? ends struct SIMPLE_TEXT_OUTPUT_INTERFACE Reset dq ? OutputString dq ? TestString dq ? QueryMode dq ? SetMode dq ? SetAttribute dq ? ClearScreen dq ? SetCursorPosition dq ? EnableCursor dq ? Mode dq ? ends struct SIMPLE_INPUT_INTERFACE Reset dq ? ReadKeyStroke dq ? WaitForKey dq ? ends struct EFI_BOOT_SERVICES_TABLE Hdr EFI_TABLE_HEADER RaisePriority dq ? RestorePriority dq ? AllocatePages dq ? FreePages dq ? GetMemoryMap dq ? AllocatePool dq ? FreePool dq ? CreateEvent dq ? SetTimer dq ? WaitForEvent dq ? SignalEvent dq ? CloseEvent dq ? CheckEvent dq ? InstallProtocolInterface dq ? ReInstallProtocolInterface dq ? UnInstallProtocolInterface dq ? HandleProtocol dq ? Void dq ? RegisterProtocolNotify dq ? LocateHandle dq ? LocateDevicePath dq ? InstallConfigurationTable dq ? ImageLoad dq ? ImageStart dq ? Exit dq ? ImageUnLoad dq ? ExitBootServices dq ? GetNextMonotonicCount dq ? Stall dq ? SetWatchdogTimer dq ? ConnectController dq ? DisConnectController dq ? OpenProtocol dq ? CloseProtocol dq ? OpenProtocolInformation dq ? ProtocolsPerHandle dq ? LocateHandleBuffer dq ? LocateProtocol dq ? InstallMultipleProtocolInterfaces dq ? UnInstallMultipleProtocolInterfaces dq ? CalculateCrc32 dq ? CopyMem dq ? SetMem dq ? ends struct EFI_RUNTIME_SERVICES_TABLE Hdr EFI_TABLE_HEADER GetTime dq ? SetTime dq ? GetWakeUpTime dq ? SetWakeUpTime dq ? SetVirtualAddressMap dq ? ConvertPointer dq ? GetVariable dq ? GetNextVariableName dq ? SetVariable dq ? GetNextHighMonoCount dq ? ResetSystem dq ? ends struct EFI_TIME Year dw ? Month db ? Day db ? Hour db ? Minute db ? Second db ? Pad1 db ? Nanosecond dd ? TimeZone dw ? Daylight db ? Pad2 db ? sizeof db ? ends EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID equ 0x22,0x5b,0x4e,0x96,0x59,0x64,0xd2,0x11, \ 0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL Revision dq ? OpenVolume dq ? ends EFI_FILE_MODE_READ = 1 EFI_FILE_MODE_WRITE = 2 EFI_FILE_MODE_CREATE = 0x8000000000000000 struct EFI_FILE_PROTOCOL Revision dq ? Open dq ? Close dq ? Delete dq ? Read dq ? Write dq ? GetPosition dq ? SetPosition dq ? GetInfo dq ? SetInfo dq ? Flush dq ? OpenEx dq ? ReadEx dq ? WriteEx dq ? FlushEx dq ? ends EFI_LOADED_IMAGE_PROTOCOL_GUID equ 0xA1,0x31,0x1b,0x5b,0x62,0x95,0xd2,0x11, \ 0x8E,0x3F,0x00,0xA0,0xC9,0x69,0x72,0x3B struct EFI_LOADED_IMAGE_PROTOCOL Revision dd ? dd ? ParentHandle dq ? SystemTable dq ? DeviceHandle dq ? FilePath dq ? Reserved dq ? LoadOptionsSize dd ? dd ? ImageBase dq ? ImageSize dq ? ImageCodeType dd ? ImageDataType dd ? UnLoad dq ? ends EFI_BLOCK_IO_PROTOCOL_GUID equ 0x21,0x5b,0x4e,0x96,0x59,0x64,0xd2,0x11, \ 0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b struct EFI_BLOCK_IO_PROTOCOL Revision dq ? Media dq ? Reset dq ? ReadBlocks dq ? WriteBlocks dq ? FlushBlocks dq ? ends struct EFI_BLOCK_IO_MEDIA MediaId dd ? RemovableMedia db ? MediaPresent db ? LogicalPartition db ? ReadOnly db ? WriteCaching db ? rb 3 BlockSize dd ? IoAlign dd ? LastBlock dq ? ends EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID equ 0xde,0xa9,0x42,0x90,0xdc,0x23,0x38,0x4a, \ 0x96,0xfb,0x7a,0xde,0xd0,0x80,0x51,0x6a struct EFI_GRAPHICS_OUTPUT_PROTOCOL QueryMode dq ? SetMode dq ? Blt dq ? Mode dq ? ends struct EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE MaxMode dd ? Mode dd ? nfo dq ? SizeOfInfo dq ? FrameBufferBase dq ? FrameBufferSize dq ? ends struct EFI_GRAPHICS_OUTPUT_MODE_INFORMATION Version dd ? HorizontalResolution dd ? VerticalResolution dd ? PixelFormat dd ? RedMask dd ? GreenMask dd ? BlueMask dd ? Reserved dd ? PixelsPerScanLine dd ? ends ;---macros to make life easier--- ;call it early, after entry point is the best macro InitializeLib { clc test rdx, rdx jz .badout cmp dword[rdx], 'IBI ' ; 20494249h jz @f .badout: xor ecx, ecx xor edx, edx stc @@: mov [efi_handler], rcx ; ImageHandle mov [efi_ptr], rdx ; pointer to SystemTable } ;invoke an UEFI function macro eficall interface,function,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11 { numarg = 0 if ~ arg11 eq numarg = numarg + 1 if ~ arg11 eq rdi mov rdi, arg11 end if end if if ~ arg10 eq numarg = numarg + 1 if ~ arg10 eq rsi mov rsi, arg10 end if end if if ~ arg9 eq numarg = numarg + 1 if ~ arg9 eq r14 mov r14, arg9 end if end if if ~ arg8 eq numarg = numarg + 1 if ~ arg8 eq r13 mov r13, arg8 end if end if if ~ arg7 eq numarg = numarg + 1 if ~ arg7 eq r12 mov r12, arg7 end if end if if ~ arg6 eq numarg = numarg + 1 if ~ arg6 eq r11 mov r11, arg6 end if end if if ~ arg5 eq numarg = numarg + 1 if ~ arg5 eq r10 mov r10, arg5 end if end if if ~ arg4 eq numarg = numarg + 1 if ~ arg4 eq r9 mov r9, arg4 end if end if if ~ arg3 eq numarg = numarg + 1 if ~ arg3 eq r8 mov r8, arg3 end if end if if ~ arg2 eq numarg = numarg + 1 if ~ arg2 eq rdx mov rdx, arg2 end if end if if ~ arg1 eq numarg = numarg + 1 if ~ arg1 eq rcx if ~ arg1 in mov rcx, arg1 end if end if end if xor rax, rax mov al, numarg if interface in mov rbx, [efi_ptr] mov rbx, [rbx + EFI_SYSTEM_TABLE.#interface] else if ~ interface eq rbx mov rbx, interface end if end if if arg1 in mov rcx, rbx end if if defined SIMPLE_INPUT_INTERFACE.#function mov rbx, [rbx + SIMPLE_INPUT_INTERFACE.#function] else if defined SIMPLE_TEXT_OUTPUT_INTERFACE.#function mov rbx, [rbx + SIMPLE_TEXT_OUTPUT_INTERFACE.#function] else if defined EFI_BOOT_SERVICES_TABLE.#function mov rbx, [rbx + EFI_BOOT_SERVICES_TABLE.#function] else if defined EFI_RUNTIME_SERVICES_TABLE.#function mov rbx, [rbx + EFI_RUNTIME_SERVICES_TABLE.#function] else if defined EFI_GRAPHICS_OUTPUT_PROTOCOL.#function mov rbx, [rbx + EFI_GRAPHICS_OUTPUT_PROTOCOL.#function] else if defined EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.#function mov rbx, [rbx + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.#function] else mov rbx, [rbx + function] end if end if end if end if end if end if call uefifunc } ;********************************************************************* ;* Library functions * ;********************************************************************* section '.text' code executable readable uefifunc: ;save stack pointer mov qword [uefi_rsptmp], rsp ;set up new aligned stack and esp, 0xFFFFFFF0 ;alignment check on arguments bt eax, 0 jnc @f push rax ;arguments @@: cmp al, 11 jb @f push rdi @@: cmp al, 10 jb @f push rsi @@: cmp al, 9 jb @f push r14 @@: cmp al, 8 jb @f push r13 @@: cmp al, 7 jb @f push r12 @@: cmp al, 6 jb @f push r11 @@: cmp al, 5 jb @f push r10 @@: ;space for ;r9 ;r8 ;rdx ;rcx sub rsp, 4*8 ;call function call rbx ;restore old stack mov rsp, qword [uefi_rsptmp] ret section '.data' data readable writeable efi_handler dq 0 efi_ptr dq 0 uefi_rsptmp dq 0