diff --git a/decompressor/Makefile b/decompressor/Makefile index 2186687d..9f48cf50 100644 --- a/decompressor/Makefile +++ b/decompressor/Makefile @@ -2,9 +2,9 @@ CC = i386-elf-gcc LD = i386-elf-gcc OBJCOPY = i386-elf-objcopy -CFLAGS = -flto -Os -pipe -Wall -Wextra +CFLAGS = -Os -pipe -Wall -Wextra -INTERNAL_CFLAGS = \ +INTERNAL_CFLAGS = \ -std=gnu11 \ -ffreestanding \ -fno-stack-protector \ @@ -20,13 +20,14 @@ INTERNAL_CFLAGS = \ -MMD \ -I. -LDFLAGS = -flto -Os +LDFLAGS = -Os INTERNAL_LDFLAGS = \ -lgcc \ -static-libgcc \ -nostdlib \ -no-pie \ + -z max-page-size=0x1000 \ -static \ -Tlinker.ld diff --git a/decompressor/linker.ld b/decompressor/linker.ld index a5bae43a..707bddf5 100644 --- a/decompressor/linker.ld +++ b/decompressor/linker.ld @@ -24,4 +24,8 @@ SECTIONS *(.bss*) bss_end = .; } + + /DISCARD/ : { + *(*) + } } diff --git a/decompressor/main.c b/decompressor/main.c index 68cd0a67..7c221ec0 100644 --- a/decompressor/main.c +++ b/decompressor/main.c @@ -4,8 +4,8 @@ __attribute__((noreturn)) void entry(uint8_t *compressed_stage2, size_t stage2_size, uint8_t boot_drive) { - // The decompressor should decompress compressed_stage2 to address 0x4000. - uint8_t *dest = (uint8_t *)0x4000; + // The decompressor should decompress compressed_stage2 to address 0x8000. + uint8_t *dest = (uint8_t *)0x8000; tinf_gzip_uncompress(dest, compressed_stage2, stage2_size); diff --git a/limine.bin b/limine.bin index b92fdfbc..ab7bd0c1 100644 Binary files a/limine.bin and b/limine.bin differ diff --git a/stage2/Makefile b/stage2/Makefile index 97728305..80cf9a6a 100644 --- a/stage2/Makefile +++ b/stage2/Makefile @@ -2,9 +2,9 @@ CC = i386-elf-gcc LD = i386-elf-gcc OBJCOPY = i386-elf-objcopy -CFLAGS = -flto -Os -pipe -Wall -Wextra +CFLAGS = -Os -pipe -Wall -Wextra -INTERNAL_CFLAGS = \ +INTERNAL_CFLAGS = \ -std=gnu11 \ -fplan9-extensions \ -ffreestanding \ @@ -22,13 +22,14 @@ INTERNAL_CFLAGS = \ -I. \ -I.. -LDFLAGS = -flto -Os +LDFLAGS = -Os INTERNAL_LDFLAGS = \ -lgcc \ -static-libgcc \ -nostdlib \ -no-pie \ + -z max-page-size=0x1000 \ -static \ -Tlinker.ld diff --git a/stage2/drivers/disk.c b/stage2/drivers/disk.c index a81bd41b..bc888e03 100644 --- a/stage2/drivers/disk.c +++ b/stage2/drivers/disk.c @@ -17,35 +17,44 @@ static uint8_t *cache = NULL; static uint64_t cached_block = CACHE_INVALID; -static struct { +struct dap { uint16_t size; uint16_t count; uint16_t offset; uint16_t segment; uint64_t lba; -} dap = { 16, BLOCK_SIZE_IN_SECTORS, 0, 0, 0 }; +}; + +static struct dap *dap = NULL; static int cache_block(int drive, uint64_t block) { if (block == cached_block) return 0; + if (!dap) { + dap = conv_mem_alloc(sizeof(struct dap)); + dap->size = 16; + dap->count = BLOCK_SIZE_IN_SECTORS; + } + if (!cache) cache = conv_mem_alloc_aligned(BLOCK_SIZE, 16); - dap.segment = rm_seg(cache); - dap.offset = rm_off(cache); - dap.lba = block * BLOCK_SIZE_IN_SECTORS; + dap->segment = rm_seg(cache); + dap->offset = rm_off(cache); + dap->lba = block * BLOCK_SIZE_IN_SECTORS; struct rm_regs r = {0}; r.eax = 0x4200; r.edx = drive; - r.esi = (uint32_t)&dap; + r.esi = (uint32_t)rm_off(dap); + r.ds = rm_seg(dap); rm_int(0x13, &r, &r); if (r.eflags & EFLAGS_CF) { int ah = (r.eax >> 8) & 0xff; - panic("Disk error %x. Drive %x, LBA %x.\n", ah, drive, dap.lba); + panic("Disk error %x. Drive %x, LBA %x.\n", ah, drive, dap->lba); cached_block = CACHE_INVALID; return ah; } diff --git a/stage2/linker.ld b/stage2/linker.ld index 3f0d47c1..8551fe38 100644 --- a/stage2/linker.ld +++ b/stage2/linker.ld @@ -3,7 +3,7 @@ ENTRY(_start) SECTIONS { - . = 0x4000; + . = 0x8000; .text : { KEEP(*(.entry*)) @@ -25,4 +25,8 @@ SECTIONS *(.bss*) bss_end = .; } + + /DISCARD/ : { + *(*) + } } diff --git a/stage2/mm/pmm.c b/stage2/mm/pmm.c index 652bc7d0..3d56a17d 100644 --- a/stage2/mm/pmm.c +++ b/stage2/mm/pmm.c @@ -280,7 +280,7 @@ void *conv_mem_alloc_aligned(size_t count, size_t alignment) { uint16_t limit; uint32_t ptr; } __attribute__((packed)) gdtr; - asm volatile ("sgdt %0" :: "m"(gdtr)); + asm volatile ("sgdt %0" :: "m"(gdtr) : "memory"); bump_allocator_limit = gdtr.ptr; } diff --git a/test/limine.cfg b/test/limine.cfg index 3617dc05..21b61ebc 100644 --- a/test/limine.cfg +++ b/test/limine.cfg @@ -1,6 +1,6 @@ TIMEOUT=3 -THEME_BLACK=33000000 +THEME_BLACK=50000000 THEME_RED=aa0000 THEME_GREEN=00aaff THEME_BROWN=aa5500 @@ -9,7 +9,7 @@ THEME_MAGENTA=aa00aa THEME_CYAN=9076DE THEME_GREY=aaaaaa THEME_WHITE=ffffff -THEME_MARGIN=16 +THEME_MARGIN=64 BACKGROUND_PARTITION=0 BACKGROUND_PATH=bg.bmp