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

2002/0417/alphapc/trap.c (diff list | history)

2001/1121/sys/src/9/alphapc/trap.c:682,6912002/0417/sys/src/9/alphapc/trap.c:682,693 (short | long | prev | next)
1999/0415    
long 
syscall(Ureg *aur) 
{ 
2002/0417    
	int i; 
2001/0924    
	char *e; 
1999/0415    
	long ret; 
	ulong sp; 
	Ureg *ur; 
2002/0417    
	ulong scallnr; 
1999/0415    
 
	m->syscall++; 
	up = m->proc; 
2001/1121/sys/src/9/alphapc/trap.c:695,7032002/0417/sys/src/9/alphapc/trap.c:697,706
1999/0415    
	up->dbgreg = aur; 
	ur->type = 5;		/* for debugging */ 
 
2002/0417    
	scallnr = ur->r0; 
1999/0515    
	up->scallnr = ur->r0; 
 
	if(up->scallnr == RFORK && up->fpstate == FPactive){ 
2002/0417    
	if(scallnr == RFORK && up->fpstate == FPactive){ 
1999/0515    
		savefpregs(&up->fpsave); 
		up->fpstate = FPinactive; 
//print("SR=%lux+", up->fpsave.fpstatus); 
2001/1121/sys/src/9/alphapc/trap.c:707,7522002/0417/sys/src/9/alphapc/trap.c:710,757
1999/0415    
	sp = ur->sp; 
1999/0515    
	up->nerrlab = 0; 
1999/0415    
	ret = -1; 
	if(waserror()) 
		goto error; 
2002/0417    
	if(!waserror()) { 
		if(scallnr >= nsyscall || systab[scallnr] == nil){ 
			pprint("bad sys call %d pc %lux\n", up->scallnr, (ulong)ur->pc); 
			postnote(up, 1, "sys: bad sys call", NDebug); 
			error(Ebadarg); 
		} 
1999/0415    
 
	if(up->scallnr >= nsyscall){ 
1999/0515    
		pprint("bad sys call %d pc %lux\n", 
			up->scallnr, (ulong)ur->pc); 
1999/0415    
print("bad sys call %d pc %lux\n", up->scallnr, (ulong)ur->pc); 
		postnote(up, 1, "sys: bad sys call", NDebug); 
		error(Ebadarg); 
	} 
2002/0417    
		if(sp & (BY2WD-1)){	/* XXX too weak? */ 
			pprint("odd sp in sys call pc %lux sp %lux\n", 
				(ulong)ur->pc, (ulong)ur->sp); 
			postnote(up, 1, "sys: odd stack", NDebug); 
			error(Ebadarg); 
		} 
1999/0415    
 
	if(sp & (BY2WD-1)){	/* XXX too weak? */ 
1999/0515    
		pprint("odd sp in sys call pc %lux sp %lux\n", 
			(ulong)ur->pc, (ulong)ur->sp); 
1999/0415    
		postnote(up, 1, "sys: odd stack", NDebug); 
		error(Ebadarg); 
2002/0417    
		if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs))) 
			validaddr(sp, sizeof(Sargs), 0); 
 
		up->s = *((Sargs*)(sp+2*BY2WD)); 
		up->psstate = sysctab[scallnr]; 
		ret = systab[scallnr](up->s.args); 
		poperror(); 
	}else{ 
		/* failure: save the error buffer for errstr */ 
		e = up->syserrstr; 
		up->syserrstr = up->errstr; 
		up->errstr = e; 
1999/0415    
	} 
2002/0417    
	if(up->nerrlab){ 
		print("bad errstack [%uld]: %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"); 
	} 
1999/0415    
 
	if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-sizeof(Sargs))) 
		validaddr(sp, sizeof(Sargs), 0); 
                 
	up->s = *((Sargs*)(sp+2*BY2WD)); 
	up->psstate = sysctab[up->scallnr]; 
                 
	ret = (*systab[up->scallnr])(up->s.args); 
	poperror(); 
                 
error: 
2001/0822    
	/* failure: save the error buffer for errstr */ 
2001/0924    
	e = up->syserrstr; 
	up->syserrstr = up->errstr; 
	up->errstr = e; 
                 
1999/0415    
	up->nerrlab = 0; 
	up->psstate = 0; 
	up->insyscall = 0; 
1999/0515    
	if(up->scallnr == NOTED)			/* ugly hack */ 
2002/0417    
	if(scallnr == NOTED)			/* ugly hack */ 
1999/0415    
		noted(ur, &aur, *(ulong*)(sp+2*BY2WD));	/* doesn't return */ 
 
	if(up->scallnr!=RFORK && (up->procctl || up->nnote)){ 
2002/0417    
	if(scallnr!=RFORK && (up->procctl || up->nnote)){ 
1999/0415    
		ur->r0 = ret;				/* load up for noted() */ 
		if(notify(ur)) 
			return ur->r0; 


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