feat: EFI 'hello, world'
This commit is contained in:
parent
03c95cb0a4
commit
e9ec779ca0
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -28,3 +28,5 @@ bochsrc.bxrc
|
||||||
/tmp
|
/tmp
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
*.sys
|
*.sys
|
||||||
|
*.obj
|
||||||
|
*.efi
|
||||||
|
|
BIN
bin/cmd/cmd.obj
BIN
bin/cmd/cmd.obj
Binary file not shown.
|
@ -1,32 +1,39 @@
|
||||||
AS = fasm
|
AS = fasm
|
||||||
RM = rm
|
RM = rm
|
||||||
|
|
||||||
TARGET = bootsector.bin stpdboot.sys
|
TARGET = bootsector.bin stpdboot.sys bootia32.efi
|
||||||
|
|
||||||
STAGE0_SRCS = boot0.asm \
|
STAGE0_SRCS = boot0.asm \
|
||||||
const.inc \
|
const.inc \
|
||||||
fat12.inc
|
fat12.inc
|
||||||
|
|
||||||
STAGE1_SRCS = boot1.asm \
|
STAGE1_SRCS = boot1.asm \
|
||||||
const.inc \
|
const.inc \
|
||||||
a20.inc \
|
a20.inc \
|
||||||
multiboot.inc
|
multiboot.inc
|
||||||
|
|
||||||
.PHONY: all
|
BOOTIA32_EFI_SRCS = bootia32.asm \
|
||||||
all: $(TARGET)
|
uefi.inc
|
||||||
|
|
||||||
bootsector.bin: $(STAGE0_SRCS)
|
.PHONY: all
|
||||||
$(AS) boot0.asm $@
|
all: $(TARGET)
|
||||||
|
|
||||||
stpdboot.sys: $(STAGE1_SRCS)
|
bootsector.bin: $(STAGE0_SRCS)
|
||||||
$(AS) boot1.asm $@
|
$(AS) boot0.asm $@
|
||||||
|
|
||||||
.PHONY: clean
|
stpdboot.sys: $(STAGE1_SRCS)
|
||||||
clean:
|
$(AS) boot1.asm $@
|
||||||
$(RM) $(TARGET)
|
|
||||||
|
bootia32.efi: $(BOOTIA32_EFI_SRCS)
|
||||||
.PHONY: install
|
$(AS) bootia32.asm $@
|
||||||
install: $(TARGET)
|
|
||||||
@ mkdir -p $(DESTDIR)
|
.PHONY: clean
|
||||||
install stpdboot.sys $(DESTDIR)
|
clean:
|
||||||
|
$(RM) $(TARGET)
|
||||||
|
|
||||||
|
.PHONY: install
|
||||||
|
install: $(TARGET)
|
||||||
|
@ mkdir -p $(DESTDIR)
|
||||||
|
install stpdboot.sys $(DESTDIR)
|
||||||
|
@ mkdir -p $(DESTDIR)/EFI/BOOT
|
||||||
|
install bootia32.efi $(DESTDIR)/EFI/BOOT
|
||||||
|
|
42
boot/bootia32.asm
Normal file
42
boot/bootia32.asm
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
format PE DLL EFI at 10000000h
|
||||||
|
entry efimain
|
||||||
|
|
||||||
|
section '.text' code executable readable
|
||||||
|
|
||||||
|
include 'uefi.inc'
|
||||||
|
|
||||||
|
; ESP => return address
|
||||||
|
; ESP + 4 => Handle
|
||||||
|
; ESP + 8 => SysTable
|
||||||
|
efimain:
|
||||||
|
mov eax, [esp+4]
|
||||||
|
mov [handle], eax
|
||||||
|
mov eax, [esp+8]
|
||||||
|
mov [system_table], eax
|
||||||
|
|
||||||
|
mov ebx, [eax + EFI_SYSTEM_TABLE.ConOut]
|
||||||
|
|
||||||
|
mov eax, 1
|
||||||
|
push eax
|
||||||
|
push ebx
|
||||||
|
call [ebx + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset]
|
||||||
|
add esp, 8
|
||||||
|
|
||||||
|
push hello_msg
|
||||||
|
push ebx
|
||||||
|
call [ebx + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString]
|
||||||
|
add esp, 8
|
||||||
|
|
||||||
|
jmp $
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
section '.reloc' fixups data discardable
|
||||||
|
|
||||||
|
section '.data' data readable writeable
|
||||||
|
|
||||||
|
hello_msg du 'StupidOS EFI Bootloader', 13, 10, 0
|
||||||
|
|
||||||
|
handle dd ?
|
||||||
|
system_table dd ?
|
147
boot/uefi.inc
Normal file
147
boot/uefi.inc
Normal file
|
@ -0,0 +1,147 @@
|
||||||
|
macro defn name
|
||||||
|
{
|
||||||
|
virtual at 0
|
||||||
|
name name
|
||||||
|
end virtual
|
||||||
|
}
|
||||||
|
|
||||||
|
struc BOOLEAN
|
||||||
|
{
|
||||||
|
. db ?
|
||||||
|
}
|
||||||
|
|
||||||
|
struc UINT64
|
||||||
|
{
|
||||||
|
align 8
|
||||||
|
. dq ?
|
||||||
|
}
|
||||||
|
|
||||||
|
struc UINT32
|
||||||
|
{
|
||||||
|
align 4
|
||||||
|
. dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
struc INT32
|
||||||
|
{
|
||||||
|
align 4
|
||||||
|
. dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
struc UINTN
|
||||||
|
{
|
||||||
|
align 4
|
||||||
|
. dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
struc EFI_HANDLE
|
||||||
|
{
|
||||||
|
align 4
|
||||||
|
. dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
struc UINTPTR
|
||||||
|
{
|
||||||
|
align 4
|
||||||
|
. dd ?
|
||||||
|
}
|
||||||
|
|
||||||
|
struc EFI_TABLE_HEADER
|
||||||
|
{
|
||||||
|
.Signature UINT64
|
||||||
|
.Revision UINT32
|
||||||
|
.HeaderSize UINT32
|
||||||
|
.CRC32 UINT32
|
||||||
|
.Reserved UINT32
|
||||||
|
}
|
||||||
|
defn EFI_TABLE_HEADER
|
||||||
|
|
||||||
|
;; ========================================================================
|
||||||
|
;; EFI_SYSTEM_TABLE
|
||||||
|
;; ========================================================================
|
||||||
|
EFI_SYSTEM_TABLE_SIGNATURE = 0x5453595320494249
|
||||||
|
|
||||||
|
EFI_2_90_SYSTEM_TABLE_REVISION = ((2 shl 16) or (90))
|
||||||
|
EFI_2_80_SYSTEM_TABLE_REVISION = ((2 shl 16) or (80))
|
||||||
|
EFI_2_70_SYSTEM_TABLE_REVISION = ((2 shl 16) or (70))
|
||||||
|
EFI_2_60_SYSTEM_TABLE_REVISION = ((2 shl 16) or (60))
|
||||||
|
EFI_2_50_SYSTEM_TABLE_REVISION = ((2 shl 16) or (50))
|
||||||
|
EFI_2_40_SYSTEM_TABLE_REVISION = ((2 shl 16) or (40))
|
||||||
|
EFI_2_31_SYSTEM_TABLE_REVISION = ((2 shl 16) or (31))
|
||||||
|
EFI_2_30_SYSTEM_TABLE_REVISION = ((2 shl 16) or (30))
|
||||||
|
EFI_2_20_SYSTEM_TABLE_REVISION = ((2 shl 16) or (20))
|
||||||
|
EFI_2_10_SYSTEM_TABLE_REVISION = ((2 shl 16) or (10))
|
||||||
|
EFI_2_00_SYSTEM_TABLE_REVISION = ((2 shl 16) or (00))
|
||||||
|
EFI_1_10_SYSTEM_TABLE_REVISION = ((1 shl 16) or (10))
|
||||||
|
EFI_1_02_SYSTEM_TABLE_REVISION = ((1 shl 16) or (02))
|
||||||
|
|
||||||
|
EFI_SYSTEM_TABLE_REVISION = EFI_2_90_SYSTEM_TABLE_REVISION
|
||||||
|
EFI_SPECIFICATION_VERSION = EFI_SYSTEM_TABLE_REVISION
|
||||||
|
|
||||||
|
struc EFI_SYSTEM_TABLE
|
||||||
|
{
|
||||||
|
.Hdr EFI_TABLE_HEADER
|
||||||
|
.FirmwareVendor UINTPTR
|
||||||
|
.FirmwareRevision UINT32
|
||||||
|
.ConsoleInHandle EFI_HANDLE
|
||||||
|
.ConIn UINTPTR
|
||||||
|
.ConsoleOutHandle EFI_HANDLE
|
||||||
|
.ConOut UINTPTR
|
||||||
|
.StandardErrorHandle EFI_HANDLE
|
||||||
|
.StdErr UINTPTR
|
||||||
|
.RuntimeServices UINTPTR
|
||||||
|
.BootServices UINTPTR
|
||||||
|
.NumberOfTableEntries UINTN
|
||||||
|
.ConfigurationTable UINTPTR
|
||||||
|
}
|
||||||
|
defn EFI_SYSTEM_TABLE
|
||||||
|
|
||||||
|
;; ========================================================================
|
||||||
|
;; EFI_BOOT_SERVICES
|
||||||
|
;; ========================================================================
|
||||||
|
EFI_BOOT_SERVICES_SIGNATURE = 0x56524553544f4f42
|
||||||
|
EFI_BOOT_SERVICES_REVISION = EFI_SPECIFICATION_VERSION
|
||||||
|
|
||||||
|
struc EFI_BOOT_SERVICES
|
||||||
|
{
|
||||||
|
.Hdr EFI_TABLE_HEADER
|
||||||
|
}
|
||||||
|
|
||||||
|
;; ========================================================================
|
||||||
|
;; EFI_RUNTIMES_SERVICES
|
||||||
|
;; ========================================================================
|
||||||
|
EFI_RUNTIMES_SERVICES_SIGNATURE = 0x56524553544e5552
|
||||||
|
EFI_RUNTIMES_SERVICES_REVISION = EFI_SPECIFICATION_VERSION
|
||||||
|
|
||||||
|
struc EFI_RUNTIMES_SERVICES
|
||||||
|
{
|
||||||
|
.Hdr EFI_TABLE_HEADER
|
||||||
|
}
|
||||||
|
|
||||||
|
;; ========================================================================
|
||||||
|
;; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
|
||||||
|
;; ========================================================================
|
||||||
|
struc EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
|
||||||
|
{
|
||||||
|
.Reset UINTPTR
|
||||||
|
.OutputString UINTPTR
|
||||||
|
.TestString UINTPTR
|
||||||
|
.QueryMode UINTPTR
|
||||||
|
.SetMode UINTPTR
|
||||||
|
.SetAttribute UINTPTR
|
||||||
|
.ClearScreen UINTPTR
|
||||||
|
.SetCursorPosition UINTPTR
|
||||||
|
.EnableCursor UINTPTR
|
||||||
|
.Mode UINTPTR
|
||||||
|
}
|
||||||
|
defn EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
|
||||||
|
|
||||||
|
struc SIMPLE_TEXT_OUTPUT_MODE
|
||||||
|
{
|
||||||
|
.MaxMode INT32
|
||||||
|
.Mode INT32
|
||||||
|
.Attribute INT32
|
||||||
|
.CursorColumn INT32
|
||||||
|
.CursorRow INT32
|
||||||
|
.CursorVisible BOOLEAN
|
||||||
|
}
|
Loading…
Reference in a new issue