]> Devi Nivas Git - cs3210-lab1.git/commitdiff
system call arguments
authorrtm <rtm>
Mon, 26 Jun 2006 15:11:19 +0000 (15:11 +0000)
committerrtm <rtm>
Mon, 26 Jun 2006 15:11:19 +0000 (15:11 +0000)
Makefile
defs.h
proc.c
spinlock.c
syscall.c
syscall.h
user1.c

index 870ea70133f04c657a83ba779fc1f6a8a52371fc..9cac647b6138226ab092b1f8491e6c62f10ef9af 100644 (file)
--- 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 85f3578610ae279ec9aa060dad51d78fb2df2723..387341b31a8e9c178a22a12e525eb050fb08755b 100644 (file)
--- 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 45696a2e905ee07d00c1a8895c9951a34ffee560..9247cc7cda41333dfb665739a5610750b3081187 100644 (file)
--- 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);
   }
index 2666842ae3cbd8d6a62c02d250994ed8baaec3f6..911ecf820bdbbd2f71fe3923f82b7d2a5969cb02 100644 (file)
@@ -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;
index 48adba887963f4819bad0058fe7a4ccece0d9b64..beadcbbba77d0e83aefd0e16b0eef169a6f49086 100644 (file)
--- a/syscall.c
+++ b/syscall.c
 /*
  * 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()
 {
@@ -72,6 +99,15 @@ sys_wait()
   }
 }
 
+void
+sys_cons_putc()
+{
+  int c;
+
+  fetcharg(0, &c);
+  cons_putc(c & 0xff);
+}
+
 void
 syscall()
 {
@@ -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
index 13bb2c75a264659ac6195ba110a71781304b56b2..f0544141e2ab37ebd059d8350f77975972bc4b38 100644 (file)
--- 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 4fe572e7caa1f9c237c15544c97bbc451efd5f34..ea260a2c4b6faaf71bb3ec000c7ea80b6b8629ad 100644 (file)
--- 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)
     ;
 }