~kris/9p

9hist

ref: c1220b0e76e06e21711427fb1226d3ad8a516ebd 9hist/ss/faultsparc.c -rw-r--r-- 1.3 KiB
c1220b0e — David du Colombier Plan 9 from Bell Labs 1990-12-26 35 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include	"u.h"
#include	"lib.h"
#include	"mem.h"
#include	"dat.h"
#include	"fns.h"
#include	"ureg.h"
#include	"errno.h"


void
faultsparc(Ureg *ur)
{
	ulong addr, badvaddr;
	int user, read, insyscall;
	ulong tbr;

	tbr = ur->tbr&0xFFF;
	addr = ur->pc;			/* assume instr. exception */
	if(tbr == (9<<4))		/* data access exception */
		addr = getw2(SEVAR);
	else if(tbr != (1<<4)){		/* should be instruction access exception */
		trap(ur);
		panic("trap returns");
	}
	spllo();
print("fault: %s pc=0x%lux addr %lux\n", excname(ur->tbr), ur->pc, addr);
	if(u == 0){
		dumpregs(ur);
		panic("fault u==0 pc=%lux", ur->pc);
	}
	if(getw2(SER) & 0x8000)
		read = 0;
	else
		read = 1;
	insyscall = u->p->insyscall;
	u->p->insyscall = 1;
/*	addr &= VAMASK; /**/
	badvaddr = addr;
	addr &= ~(BY2PG-1);
	user = !(ur->psr&PSRSUPER);

	if(fault(addr, read) < 0){
		if(user){
			pprint("user %s error addr=0x%lux\n", read? "read" : "write", badvaddr);
			pprint("psr=0x%lux pc=0x%lux sp=0x%lux\n", ur->psr, ur->pc, ur->sp);
			pexit("Suicide", 0);
		}
		u->p->state = MMUing;
		dumpregs(ur);
		panic("fault: 0x%lux", badvaddr);
		exit();
	}
	u->p->insyscall = insyscall;
}

/*
 * called in sysfile.c
 */
void
evenaddr(ulong addr)
{
	if(addr & 3){
panic("evenaddr");
		postnote(u->p, 1, "sys: odd address", NDebug);
		error(Ebadarg);
	}
}