diff options
| -rw-r--r-- | sys/src/9/bcm/main.c | 2 | ||||
| -rw-r--r-- | sys/src/9/pc64/mem.h | 2 | ||||
| -rw-r--r-- | sys/src/9/port/portdat.h | 2 | ||||
| -rw-r--r-- | sys/src/9/port/portfns.h | 4 | ||||
| -rw-r--r-- | sys/src/9/port/segment.c | 13 |
5 files changed, 11 insertions, 12 deletions
diff --git a/sys/src/9/bcm/main.c b/sys/src/9/bcm/main.c index 3382bd397..2d74f083f 100644 --- a/sys/src/9/bcm/main.c +++ b/sys/src/9/bcm/main.c @@ -223,7 +223,7 @@ gpiomeminit(void) seg.attr = SG_PHYSICAL; seg.name = "gpio"; seg.pa = (VIRTIO+0x200000); - seg.size = 1; + seg.size = BY2PG; addphysseg(&seg); } diff --git a/sys/src/9/pc64/mem.h b/sys/src/9/pc64/mem.h index d75e0f941..a641f8800 100644 --- a/sys/src/9/pc64/mem.h +++ b/sys/src/9/pc64/mem.h @@ -132,7 +132,7 @@ /* * virtual MMU */ -#define PTEMAPMEM (1024*1024) +#define PTEMAPMEM (1ull*MiB) #define PTEPERTAB (PTEMAPMEM/BY2PG) #define SEGMAPSIZE 65536 #define SSEGMAPSIZE 16 diff --git a/sys/src/9/port/portdat.h b/sys/src/9/port/portdat.h index 062a6ac56..ee92c43c3 100644 --- a/sys/src/9/port/portdat.h +++ b/sys/src/9/port/portdat.h @@ -389,7 +389,7 @@ struct Physseg ulong attr; /* Segment attributes */ char *name; /* Attach name */ uintptr pa; /* Physical address */ - ulong size; /* Maximum segment size in pages */ + uintptr size; /* Maximum segment size in bytes */ Page *(*pgalloc)(Segment*, uintptr); /* Allocation if we need it */ void (*pgfree)(Page*); }; diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h index 5200be1e9..233dcaf9a 100644 --- a/sys/src/9/port/portfns.h +++ b/sys/src/9/port/portfns.h @@ -137,7 +137,7 @@ int iprint(char*, ...); void isdir(Chan*); int iseve(void); int islo(void); -Segment* isoverlap(Proc*, uintptr, int); +Segment* isoverlap(Proc*, uintptr, uintptr); int ispages(void*); int isphysseg(char*); void ixsummary(void); @@ -302,7 +302,7 @@ void scheddump(void); void schedinit(void); void (*screenputs)(char*, int); long seconds(void); -uintptr segattach(Proc*, ulong, char *, uintptr, ulong); +uintptr segattach(Proc*, ulong, char *, uintptr, uintptr); void segclock(uintptr); void segpage(Segment*, Page*); int setcolor(ulong, ulong, ulong, ulong); diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c index c73698b9e..735c876b4 100644 --- a/sys/src/9/port/segment.c +++ b/sys/src/9/port/segment.c @@ -558,7 +558,7 @@ out: } Segment* -isoverlap(Proc *p, uintptr va, int len) +isoverlap(Proc *p, uintptr va, uintptr len) { int i; Segment *ns; @@ -621,7 +621,7 @@ isphysseg(char *name) } uintptr -segattach(Proc *p, ulong attr, char *name, uintptr va, ulong len) +segattach(Proc *p, ulong attr, char *name, uintptr va, uintptr len) { int sno; Segment *s, *os; @@ -671,13 +671,12 @@ segattach(Proc *p, ulong attr, char *name, uintptr va, ulong len) error(Enovmem); va -= len; } - va &= ~(BY2PG-1); - } else { - va &= ~(BY2PG-1); - if(va == 0 || va >= USTKTOP) - error(Ebadarg); } + va &= ~(BY2PG-1); + if(va == 0 || (va+len) > USTKTOP || (va+len) < va) + error(Ebadarg); + if(isoverlap(p, va, len) != nil) error(Esoverlap); |
