summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--entry.S4
-rw-r--r--proc.c2
-rw-r--r--usertests.c28
-rw-r--r--vm.c5
4 files changed, 26 insertions, 13 deletions
diff --git a/entry.S b/entry.S
index f814aeb..4fd85c6 100644
--- a/entry.S
+++ b/entry.S
@@ -54,10 +54,10 @@ entry:
# Set up the stack pointer.
movl $(stack + STACK), %esp
- # Call main(), which switches to executing at
+ # Jump to main(), and switch to executing at
# high addresses. The indirect call is needed because
# the assembler produces a PC-relative instruction
- # for a direct call.
+ # for a direct jump.
mov $main, %eax
jmp *%eax
diff --git a/proc.c b/proc.c
index bdc119f..05cb85f 100644
--- a/proc.c
+++ b/proc.c
@@ -49,7 +49,7 @@ found:
p->pid = nextpid++;
release(&ptable.lock);
- // Allocate kernel stack if possible.
+ // Allocate kernel stack.
if((p->kstack = kalloc()) == 0){
p->state = UNUSED;
return 0;
diff --git a/usertests.c b/usertests.c
index 655610c..62ce8d7 100644
--- a/usertests.c
+++ b/usertests.c
@@ -1508,30 +1508,41 @@ bsstest(void)
printf(stdout, "bss test ok\n");
}
-// does exec do something sensible if the arguments
-// are larger than a page?
+// does exec return an error if the arguments
+// are larger than a page? or does it write
+// below the stack and wreck the instructions/data?
void
bigargtest(void)
{
- int pid, ppid;
+ int pid, ppid, fd;
+ unlink("bigarg-ok");
ppid = getpid();
pid = fork();
if(pid == 0){
- char *args[32+1];
+ static char *args[MAXARG];
int i;
- for(i = 0; i < 32; i++)
- args[i] = "bigargs test: failed\n ";
- args[32] = 0;
- printf(stdout, "bigarg test\n");
+ for(i = 0; i < MAXARG-1; i++)
+ args[i] = "bigargs test: failed\n ";
+ args[MAXARG-1] = 0;
+ printf(stdout, "bigarg test %d\n", (MAXARG-1)*strlen(args[0]));
exec("echo", args);
printf(stdout, "bigarg test ok\n");
+ fd = open("bigarg-ok", O_CREATE);
+ close(fd);
exit();
} else if(pid < 0){
printf(stdout, "bigargtest: fork failed\n");
exit();
}
wait();
+ fd = open("bigarg-ok", 0);
+ if(fd < 0){
+ printf(stdout, "bigarg test failed!\n");
+ exit();
+ }
+ close(fd);
+ unlink("bigarg-ok");
}
// what happens when the file system runs out of blocks?
@@ -1606,6 +1617,7 @@ main(int argc, char *argv[])
}
close(open("usertests.ran", O_CREATE));
+ bigargtest();
bigwrite();
bigargtest();
bsstest();
diff --git a/vm.c b/vm.c
index 32775a1..7bda3dd 100644
--- a/vm.c
+++ b/vm.c
@@ -68,7 +68,8 @@ walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
// physical addresses starting at pa. va and size might not
// be page-aligned.
static int
-mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm, char* (*alloc)(void))
+mappages(pde_t *pgdir, void *va, uint size, uint pa,
+ int perm, char* (*alloc)(void))
{
char *a, *last;
pte_t *pte;
@@ -343,7 +344,7 @@ copyout(pde_t *pgdir, uint va, void *p, uint len)
{
char *buf, *pa0;
uint n, va0;
-
+
buf = (char*)p;
while(len > 0){
va0 = (uint)PGROUNDDOWN(va);