Some EFI framebuffers are very slow, so rather than sending every pixel of a character one at a time, send one row at a time.
Under VMWare fusion, this change makes a kernel boot to userland more than 10 seconds faster. It also helps a noticeable bit on my MacBook Air before inteldrm takes over. Index: sys/dev/rasops/rasops32.c =================================================================== RCS file: /cvs/src/sys/dev/rasops/rasops32.c,v retrieving revision 1.7 diff -u -p -u -p -r1.7 rasops32.c --- sys/dev/rasops/rasops32.c 28 Aug 2010 12:48:14 -0000 1.7 +++ sys/dev/rasops/rasops32.c 19 Feb 2017 16:34:28 -0000 @@ -69,6 +69,7 @@ rasops32_putchar(void *cookie, int row, struct rasops_info *ri; int32_t *dp, *rp; u_char *fr; + uint32_t buffer[64]; ri = (struct rasops_info *)cookie; @@ -90,12 +91,13 @@ rasops32_putchar(void *cookie, int row, clr[1] = ri->ri_devcmap[(attr >> 24) & 0xf]; if (uc == ' ') { + for (cnt = 0; cnt < width; cnt++) + buffer[cnt] = clr[0]; while (height--) { dp = rp; DELTA(rp, ri->ri_stride, int32_t *); - for (cnt = width; cnt; cnt--) - *dp++ = clr[0]; + memcpy(dp, buffer, width << 2); } } else { uc -= ri->ri_font->firstchar; @@ -109,10 +111,11 @@ rasops32_putchar(void *cookie, int row, fr += fs; DELTA(rp, ri->ri_stride, int32_t *); - for (cnt = width; cnt; cnt--) { - *dp++ = clr[(fb >> 31) & 1]; + for (cnt = 0; cnt < width; cnt++) { + buffer[cnt] = clr[(fb >> 31) & 1]; fb <<= 1; } + memcpy(dp, buffer, width << 2); } }