Skip to content

Commit

Permalink
stage1: Misc improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
mintsuki committed Sep 21, 2021
1 parent b29a513 commit 5e023bc
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 92 deletions.
98 changes: 45 additions & 53 deletions stage1/cd/bootsect.asm
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
BITS 16
ORG 0x7C00

%define STAGE2_LOCATION 0x60000
%define DECOMPRESSOR_LOCATION 0x70000
%define BOOT_FROM_CD 2
org 0x7c00
bits 16

jmp skip_bpb
nop
Expand All @@ -25,42 +21,31 @@ skip_bpb:
cld
jmp 0x0000:.initialise_cs
.initialise_cs:
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
xor si, si
mov ds, si
mov es, si
mov ss, si
mov sp, 0x7c00
sti

; int 13h?
mov ah, 0x41
mov bx, 0x55AA
mov bx, 0x55aa
int 0x13
jc err
cmp bx, 0xAA55
jne err

mov esp, 0x7C00
jc err.0
cmp bx, 0xaa55
jne err.1

; --- Load the decompressor ---
mov eax, dword [bi_boot_LBA]
add eax, DEC_LBA_OFFSET
mov ecx, DEC_LBA_COUNT
add eax, 1
mov ecx, stage2.fullsize / 2048
; DECOMPRESSOR_LOCATION = 0x70000 = 0x7000:0x0000
mov si, 0x7000
xor di, di
push 0x7000
pop es
xor bx, bx
call read_2k_sectors
jc err

; --- Load the stage2.bin.gz ---
mov eax, dword [bi_boot_LBA]
add eax, STAGE2_LBA_OFFSET
mov ecx, STAGE2_LBA_COUNT
; STAGE2_LOCATION = 0x60000 = 0x6000:0x0000
mov si, 0x6000
xor di, di
call read_2k_sectors
jc err
jc err.2

; Enable GDT
lgdt [gdt]
Expand All @@ -72,13 +57,25 @@ skip_bpb:
jmp 0x08:pmode

err:
hlt
jmp err
.2:
inc si
.1:
inc si
.0:
add si, '0' | (0x4f << 8)

push 0xb800
pop es
mov word [es:0], si

sti
.h: hlt
jmp .h

%include 'read_2k_sectors.asm'
%include '../gdt.asm'

BITS 32
bits 32
pmode:
mov eax, 0x10
mov ds, ax
Expand All @@ -88,27 +85,22 @@ pmode:
mov ss, ax

; Time to handle control over to the decompressor
push BOOT_FROM_CD
and edx, 0xFF
push 2
and edx, 0xff
push edx ; Boot drive
push STAGE2_SIZE
push STAGE2_LOCATION
call DECOMPRESSOR_LOCATION
hlt

%define FILEPOS ($-$$)
%define UPPER2K ((FILEPOS+2047) & ~2047)
%define ALIGN2K times UPPER2K - FILEPOS db 0
push stage2.size
push (stage2 - decompressor) + 0x70000
call 0x70000

; Align stage2 to 2K ON DISK
ALIGN2K
DEC_LBA_OFFSET equ ($-$$)/2048
times 2048-($-$$) db 0
decompressor:
incbin '../../build/decompressor/decompressor.bin'

ALIGN2K
STAGE2_START equ $-$$
STAGE2_LBA_OFFSET equ STAGE2_START/2048
DEC_LBA_COUNT equ STAGE2_LBA_OFFSET - DEC_LBA_OFFSET
align 16
stage2:
incbin '../../build/stage23-bios/stage2.bin.gz'
STAGE2_SIZE equ ($-$$) - STAGE2_START
STAGE2_LBA_COUNT equ (2047 + $-$$)/2048
.size: equ $ - stage2

times ((($-$$)+2047) & ~2047)-($-$$) db 0
.fullsize: equ $ - decompressor
10 changes: 5 additions & 5 deletions stage1/cd/read_2k_sectors.asm
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
BITS 16
bits 16

; --- Read sectors from disk ---
; IN:
; eax <- start LBA (2k sectors)
; cx <- number of 2k sectors
; dl <- drive number
; ds <- ZERO
; di <- buffer offset
; si <- buffer segment
; bx <- buffer offset
; es <- buffer segment

; OUT:
; Carry if error
Expand All @@ -25,8 +25,8 @@ read_2k_sectors:
pusha
mov dword [dapack_LBA], eax
mov word [dapack_nblocks], cx
mov word [dapack_offset], di
mov word [dapack_segment], si
mov word [dapack_offset], bx
mov word [dapack_segment], es

mov ah, 0x42
mov si, dapack
Expand Down
50 changes: 26 additions & 24 deletions stage1/hdd/bootsect.asm
Original file line number Diff line number Diff line change
Expand Up @@ -16,36 +16,31 @@ start:
cld
jmp 0x0000:.initialise_cs
.initialise_cs:
xor bx, bx
mov ds, bx
mov es, bx
mov ss, bx
xor si, si
mov ds, si
mov es, si
mov ss, si
mov sp, 0x7c00
sti

; Limine isn't made for floppy disks, these are dead anyways.
; So if the value the BIOS passed is <0x80, just assume it has passed
; an incorrect value.
cmp dl, 0x80
jb floppy_err
jb err.0
; Values above 0x8f are dubious so we assume we weren't booted properly
; for those either
cmp dl, 0x8f
ja hdd_err
ja err.1

.continue:
; Make sure int 13h extensions are supported
mov ah, 0x41
mov bx, 0x55aa
int 0x13
jc err
jc err.2
cmp bx, 0xaa55
jne err

; If int 13h extensions are supported, then we are definitely running on
; a 386+. We have no idea whether the upper 16 bits of esp are cleared, so
; make sure that is the case now.
mov esp, 0x7c00
jne err.3

push 0x7000
pop es
Expand All @@ -56,13 +51,13 @@ start:
xor ecx, ecx
mov cx, word [di-4]
call read_sectors
jc err
jc err.4
mov eax, dword [di+8]
mov ebp, dword [di+12]
add bx, cx
mov cx, word [di-2]
call read_sectors
jc err
jc err.5

lgdt [gdt]

Expand All @@ -82,20 +77,27 @@ times 6 db 0
%include '../gdt.asm'

err:
.5:
inc si
.4:
inc si
.3:
inc si
.2:
inc si
.1:
inc si
.0:
add si, '0' | (0x4f << 8)

push 0xb800
pop es
mov dword [es:0], eax
mov word [es:0], si

sti
.h: hlt
jmp .h

floppy_err:
mov eax, 'F ! '
jmp err

hdd_err:
mov eax, 'H ! '
jmp err

bits 32
vector:
mov eax, 0x10
Expand Down
14 changes: 4 additions & 10 deletions stage1/pxe/bootsect.asm
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ org 0x7c00
bits 16

start:
cli
cld
jmp 0x0000:.initialise_cs
.initialise_cs:
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00
sti
lgdt [gdt]

cli
lgdt [gdt]

mov eax, cr0
bts ax, 0
Expand All @@ -21,7 +21,7 @@ start:
jmp 0x08:.mode32
bits 32
.mode32:
mov ax, 0x10
mov eax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
Expand All @@ -42,12 +42,6 @@ start:

call 0x70000

bits 16

err:
hlt
jmp err

; Includes

%include '../gdt.asm'
Expand Down

0 comments on commit 5e023bc

Please sign in to comment.