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

1993/1113/pc/trap.c (diff list | history)

1993/1022/sys/src/9/pc/trap.c:219,2241993/1113/sys/src/9/pc/trap.c:219,225 (short | long | prev | next)
1991/1113    
}; 
 
1993/0915    
Ureg lasttrap, *lastur; 
1993/1113    
Proc *lastup; 
1993/0915    
 
 
1991/0614    
/* 
1993/1022/sys/src/9/pc/trap.c:234,2431993/1113/sys/src/9/pc/trap.c:235,251
1991/0703    
 
1991/0731    
	v = ur->trap; 
 
1991/1112    
	user = ((ur->cs)&0xffff)!=KESEL && v!=Syscallvec; 
1993/1113    
	user = (ur->cs&0xffff) == UESEL; 
1991/1112    
	if(user) 
1993/0915    
		up->dbgreg = ur; 
1991/1112    
 
1993/1113    
ur->cs &= 0xffff; 
ur->ds &= 0xffff; 
ur->es &= 0xffff; 
ur->fs &= 0xffff; 
ur->gs &= 0xffff; 
if(user) ur->ss &= 0xffff; 
 
1991/0709    
	/* 
	 *  tell the 8259 that we're done with the 
1991/0801    
	 *  highest level interrupt (interrupts are still 
1993/1022/sys/src/9/pc/trap.c:253,2581993/1113/sys/src/9/pc/trap.c:261,267
1993/0217    
	if(v>=256 || (h = halloc.ivec[v]) == 0){ 
1993/0915    
lasttrap = *ur; 
lastur = ur; 
1993/1113    
lastup = up; 
1993/0224    
		/* an old 386 generates these fairly often, no idea why */ 
1991/1214    
		if(v == 13) 
			return; 
1993/1022/sys/src/9/pc/trap.c:292,2971993/1113/sys/src/9/pc/trap.c:301,308
1993/0915    
	splhi(); 
	if(user && (up->procctl || up->nnote)) 
1991/0910    
		notify(ur); 
1993/1113    
 
lastup = up; 
1993/0915    
lasttrap = *ur; 
lastur = ur; 
1991/0806    
} 
1993/1022/sys/src/9/pc/trap.c:307,3201993/1113/sys/src/9/pc/trap.c:318,331
1991/0718    
	else 
		print("registers for kernel\n"); 
1993/0915    
	print("FLAGS=%lux TRAP=%lux ECODE=%lux CS=%lux PC=%lux", ur->flags, ur->trap, 
1991/1214    
		ur->ecode, ur->cs&0xff, ur->pc); 
1993/1013    
	print(" SS=%lux USP=%lux\n", ur->ss&0xff, ur->usp); 
1993/1113    
		ur->ecode, ur->cs, ur->pc); 
	print(" SS=%lux USP=%lux\n", ur->ss, ur->usp); 
1991/0718    
	print("  AX %8.8lux  BX %8.8lux  CX %8.8lux  DX %8.8lux\n", 
		ur->ax, ur->bx, ur->cx, ur->dx); 
1991/1214    
	print("  SI %8.8lux  DI %8.8lux  BP %8.8lux\n", 
		ur->si, ur->di, ur->bp); 
	print("  DS %4.4ux  ES %4.4ux  FS %4.4ux  GS %4.4ux\n", 
		ur->ds&0xffff, ur->es&0xffff, ur->fs&0xffff, ur->gs&0xffff); 
1993/1113    
	print("  DS %4.4lux  ES %4.4lux  FS %4.4lux  GS %4.4lux\n", 
		ur->ds, ur->es, ur->fs, ur->gs); 
1993/0915    
 
1991/0718    
} 
 
1993/1022/sys/src/9/pc/trap.c:321,3301993/1113/sys/src/9/pc/trap.c:332,348
1991/0720    
void 
1993/0915    
dumpregs(Ureg *ur) 
{ 
1993/1113    
	ulong *x; 
 
	x = (ulong*)(ur+1); 
1993/0915    
	dumpregs2(ur); 
	print("  ur %lux\n", ur); 
1993/1113    
	print("  magic %lux %lux %lux\n", x[0], x[1], x[2]); 
	print("  ur %lux up %lux\n", ur, up); 
1993/0915    
	dumpregs2(&lasttrap); 
	print("  lastur %lux\n", lastur); 
1993/1113    
	print("  lastur %lux lastup %lux\n", lastur); 
splhi(); 
dumpstack(); 
for(;;); 
1993/0915    
} 
 
void 
1993/1022/sys/src/9/pc/trap.c:332,3801993/1113/sys/src/9/pc/trap.c:350,377
1991/0720    
{ 
1992/0804    
	ulong l, v, i; 
	extern ulong etext; 
1993/1113    
	int lim; 
1992/0804    
 
1993/0915    
	if(up == 0) 
1992/0804    
		return; 
 
	i = 0; 
1993/1013    
	for(l=(ulong)&l; l<(ulong)(up->kstack+BY2PG); l+=4){ 
1993/1113    
	lim = 3; 
	for(l=(ulong)&l; l<(ulong)(up->kstack+BY2PG) && lim; l+=4){ 
1992/0804    
		v = *(ulong*)l; 
		if(KTZERO < v && v < (ulong)&etext){ 
			print("%lux ", v); 
			i++; 
		} 
		if(i == 4){ 
1993/1113    
		if(i == 8){ 
1992/0804    
			i = 0; 
			print("\n"); 
1993/1113    
			lim--; 
1992/0804    
		} 
	} 
 
1991/0720    
} 
 
1991/1214    
long 
execregs(ulong entry, ulong ssize, ulong nargs) 
1991/0720    
{ 
1991/1214    
	ulong *sp; 
1993/1013    
	Ureg *ur; 
1991/1214    
                 
	sp = (ulong*)(USTKTOP - ssize); 
	*--sp = nargs; 
1993/1013    
                 
	ur = up->dbgreg; 
	ur->usp = (ulong)sp; 
	ur->pc = entry; 
1991/1214    
	return USTKTOP-BY2WD;			/* address of user-level clock */ 
1991/0720    
} 
                 
1992/0120    
ulong 
userpc(void) 
{ 
1993/1013    
	Ureg *ur; 
                 
	ur = (Ureg*)up->dbgreg; 
	return ur->pc; 
1992/0120    
} 
                 
1991/0718    
/* 
1991/0710    
 *  system calls 
 */ 
1993/1022/sys/src/9/pc/trap.c:573,5781993/1113/sys/src/9/pc/trap.c:570,599
1991/0720    
	} 
1991/1112    
} 
 
1993/1113    
long 
execregs(ulong entry, ulong ssize, ulong nargs) 
{ 
	ulong *sp; 
	Ureg *ur; 
 
	sp = (ulong*)(USTKTOP - ssize); 
	*--sp = nargs; 
 
	ur = up->dbgreg; 
	ur->usp = (ulong)sp; 
	ur->pc = entry; 
	return USTKTOP-BY2WD;			/* address of user-level clock */ 
} 
 
ulong 
userpc(void) 
{ 
	Ureg *ur; 
 
	ur = (Ureg*)up->dbgreg; 
	return ur->pc; 
} 
 
1991/1112    
/* This routine must save the values of registers the user is not permitted to write 
 * from devproc and the restore the saved values before returning 
 */ 
1993/1022/sys/src/9/pc/trap.c:590,5951993/1113/sys/src/9/pc/trap.c:611,655
1991/1112    
	xp->flags = (xp->flags & 0xff) | (flags & 0xff00); 
	xp->cs = cs; 
	xp->ss = ss; 
1993/1113    
} 
 
static void 
linkproc(void) 
{ 
	spllo(); 
	(*up->kpfun)(up->kparg); 
} 
 
void 
kprocchild(Proc *p, void (*func)(void*), void *arg) 
{ 
	p->sched.pc = (ulong)linkproc; 
	p->sched.sp = (ulong)p->kstack+KSTACK; 
 
	p->kpfun = func; 
	p->kparg = arg; 
} 
 
void 
forkchild(Proc *p, Ureg *ur) 
{ 
	Ureg *cur; 
 
	/* 
	 * We add 2*BY2Wd to the stack because we have to account for 
	 *  - the return PC 
	 *  - trap's argument (ur) 
	 */ 
	p->sched.sp = (ulong)p->kstack+KSTACK-(sizeof(Ureg)+2*BY2WD); 
	p->sched.pc = (ulong)forkret; 
 
	cur = (Ureg*)(p->sched.sp+2*BY2WD); 
	memmove(cur, ur, sizeof(Ureg)); 
	cur->ax = 0;				/* return value of syscall in child */ 
 
	/* Things from bottom of syscall we never got to execute */ 
	p->psstate = 0; 
	p->insyscall = 0; 
1991/0614    
} 
1993/1022    
 
/* Give enough context in the ureg to produce a kernel stack for 


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