On Fri, 15 Jul 2022, Robert Elz wrote:

If that is all it is, it is barely worth fixing ... though this
must have happened sometime in the 9.99.9[78] series (sometime
after early last Dec).


Farther back than that I think: 9.2_STABLE does the same thing.

On Fri, 15 Jul 2022, Michael van Elst wrote:

Whatever driver you use either doesn't translate correctly or badly
assumes some hardware configuration (e.g. color palette) when booting.


Unsurprisingly, EFI also has a colour-index similar to VGA (see:
/usr/src/sys/external/bsd/gnu-efi/dist/inc/eficon.h). I tried fixing the
indexes like this, but, it doesn't for some (autoconfig?) reason. Can
only look into this after I come back from my road-trip.

---
diff -urN a/src/sys/arch/x86/x86/genfb_machdep.c 
b/src/sys/arch/x86/x86/genfb_machdep.c
--- a/src/sys/arch/x86/x86/genfb_machdep.c      2021-01-28 01:57:31.000000000 
+0000
+++ b/src/sys/arch/x86/x86/genfb_machdep.c      2022-07-15 23:29:07.334415944 
+0000
@@ -163,24 +163,60 @@
        return 1;
 }

+/*
+ * translate WS(=ANSI) color codes to EFI/PC ones
+ */
+#define bg(x) ((x)<<4U)
+static const unsigned char fgansitopc[] = {
+       WSCOL_BLACK, WSCOL_BLUE, WSCOL_GREEN, WSCOL_CYAN, WSCOL_RED,
+       WSCOL_MAGENTA, WSCOL_BROWN, WSCOL_WHITE,
+       WSCOL_LIGHT_GREY, WSCOL_LIGHT_BLUE, WSCOL_LIGHT_GREEN, WSCOL_LIGHT_CYAN,
+       WSCOL_LIGHT_RED, WSCOL_LIGHT_MAGENTA, WSCOL_LIGHT_BROWN, 
WSCOL_LIGHT_WHITE
+}, bgansitopc[] = {
+       bg(WSCOL_BLACK), bg(WSCOL_BLUE), bg(WSCOL_GREEN), bg(WSCOL_CYAN),
+       bg(WSCOL_RED), bg(WSCOL_MAGENTA), bg(WSCOL_BROWN), bg(WSCOL_LIGHT_GREY)
+};
+#undef bg
+
+static void
+x86_genfb_pc_colour(long *attr)
+{
+       uint32_t fg, bg, flag;
+       long aa;
+
+       rasops_unpack_attr(*attr, &fg, &bg, NULL);
+       if (__predict_false(fg >= sizeof(fgansitopc) || bg >= 
sizeof(bgansitopc))) {
+               aprint_normal("x86_genfb_pc_colour: out of range\n");
+               return;
+       }
+       flag = *attr & 0xFFFFU;
+       aa = fgansitopc[fg] << 24 | bgansitopc[bg] << 16 | flag;
+       aprint_normal("x86_genfb_pc_colour: old = 0x%lX, new = 0x%lX\n", *attr, 
aa);
+       *attr = aa;
+}
+
 int
 x86_genfb_cnattach(void)
 {
        static int ncalls = 0;
        struct rasops_info *ri = &x86_genfb_console_screen.scr_ri;
-       long defattr;
+       long defattr = 0;

        /* XXX jmcneill
         *  Defer console initialization until UVM is initialized
         */
+       aprint_normal("x86_genfb_cnattach()\n");
        ++ncalls;
        if (ncalls < 3)
                return -1;

-       if (!x86_genfb_init())
+       if (!x86_genfb_init()) {
+               aprint_normal("x86_genfb_init ERROR\n");
                return 0;
+       }

        ri->ri_ops.allocattr(ri, 0, 0, 0, &defattr);
+       x86_genfb_pc_colour(&defattr);
        wsdisplay_preattach(&x86_genfb_stdscreen, ri, 0, 0, defattr);

        return 1;
---

-RVP

Reply via email to