summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-06-06 15:23:50 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2020-06-06 15:23:50 +0200
commit6184a4ef2eba1d49f0386e9ce94f4877d3d9edb2 (patch)
tree9384da1347976c340dc0cec456723d991ac5a23e
parent182e18ecffa579b06d88b4d9bdd1b87f257b5936 (diff)
devvga: use 64-bit physical addresses for framebuffer
-rw-r--r--sys/src/9/pc/devvga.c2
-rw-r--r--sys/src/9/pc/screen.c25
-rw-r--r--sys/src/9/pc/screen.h6
-rw-r--r--sys/src/9/pc/vga.c9
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);
}