summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vmx
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-08-13 19:19:55 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2017-08-13 19:19:55 +0200
commit6f6df11db70363d600a30960b7c7f00076e22664 (patch)
treebf6d2334a724999e9d114ccc1248dc266d0f9d0a /sys/src/cmd/vmx
parentc78d4c4ce70f09dd6a37f0327dfdccab68b7a490 (diff)
vmx: pass multiboot framebuffer info to kernel
Diffstat (limited to 'sys/src/cmd/vmx')
-rw-r--r--sys/src/cmd/vmx/ksetup.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/sys/src/cmd/vmx/ksetup.c b/sys/src/cmd/vmx/ksetup.c
index be0329528..f3e2d95c8 100644
--- a/sys/src/cmd/vmx/ksetup.c
+++ b/sys/src/cmd/vmx/ksetup.c
@@ -14,6 +14,8 @@ extern int bootmodn;
extern char **bootmod;
extern int cmdlinen;
extern char **cmdlinev;
+extern VgaMode *curmode, textmode;
+extern uintptr fbaddr, fbsz;
static int elf64;
@@ -180,7 +182,29 @@ trymultiboot(void)
p[6] = gpa(modp);
modp += len + 7 & -8;
}
-
+
+ if(curmode != nil && curmode != &textmode){
+ int i, o, n;
+ u16int r, g, b;
+
+ o = 0;
+ r = g = b = 0;
+ for(i = 0; i < 4; i++){
+ n = curmode->chan >> 8*i & 0xf;
+ if(n == 0) continue;
+ switch(curmode->chan >> 4 + 8*i & 0xf){
+ case CRed: r = o | n<<8; break;
+ case CGreen: g = o | n<<8; break;
+ case CBlue: b = o | n<<8; break;
+ }
+ o += n;
+ }
+ p[0] |= 1<<12;
+ pack(&p[22], "viiiisss", (u64int)fbaddr,
+ curmode->hbytes, curmode->w, curmode->h,
+ chantodepth(curmode->chan) | 1<<8, r, g, b);
+ }
+
USED(modp);
rset(RPC, entry);
rset(RAX, 0x2badb002);
@@ -560,8 +584,6 @@ obsdfb(void)
{
int i, s, p;
u32int r, g, b, a, m;
- extern VgaMode *curmode, textmode;
- extern uintptr fbaddr, fbsz;
if(curmode == nil || curmode == &textmode) return;
p = r = g = b = a = 0;