ref: 48980502820f92ecd647d9f454513ee88f382ed7
parent: af20ba67460b79f7c4aee7014756205baba29cd5
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Nov 26 12:11:01 EST 2017
cga: capture cga console contents on boot, make sure cgapos is in range to capture bios and bootloader messages, convert the contents on the screen to kmesg. on machines without legacy cga, the cga registers read out as 0xFF, resuting in out of bounds cgapos. so set cgapos to 0 in that case.
--- a/sys/src/9/pc/cga.c
+++ b/sys/src/9/pc/cga.c
@@ -169,13 +169,46 @@
unlock(&cgascreenlock);
}
+static void
+cgatokmesg(void)
+{
+ int i, n;
+ char *p;
+
+ ilock(&kmesg.lk);
+ n = kmesg.n;
+ for(i = cgapos-2; i >= 0 && n < sizeof kmesg.buf-UTFmax-1; i -= 2){
+ if((i % Width) == Width-2)
+ n++;
+ n += runelen(cp437[CGASCREENBASE[i]]);
+ }
+ n -= kmesg.n;
+ if(n > 0){
+ memmove(kmesg.buf+n, kmesg.buf, kmesg.n);
+ kmesg.n += n;
+ p = kmesg.buf;
+ for(i += 2; i >= 0 && i < cgapos && p < kmesg.buf+n; i += 2){
+ p += runetochar(p, &cp437[CGASCREENBASE[i]]);
+ if((i % Width) == Width-2)
+ *p++ = '\n';
+ }
+ }
+ iunlock(&kmesg.lk);
+}
+
void
screeninit(void)
{
-
cgapos = cgaregr(0x0E)<<8;
cgapos |= cgaregr(0x0F);
cgapos *= 2;
+
+ if(cgapos >= Width*Height){
+ cgapos = 0;
+ movecursor();
+ }
+
+ cgatokmesg();
screenputs = cgascreenputs;
}