337 lines
7.6 KiB
PHP
337 lines
7.6 KiB
PHP
;*********************************************************************
|
|
;* *
|
|
;* UEFI library for fasm by bzt, Public Domain *
|
|
;* *
|
|
;*********************************************************************
|
|
|
|
; include x86asm.net's efi.inc
|
|
;include 'efi.inc'
|
|
struc int8 {
|
|
. db ?
|
|
}
|
|
struc int16 {
|
|
align 2
|
|
. dw ?
|
|
}
|
|
struc int32 {
|
|
align 4
|
|
. dd ?
|
|
}
|
|
struc int64 {
|
|
align 8
|
|
. dq ?
|
|
}
|
|
struc intn {
|
|
align 8
|
|
. dq ?
|
|
}
|
|
struc dptr {
|
|
align 8
|
|
. dq ?
|
|
}
|
|
|
|
;symbols
|
|
|
|
; EFIERR = 0x8000000000000000
|
|
EFI_SUCCESS = 0
|
|
EFI_LOAD_ERROR = 1 ;or EFIERR
|
|
EFI_INVALID_PARAMETER = 2 ;or EFIERR
|
|
EFI_UNSUPPORTED = 3;or EFIERR
|
|
EFI_BAD_BUFFER_SIZE = 4;or EFIERR
|
|
EFI_BUFFER_TOO_SMALL = 5;or EFIERR
|
|
EFI_NOT_READY = 6;or EFIERR
|
|
EFI_DEVICE_ERROR = 7;or EFIERR
|
|
EFI_WRITE_PROTECTED = 8;or EFIERR
|
|
EFI_OUT_OF_RESOURCES = 9;or EFIERR
|
|
EFI_VOLUME_CORRUPTED = 10;or EFIERR
|
|
EFI_VOLUME_FULL = 11;or EFIERR
|
|
EFI_NO_MEDIA = 12;or EFIERR
|
|
EFI_MEDIA_CHANGED = 13;or EFIERR
|
|
EFI_NOT_FOUND = 14;or EFIERR
|
|
EFI_ACCESS_DENIED = 15;or EFIERR
|
|
EFI_NO_RESPONSE = 16;or EFIERR
|
|
EFI_NO_MAPPING = 17;or EFIERR
|
|
EFI_TIMEOUT = 18;or EFIERR
|
|
EFI_NOT_STARTED = 19;or EFIERR
|
|
EFI_ALREADY_STARTED = 20;or EFIERR
|
|
EFI_ABORTED = 21;or EFIERR
|
|
EFI_ICMP_ERROR = 22;or EFIERR
|
|
EFI_TFTP_ERROR = 23;or EFIERR
|
|
EFI_PROTOCOL_ERROR = 24;or EFIERR
|
|
|
|
; ConOut Colors :)
|
|
EFI_BLACK = 0x00
|
|
EFI_BLUE = 0x01
|
|
EFI_GREEN = 0x02
|
|
EFI_CYAN = 0x03
|
|
EFI_RED = 0x04
|
|
EFI_MAGENTA = 0x05
|
|
EFI_BROWN = 0x06
|
|
EFI_LIGHTGRAY = 0x07
|
|
EFI_BRIGHT = 0x08
|
|
EFI_DARKGRAY = 0x08
|
|
EFI_LIGHTBLUE = 0x09
|
|
EFI_LIGHTGREEN = 0x0A
|
|
EFI_LIGHTCYAN = 0x0B
|
|
EFI_LIGHTRED = 0x0C
|
|
EFI_LIGHTMAGENTA = 0x0D
|
|
EFI_YELLOW = 0x0E
|
|
EFI_WHITE = 0x0F
|
|
|
|
EFI_BACKGROUND_BLACK = 0x00
|
|
EFI_BACKGROUND_BLUE = 0x10
|
|
EFI_BACKGROUND_GREEN = 0x20
|
|
EFI_BACKGROUND_CYAN = 0x30
|
|
EFI_BACKGROUND_RED = 0x40
|
|
EFI_BACKGROUND_MAGENTA = 0x50
|
|
EFI_BACKGROUND_BROWN = 0x60
|
|
EFI_BACKGROUND_LIGHTGRAY = 0x70
|
|
|
|
;helper macro for definition of relative structure member offsets
|
|
|
|
macro struct name
|
|
{
|
|
virtual at 0
|
|
name name
|
|
end virtual
|
|
}
|
|
|
|
;structures
|
|
EFI_SYSTEM_TABLE_SIGNATURE equ 49h,42h,49h,20h,53h,59h,53h,54h
|
|
struc EFI_TABLE_HEADER {
|
|
.Signature int64
|
|
.Revision int32
|
|
.HeaderSize int32
|
|
.CRC32 int32
|
|
.Reserved int32
|
|
}
|
|
struct EFI_TABLE_HEADER
|
|
|
|
struc EFI_SYSTEM_TABLE {
|
|
.Hdr EFI_TABLE_HEADER
|
|
.FirmwareVendor dptr
|
|
.FirmwareRevision int32
|
|
.ConsoleInHandle dptr
|
|
.ConIn dptr
|
|
.ConsoleOutHandle dptr
|
|
.ConOut dptr
|
|
.StandardErrorHandle dptr
|
|
.StdErr dptr
|
|
.RuntimeServices dptr
|
|
.BootServices dptr
|
|
.NumberOfTableEntries intn
|
|
.ConfigurationTable dptr
|
|
}
|
|
struct EFI_SYSTEM_TABLE
|
|
|
|
struc SIMPLE_TEXT_OUTPUT_INTERFACE {
|
|
.Reset dptr
|
|
.OutputString dptr
|
|
.TestString dptr
|
|
.QueryMode dptr
|
|
.SetMode dptr
|
|
.SetAttribute dptr
|
|
.ClearScreen dptr
|
|
.SetCursorPosition dptr
|
|
.EnableCursor dptr
|
|
.Mode dptr
|
|
}
|
|
struct SIMPLE_TEXT_OUTPUT_INTERFACE
|
|
|
|
;---include ends
|
|
|
|
struc SIMPLE_INPUT_INTERFACE {
|
|
.Reset dptr
|
|
.ReadKeyStroke dptr
|
|
.WaitForKey dptr
|
|
}
|
|
struct SIMPLE_INPUT_INTERFACE
|
|
|
|
struc EFI_BOOT_SERVICES_TABLE {
|
|
.Hdr EFI_TABLE_HEADER
|
|
.RaisePriority dptr
|
|
.RestorePriority dptr
|
|
.AllocatePages dptr
|
|
.FreePages dptr
|
|
.GetMemoryMap dptr
|
|
.AllocatePool dptr
|
|
.FreePool dptr
|
|
.CreateEvent dptr
|
|
.SetTimer dptr
|
|
.WaitForEvent dptr
|
|
.SignalEvent dptr
|
|
.CloseEvent dptr
|
|
.CheckEvent dptr
|
|
.InstallProtocolInterface dptr
|
|
.ReInstallProtocolInterface dptr
|
|
.UnInstallProtocolInterface dptr
|
|
.HandleProtocol dptr
|
|
.Void dptr
|
|
.RegisterProtocolNotify dptr
|
|
.LocateHandle dptr
|
|
.LocateDevicePath dptr
|
|
.InstallConfigurationTable dptr
|
|
.ImageLoad dptr
|
|
.ImageStart dptr
|
|
.Exit dptr
|
|
.ImageUnLoad dptr
|
|
.ExitBootServices dptr
|
|
.GetNextMonotonicCount dptr
|
|
.Stall dptr
|
|
.SetWatchdogTimer dptr
|
|
.ConnectController dptr
|
|
.DisConnectController dptr
|
|
.OpenProtocol dptr
|
|
.CloseProtocol dptr
|
|
.OpenProtocolInformation dptr
|
|
.ProtocolsPerHandle dptr
|
|
.LocateHandleBuffer dptr
|
|
.LocateProtocol dptr
|
|
.InstallMultipleProtocolInterfaces dptr
|
|
.UnInstallMultipleProtocolInterfaces dptr
|
|
.CalculateCrc32 dptr
|
|
.CopyMem dptr
|
|
.SetMem dptr
|
|
}
|
|
struct EFI_BOOT_SERVICES_TABLE
|
|
|
|
struc EFI_RUNTIME_SERVICES_TABLE {
|
|
.Hdr EFI_TABLE_HEADER
|
|
.GetTime dptr
|
|
.SetTime dptr
|
|
.GetWakeUpTime dptr
|
|
.SetWakeUpTime dptr
|
|
.SetVirtualAddressMap dptr
|
|
.ConvertPointer dptr
|
|
.GetVariable dptr
|
|
.GetNextVariableName dptr
|
|
.SetVariable dptr
|
|
.GetNextHighMonoCount dptr
|
|
.ResetSystem dptr
|
|
}
|
|
struct EFI_RUNTIME_SERVICES_TABLE
|
|
|
|
struc EFI_TIME {
|
|
.Year int16
|
|
.Month int8
|
|
.Day int8
|
|
.Hour int8
|
|
.Minute int8
|
|
.Second int8
|
|
.Pad1 int8
|
|
.Nanosecond int32
|
|
.TimeZone int16
|
|
.Daylight int8
|
|
.Pad2 int8
|
|
.sizeof rb 1
|
|
}
|
|
struct EFI_TIME
|
|
|
|
EFI_LOADED_IMAGE_PROTOCOL_UUID equ 0A1h,31h,1bh,5bh,62h,95h,0d2h,11h,8Eh,3Fh,0h,0A0h,0C9h,69h,72h,3Bh
|
|
struc EFI_LOADED_IMAGE_PROTOCOL {
|
|
.Revision int32
|
|
.ParentHandle int64
|
|
.SystemTable dptr
|
|
.DeviceHandle int64
|
|
.FilePath dptr
|
|
.Reserved int64
|
|
.LoadOptionsSize int32
|
|
.ImageBase dptr
|
|
.ImageSize int64
|
|
.ImageCodeType int32
|
|
.ImageDataType int32
|
|
.UnLoad dptr
|
|
}
|
|
struct EFI_LOADED_IMAGE_PROTOCOL
|
|
|
|
EFI_BLOCK_IO_PROTOCOL_UUID equ 21h,5bh,4eh,96h,59h,64h,0d2h,11h,8eh,39h,00h,0a0h,0c9h,69h,72h,3bh
|
|
struc EFI_BLOCK_IO_PROTOCOL {
|
|
.Revision int64
|
|
.Media dptr
|
|
.Reset dptr
|
|
.ReadBlocks dptr
|
|
.WriteBlocks dptr
|
|
.FlushBlocks dptr
|
|
}
|
|
struct EFI_BLOCK_IO_PROTOCOL
|
|
|
|
struc EFI_BLOCK_IO_MEDIA {
|
|
.MediaId int32
|
|
.RemovableMedia int8
|
|
.MediaPresent int8
|
|
.LogicalPartition int8
|
|
.ReadOnly int8
|
|
.WriteCaching int8
|
|
.BlockSize int32
|
|
.IoAlign int32
|
|
.LastBlock int64
|
|
}
|
|
struct EFI_BLOCK_IO_MEDIA
|
|
|
|
EFI_GRAPHICS_OUTPUT_PROTOCOL_UUID equ 0deh, 0a9h, 42h,90h,0dch,023h,38h,04ah,96h,0fbh,7ah,0deh,0d0h,80h,51h,6ah
|
|
struc EFI_GRAPHICS_OUTPUT_PROTOCOL {
|
|
.QueryMode dptr
|
|
.SetMode dptr
|
|
.Blt dptr
|
|
.Mode dptr
|
|
}
|
|
struct EFI_GRAPHICS_OUTPUT_PROTOCOL
|
|
|
|
struc EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE {
|
|
.MaxMode int32
|
|
.CurrentMode int32
|
|
.ModeInfo dptr
|
|
.SizeOfModeInfo intn
|
|
.FrameBufferBase dptr
|
|
.FrameBufferSize intn
|
|
}
|
|
struct EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE
|
|
|
|
struc EFI_GRAPHICS_OUTPUT_MODE_INFORMATION {
|
|
.Version int32
|
|
.HorizontalResolution int32
|
|
.VerticalResolution int32
|
|
.PixelFormat int32
|
|
.RedMask int32
|
|
.GreenMask int32
|
|
.BlueMask int32
|
|
.Reserved int32
|
|
.PixelsPerScanline int32
|
|
}
|
|
struct EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
|
|
|
|
struc EFI_MEMORY_DESCRIPTOR {
|
|
.Type int32
|
|
.Pad int32
|
|
.PhysicalStart int64
|
|
.VirtualStart int64
|
|
.NumberOfPages int64
|
|
.Attribute int64
|
|
}
|
|
struct EFI_MEMORY_DESCRIPTOR
|
|
|
|
;---macros to make life easier---
|
|
;call it early, after entry point is the best
|
|
macro InitializeLib
|
|
{
|
|
clc
|
|
or rdx, rdx
|
|
jz .badout
|
|
cmp dword [rdx], 20494249h
|
|
je @f
|
|
.badout: xor rcx, rcx
|
|
xor rdx, rdx
|
|
stc
|
|
@@: mov [efi_handler], rcx ; ImageHandle
|
|
mov [efi_ptr], rdx ; pointer to SystemTable
|
|
}
|
|
|
|
|
|
;*********************************************************************
|
|
;* Library functions *
|
|
;*********************************************************************
|
|
|
|
section '.data' data readable writeable
|
|
efi_handler: dq 0
|
|
efi_ptr: dq 0
|
|
uefi_rsptmp: dq 0
|