forked from KolibriOS/kolibrios
Ivan Baravy
ab9b1ebb4a
* Now there is a config file with boot options, example included. * Config, kernel and ramdisk are loaded from the disk, not compiled in. * DEVICES.DAT file is also optionally loaded from the disk. * Also, move the loader to /kernel/trunk/bootloader/uefi4kos. git-svn-id: svn://kolibrios.org@8092 a494cfbc-eb01-0410-851d-a64ba20cac60
516 lines
14 KiB
PHP
516 lines
14 KiB
PHP
;*********************************************************************
|
|
;* *
|
|
;* 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 <ConsoleInHandle,ConIn,ConsoleOutHandle,ConOut,StandardErrorHandle,StdErr,RuntimeServices,BootServices>
|
|
mov rcx, arg1
|
|
end if
|
|
end if
|
|
end if
|
|
|
|
xor rax, rax
|
|
mov al, numarg
|
|
|
|
if interface in <ConsoleInHandle,ConIn,ConsoleOutHandle,ConOut,StandardErrorHandle,StdErr,RuntimeServices,BootServices>
|
|
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 <ConsoleInHandle,ConIn,ConsoleOutHandle,ConOut,StandardErrorHandle,StdErr,RuntimeServices,BootServices>
|
|
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
|