:: commit 710757420bfd368966c781a73de47af7e6c67220

mintsuki <mintsuki@protonmail.com> — 2022-09-17 11:53

parents: 3181293a04

misc: Misc stage 2 related improvements

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 <lib/misc.h>
 #include <lib/print.h>
 
-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 <sys/cpu.h>
 #include <drivers/serial.h>
 
+#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)
tab: 248 wrap: offon