mirror of
https://github.com/limine-bootloader/limine
synced 2025-01-21 03:52:04 +03:00
stage1: Misc improvements
This commit is contained in:
parent
b29a513e6c
commit
5e023bce3d
@ -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
|
||||
@ -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]
|
||||
@ -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
|
||||
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
BITS 16
|
||||
bits 16
|
||||
|
||||
; --- Read sectors from disk ---
|
||||
; IN:
|
||||
@ -6,8 +6,8 @@ BITS 16
|
||||
; 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
|
||||
@ -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
|
||||
|
@ -16,10 +16,10 @@ 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
|
||||
|
||||
@ -27,25 +27,20 @@ start:
|
||||
; 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
|
||||
@ -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]
|
||||
|
||||
@ -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
|
||||
|
@ -2,6 +2,8 @@ org 0x7c00
|
||||
bits 16
|
||||
|
||||
start:
|
||||
cli
|
||||
cld
|
||||
jmp 0x0000:.initialise_cs
|
||||
.initialise_cs:
|
||||
xor ax, ax
|
||||
@ -9,10 +11,8 @@ start:
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
mov sp, 0x7c00
|
||||
sti
|
||||
lgdt [gdt]
|
||||
|
||||
cli
|
||||
lgdt [gdt]
|
||||
|
||||
mov eax, cr0
|
||||
bts ax, 0
|
||||
@ -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
|
||||
@ -42,12 +42,6 @@ start:
|
||||
|
||||
call 0x70000
|
||||
|
||||
bits 16
|
||||
|
||||
err:
|
||||
hlt
|
||||
jmp err
|
||||
|
||||
; Includes
|
||||
|
||||
%include '../gdt.asm'
|
||||
|
Loading…
Reference in New Issue
Block a user