plan 9 kernel history: overview | file list | diff list

1999/0128/mpc/trap.c (diff list | history)

1999/0127/sys/src/9/mpc/trap.c:33,381999/0128/sys/src/9/mpc/trap.c:33,39 (short | long | prev | next)
1999/0123    
 
1999/0127    
void	faultpower(Ureg *ur, ulong addr, int read); 
1999/0123    
void	kernfault(Ureg*, int); 
1999/0128    
void	syscall(Ureg* ureg); 
1999/0123    
 
char *excname[] = 
{ 
1999/0127/sys/src/9/mpc/trap.c:179,1891999/0128/sys/src/9/mpc/trap.c:180,186
1999/0123    
		break; 
 
1999/0127    
	case CSYSCALL: 
		spllo(); 
		print("syscall!\n"); 
		dumpregs(ur); 
		delay(100); 
		splhi(); 
1999/0128    
		syscall(ur); 
1999/0127    
		break; 
 
1999/0123    
	case CPROG: 
1999/0127/sys/src/9/mpc/trap.c:214,2201999/0128/sys/src/9/mpc/trap.c:211,217
1999/0127    
	char buf[ERRLEN]; 
 
	user = (ureg->srr1 & MSR_PR) != 0; 
print("fault: pc = %ux, addr = %ux read = %d user = %d stack=%ux\n", ureg->pc, addr, read, user, &ureg); 
1999/0128    
//print("fault: pc = %ux, addr = %ux read = %d user = %d stack=%ux\n", ureg->pc, addr, read, user, &ureg); 
1999/0127    
	insyscall = up->insyscall; 
	up->insyscall = 1; 
	spllo(); 
1999/0127/sys/src/9/mpc/trap.c:229,2351999/0128/sys/src/9/mpc/trap.c:226,231
1999/0127    
		postnote(up, 1, buf, NDebug); 
	} 
	up->insyscall = insyscall; 
	splhi(); 
} 
 
void 
1999/0127/sys/src/9/mpc/trap.c:540,5481999/0128/sys/src/9/mpc/trap.c:536,543
1999/0123    
 
	cur = (Ureg*)(p->sched.sp+2*BY2WD); 
	memmove(cur, ur, sizeof(Ureg)); 
                 
	cur->pc += 4; 
                 
1999/0128    
	cur->r3 = 0; 
	 
1999/0123    
	/* Things from bottom of syscall we never got to execute */ 
	p->psstate = 0; 
	p->insyscall = 0; 
1999/0127/sys/src/9/mpc/trap.c:558,5691999/0128/sys/src/9/mpc/trap.c:553,558
1999/0123    
} 
 
 
// need to be in l.s 
void 
forkret(void) 
{ 
	panic("forkret"); 
} 
/* This routine must save the values of registers the user is not  
 * permitted to write from devproc and then restore the saved values  
 * before returning 
1999/0127/sys/src/9/mpc/trap.c:598,6011999/0128/sys/src/9/mpc/trap.c:587,664
1999/0123    
		return 0; 
 
	return ureg->pc; 
1999/0128    
} 
 
/* 
 *  system calls 
 */ 
#include "../port/systab.h" 
 
/* 
 *  Syscall should be called directly from assembler without going through trap(). 
 */ 
void 
syscall(Ureg* ureg) 
{ 
	ulong	sp; 
	long	ret; 
	int	i, scallnr; 
 
	if((ureg->srr1 & MSR_PR) == 0) 
		panic("syscall: srr1 0x%4.4uX\n", ureg->srr1); 
 
	m->syscall++; 
	up->insyscall = 1; 
	up->pc = ureg->pc; 
	up->dbgreg = ureg; 
 
	scallnr = ureg->r3; 
//print("scall %s\n", sysctab[scallnr]); 
	up->scallnr = scallnr; 
	spllo(); 
 
	sp = ureg->usp; 
	up->nerrlab = 0; 
	ret = -1; 
	if(!waserror()){ 
		if(scallnr >= nsyscall){ 
			pprint("bad sys call number %d pc %lux\n", scallnr, ureg->pc); 
			postnote(up, 1, "sys: bad sys call", NDebug); 
			error(Ebadarg); 
		} 
 
		if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs)-BY2WD)) 
			validaddr(sp, sizeof(Sargs)+BY2WD, 0); 
 
		up->s = *((Sargs*)(sp+BY2WD)); 
		up->psstate = sysctab[scallnr]; 
 
		ret = systab[scallnr](up->s.args); 
		poperror(); 
	} 
	if(up->nerrlab){ 
		print("bad errstack [%d]: %d extra\n", scallnr, up->nerrlab); 
		for(i = 0; i < NERR; i++) 
			print("sp=%lux pc=%lux\n", up->errlab[i].sp, up->errlab[i].pc); 
		panic("error stack"); 
	} 
 
	up->insyscall = 0; 
	up->psstate = 0; 
 
	/* 
	 *  Put return value in frame.  On the x86 the syscall is 
	 *  just another trap and the return value from syscall is 
	 *  ignored.  On other machines the return value is put into 
	 *  the results register by caller of syscall. 
	 */ 
	ureg->r3 = ret; 
//print("ret = %d\n", ret); 
//	if(scallnr == NOTED) 
//		noted(ureg, *(ulong*)(sp+BY2WD)); 
 
//	if(scallnr!=RFORK && (up->procctl || up->nnote)){ 
//		splhi(); 
//		notify(ureg); 
//	} 
1999/0122    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)