|
|
|
@ -222,7 +222,7 @@ STAGE2_GPT_ENTRY_ADDR equ 0x1a
|
|
|
|
|
|
|
|
|
|
|
|
; Compare entry GUID to our stage 2 partition GUID.
|
|
|
|
; Compare entry GUID to our stage 2 partition GUID.
|
|
|
|
mov cx, GUID_LEN
|
|
|
|
mov cx, GUID_LEN
|
|
|
|
mov si, guid_linux
|
|
|
|
mov si, guid_stage2
|
|
|
|
mov di, ax
|
|
|
|
mov di, ax
|
|
|
|
repe cmpsb
|
|
|
|
repe cmpsb
|
|
|
|
je .found_stage2
|
|
|
|
je .found_stage2
|
|
|
|
@ -257,22 +257,13 @@ STAGE2_GPT_ENTRY_ADDR equ 0x1a
|
|
|
|
|
|
|
|
|
|
|
|
mov bx, 0x8200
|
|
|
|
mov bx, 0x8200
|
|
|
|
call .read_lba
|
|
|
|
call .read_lba
|
|
|
|
; TODO: jump to the sector we just read
|
|
|
|
jmp bx
|
|
|
|
|
|
|
|
|
|
|
|
mov al, [0x7e00]
|
|
|
|
|
|
|
|
mov byte fs:[0x0000], al
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov al, [0x8000]
|
|
|
|
|
|
|
|
mov byte fs:[0x0002], al
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hlt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; Load a single boot disk sector. Panic on failure.
|
|
|
|
; Load a single boot disk sector. Panic on failure.
|
|
|
|
; Inputs:
|
|
|
|
; Inputs:
|
|
|
|
; - ax: LBA to load
|
|
|
|
; - ax: LBA to load
|
|
|
|
; - bx: address to read sector to
|
|
|
|
; - bx: address to read sector to
|
|
|
|
; Clobber: ax, cx, dx. Possibly bx? TODO: double check
|
|
|
|
; Clobber: ax, cx, dx
|
|
|
|
; ngl probably best to assume everything is clobbered because it's a bios interrupt
|
|
|
|
|
|
|
|
.read_lba:
|
|
|
|
.read_lba:
|
|
|
|
; sector - 1 = LBA % sectors_per_track
|
|
|
|
; sector - 1 = LBA % sectors_per_track
|
|
|
|
; temp = LBA / sectors_per_track
|
|
|
|
; temp = LBA / sectors_per_track
|
|
|
|
@ -305,29 +296,13 @@ STAGE2_GPT_ENTRY_ADDR equ 0x1a
|
|
|
|
mov word fs:[0x0000], 0x4f21
|
|
|
|
mov word fs:[0x0000], 0x4f21
|
|
|
|
hlt
|
|
|
|
hlt
|
|
|
|
|
|
|
|
|
|
|
|
; TODO: enable A20
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; TODO: load a second stage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; TODO: grab all the info we can from bios interrupts and deliver it to ths OS nicely
|
|
|
|
|
|
|
|
; e.g. in a fixed memory location
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; TODO:
|
|
|
|
|
|
|
|
; - Generate GPT in justfile
|
|
|
|
|
|
|
|
; - Parse global parition table
|
|
|
|
|
|
|
|
; - Load second stage from GPT partition with a particular UUID / name like GRUB does
|
|
|
|
|
|
|
|
; (it's Hah!IdontNeedEFI in GRUB)
|
|
|
|
|
|
|
|
; - https://en.wikipedia.org/wiki/BIOS_boot_partition
|
|
|
|
|
|
|
|
; - Future work:
|
|
|
|
|
|
|
|
; - Boot from UEFI
|
|
|
|
|
|
|
|
; - Boot on non-GPT partitioned disk
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gpt_magic db "EFI PART"
|
|
|
|
gpt_magic db "EFI PART"
|
|
|
|
GPT_MAGIC_LEN equ $ - gpt_magic
|
|
|
|
GPT_MAGIC_LEN equ $ - gpt_magic
|
|
|
|
|
|
|
|
|
|
|
|
guid_linux db 0xaf, 0x3d, 0xc6, 0x0f, 0x83, 0x84, 0x72, 0x47, \
|
|
|
|
; Our stage2 guid: fdffea69-3651-442f-a11d-88a09bf372dd
|
|
|
|
0x8e, 0x79, 0x3d, 0x69, 0xd8, 0x47, 0x7d, 0xe4
|
|
|
|
guid_stage2 db 0x69, 0xea, 0xff, 0xfd, 0x51, 0x36, 0x2f, 0x44, \
|
|
|
|
GUID_LEN equ $ - guid_linux
|
|
|
|
0xa1, 0x1d, 0x88, 0xa0, 0x9b, 0xf3, 0x72, 0xdd
|
|
|
|
|
|
|
|
GUID_LEN equ $ - guid_stage2
|
|
|
|
|
|
|
|
|
|
|
|
; MBR bootstrap field is 440 bytes long
|
|
|
|
; MBR bootstrap field is 440 bytes long
|
|
|
|
%if ($ - $$) > 440
|
|
|
|
%if ($ - $$) > 440
|
|
|
|
|