shithub: riscv

Download patch

ref: 1f3c43c01720ed66e7c981d3287eca7dae362ba8
parent: 27445c5768fc9efd11efae2ac0e793fd7f4779fc
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Aug 2 03:32:49 EDT 2015

pc, pc64: set *bootscreen= when framebuffer changes

add bootscreenconf(VGAscr *) function, that is called whenever
the framebuffer configuration is changed by devvga. that way, we
can pass the current setting of the framebuffer to the new
kernel when using /dev/reboot.

--- a/sys/src/9/pc/devvga.c
+++ b/sys/src/9/pc/devvga.c
@@ -329,6 +329,7 @@
 
 	case CMtextmode:
 		screeninit();
+		bootscreenconf(nil);
 		return;
 
 	case CMsize:
@@ -357,6 +358,7 @@
 		deletescreenimage();
 		if(screensize(x, y, z, chan))
 			error(Egreg);
+		bootscreenconf(scr);
 		return;
 
 	case CMactualsize:
--- a/sys/src/9/pc/screen.c
+++ b/sys/src/9/pc/screen.c
@@ -586,7 +586,7 @@
 
 /*
  * called early on boot to attach to framebuffer
- * setup by bootloader or firmware.
+ * setup by bootloader/firmware or plan9.
  */
 void
 bootscreeninit(void)
@@ -664,4 +664,24 @@
 	scr->cur = &swcursor;
 	scr->cur->enable(scr);
 	cursoron();
+}
+
+/*
+ * called from devvga when the framebuffer is setup
+ * to set *bootscreen= that can be passed on to a
+ * new kernel on reboot.
+ */
+void
+bootscreenconf(VGAscr *scr)
+{
+	char conf[100], chan[30];
+
+	conf[0] = '\0';
+	if(scr != nil && scr->paddr != 0)
+		snprint(conf, sizeof(conf), "%dx%dx%d %s %#p %d\n",
+			scr->gscreen->r.max.x, scr->gscreen->r.max.y,
+			scr->gscreen->depth, chantostr(chan, scr->gscreen->chan),
+			scr->paddr, scr->apsize);
+
+	ksetenv("*bootscreen", conf, 1);
 }
--- a/sys/src/9/pc/screen.h
+++ b/sys/src/9/pc/screen.h
@@ -149,6 +149,9 @@
 extern Rectangle physgscreenr;	/* actual monitor size */
 extern void	blankscreen(int);
 
+extern void	bootscreeninit(void);
+extern void	bootscreenconf(VGAscr*);
+
 extern VGAcur swcursor;
 extern void swcursorinit(void);
 extern void swcursorhide(void);