summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-01-21 22:12:25 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2014-01-21 22:12:25 +0100
commit520957e254c430b4f8c94495d3c29306fab9ea44 (patch)
treee25179156b9dab6e332de1372d4ba3942b8afbd3
parentebfb4fdf2937bd9fc939ac85fdfc416e7fa7776d (diff)
downloadplan9front-520957e254c430b4f8c94495d3c29306fab9ea44.tar.xz
kernel: fix ulong abuse in xalloc
-rwxr-xr-xsys/src/9/port/mkdevc2
-rw-r--r--sys/src/9/port/portfns.h2
-rw-r--r--sys/src/9/port/xalloc.c35
3 files changed, 21 insertions, 18 deletions
diff --git a/sys/src/9/port/mkdevc b/sys/src/9/port/mkdevc
index 17b6a852a..c4ba81ff9 100755
--- a/sys/src/9/port/mkdevc
+++ b/sys/src/9/port/mkdevc
@@ -109,7 +109,7 @@ END{
printf "\t%slink();\n", link[i];
printf "}\n\n";
- if(narch || objtype == "386"){
+ if(narch || objtype == "386" || objtype == "amd64"){
for(i = 0; i < narch; i++)
printf "extern PCArch %s;\n", arch[i];
printf "PCArch* knownarch[] = {\n";
diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h
index e5d809b17..41b4b105d 100644
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -370,7 +370,7 @@ void wunlock(RWlock*);
void* xalloc(ulong);
void* xallocz(ulong, int);
void xfree(void*);
-void xhole(ulong, ulong);
+void xhole(uintptr, uintptr);
void xinit(void);
int xmerge(void*, void*);
void* xspanalloc(ulong, int, ulong);
diff --git a/sys/src/9/port/xalloc.c b/sys/src/9/port/xalloc.c
index 873cbe021..ab6be9b34 100644
--- a/sys/src/9/port/xalloc.c
+++ b/sys/src/9/port/xalloc.c
@@ -16,9 +16,9 @@ typedef struct Xhdr Xhdr;
struct Hole
{
- ulong addr;
- ulong size;
- ulong top;
+ uintptr addr;
+ uintptr size;
+ uintptr top;
Hole* link;
};
@@ -44,6 +44,7 @@ xinit(void)
{
int i, n, upages, kpages;
ulong maxpages;
+ uintptr size;
Confmem *m;
Pallocmem *pm;
Hole *h, *eh;
@@ -66,11 +67,12 @@ xinit(void)
maxpages = cankaddr(m->base)/BY2PG;
if(n > maxpages)
n = maxpages;
+ size = (uintptr)n*BY2PG;
/* first give to kernel */
if(n > 0){
- m->kbase = (ulong)KADDR(m->base);
- m->klimit = (ulong)KADDR(m->base+n*BY2PG);
- xhole(m->base, n*BY2PG);
+ m->kbase = (uintptr)KADDR(m->base);
+ m->klimit = (uintptr)KADDR(m->base+size);
+ xhole(m->base, size);
kpages -= n;
}
/* if anything left over, give to user */
@@ -79,7 +81,7 @@ xinit(void)
print("xinit: losing %lud pages\n", m->npage-n);
continue;
}
- pm->base = m->base+n*BY2PG;
+ pm->base = m->base+size;
pm->npage = m->npage - n;
pm++;
}
@@ -90,8 +92,9 @@ xinit(void)
void*
xspanalloc(ulong size, int align, ulong span)
{
- ulong a, v, t;
- a = (ulong)xalloc(size+align+span);
+ uintptr a, v, t;
+
+ a = (uintptr)xalloc(size+align+span);
if(a == 0)
panic("xspanalloc: %lud %d %lux", size, align, span);
@@ -159,7 +162,7 @@ xfree(void *p)
{
Xhdr *x;
- x = (Xhdr*)((ulong)p - offsetof(Xhdr, data[0]));
+ x = (Xhdr*)((uintptr)p - offsetof(Xhdr, data[0]));
if(x->magix != Magichole) {
xsummary();
panic("xfree(%#p) %#ux != %#lux", p, Magichole, x->magix);
@@ -172,8 +175,8 @@ xmerge(void *vp, void *vq)
{
Xhdr *p, *q;
- p = (Xhdr*)(((ulong)vp - offsetof(Xhdr, data[0])));
- q = (Xhdr*)(((ulong)vq - offsetof(Xhdr, data[0])));
+ p = (Xhdr*)(((uintptr)vp - offsetof(Xhdr, data[0])));
+ q = (Xhdr*)(((uintptr)vq - offsetof(Xhdr, data[0])));
if(p->magix != Magichole || q->magix != Magichole) {
int i;
ulong *wd;
@@ -200,10 +203,10 @@ xmerge(void *vp, void *vq)
}
void
-xhole(ulong addr, ulong size)
+xhole(uintptr addr, uintptr size)
{
- ulong top;
Hole *h, *c, **l;
+ uintptr top;
if(size == 0)
return;
@@ -239,7 +242,7 @@ xhole(ulong addr, ulong size)
if(xlists.flist == nil) {
iunlock(&xlists);
- print("xfree: no free holes, leaked %lud bytes\n", size);
+ print("xfree: no free holes, leaked %p bytes\n", size);
return;
}
@@ -266,7 +269,7 @@ xsummary(void)
print("%d holes free\n", i);
i = 0;
for(h = xlists.table; h; h = h->link) {
- print("%.8lux %.8lux %lud\n", h->addr, h->top, h->size);
+ print("%#p %#p %p\n", h->addr, h->top, h->size);
i += h->size;
}
print("%d bytes free\n", i);