:: commit 1cd381a3aa2e75d44a620a38545695abf50ddaaf

mintsuki <mintsuki@protonmail.com> — 2021-08-16 16:34

parents: c7a46830f6

stivale2: More reasonable code flow to determine target video mode

diff --git a/stage23/Makefile b/stage23/Makefile
index 95114a49..02c936dc 100644
--- a/stage23/Makefile
+++ b/stage23/Makefile
@@ -61,7 +61,6 @@ INTERNAL_CFLAGS := \
 	-fno-omit-frame-pointer \
 	-fno-lto \
 	-fno-pic \
-	-Wno-stringop-overflow \
 	-Wno-address-of-packed-member \
 	-Wshadow \
 	-mno-80387 \
diff --git a/stage23/protos/stivale2.c b/stage23/protos/stivale2.c
index 414906d2..7ecaf51e 100644
--- a/stage23/protos/stivale2.c
+++ b/stage23/protos/stivale2.c
@@ -378,8 +378,6 @@ failed_to_load_header_section:
     struct fb_info *fb = NULL;
     struct fb_info _fb;
 
-    struct stivale2_header_tag_any_video *avtag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_ANY_VIDEO_ID);
-
     struct stivale2_header_tag_framebuffer *hdrtag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_FRAMEBUFFER_ID);
 
     size_t req_width = 0, req_height = 0, req_bpp = 0;
@@ -394,18 +392,28 @@ failed_to_load_header_section:
             parse_resolution(&req_width, &req_height, &req_bpp, resolution);
     }
 
+    struct stivale2_header_tag_any_video *avtag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_ANY_VIDEO_ID);
+
+#if uefi == 1
+    if (hdrtag == NULL && avtag == NULL) {
+        panic("stivale2: Cannot use text mode with UEFI.");
+    }
+#endif
+
     char *textmode_str = config_get_value(config, 0, "TEXTMODE");
     bool textmode = textmode_str != NULL && strcmp(textmode_str, "yes") == 0;
 
+    int preference;
+    if (avtag != NULL) {
+        preference = textmode ? 1 : avtag->preference;
+    }
+
     struct stivale2_header_tag_terminal *terminal_hdr_tag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_TERMINAL_ID);
 
-    if (bits == 64 && terminal_hdr_tag != NULL && (hdrtag != NULL || textmode)) {
-        if (textmode) {
-#if bios == 1
+    if (bits == 64 && terminal_hdr_tag != NULL) {
+        if (bios && ((hdrtag == NULL) || (avtag != NULL && preference == 1))) {
             term_textmode();
-#elif uefi == 1
-            panic("stivale2: Text mode not supported on UEFI");
-#endif
+            textmode = true;
         } else {
             term_vbe(req_width, req_height);
 
@@ -414,6 +422,8 @@ failed_to_load_header_section:
             }
 
             fb = &fbinfo;
+
+            textmode = false;
         }
 
         struct stivale2_struct_tag_terminal *tag = ext_mem_alloc(sizeof(struct stivale2_struct_tag_terminal));
@@ -463,8 +473,7 @@ failed_to_load_header_section:
         fb = &_fb;
     }
 
-    if (hdrtag != NULL || (avtag != NULL && uefi)
-    || (avtag != NULL && avtag->preference == 0)) {
+    if (hdrtag != NULL || (avtag != NULL && uefi) || (avtag != NULL && preference == 0)) {
         term_deinit();
 
         if (fb_init(fb, req_width, req_height, req_bpp)) {
@@ -492,9 +501,7 @@ have_fb_tag:;
             append_tag(&stivale2_struct, (struct stivale2_tag *)tag);
         }
     } else {
-#if uefi == 1
-        panic("stivale2: Cannot use text mode with UEFI.");
-#elif bios == 1
+#if bios == 1
         size_t rows, cols;
         init_vga_textmode(&rows, &cols, false);
 
tab: 248 wrap: offon