From b41fa7e20411500be841ccd0553f5b39d38019d5 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Fri, 25 Sep 2020 22:57:57 +0200 Subject: [PATCH] Fix bugs related to handling real mode switch in inline assembly sections; reenable LTO as that fixes it --- decompressor/Makefile | 4 +-- limine.bin | Bin 32768 -> 32768 bytes stage2/Makefile | 4 +-- stage2/protos/chainload.c | 61 +++++++++++++++++--------------- stage2/protos/linux.c | 71 +++++++++++++++++++++----------------- stage2/protos/stivale.c | 5 +-- 6 files changed, 79 insertions(+), 66 deletions(-) diff --git a/decompressor/Makefile b/decompressor/Makefile index 9f48cf50..642bca50 100644 --- a/decompressor/Makefile +++ b/decompressor/Makefile @@ -2,7 +2,7 @@ CC = i386-elf-gcc LD = i386-elf-gcc OBJCOPY = i386-elf-objcopy -CFLAGS = -Os -pipe -Wall -Wextra +CFLAGS = -flto -Os -pipe -Wall -Wextra INTERNAL_CFLAGS = \ -std=gnu11 \ @@ -20,7 +20,7 @@ INTERNAL_CFLAGS = \ -MMD \ -I. -LDFLAGS = -Os +LDFLAGS = -flto -Os INTERNAL_LDFLAGS = \ -lgcc \ diff --git a/limine.bin b/limine.bin index de6fb5bf739c6743532f7504c061c3e20ff26396..0fb21da4ed3e97cf62a0f3c52fd19d7248220b55 100644 GIT binary patch delta 21869 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 diff --git a/stage2/Makefile b/stage2/Makefile index 80cf9a6a..f2051cfe 100644 --- a/stage2/Makefile +++ b/stage2/Makefile @@ -2,7 +2,7 @@ CC = i386-elf-gcc LD = i386-elf-gcc OBJCOPY = i386-elf-objcopy -CFLAGS = -Os -pipe -Wall -Wextra +CFLAGS = -flto -Os -pipe -Wall -Wextra INTERNAL_CFLAGS = \ -std=gnu11 \ @@ -22,7 +22,7 @@ INTERNAL_CFLAGS = \ -I. \ -I.. -LDFLAGS = -Os +LDFLAGS = -flto -Os INTERNAL_LDFLAGS = \ -lgcc \ diff --git a/stage2/protos/chainload.c b/stage2/protos/chainload.c index 26f9e546..f4ee639d 100644 --- a/stage2/protos/chainload.c +++ b/stage2/protos/chainload.c @@ -7,34 +7,8 @@ #include #include -void chainload(void) { - int part; { - char buf[32]; - if (!config_get_value(buf, 0, 32, "PARTITION")) { - part = -1; - } else { - part = (int)strtoui(buf); - } - } - int drive; { - char buf[32]; - if (!config_get_value(buf, 0, 32, "DRIVE")) { - panic("DRIVE not specified"); - } - drive = (int)strtoui(buf); - } - - term_deinit(); - - if (part != -1) { - struct part p; - get_part(&p, drive, part); - - read_partition(drive, &p, (void *)0x7c00, 0, 512); - } else { - read(drive, (void *)0x7c00, 0, 512); - } - +__attribute__((section(".realmode"), used)) +static void spinup(uint8_t drive) { asm volatile ( // Jump to real mode "jmp 0x08:1f\n\t" @@ -65,3 +39,34 @@ void chainload(void) { : "memory" ); } + +void chainload(void) { + int part; { + char buf[32]; + if (!config_get_value(buf, 0, 32, "PARTITION")) { + part = -1; + } else { + part = (int)strtoui(buf); + } + } + int drive; { + char buf[32]; + if (!config_get_value(buf, 0, 32, "DRIVE")) { + panic("DRIVE not specified"); + } + drive = (int)strtoui(buf); + } + + term_deinit(); + + if (part != -1) { + struct part p; + get_part(&p, drive, part); + + read_partition(drive, &p, (void *)0x7c00, 0, 512); + } else { + read(drive, (void *)0x7c00, 0, 512); + } + + spinup(drive); +} diff --git a/stage2/protos/linux.c b/stage2/protos/linux.c index 2d9da1d1..4babd397 100644 --- a/stage2/protos/linux.c +++ b/stage2/protos/linux.c @@ -12,6 +12,44 @@ #define KERNEL_LOAD_ADDR ((size_t)0x100000) #define INITRD_LOAD_ADDR ((size_t)0x1000000) +__attribute__((section(".realmode"), used)) +static void spinup(uint16_t real_mode_code_seg, uint16_t kernel_entry_seg) { + asm volatile ( + "cli\n\t" + "cld\n\t" + + "jmp 0x08:1f\n\t" + "1: .code16\n\t" + "mov ax, 0x10\n\t" + "mov ds, ax\n\t" + "mov es, ax\n\t" + "mov fs, ax\n\t" + "mov gs, ax\n\t" + "mov ss, ax\n\t" + "mov eax, cr0\n\t" + "and al, 0xfe\n\t" + "mov cr0, eax\n\t" + "jmp 0x0000:1f\n\t" + "1:\n\t" + "mov ds, bx\n\t" + "mov es, bx\n\t" + "mov fs, bx\n\t" + "mov gs, bx\n\t" + "mov ss, bx\n\t" + + "mov sp, 0xfdf0\n\t" + + "push cx\n\t" + "push 0\n\t" + "retf\n\t" + + ".code32\n\t" + : + : "b" (real_mode_code_seg), "c" (kernel_entry_seg) + : "memory" + ); +} + void linux_load(char *cmdline, int boot_drive) { int kernel_drive; { char buf[32]; @@ -136,36 +174,5 @@ void linux_load(char *cmdline, int boot_drive) { term_deinit(); - asm volatile ( - "cli\n\t" - "cld\n\t" - - "jmp 0x08:1f\n\t" - "1: .code16\n\t" - "mov ax, 0x10\n\t" - "mov ds, ax\n\t" - "mov es, ax\n\t" - "mov fs, ax\n\t" - "mov gs, ax\n\t" - "mov ss, ax\n\t" - "mov eax, cr0\n\t" - "and al, 0xfe\n\t" - "mov cr0, eax\n\t" - "jmp 0x0000:1f\n\t" - "1:\n\t" - "mov ds, bx\n\t" - "mov es, bx\n\t" - "mov fs, bx\n\t" - "mov gs, bx\n\t" - "mov ss, bx\n\t" - - "mov sp, 0xfdf0\n\t" - - "push cx\n\t" - "push 0\n\t" - "retf\n\t" - : - : "b" (real_mode_code_seg), "c" (kernel_entry_seg) - : "memory" - ); + spinup(real_mode_code_seg, kernel_entry_seg); } diff --git a/stage2/protos/stivale.c b/stage2/protos/stivale.c index 64c178fc..42fdcdac 100644 --- a/stage2/protos/stivale.c +++ b/stage2/protos/stivale.c @@ -348,7 +348,7 @@ __attribute__((noreturn)) void stivale_spinup( : "memory" ); } else if (bits == 32) { - asm volatile( + asm volatile ( "cli\n\t" "cld\n\t" @@ -371,7 +371,8 @@ __attribute__((noreturn)) void stivale_spinup( "iret\n\t" : : "b"(&entry_point), "D"(stivale_struct), "S"(&stack) - : "memory"); + : "memory" + ); } for (;;); }