summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrtm <rtm>2006-08-29 17:01:40 +0000
committerrtm <rtm>2006-08-29 17:01:40 +0000
commit3b95801add8122af978f9c071d96e3f58acfd0cc (patch)
treed420064b82d469094294160eae2ad5325c45e3a2
parent2b19190c13a12b276ac5cd3a69187d2ab504f36e (diff)
downloadxv6-labs-3b95801add8122af978f9c071d96e3f58acfd0cc.tar.gz
xv6-labs-3b95801add8122af978f9c071d96e3f58acfd0cc.tar.bz2
xv6-labs-3b95801add8122af978f9c071d96e3f58acfd0cc.zip
i broke sbrk, fix it
-rw-r--r--defs.h2
-rw-r--r--proc.c6
-rw-r--r--syscall.c5
-rw-r--r--trap.c1
-rw-r--r--usertests.c9
5 files changed, 13 insertions, 10 deletions
diff --git a/defs.h b/defs.h
index fd154ac..1dd415c 100644
--- a/defs.h
+++ b/defs.h
@@ -16,7 +16,7 @@ struct jmpbuf;
void setupsegs(struct proc *);
struct proc * copyproc(struct proc*);
struct spinlock;
-int growproc(int);
+uint growproc(int);
void sleep(void *, struct spinlock *);
void wakeup(void *);
void scheduler(void);
diff --git a/proc.c b/proc.c
index 81149d7..1d0917f 100644
--- a/proc.c
+++ b/proc.c
@@ -138,7 +138,7 @@ copyproc(struct proc* p)
return np;
}
-int
+uint
growproc(int n)
{
struct proc *cp = curproc[cpu()];
@@ -146,14 +146,14 @@ growproc(int n)
newmem = kalloc(cp->sz + n);
if(newmem == 0)
- return -1;
+ return 0xffffffff;
memmove(newmem, cp->mem, cp->sz);
memset(newmem + cp->sz, 0, n);
oldmem = cp->mem;
cp->mem = newmem;
kfree(oldmem, cp->sz);
cp->sz += n;
- return 0;
+ return cp->sz - n;
}
// Per-CPU process scheduler.
diff --git a/syscall.c b/syscall.c
index 0c4d654..eaf13c5 100644
--- a/syscall.c
+++ b/syscall.c
@@ -473,15 +473,16 @@ sys_getpid(void)
int
sys_sbrk(void)
{
+ unsigned addr;
int n;
struct proc *cp = curproc[cpu()];
if(fetcharg(0, &n) < 0)
return -1;
- if(growproc(n) != 0)
+ if((addr = growproc(n)) == 0xffffffff)
return -1;
setupsegs(cp);
- return 0;
+ return addr;
}
int
diff --git a/trap.c b/trap.c
index f9a9fc8..ef40f7e 100644
--- a/trap.c
+++ b/trap.c
@@ -37,7 +37,6 @@ trap(struct trapframe *tf)
if(v == T_SYSCALL){
struct proc *cp = curproc[cpu()];
- int num = cp->tf->eax;
if(cp->killed)
proc_exit();
cp->tf = tf;
diff --git a/usertests.c b/usertests.c
index 2b8b64f..badaa1c 100644
--- a/usertests.c
+++ b/usertests.c
@@ -124,6 +124,7 @@ mem(void)
m1 = 0;
while ((m2 = malloc(1024)) != 0) {
+ printf(1, "malloc %x\n", m2);
*(char **) m2 = m1;
m1 = m2;
}
@@ -138,6 +139,8 @@ mem(void)
exit();
}
free(m1);
+
+ printf(1, "mem ok\n");
}
int
@@ -145,10 +148,10 @@ main(int argc, char *argv[])
{
puts("usertests starting\n");
- // pipe1();
- // preempt();
- // exitwait();
mem();
+ pipe1();
+ preempt();
+ exitwait();
puts("usertests finished\n");
exit();