Skip to content
Snippets Groups Projects
Commit bf390361 authored by rtm's avatar rtm
Browse files

system call arguments

parent 89eb5fbe
No related branches found
No related tags found
No related merge requests found
......@@ -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()
{
......@@ -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
......
#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)
;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment