summaryrefslogtreecommitdiff
path: root/sys/src/9/bcm
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-05-13 19:12:41 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2019-05-13 19:12:41 +0200
commit3b36daa2bb8c0f4169455baf829b9695b520c5fc (patch)
tree9da4980fe24b4464e4e8d4c9698afcd1b9549c0e /sys/src/9/bcm
parent157d7ebdbd7479b271e7b1df744b2dfc6b5816e9 (diff)
bcm, bcm64: preserve memsize across reboots, avoid trashing atags while parsing cmdline
we override atag memory on reboot, so preserve the memsize learned from atag as *maxmem plan9 variable. the global memsize variable is not needed anymore. avoid trashing the following atag when zero terminating the cmdline string. zero memory after plan9.ini variables.
Diffstat (limited to 'sys/src/9/bcm')
-rw-r--r--sys/src/9/bcm/bootargs.c34
-rw-r--r--sys/src/9/bcm/dat.h1
-rw-r--r--sys/src/9/bcm/main.c11
-rw-r--r--sys/src/9/bcm/mmu.c4
4 files changed, 25 insertions, 25 deletions
diff --git a/sys/src/9/bcm/bootargs.c b/sys/src/9/bcm/bootargs.c
index a361f2828..830e9bc65 100644
--- a/sys/src/9/bcm/bootargs.c
+++ b/sys/src/9/bcm/bootargs.c
@@ -88,34 +88,37 @@ plan9iniinit(char *s, int cmdline)
void
bootargsinit(void)
{
+ static char maxmem[11];
+ char x, *e;
Atag *a;
- int n;
- a = (Atag*)BOOTARGS;
+ e = BOOTARGS;
+ a = (Atag*)e;
if(a->tag != AtagCore){
- plan9iniinit((char*)a, 0);
+ plan9iniinit(e, 0);
return;
}
- while(a->tag != AtagNone && a->size != 0){
+ while(a->tag != AtagNone){
+ e += a->size * sizeof(u32int);
+ if(a->size < 2 || e < (char*)a || e > &BOOTARGS[BOOTARGSLEN])
+ break;
switch(a->tag){
case AtagMem:
- /* use only first bank */
- if(conf.mem[0].limit == 0 && a->mem.size != 0){
- memsize = a->mem.size;
- conf.mem[0].base = a->mem.base;
- conf.mem[0].limit = a->mem.base + memsize;
+ if(findconf("*maxmem") < 0){
+ snprint(maxmem, sizeof(maxmem), "%ud", a->mem.base+a->mem.size);
+ addconf("*maxmem", maxmem);
}
break;
case AtagCmdline:
- n = (a->size * sizeof(u32int)) - offsetof(Atag, cmdline[0]);
- if(a->cmdline + n < BOOTARGS + BOOTARGSLEN)
- a->cmdline[n] = 0;
- else
- BOOTARGS[BOOTARGSLEN-1] = 0;
+ x = *e;
+ *e = 0;
plan9iniinit(a->cmdline, 1);
+ *e = x;
break;
}
- a = (Atag*)((u32int*)a + a->size);
+ if(e > &BOOTARGS[BOOTARGSLEN-8])
+ break;
+ a = (Atag*)e;
}
}
@@ -164,6 +167,7 @@ writeconf(void)
if(n >= BOOTARGSLEN)
error("kernel configuration too large");
memmove(BOOTARGS, p, n);
+ memset(BOOTARGS+n, 0, BOOTARGSLEN-n);
poperror();
free(p);
}
diff --git a/sys/src/9/bcm/dat.h b/sys/src/9/bcm/dat.h
index cf674cf3e..bbb287e6a 100644
--- a/sys/src/9/bcm/dat.h
+++ b/sys/src/9/bcm/dat.h
@@ -227,7 +227,6 @@ extern register Mach* m; /* R10 */
extern register Proc* up; /* R9 */
extern uintptr kseg0;
extern Mach* machaddr[MAXMACH];
-extern ulong memsize;
extern int normalprint;
/*
diff --git a/sys/src/9/bcm/main.c b/sys/src/9/bcm/main.c
index 3c5f5695c..3cc30034f 100644
--- a/sys/src/9/bcm/main.c
+++ b/sys/src/9/bcm/main.c
@@ -18,7 +18,6 @@
uintptr kseg0 = KZERO;
Mach* machaddr[MAXMACH];
Conf conf;
-ulong memsize = 128*1024*1024;
void
machinit(void)
@@ -241,7 +240,7 @@ void
confinit(void)
{
int i, userpcnt;
- ulong kpages;
+ ulong kpages, memsize = 0;
uintptr pa;
char *p;
@@ -257,12 +256,10 @@ confinit(void)
else
userpcnt = 0;
- if((p = getconf("*maxmem")) != nil){
+ if(p = getconf("*maxmem"))
memsize = strtoul(p, 0, 0) - PHYSDRAM;
- if (memsize < 16*MB) /* sanity */
- memsize = 16*MB;
- }
-
+ if (memsize < 16*MB) /* sanity */
+ memsize = 16*MB;
getramsize(&conf.mem[0]);
if(conf.mem[0].limit == 0){
conf.mem[0].base = PHYSDRAM;
diff --git a/sys/src/9/bcm/mmu.c b/sys/src/9/bcm/mmu.c
index 9d2e3709c..614a6fb4f 100644
--- a/sys/src/9/bcm/mmu.c
+++ b/sys/src/9/bcm/mmu.c
@@ -304,8 +304,8 @@ mmuuncache(void* v, usize size)
uintptr
cankaddr(uintptr pa)
{
- if(pa < PHYSDRAM + memsize) /* assumes PHYSDRAM is 0 */
- return PHYSDRAM + memsize - pa;
+ if(pa < PHYSDRAM+soc.dramsize)
+ return PHYSDRAM+soc.dramsize - pa;
return 0;
}