system call arguments

This commit is contained in:
rtm 2006-06-26 15:11:19 +00:00
parent 89eb5fbe6d
commit bf3903612d
7 changed files with 65 additions and 7 deletions

View file

@ -34,6 +34,7 @@ vectors.S : vectors.pl
user1 : user1.c user1 : user1.c
$(CC) -nostdinc -I. -c user1.c $(CC) -nostdinc -I. -c user1.c
$(LD) -N -e main -Ttext 0 -o user1 user1.o $(LD) -N -e main -Ttext 0 -o user1 user1.o
$(OBJDUMP) -S user1 > user1.asm
-include *.d -include *.d

1
defs.h
View file

@ -6,6 +6,7 @@ void kinit(void);
// console.c // console.c
void cprintf(char *fmt, ...); void cprintf(char *fmt, ...);
void panic(char *s); void panic(char *s);
void cons_putc(int);
// proc.c // proc.c
struct proc; struct proc;

3
proc.c
View file

@ -95,7 +95,6 @@ swtch()
struct proc *np; struct proc *np;
struct proc *op = curproc[cpu()]; struct proc *op = curproc[cpu()];
cprintf("swtch cpu %d op %x proc0 %x\n", cpu(), op, proc);
while(1){ while(1){
np = op + 1; np = op + 1;
while(np != op){ while(np != op){
@ -107,7 +106,7 @@ swtch()
} }
if(np->state == RUNNABLE) if(np->state == RUNNABLE)
break; break;
cprintf("swtch: nothing to run\n"); // cprintf("swtch: nothing to run\n");
release_spinlock(&kernel_lock); release_spinlock(&kernel_lock);
acquire_spinlock(&kernel_lock); acquire_spinlock(&kernel_lock);
} }

View file

@ -15,14 +15,14 @@ acquire_spinlock(uint32_t* lock)
if (*lock == cpu_id) if (*lock == cpu_id)
return; return;
while ( cmpxchg(LOCK_FREE, cpu_id, lock) != cpu_id ) { ; } while ( cmpxchg(LOCK_FREE, cpu_id, lock) != cpu_id ) { ; }
cprintf ("acquired: %d\n", cpu_id); // cprintf ("acquired: %d\n", cpu_id);
} }
void void
release_spinlock(uint32_t* lock) release_spinlock(uint32_t* lock)
{ {
int cpu_id = cpu(); int cpu_id = cpu();
cprintf ("release: %d\n", cpu_id); // cprintf ("release: %d\n", cpu_id);
if (*lock != cpu_id) if (*lock != cpu_id)
panic("release_spinlock: releasing a lock that i don't own\n"); panic("release_spinlock: releasing a lock that i don't own\n");
*lock = LOCK_FREE; *lock = LOCK_FREE;
@ -32,7 +32,7 @@ void
release_grant_spinlock(uint32_t* lock, int c) release_grant_spinlock(uint32_t* lock, int c)
{ {
int cpu_id = cpu(); 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) if (*lock != cpu_id)
panic("release_spinlock: releasing a lock that i don't own\n"); panic("release_spinlock: releasing a lock that i don't own\n");
*lock = c; *lock = c;

View file

@ -10,11 +10,38 @@
/* /*
* User code makes a system call with INT T_SYSCALL. * User code makes a system call with INT T_SYSCALL.
* System call number in %eax. * 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? * 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 void
sys_fork() sys_fork()
{ {
@ -72,6 +99,15 @@ sys_wait()
} }
} }
void
sys_cons_putc()
{
int c;
fetcharg(0, &c);
cons_putc(c & 0xff);
}
void void
syscall() syscall()
{ {
@ -89,6 +125,9 @@ syscall()
case SYS_wait: case SYS_wait:
sys_wait(); sys_wait();
break; break;
case SYS_cons_putc:
sys_cons_putc();
break;
default: default:
cprintf("unknown sys call %d\n", num); cprintf("unknown sys call %d\n", num);
// XXX fault // XXX fault

View file

@ -1,3 +1,4 @@
#define SYS_fork 1 #define SYS_fork 1
#define SYS_exit 2 #define SYS_exit 2
#define SYS_wait 3 #define SYS_wait 3
#define SYS_cons_putc 4

19
user1.c
View file

@ -5,9 +5,26 @@ fork()
asm("int $48"); 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() main()
{ {
fork(); // fork();
puts("hello!\n");
while(1) while(1)
; ;
} }