|
|
1.1 root 1: #include "u.h"
2: #include "../port/lib.h"
3: #include "mem.h"
4: #include "dat.h"
5: #include "fns.h"
6: #include "ureg.h"
7: #include "io.h"
8:
9: int faulting;
10:
11: void
12: fault386(Ureg *ur, void *a)
13: {
14: ulong addr;
15: int read;
16: int user;
17: int n;
18: int insyscall;
19: char buf[ERRLEN];
20:
21: USED(a);
22:
23: insyscall = u->p->insyscall;
24: u->p->insyscall = 1;
25: addr = getcr2();
26: read = !(ur->ecode & 2);
27: user = (ur->cs&0xffff) == UESEL;
28: spllo();
29: /* print("F%d:A#%lux:U%d:R%d|", u->p->pid, addr, user, read);/**/
30: n = fault(addr, read);
31: if(n < 0){
32: if(user){
33: sprint(buf, "sys: trap: fault %s addr=0x%lux",
34: read? "read" : "write", addr);
35: postnote(u->p, 1, buf, NDebug);
36: return;
37: }
38: dumpregs(ur);
39: panic("fault: 0x%lux", addr);
40: }
41: u->p->insyscall = insyscall;
42: }
43:
44: void
45: faultinit(void)
46: {
47: setvec(Faultvec, fault386, 0);
48: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.