71 lines
1.6 KiB
NASM
71 lines
1.6 KiB
NASM
sectalign off
|
|
|
|
; This program expects two external macros:
|
|
; STAGE3, a path to the stage3 binary
|
|
; STAGE2_SECTOR, the location of stage 2
|
|
; on the disk, in 512-byte sectors.
|
|
; On a gpt disk, this is probably 34.
|
|
|
|
; Stage 1 is MBR code, and should fit in LBA 0
|
|
; (512 bytes). Layout is as follows:
|
|
; (Format is `offset, length: purpose`)
|
|
; 0, 424: x86 boot code
|
|
; 440, 4: Unique disk signature
|
|
; 444, 2: unknown
|
|
; 446, 16*4: Array of four legacy MBR records
|
|
; 510, 2: signature 0x55 0xAA
|
|
; 512 to end of logical block: reserved
|
|
;
|
|
; See https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html
|
|
|
|
ORG 0x7C00
|
|
SECTION .text
|
|
|
|
; stage 1 is sector 0, loaded into memory at 0x7C00
|
|
%include "stage1.asm"
|
|
|
|
; Stage 1 is at most 440 bytes
|
|
times 440-($-$$) db 0
|
|
db 0xee
|
|
|
|
; Pad until 512
|
|
times 510-($-$$) db 0
|
|
|
|
; MBR signature.
|
|
; This isn't loaded into memory, it's
|
|
; only here for debugging.
|
|
db 0x55
|
|
db 0xaa
|
|
|
|
; LEGACY
|
|
; GPT area from sector 1 to 33, loaded at 0x7E00
|
|
;times (33*512) db 0
|
|
|
|
stage2:
|
|
%include "stage2.asm"
|
|
align 512, db 0
|
|
stage2.end:
|
|
|
|
; TODO: why? Stage 1 read limit?
|
|
; Can we make this smaller?
|
|
; The maximum size of stage2 is 4 KiB,
|
|
; This fill will throw an error if the subtraction
|
|
; is negative.
|
|
times (4*1024)-($-stage2) db 0
|
|
|
|
; LEGACY
|
|
; Pad to 0x13000
|
|
; This needs to match the value configured
|
|
; in the stage3 linker script
|
|
times (0x13000 - 0x7c00)-($-$$) db 0
|
|
|
|
stage3:
|
|
%defstr STAGE3_STR %[STAGE3]
|
|
incbin STAGE3_STR
|
|
align 512, db 0
|
|
.end:
|
|
|
|
; TODO: why? Of the disk, or of memory?
|
|
; the maximum size of the boot loader portion is 384 KiB
|
|
times (384*1024)-($-$$) db 0
|