shithub: riscv

Download patch

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;
 }