diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 15:23:50 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-06-06 15:23:50 +0200 |
commit | 6184a4ef2eba1d49f0386e9ce94f4877d3d9edb2 (patch) | |
tree | 9384da1347976c340dc0cec456723d991ac5a23e | |
parent | 182e18ecffa579b06d88b4d9bdd1b87f257b5936 (diff) |
devvga: use 64-bit physical addresses for framebuffer
-rw-r--r-- | sys/src/9/pc/devvga.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/screen.c | 25 | ||||
-rw-r--r-- | sys/src/9/pc/screen.h | 6 | ||||
-rw-r--r-- | sys/src/9/pc/vga.c | 9 |
4 files changed, 24 insertions, 18 deletions
diff --git a/sys/src/9/pc/devvga.c b/sys/src/9/pc/devvga.c index 11f370302..5d95c98eb 100644 --- a/sys/src/9/pc/devvga.c +++ b/sys/src/9/pc/devvga.c @@ -188,7 +188,7 @@ vgaread(Chan* c, void* a, long n, vlong off) p = seprint(p, e, "hwaccel %s\n", hwaccel ? "on" : "off"); p = seprint(p, e, "hwblank %s\n", hwblank ? "on" : "off"); p = seprint(p, e, "panning %s\n", panning ? "on" : "off"); - p = seprint(p, e, "addr p %#p v %#p size %#ux\n", + p = seprint(p, e, "addr p 0x%.8llux v %#p size %#ux\n", scr->paddr, scr->vaddr, scr->apsize); p = seprint(p, e, "softscreen %s\n", scr->softscreen ? "on" : "off"); USED(p); diff --git a/sys/src/9/pc/screen.c b/sys/src/9/pc/screen.c index e34a38297..af5799934 100644 --- a/sys/src/9/pc/screen.c +++ b/sys/src/9/pc/screen.c @@ -95,7 +95,7 @@ int screenaperture(int size, int align) { VGAscr *scr; - ulong pa; + uvlong pa; scr = &vgascreen[0]; @@ -115,7 +115,7 @@ screenaperture(int size, int align) * The driver will tell the card to use it. */ size = PGROUND(size); - pa = upaalloc(-1, size, align); + pa = upaalloc(-1ULL, size, align); if(pa == -1) return -1; scr->paddr = pa; @@ -405,10 +405,10 @@ blankscreen(int blank) } static char* -vgalinearaddr0(VGAscr *scr, ulong paddr, int size) +vgalinearaddr0(VGAscr *scr, uvlong paddr, int size) { int x, nsize; - ulong npaddr; + uvlong npaddr; /* * new approach. instead of trying to resize this @@ -455,8 +455,8 @@ vgalinearaddr0(VGAscr *scr, ulong paddr, int size) static char* vgalinearpci0(VGAscr *scr) { - ulong paddr; int i, size, best; + uvlong paddr; Pcidev *p; p = scr->pci; @@ -505,7 +505,7 @@ vgalinearpci(VGAscr *scr) } void -vgalinearaddr(VGAscr *scr, ulong paddr, int size) +vgalinearaddr(VGAscr *scr, uvlong paddr, int size) { char *err; @@ -514,15 +514,15 @@ vgalinearaddr(VGAscr *scr, ulong paddr, int size) } static char* -bootmapfb(VGAscr *scr, ulong pa, ulong sz) +bootmapfb(VGAscr *scr, uvlong pa, ulong sz) { - ulong start, end; + uvlong start, end; Pcidev *p; int i; for(p = pcimatch(nil, 0, 0); p != nil; p = pcimatch(p, 0, 0)){ for(i=0; i<nelem(p->mem); i++){ - if(p->mem[i].bar & 1) + if(p->mem[i].size == 0 || (p->mem[i].bar & 1) != 0) continue; start = p->mem[i].bar & ~0xF; end = start + p->mem[i].size; @@ -575,7 +575,8 @@ bootscreeninit(void) { VGAscr *scr; int x, y, z; - ulong chan, pa, sz; + uvlong pa; + ulong chan, sz; char *s, *p, *err; /* *bootscreen=WIDTHxHEIGHTxDEPTH CHAN PA [SZ] */ @@ -603,7 +604,7 @@ bootscreeninit(void) return; sz = 0; - pa = strtoul(p+1, &s, 0); + pa = strtoull(p+1, &s, 0); if(pa == 0) return; if(*s++ == ' ') @@ -658,7 +659,7 @@ bootscreenconf(VGAscr *scr) conf[0] = '\0'; if(scr != nil && scr->paddr != 0 && scr->gscreen != nil) - snprint(conf, sizeof(conf), "%dx%dx%d %s %#p %d\n", + snprint(conf, sizeof(conf), "%dx%dx%d %s 0x%.8llux %d\n", scr->gscreen->r.max.x, scr->gscreen->r.max.y, scr->gscreen->depth, chantostr(chan, scr->gscreen->chan), scr->paddr, scr->apsize); diff --git a/sys/src/9/pc/screen.h b/sys/src/9/pc/screen.h index d852e5ad5..5f6c8ecf5 100644 --- a/sys/src/9/pc/screen.h +++ b/sys/src/9/pc/screen.h @@ -92,7 +92,7 @@ struct VGAscr { int useflush; - uintptr paddr; /* frame buffer */ + uvlong paddr; /* frame buffer */ void* vaddr; int apsize; @@ -129,7 +129,7 @@ extern void mouseredraw(void); extern int hwaccel; /* use hw acceleration */ extern int hwblank; /* use hw blanking */ extern int panning; /* use virtual screen panning */ -extern void addvgaseg(char*, ulong, ulong); +extern void addvgaseg(char*, uvlong, ulong); extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void flushmemscreen(Rectangle); extern void cursoron(void); @@ -154,7 +154,7 @@ extern QLock drawlock; extern void vgascreenwin(VGAscr*); extern void vgaimageinit(ulong); extern void vgalinearpci(VGAscr*); -extern void vgalinearaddr(VGAscr*, ulong, int); +extern void vgalinearaddr(VGAscr*, uvlong, int); extern void vgablank(VGAscr*, int); extern Lock vgascreenlock; diff --git a/sys/src/9/pc/vga.c b/sys/src/9/pc/vga.c index 2cfbd8078..6eb1e965a 100644 --- a/sys/src/9/pc/vga.c +++ b/sys/src/9/pc/vga.c @@ -252,14 +252,19 @@ vgablank(VGAscr*, int blank) } void -addvgaseg(char *name, ulong pa, ulong size) +addvgaseg(char *name, uvlong pa, ulong size) { Physseg seg; + if((uintptr)pa != pa || size == 0 || -(uintptr)pa < size){ + print("addvgaseg %s: bad address %llux-%llux pc %#p\n", + name, pa, pa+size, getcallerpc(&name)); + return; + } memset(&seg, 0, sizeof seg); seg.attr = SG_PHYSICAL | SG_DEVICE | SG_NOEXEC; seg.name = name; - seg.pa = pa; + seg.pa = (uintptr)pa; seg.size = size; addphysseg(&seg); } |