diff options
| author | rtm <rtm> | 2006-06-26 15:11:19 +0000 | 
|---|---|---|
| committer | rtm <rtm> | 2006-06-26 15:11:19 +0000 | 
| commit | bf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4 (patch) | |
| tree | 8e99247d02b29f4ec74c4ad9c1ba19fcc6431a8c | |
| parent | 89eb5fbe6d120f19d69c3c84bed69611a746ff03 (diff) | |
| download | xv6-labs-bf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4.tar.gz xv6-labs-bf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4.tar.bz2 xv6-labs-bf3903612d998ca8d95a48fb7cc0e5bfbe68f4c4.zip | |
system call arguments
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | defs.h | 1 | ||||
| -rw-r--r-- | proc.c | 3 | ||||
| -rw-r--r-- | spinlock.c | 6 | ||||
| -rw-r--r-- | syscall.c | 41 | ||||
| -rw-r--r-- | syscall.h | 1 | ||||
| -rw-r--r-- | user1.c | 19 | 
7 files changed, 65 insertions, 7 deletions
| @@ -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 @@ -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; @@ -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);    } @@ -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; @@ -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 @@ -1,3 +1,4 @@  #define SYS_fork 1  #define SYS_exit 2  #define SYS_wait 3 +#define SYS_cons_putc 4 @@ -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)      ;  } | 
