From 710757420bfd368966c781a73de47af7e6c67220 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sat, 17 Sep 2022 13:53:57 +0200 Subject: [PATCH] misc: Misc stage 2 related improvements --- common/GNUmakefile | 23 +++++++++++++++++++---- common/entry.s2.c | 7 +++---- common/lib/misc.s2.c | 2 +- common/lib/print.s2.c | 33 ++++++++++++++++++++++++++++++++- common/linker_bios.ld.in | 3 +-- 5 files changed, 56 insertions(+), 12 deletions(-) diff --git a/common/GNUmakefile b/common/GNUmakefile index 383d9f0e..21d5e5d8 100644 --- a/common/GNUmakefile +++ b/common/GNUmakefile @@ -215,15 +215,15 @@ $(call MKESCAPE,$(BUILDDIR))/stage2.bin.gz: $(call MKESCAPE,$(BUILDDIR))/stage2. gzip -n -9 < '$(call SHESCAPE,$<)' > '$(call SHESCAPE,$@)' $(call MKESCAPE,$(BUILDDIR))/stage2.bin: $(call MKESCAPE,$(BUILDDIR))/limine.sys - dd if='$(call SHESCAPE,$<)' bs=$$(( 0x$$("$(CROSS_READELF)" -S '$(call SHESCAPE,$(BUILDDIR))/limine.elf' | $(GREP) .text.stage3 | $(SED) 's/^.*] //' | $(AWK) '{print $$3}' | $(SED) 's/^0*//') - 0x8000 )) count=1 of='$(call SHESCAPE,$@)' 2>/dev/null + dd if='$(call SHESCAPE,$<)' bs=$$(( 0x$$("$(CROSS_READELF)" -S '$(call SHESCAPE,$(BUILDDIR))/limine.elf' | $(GREP) '\.text\.stage3' | $(SED) 's/^.*] //' | $(AWK) '{print $$3}' | $(SED) 's/^0*//') - 0x8000 )) count=1 of='$(call SHESCAPE,$@)' 2>/dev/null $(call MKESCAPE,$(BUILDDIR))/stage2.map.o: $(call MKESCAPE,$(BUILDDIR))/limine_nomap.elf cd '$(call SHESCAPE,$(BUILDDIR))' && \ - '$(call SHESCAPE,$(SRCDIR))/gensyms.sh' '$(call SHESCAPE,$<)' stage2 32 '\.text.stage2' + '$(call SHESCAPE,$(SRCDIR))/gensyms.sh' '$(call SHESCAPE,$<)' stage2 32 '\.text\.stage2' $(CROSS_CC) $(CROSS_CFLAGS) -c '$(call SHESCAPE,$(BUILDDIR))/stage2.map.S' -o '$(call SHESCAPE,$@)' rm -f '$(call SHESCAPE,$(BUILDDIR))/stage2.map.S' '$(call SHESCAPE,$(BUILDDIR))/stage2.map.d' -$(call MKESCAPE,$(BUILDDIR))/full.map.o: $(call MKESCAPE,$(BUILDDIR))/limine_nomap.elf +$(call MKESCAPE,$(BUILDDIR))/full.map.o: $(call MKESCAPE,$(BUILDDIR))/limine_nos3map.elf cd '$(call SHESCAPE,$(BUILDDIR))' && \ '$(call SHESCAPE,$(SRCDIR))/gensyms.sh' '$(call SHESCAPE,$<)' full 32 '\.text' $(CROSS_CC) $(CROSS_CFLAGS) -c '$(call SHESCAPE,$(BUILDDIR))/full.map.S' -o '$(call SHESCAPE,$@)' @@ -242,11 +242,26 @@ $(call MKESCAPE,$(BUILDDIR))/limine_stage2only.elf: $(OBJ_S2) ../libgcc-binaries ( echo "This error may mean that stage 2 was trying to use stage 3 symbols before loading stage 3" && \ false ) +$(call MKESCAPE,$(BUILDDIR))/linker_nos2map.ld: linker_bios.ld.in + $(MKDIR_P) '$(call SHESCAPE,$(BUILDDIR))' + $(CROSS_CC) -x c -E -P -undef -DLINKER_NOMAP -DLINKER_NOS2MAP linker_bios.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker_nos2map.ld' + +$(call MKESCAPE,$(BUILDDIR))/limine_nomap.elf: $(OBJ) ../libgcc-binaries/libgcc-i686.a $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o + $(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker_nos2map.ld' + $(CROSS_LD) '$(call OBJESCAPE,$^)' $(CROSS_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker_nos2map.ld' -o '$(call SHESCAPE,$@)' + $(CROSS_OBJCOPY) -O binary --only-section=.note.gnu.build-id '$(call SHESCAPE,$@)' '$(call SHESCAPE,$(BUILDDIR))/build-id.s2.bin' + cd '$(call SHESCAPE,$(BUILDDIR))' && \ + $(CROSS_OBJCOPY) -I binary $(OBJCOPY2ELF_FLAGS) build-id.s2.bin build-id.s2.o + $(CROSS_OBJCOPY) -O binary --only-section=.note.gnu.build-id '$(call SHESCAPE,$@)' '$(call SHESCAPE,$(BUILDDIR))/build-id.s3.bin' + cd '$(call SHESCAPE,$(BUILDDIR))' && \ + $(CROSS_OBJCOPY) -I binary $(OBJCOPY2ELF_FLAGS) build-id.s3.bin build-id.s3.o + $(CROSS_LD) '$(call OBJESCAPE,$^)' '$(call SHESCAPE,$(BUILDDIR))/build-id.s2.o' '$(call SHESCAPE,$(BUILDDIR))/build-id.s3.o' $(CROSS_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker_nos2map.ld' -o '$(call SHESCAPE,$@)' + $(call MKESCAPE,$(BUILDDIR))/linker_nomap.ld: linker_bios.ld.in $(MKDIR_P) '$(call SHESCAPE,$(BUILDDIR))' $(CROSS_CC) -x c -E -P -undef -DLINKER_NOMAP linker_bios.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld' -$(call MKESCAPE,$(BUILDDIR))/limine_nomap.elf: $(OBJ) ../libgcc-binaries/libgcc-i686.a $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o +$(call MKESCAPE,$(BUILDDIR))/limine_nos3map.elf: $(OBJ) ../libgcc-binaries/libgcc-i686.a $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/stage2.map.o $(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld' $(CROSS_LD) '$(call OBJESCAPE,$^)' $(CROSS_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld' -o '$(call SHESCAPE,$@)' $(CROSS_OBJCOPY) -O binary --only-section=.note.gnu.build-id '$(call SHESCAPE,$@)' '$(call SHESCAPE,$(BUILDDIR))/build-id.s2.bin' diff --git a/common/entry.s2.c b/common/entry.s2.c index 76d41194..58929301 100644 --- a/common/entry.s2.c +++ b/common/entry.s2.c @@ -78,14 +78,13 @@ enum { }; noreturn void entry(uint8_t boot_drive, int boot_from) { + term_fallback(); + // XXX DO NOT MOVE A20 ENABLE CALL if (!a20_enable()) { - term_fallback(); panic(false, "Could not enable A20 line"); } - term_fallback(); - init_e820(); init_memmap(); @@ -101,7 +100,7 @@ noreturn void entry(uint8_t boot_drive, int boot_from) { } if (boot_volume == NULL) { - panic(false, "Could not determine boot drive\n"); + panic(false, "Could not determine boot drive"); } volume_iterate_parts(boot_volume, diff --git a/common/lib/misc.s2.c b/common/lib/misc.s2.c index 25039631..9c69e0cc 100644 --- a/common/lib/misc.s2.c +++ b/common/lib/misc.s2.c @@ -3,7 +3,7 @@ #include #include -bool verbose = true; +bool verbose = false; bool quiet = false; bool serial = false; diff --git a/common/lib/print.s2.c b/common/lib/print.s2.c index 0fb514a4..84178865 100644 --- a/common/lib/print.s2.c +++ b/common/lib/print.s2.c @@ -11,6 +11,29 @@ #include #include +#if defined (BIOS) +static void s2_print(const char *s, size_t len) { + for (size_t i = 0; i < len; i++) { + struct rm_regs r = {0}; + char c = s[i]; + + switch (c) { + case '\n': + r.eax = 0x0e00 | '\r'; + rm_int(0x10, &r, &r); + r = (struct rm_regs){0}; + r.eax = 0x0e00 | '\n'; + rm_int(0x10, &r, &r); + break; + default: + r.eax = 0x0e00 | s[i]; + rm_int(0x10, &r, &r); + break; + } + } +} +#endif + static const char *base_digits = "0123456789abcdef"; #define PRINT_BUF_MAX 4096 @@ -180,7 +203,15 @@ void vprint(const char *fmt, va_list args) { } out: - term_write((uint64_t)(uintptr_t)print_buf, print_buf_i); +#if defined (BIOS) + if (stage3_loaded) { +#endif + term_write((uint64_t)(uintptr_t)print_buf, print_buf_i); +#if defined (BIOS) + } else { + s2_print(print_buf, print_buf_i); + } +#endif for (size_t i = 0; i < print_buf_i; i++) { #if defined (__x86_64__) || defined (__i386__) diff --git a/common/linker_bios.ld.in b/common/linker_bios.ld.in index f94b98b2..632ced84 100644 --- a/common/linker_bios.ld.in +++ b/common/linker_bios.ld.in @@ -41,10 +41,9 @@ SECTIONS getchar = .; menu = .; term_write = .; - term_vbe = .; stage3_addr = .; #else -#ifdef LINKER_NOMAP +#ifdef LINKER_NOS2MAP stage2_map = .; #else *(.stage2_map)