system call arguments
This commit is contained in:
parent
89eb5fbe6d
commit
bf3903612d
7 changed files with 65 additions and 7 deletions
1
Makefile
1
Makefile
|
@ -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
1
defs.h
|
@ -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
3
proc.c
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
41
syscall.c
41
syscall.c
|
@ -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
|
||||||
|
|
|
@ -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
19
user1.c
|
@ -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)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue