From 5e023bce3d827dfeacab2af7c12cc75eb232f0c5 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Tue, 21 Sep 2021 14:39:43 +0200 Subject: [PATCH] stage1: Misc improvements --- stage1/cd/bootsect.asm | 98 ++++++++++++++++------------------- stage1/cd/read_2k_sectors.asm | 10 ++-- stage1/hdd/bootsect.asm | 50 +++++++++--------- stage1/pxe/bootsect.asm | 14 ++--- 4 files changed, 80 insertions(+), 92 deletions(-) diff --git a/stage1/cd/bootsect.asm b/stage1/cd/bootsect.asm index 083d2e35..47f4bfc6 100644 --- a/stage1/cd/bootsect.asm +++ b/stage1/cd/bootsect.asm @@ -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 diff --git a/stage1/cd/read_2k_sectors.asm b/stage1/cd/read_2k_sectors.asm index 7ebd0ba5..14090fe7 100644 --- a/stage1/cd/read_2k_sectors.asm +++ b/stage1/cd/read_2k_sectors.asm @@ -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 diff --git a/stage1/hdd/bootsect.asm b/stage1/hdd/bootsect.asm index 23e55436..5a341aef 100644 --- a/stage1/hdd/bootsect.asm +++ b/stage1/hdd/bootsect.asm @@ -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 diff --git a/stage1/pxe/bootsect.asm b/stage1/pxe/bootsect.asm index a2f8e638..f0d94be4 100644 --- a/stage1/pxe/bootsect.asm +++ b/stage1/pxe/bootsect.asm @@ -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'