V4/nsys/ken/trap.c

Compare this file to the similar file:
Show the results in this format:

#include "/sys/nsys/param.h"
#include "/sys/nsys/systm.h"
#include "/sys/nsys/user.h"
#include "/sys/nsys/proc.h"
#include "/sys/nsys/reg.h"
#include "/sys/nsys/text.h"

#define	EBIT	1
#define	UMODE	0170000
struct	{
	int	count;
	int	(*call)();
} sysent[64];
struct {
	char	hibyte;
	char	lobyte;
};
char	regloc[8]
{
	R0, R1, R2, R3, R4, R5, R6, R7
};

trap(dev, sp, r4, r3, r2, r1, nps, r0, pc, ps)
char *sp;
{
	int i, a;

	if(dev == 8) {
		psignal(u.u_procp, SIGFPT);
		return;
	}
	if((ps&UMODE) != UMODE)
		goto bad;
	if(dev==9 && sp<-u.u_ssize*64) {
		(&r0)[regloc[ssr[1].lobyte&07]] =- ssr[1].lobyte>>3;
		(&r0)[regloc[ssr[1].hibyte&07]] =- ssr[1].hibyte>>3;
		pc = ssr[2];
		if(!estabur(u.u_tsize, u.u_dsize, u.u_ssize+SINCR)) {
			u.u_ssize =+ SINCR;
			expand(u.u_procp->p_size+SINCR);
			a = u.u_procp->p_addr + u.u_procp->p_size;
			for(i=0; i<u.u_ssize; i++) {
				a--;
				copyseg(a-SINCR, a);
			}
			return;
		}
	}
	u.u_error = 0;
	switch(dev) {

	case 0:
		i = SIGBUS;
		goto def;

	case 1:
		i = SIGINS;
		goto def;

	case 2:
		i = SIGTRC;
		goto def;

	case 3:
		i = SIGIOT;
		goto def;

	case 5:
		i = SIGEMT;
		goto def;

	case 9:
		i = SIGSEG;
		goto def;

	def:
		psignal(u.u_procp, i);

	default:
		u.u_error = dev+100;

	case 6:;
	}
	if(u.u_error)
		goto err;
	ps =& ~EBIT;
	dev = fuword(pc-2)&077;
	if(dev == 0) { /* indirect */
		a = fuword(pc);
		pc =+ 2;
		dev = fuword(a)&077;
		a =+ 2;
	} else {
		a = pc;
		pc =+ sysent[dev].count*2;
	}
	for(i=0; i<sysent[dev].count; i++) {
		u.u_arg[i] = fuword(a);
		a =+ 2;
	}
	u.u_dirp = u.u_arg[0];
	u.u_ar0 = &r0;
	trap1(sysent[dev].call);
	if(u.u_error >= 100)
		psignal(u.u_procp, SIGSYS);
err:
	if(issig())
		psig();
	if(u.u_error != 0) {
		ps =| EBIT;
		r0 = u.u_error;
	}
	u.u_procp->p_pri = PUSER + u.u_procp->p_ndis;
	if((i=u.u_procp->p_textp)!=0 && i->x_ccount==0)
		panic("text not loaded");
	return;

bad:
	printf("dev = %o\n", dev);
	printf("sp  = %o\n", sp);
	printf("pc  = %o\n", pc);
	printf("ps  = %o\n", ps);
	printf("aps = %o\n", &ps);
	panic("trap");
}

trap1(f)
int (*f)();
{

	savu(u.u_qsav);
	(*f)();
}

nosys()
{

	printf("sys %d\n", u.u_ar0[-7]);
	u.u_error = 100;
}

nullsys()
{
}