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

1992/06271/pc/trap.c (diff list | history)

1992/0625/sys/src/9/pc/trap.c:305,3111992/06271/sys/src/9/pc/trap.c:305,310 (short | long | prev | next)
1991/0710    
long 
syscall(Ureg *ur) 
{ 
1991/0720    
	ulong	ax; 
	ulong	sp; 
	long	ret; 
	int	i; 
1992/0625/sys/src/9/pc/trap.c:318,3301992/06271/sys/src/9/pc/trap.c:317,329
1991/0720    
	/* 
	 *  do something about floating point!!! 
	 */ 
	ax = ur->ax; 
1992/06271    
	u->scallnr = ur->ax; 
1991/0720    
	sp = ur->usp; 
	u->nerrlab = 0; 
	ret = -1; 
	if(!waserror()){ 
		if(ax >= sizeof systab/BY2WD){ 
			pprint("bad sys call number %d pc %lux\n", ax, ur->pc); 
1992/06271    
		if(u->scallnr >= sizeof systab/BY2WD){ 
			pprint("bad sys call number %d pc %lux\n", u->scallnr, ur->pc); 
1991/0720    
			postnote(u->p, 1, "sys: bad sys call", NDebug); 
			error(Ebadarg); 
		} 
1992/0625/sys/src/9/pc/trap.c:333,3451992/06271/sys/src/9/pc/trap.c:332,344
1991/0720    
			validaddr(sp, (1+MAXSYSARG)*BY2WD, 0); 
1992/0625    
 
		u->s = *((Sargs*)(sp+1*BY2WD)); 
1991/0926    
		u->p->psstate = sysctab[ax]; 
1992/06271    
		u->p->psstate = sysctab[u->scallnr]; 
1992/0625    
 
		ret = (*systab[ax])(u->s.args); 
1992/06271    
		ret = (*systab[u->scallnr])(u->s.args); 
1991/0720    
		poperror(); 
	} 
	if(u->nerrlab){ 
		print("bad errstack [%d]: %d extra\n", ax, u->nerrlab); 
1992/06271    
		print("bad errstack [%d]: %d extra\n", u->scallnr, u->nerrlab); 
1991/0720    
		for(i = 0; i < NERR; i++) 
			print("sp=%lux pc=%lux\n", u->errlab[i].sp, u->errlab[i].pc); 
		panic("error stack"); 
1992/0625/sys/src/9/pc/trap.c:356,3661992/06271/sys/src/9/pc/trap.c:355,365
1992/0609    
	 */ 
1991/0801    
	ur->ax = ret; 
1992/0609    
 
1991/1114    
	if(ax == NOTED) 
1992/06271    
	if(u->scallnr == NOTED) 
1991/0720    
		noted(ur, *(ulong*)(sp+BY2WD)); 
1991/1114    
 
1992/0103    
	splhi(); /* avoid interrupts during the iret */ 
1992/0430    
	if(ax!=RFORK && (u->p->procctl || u->nnote)) 
1992/06271    
	if(u->scallnr!=RFORK && (u->p->procctl || u->nnote)) 
1991/0720    
		notify(ur); 
	return ret; 
1991/0710    
} 


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