diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 15:58:18 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 15:58:18 +0200 |
commit | 3bebd3f5e278d77b1eb526cd9f924b0777043d2b (patch) | |
tree | 2bf7b60c52b67912ccc49a45b6db126186517a3c /sys/src/9/pc/vgavmware.c | |
parent | a8f64e53fe2a2a27440dd9441800e8210cb1a00f (diff) |
pc/vga*: use 64-bit physical addresses and check pci membar types and sizes
Diffstat (limited to 'sys/src/9/pc/vgavmware.c')
-rw-r--r-- | sys/src/9/pc/vgavmware.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/src/9/pc/vgavmware.c b/sys/src/9/pc/vgavmware.c index 710da156e..aa4b12e30 100644 --- a/sys/src/9/pc/vgavmware.c +++ b/sys/src/9/pc/vgavmware.c @@ -95,7 +95,7 @@ enum { typedef struct Vmware Vmware; struct Vmware { - ulong fb; + uvlong fb; ulong ra; ulong rd; @@ -142,6 +142,8 @@ vmwarelinear(VGAscr* scr, int, int) p = scr->pci; if(p == nil || p->vid != PCIVMWARE) return; + if(p->mem[1].bar & 1) + return; switch(p->did){ default: return; @@ -151,6 +153,8 @@ vmwarelinear(VGAscr* scr, int, int) vm->rd = 0x4560 + 4; break; case VMWARE2: + if((p->mem[0].bar & 1) == 0) + return; vm->ver = 2; vm->ra = p->mem[0].bar & ~3; vm->rd = vm->ra + 1; @@ -164,8 +168,11 @@ vmwarelinear(VGAscr* scr, int, int) addvgaseg("vmwarescreen", scr->paddr, scr->apsize); if(scr->mmio==nil){ - ulong mmiobase, mmiosize; + uvlong mmiobase; + ulong mmiosize; + if(p->mem[2].bar & 1) + return; // mmiobase = vmrd(vm, Rmemstart); mmiobase = p->mem[2].bar & ~0xF; if(mmiobase == 0) |