From eb18645f17877de4ced951eed5abac61bdfcd5c5 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Thu, 5 Aug 2010 12:10:54 -0400 Subject: fix allocuvm() to handle sbrk() with non-page-granularity argument (maybe this never worked, but it works now) --- usertests.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'usertests.c') diff --git a/usertests.c b/usertests.c index cc2601c..2bd21ba 100644 --- a/usertests.c +++ b/usertests.c @@ -1229,6 +1229,38 @@ forktest(void) printf(1, "fork test OK\n"); } +void +sbrktest(void) +{ + printf(stdout, "sbrk test\n"); + char *a = sbrk(0); + int i; + for(i = 0; i < 5000; i++){ + char *b = sbrk(1); + if(b != a){ + printf(stdout, "sbrk test failed %d %x %x\n", i, a, b); + exit(); + } + *b = 1; + a = b + 1; + } + int pid = fork(); + if(pid < 0){ + printf(stdout, "sbrk test fork failed\n"); + exit(); + } + char *c = sbrk(1); + c = sbrk(1); + if(c != a + 1){ + printf(stdout, "sbrk test failed post-fork\n"); + exit(); + } + if(pid == 0) + exit(); + wait(); + printf(stdout, "sbrk test OK\n"); +} + int main(int argc, char *argv[]) { @@ -1240,6 +1272,8 @@ main(int argc, char *argv[]) } close(open("usertests.ran", O_CREATE)); + sbrktest(); + opentest(); writetest(); writetest1(); -- cgit v1.2.3 From c4cc10da7ef6d65f0f654445e0af35b8309f16c2 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Fri, 6 Aug 2010 11:12:18 -0400 Subject: fix corner cases in exec of ELF put an invalid page below the stack have fork() handle invalid pages --- usertests.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'usertests.c') diff --git a/usertests.c b/usertests.c index 2bd21ba..247cc95 100644 --- a/usertests.c +++ b/usertests.c @@ -1261,6 +1261,29 @@ sbrktest(void) printf(stdout, "sbrk test OK\n"); } +void +stacktest(void) +{ + printf(stdout, "stack test\n"); + char dummy = 1; + char *p = &dummy; + int ppid = getpid(); + int pid = fork(); + if(pid < 0){ + printf(stdout, "fork failed\n"); + exit(); + } + if(pid == 0){ + // should cause a trap: + p[-4096] = 'z'; + kill(ppid); + printf(stdout, "stack test failed: page before stack was writeable\n"); + exit(); + } + wait(); + printf(stdout, "stack test OK\n"); +} + int main(int argc, char *argv[]) { @@ -1272,6 +1295,7 @@ main(int argc, char *argv[]) } close(open("usertests.ran", O_CREATE)); + stacktest(); sbrktest(); opentest(); -- cgit v1.2.3 From 83d2db91f75460e1275d67847adec0fca5a9800b Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Tue, 10 Aug 2010 17:08:41 -0400 Subject: allow sbrk(-x) to de-allocate user memory --- usertests.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) (limited to 'usertests.c') diff --git a/usertests.c b/usertests.c index 247cc95..9ad6448 100644 --- a/usertests.c +++ b/usertests.c @@ -1232,7 +1232,11 @@ forktest(void) void sbrktest(void) { + int pid; + printf(stdout, "sbrk test\n"); + + // can one sbrk() less than a page? char *a = sbrk(0); int i; for(i = 0; i < 5000; i++){ @@ -1244,7 +1248,7 @@ sbrktest(void) *b = 1; a = b + 1; } - int pid = fork(); + pid = fork(); if(pid < 0){ printf(stdout, "sbrk test fork failed\n"); exit(); @@ -1258,6 +1262,57 @@ sbrktest(void) if(pid == 0) exit(); wait(); + + // can one allocate the full 640K? + a = sbrk(0); + uint amt = (640 * 1024) - (uint) a; + char *p = sbrk(amt); + if(p != a){ + printf(stdout, "sbrk test failed 640K test, p %x a %x\n", p, a); + exit(); + } + char *lastaddr = (char *)(640 * 1024 - 1); + *lastaddr = 99; + + // is one forbidden from allocating more than 640K? + c = sbrk(4096); + if(c != (char *) 0xffffffff){ + printf(stdout, "sbrk allocated more than 640K, c %x\n", c); + exit(); + } + + // can one de-allocate? + a = sbrk(0); + c = sbrk(-4096); + if(c == (char *) 0xffffffff){ + printf(stdout, "sbrk could not deallocate\n"); + exit(); + } + c = sbrk(0); + if(c != a - 4096){ + printf(stdout, "sbrk deallocation produced wrong address, a %x c %x\n", a, c); + exit(); + } + + // can one re-allocate that page? + a = sbrk(0); + c = sbrk(4096); + if(c != a || sbrk(0) != a + 4096){ + printf(stdout, "sbrk re-allocation failed, a %x c %x\n", a, c); + exit(); + } + if(*lastaddr == 99){ + // should be zero + printf(stdout, "sbrk de-allocation didn't really deallocate\n"); + exit(); + } + + c = sbrk(4096); + if(c != (char *) 0xffffffff){ + printf(stdout, "sbrk was able to re-allocate beyond 640K, c %x\n", c); + exit(); + } + printf(stdout, "sbrk test OK\n"); } -- cgit v1.2.3 From 789b508d538e6faf635e49f268a4f1f9e9b65f05 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Wed, 11 Aug 2010 14:34:45 -0400 Subject: uptime() sys call for benchmarking increase PHYSTOP --- usertests.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'usertests.c') diff --git a/usertests.c b/usertests.c index 9ad6448..670a4a8 100644 --- a/usertests.c +++ b/usertests.c @@ -322,8 +322,9 @@ void mem(void) { void *m1, *m2; - int pid; + int pid, ppid; + ppid = getpid(); if((pid = fork()) == 0){ m1 = 0; while((m2 = malloc(10001)) != 0) { @@ -338,6 +339,7 @@ mem(void) m1 = malloc(1024*20); if(m1 == 0) { printf(1, "couldn't allocate mem?!!\n"); + kill(ppid); exit(); } free(m1); @@ -1233,6 +1235,7 @@ void sbrktest(void) { int pid; + char *oldbrk = sbrk(0); printf(stdout, "sbrk test\n"); @@ -1313,6 +1316,25 @@ sbrktest(void) exit(); } + // can we read the kernel's memory? + for(a = (char*)(640*1024); a < (char *)2000000; a += 50000){ + int ppid = getpid(); + int pid = fork(); + if(pid < 0){ + printf(stdout, "fork failed\n"); + exit(); + } + if(pid == 0){ + printf(stdout, "oops could read %x = %x\n", a, *a); + kill(ppid); + exit(); + } + wait(); + } + + if(sbrk(0) > oldbrk) + sbrk(-(sbrk(0) - oldbrk)); + printf(stdout, "sbrk test OK\n"); } -- cgit v1.2.3