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)
