Makefile + fixed GetMemMap + updated readme
This commit is contained in:
parent
925aa01c9b
commit
9c3495c98a
5 changed files with 367 additions and 5 deletions
8
Makefile
Normal file
8
Makefile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
bootefi.efi: bootefi.asm uefi.inc
|
||||||
|
fasm bootefi.asm
|
||||||
|
|
||||||
|
run: bootefi.efi
|
||||||
|
uefi-run bootefi.efi -b /usr/share/ovmf/x64/OVMF.4m.fd
|
||||||
|
|
||||||
|
clean: bootefi.efi
|
||||||
|
rm bootefi.efi
|
13
README
Normal file
13
README
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
FlatEFILoader
|
||||||
|
=============
|
||||||
|
|
||||||
|
FEFIL is a simple EFI bootloader written in flatassembler. It tries to be
|
||||||
|
understandable by mere mortals
|
||||||
|
|
||||||
|
TODO
|
||||||
|
====
|
||||||
|
- [X] Make GetMemoryMap and ExitBootServices work
|
||||||
|
- [ ] Get GOP frame buffer and load it to arbitrary memory space
|
||||||
|
- [ ] Indicate boot success with frame buffer
|
||||||
|
- [ ] EDID multiple screens and their resolution
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
# FlatEFILoader
|
|
||||||
|
|
||||||
FEFIL is a EFI bootloader written in flatassembler
|
|
22
bootefi.asm
22
bootefi.asm
|
@ -60,7 +60,21 @@ main:
|
||||||
mov rdx, BootMsg
|
mov rdx, BootMsg
|
||||||
call print
|
call print
|
||||||
|
|
||||||
|
;.GetGOP:
|
||||||
|
; mov rcx, EFI_GRAPHICS_OUTPUT_UUID
|
||||||
|
; mov rdx, 3
|
||||||
|
; mov r8, Video
|
||||||
|
;
|
||||||
|
; mov rax, [BootSrvc]
|
||||||
|
; call_safe [rax + EFI_BOOT_SERVICES_TABLE.LocateProtocol]
|
||||||
|
;
|
||||||
|
; cmp rax, EFI_SUCCES
|
||||||
|
; jne .error
|
||||||
|
;
|
||||||
|
; mov rax, [Video]
|
||||||
|
; mov rbx, [rax + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE.MaxMode]
|
||||||
|
|
||||||
|
; jmp .
|
||||||
; TODO: Get and store framebuffer
|
; TODO: Get and store framebuffer
|
||||||
|
|
||||||
; Getting the memory map is kind of harder (not in this case), normally
|
; Getting the memory map is kind of harder (not in this case), normally
|
||||||
|
@ -76,6 +90,8 @@ main:
|
||||||
; *MemMapDescSize,
|
; *MemMapDescSize,
|
||||||
; *MemMapDescVer)
|
; *MemMapDescVer)
|
||||||
.GetMemMap:
|
.GetMemMap:
|
||||||
|
mov rax, [BootSrvc]
|
||||||
|
|
||||||
lea rcx, [MemMapSize]
|
lea rcx, [MemMapSize]
|
||||||
mov rdx, [MemMapBuff]
|
mov rdx, [MemMapBuff]
|
||||||
lea r8, [MemMapKey]
|
lea r8, [MemMapKey]
|
||||||
|
@ -85,7 +101,7 @@ main:
|
||||||
lea r10, [MemMapDescVer]
|
lea r10, [MemMapDescVer]
|
||||||
mov [rsp+32], r10
|
mov [rsp+32], r10
|
||||||
|
|
||||||
call [BootSrvc + EFI_BOOT_SERVICES_TABLE.GetMemoryMap]
|
call [rax + EFI_BOOT_SERVICES_TABLE.GetMemoryMap]
|
||||||
|
|
||||||
; if it returns buffer too small run the function again as it filled out
|
; if it returns buffer too small run the function again as it filled out
|
||||||
; the needed buffer length
|
; the needed buffer length
|
||||||
|
@ -106,7 +122,8 @@ main:
|
||||||
mov rcx, [ImgHdl]
|
mov rcx, [ImgHdl]
|
||||||
mov rdx, [MemMapKey]
|
mov rdx, [MemMapKey]
|
||||||
|
|
||||||
call_safe [BootSrvc + EFI_BOOT_SERVICES_TABLE.ExitBootServices]
|
mov rax, [BootSrvc]
|
||||||
|
call_safe [rax + EFI_BOOT_SERVICES_TABLE.ExitBootServices]
|
||||||
|
|
||||||
cmp rax, EFI_SUCCESS
|
cmp rax, EFI_SUCCESS
|
||||||
jne .error
|
jne .error
|
||||||
|
@ -138,6 +155,7 @@ ImgHdl dq ?
|
||||||
SysTbl dq ?
|
SysTbl dq ?
|
||||||
BootSrvc dq ?
|
BootSrvc dq ?
|
||||||
Output dq ?
|
Output dq ?
|
||||||
|
Video dq ?
|
||||||
|
|
||||||
MemMapSize dq 32768
|
MemMapSize dq 32768
|
||||||
MemMapKey dq ?
|
MemMapKey dq ?
|
||||||
|
|
326
uefi.inc
Normal file
326
uefi.inc
Normal file
|
@ -0,0 +1,326 @@
|
||||||
|
;*********************************************************************
|
||||||
|
;* *
|
||||||
|
;* 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
|
||||||
|
;---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
|
Loading…
Add table
Add a link
Reference in a new issue