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() { @@ -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 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) ; }