From b16f63458d09073aec2ec178014160bd4a91ae04 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sun, 6 Sep 2020 05:15:55 +0200 Subject: [PATCH] Shuffle around memory layout of bootloader --- src/bootsect/bootsect.asm | 20 +++---- src/bootsect/disk.inc | 103 +++++++------------------------------ src/bootsect/gdt.inc | 4 +- src/decompressor/linker.ld | 2 +- src/decompressor/main.c | 5 +- src/lib/blib.c | 5 +- src/lib/real.asm | 2 +- src/lib/sleep.asm | 2 +- src/linker.ld | 3 +- 9 files changed, 41 insertions(+), 105 deletions(-) diff --git a/src/bootsect/bootsect.asm b/src/bootsect/bootsect.asm index b7404f15..6430c6b6 100644 --- a/src/bootsect/bootsect.asm +++ b/src/bootsect/bootsect.asm @@ -15,7 +15,7 @@ start: mov fs, ax mov gs, ax mov ss, ax - mov sp, 0xfff0 + mov esp, 0x4000 sti ; Some BIOSes don't pass the correct boot drive number, @@ -39,12 +39,12 @@ start: mov si, LoadingMsg call simple_print - ; ****************** Load stage 2 ****************** + ; ****************** Load stage 1.5 ****************** - mov si, Stage2Msg + mov si, Stage15Msg call simple_print - mov eax, dword [stage2_sector] + mov eax, dword [stage15_sector] mov ebx, 0x7e00 mov ecx, 1 call read_sectors @@ -73,7 +73,7 @@ halt: ; Data LoadingMsg db 0x0D, 0x0A, 'Limine', 0x0D, 0x0A, 0x0A, 0x00 -Stage2Msg db 'Loading stage2...', 0x00 +Stage15Msg db 'Loading stage 1.5...', 0x00 ErrReadDiskMsg db 0x0D, 0x0A, 'Disk read error, system halted', 0x00 ErrEnableA20Msg db 0x0D, 0x0A, 'A20 enable error, system halted', 0x00 DoneMsg db ' DONE', 0x0D, 0x0A, 0x00 @@ -87,7 +87,7 @@ times 6 db 0 %include 'disk.inc' times 0x1b0-($-$$) db 0 -stage2_sector: dd 1 +stage15_sector: dd 1 times 0x1b8-($-$$) db 0 times 510-($-$$) db 0 @@ -97,9 +97,9 @@ dw 0xaa55 stage15: push es - push 0x6000 + push 0x7000 pop es - mov eax, dword [stage2_sector] + mov eax, dword [stage15_sector] inc eax xor ebx, ebx mov ecx, 62 @@ -132,9 +132,9 @@ stage15: push edx push stage2.size - push (stage2 - 0x8000) + 0x60000 + push (stage2 - 0x8000) + 0x70000 - call 0x60000 + call 0x70000 bits 16 %include 'a20_enabler.inc' diff --git a/src/bootsect/disk.inc b/src/bootsect/disk.inc index c278648f..ecb2acaa 100644 --- a/src/bootsect/disk.inc +++ b/src/bootsect/disk.inc @@ -7,41 +7,44 @@ ; DL = Drive number ; ES = Buffer segment ; BX = Buffer offset +; CX = Sectors count ; OUT: ; Carry if error -read_sector: - push eax - push ebx - push ecx - push edx - push esi - push edi +read_sectors: + pusha push es pop word [.target_segment] mov word [.target_offset], bx mov dword [.lba_address_low], eax - xor esi, esi - mov si, .da_struct + mov word [.countdown], cx + + .loop: + mov esi, .da_struct mov ah, 0x42 clc int 0x13 + jc .done + + add word [.target_offset], 512 + inc dword [.lba_address_low] + + dec word [.countdown] + jnz .loop .done: - pop edi - pop esi - pop edx - pop ecx - pop ebx - pop eax + popa ret +align 2 + .countdown: dw 0 + align 4 -.da_struct: + .da_struct: .packet_size db 16 .unused db 0 .count dw 1 @@ -49,71 +52,3 @@ align 4 .target_segment dw 0 .lba_address_low dd 0 .lba_address_high dd 0 - -; ******************************************** -; Reads multiple LBA addressed sectors -; ******************************************** - -; IN: -; EAX = LBA starting sector -; DL = Drive number -; ES = Buffer segment -; EBX = Buffer offset -; ECX = Sectors count - -; OUT: -; Carry if error - -%define TEMP_BUFFER_SEG 0x7000 -%define BYTES_PER_SECT 512 - -read_sectors: - push eax ; Save GPRs - push ebx - push ecx - push edx - push esi - push edi - - .loop: - push es - push ebx - - mov bx, TEMP_BUFFER_SEG - mov es, bx - xor bx, bx - - call read_sector - - pop ebx - pop es - - jc .done - - push ds - - mov si, TEMP_BUFFER_SEG - mov ds, si - mov edi, ebx - xor esi, esi - - push ecx - mov ecx, BYTES_PER_SECT - a32 o32 rep movsb - pop ecx - - pop ds - - inc eax - add ebx, BYTES_PER_SECT - - loop .loop - - .done: - pop edi - pop esi - pop edx - pop ecx - pop ebx - pop eax - ret diff --git a/src/bootsect/gdt.inc b/src/bootsect/gdt.inc index 9df929b1..b6a63439 100644 --- a/src/bootsect/gdt.inc +++ b/src/bootsect/gdt.inc @@ -2,7 +2,7 @@ load_gdt: pusha push es push ds - push 0x7000 + push 0x7ff0 pop es xor di, di push 0 @@ -19,7 +19,7 @@ load_gdt: GDT: dw .GDTEnd - .GDTStart - 1 ; GDT size -dd 0x70000 ; GDT start +dd 0x7ff00 ; GDT start .GDTStart: diff --git a/src/decompressor/linker.ld b/src/decompressor/linker.ld index baf1f0de..12b58ef4 100644 --- a/src/decompressor/linker.ld +++ b/src/decompressor/linker.ld @@ -3,7 +3,7 @@ ENTRY(main) SECTIONS { - . = 0x60000; + . = 0x70000; .text : { KEEP(*(.entry*)) diff --git a/src/decompressor/main.c b/src/decompressor/main.c index e6bc3841..c097769a 100644 --- a/src/decompressor/main.c +++ b/src/decompressor/main.c @@ -22,9 +22,8 @@ ASM_BASIC( __attribute__((noreturn)) void main(uint8_t *compressed_stage2, size_t stage2_size, uint8_t boot_drive) { - // The decompressor should decompress compressed_stage2 to address 0x500. - // For now, just copy it over as it is not compressed. TODO: implement decompressor. - volatile uint8_t *dest = (volatile uint8_t *)0x500; + // The decompressor should decompress compressed_stage2 to address 0x4000. + volatile uint8_t *dest = (volatile uint8_t *)0x4000; tinf_gzip_uncompress(dest, compressed_stage2, stage2_size); diff --git a/src/lib/blib.c b/src/lib/blib.c index 98ef721a..6cbd9ef9 100644 --- a/src/lib/blib.c +++ b/src/lib/blib.c @@ -45,8 +45,9 @@ __attribute__((noreturn)) void panic(const char *fmt, ...) { } } -static size_t bump_allocator_base = 0x10000; -#define BUMP_ALLOCATOR_LIMIT ((size_t)0x70000) +extern symbol bss_end; +static size_t bump_allocator_base = (size_t)bss_end; +#define BUMP_ALLOCATOR_LIMIT ((size_t)0x7ff00) void brewind(size_t count) { bump_allocator_base -= count; diff --git a/src/lib/real.asm b/src/lib/real.asm index 5b815aa6..ee98ced2 100644 --- a/src/lib/real.asm +++ b/src/lib/real.asm @@ -1,4 +1,4 @@ -section .text +section .realmode global rm_int rm_int: diff --git a/src/lib/sleep.asm b/src/lib/sleep.asm index 9f0bcef5..c0463e32 100644 --- a/src/lib/sleep.asm +++ b/src/lib/sleep.asm @@ -1,4 +1,4 @@ -section .text +section .realmode int_08_ticks_counter: dd 0 diff --git a/src/linker.ld b/src/linker.ld index f9f0057f..7f7ddf0d 100644 --- a/src/linker.ld +++ b/src/linker.ld @@ -3,10 +3,11 @@ ENTRY(main) SECTIONS { - . = 0x500; + . = 0x4000; .text : { KEEP(*(.entry*)) + KEEP(*(.realmode*)) *(.text*) }