diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-08-13 19:19:55 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-08-13 19:19:55 +0200 |
commit | 6f6df11db70363d600a30960b7c7f00076e22664 (patch) | |
tree | bf6d2334a724999e9d114ccc1248dc266d0f9d0a /sys/src/cmd/vmx | |
parent | c78d4c4ce70f09dd6a37f0327dfdccab68b7a490 (diff) |
vmx: pass multiboot framebuffer info to kernel
Diffstat (limited to 'sys/src/cmd/vmx')
-rw-r--r-- | sys/src/cmd/vmx/ksetup.c | 28 |
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; |