summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrtm <rtm>2006-06-26 15:11:19 +0000
committerrtm <rtm>2006-06-26 15:11:19 +0000
commitbf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4 (patch)
tree8e99247d02b29f4ec74c4ad9c1ba19fcc6431a8c
parent89eb5fbe6d120f19d69c3c84bed69611a746ff03 (diff)
downloadxv6-labs-bf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4.tar.gz
xv6-labs-bf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4.tar.bz2
xv6-labs-bf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4.zip
system call arguments
-rw-r--r--Makefile1
-rw-r--r--defs.h1
-rw-r--r--proc.c3
-rw-r--r--spinlock.c6
-rw-r--r--syscall.c41
-rw-r--r--syscall.h1
-rw-r--r--user1.c19
7 files changed, 65 insertions, 7 deletions
diff --git a/Makefile b/Makefile
index 870ea70..9cac647 100644
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,7 @@ vectors.S : vectors.pl
user1 : user1.c
$(CC) -nostdinc -I. -c user1.c
$(LD) -N -e main -Ttext 0 -o user1 user1.o
+ $(OBJDUMP) -S user1 > user1.asm
-include *.d
diff --git a/defs.h b/defs.h
index 85f3578..387341b 100644
--- a/defs.h
+++ b/defs.h
@@ -6,6 +6,7 @@ void kinit(void);
// console.c
void cprintf(char *fmt, ...);
void panic(char *s);
+void cons_putc(int);
// proc.c
struct proc;
diff --git a/proc.c b/proc.c
index 45696a2..9247cc7 100644
--- a/proc.c
+++ b/proc.c
@@ -95,7 +95,6 @@ swtch()
struct proc *np;
struct proc *op = curproc[cpu()];
- cprintf("swtch cpu %d op %x proc0 %x\n", cpu(), op, proc);
while(1){
np = op + 1;
while(np != op){
@@ -107,7 +106,7 @@ swtch()
}
if(np->state == RUNNABLE)
break;
- cprintf("swtch: nothing to run\n");
+ // cprintf("swtch: nothing to run\n");
release_spinlock(&kernel_lock);
acquire_spinlock(&kernel_lock);
}
diff --git a/spinlock.c b/spinlock.c
index 2666842..911ecf8 100644
--- a/spinlock.c
+++ b/spinlock.c
@@ -15,14 +15,14 @@ acquire_spinlock(uint32_t* lock)
if (*lock == cpu_id)
return;
while ( cmpxchg(LOCK_FREE, cpu_id, lock) != cpu_id ) { ; }
- cprintf ("acquired: %d\n", cpu_id);
+ // cprintf ("acquired: %d\n", cpu_id);
}
void
release_spinlock(uint32_t* lock)
{
int cpu_id = cpu();
- cprintf ("release: %d\n", cpu_id);
+ // cprintf ("release: %d\n", cpu_id);
if (*lock != cpu_id)
panic("release_spinlock: releasing a lock that i don't own\n");
*lock = LOCK_FREE;
@@ -32,7 +32,7 @@ void
release_grant_spinlock(uint32_t* lock, int c)
{
int cpu_id = cpu();
- cprintf ("release_grant: %d -> %d\n", cpu_id, c);
+ // cprintf ("release_grant: %d -> %d\n", cpu_id, c);
if (*lock != cpu_id)
panic("release_spinlock: releasing a lock that i don't own\n");
*lock = c;
diff --git a/syscall.c b/syscall.c
index 48adba8..beadcbb 100644
--- a/syscall.c
+++ b/syscall.c
@@ -10,11 +10,38 @@
/*
* User code makes a system call with INT T_SYSCALL.
* System call number in %eax.
- * Arguments on the stack.
+ * Arguments on the stack, from the user call to the C
+ * library system call function. The saved user %esp points
+ * to a saved frame pointer, a program counter, and then
+ * the first argument.
*
* Return value? Error indication? Errno?
*/
+/*
+ * fetch 32 bits from a user-supplied pointer.
+ * returns 1 if addr was OK, 0 if illegal.
+ */
+int
+fetchint(struct proc *p, unsigned addr, int *ip)
+{
+ *ip = 0;
+
+ if(addr > p->sz - 4)
+ return 0;
+ memcpy(ip, p->mem + addr, 4);
+ return 1;
+}
+
+int
+fetcharg(int argno, int *ip)
+{
+ unsigned esp;
+
+ esp = (unsigned) curproc[cpu()]->tf->tf_esp;
+ return fetchint(curproc[cpu()], esp + 8 + 4*argno, ip);
+}
+
void
sys_fork()
{
@@ -73,6 +100,15 @@ sys_wait()
}
void
+sys_cons_putc()
+{
+ int c;
+
+ fetcharg(0, &c);
+ cons_putc(c & 0xff);
+}
+
+void
syscall()
{
struct proc *cp = curproc[cpu()];
@@ -89,6 +125,9 @@ syscall()
case SYS_wait:
sys_wait();
break;
+ case SYS_cons_putc:
+ sys_cons_putc();
+ break;
default:
cprintf("unknown sys call %d\n", num);
// XXX fault
diff --git a/syscall.h b/syscall.h
index 13bb2c7..f054414 100644
--- a/syscall.h
+++ b/syscall.h
@@ -1,3 +1,4 @@
#define SYS_fork 1
#define SYS_exit 2
#define SYS_wait 3
+#define SYS_cons_putc 4
diff --git a/user1.c b/user1.c
index 4fe572e..ea260a2 100644
--- a/user1.c
+++ b/user1.c
@@ -5,9 +5,26 @@ fork()
asm("int $48");
}
+void
+cons_putc(int c)
+{
+ asm("mov $4, %eax");
+ asm("int $48");
+}
+
+void
+puts(char *s)
+{
+ int i;
+
+ for(i = 0; s[i]; i++)
+ cons_putc(s[i]);
+}
+
main()
{
- fork();
+ // fork();
+ puts("hello!\n");
while(1)
;
}