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
 | 
			
		||||
	$(CC) -nostdinc -I. -c user1.c
 | 
			
		||||
	$(LD) -N -e main -Ttext 0 -o user1 user1.o
 | 
			
		||||
	$(OBJDUMP) -S user1 > user1.asm
 | 
			
		||||
 | 
			
		||||
-include *.d
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								defs.h
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								proc.c
									
										
									
									
									
								
							
							
						
						
									
										3
									
								
								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);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										41
									
								
								syscall.c
									
										
									
									
									
								
							
							
						
						
									
										41
									
								
								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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
#define SYS_fork 1
 | 
			
		||||
#define SYS_exit 2
 | 
			
		||||
#define SYS_wait 3
 | 
			
		||||
#define SYS_cons_putc 4
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										19
									
								
								user1.c
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								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)
 | 
			
		||||
    ;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue