1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #include "u.h"
- #include "../port/lib.h"
- #include "mem.h"
- #include "dat.h"
- #include "fns.h"
- #include "ureg.h"
- #include "../port/error.h"
- /*
- * find out fault address and type of access.
- * Call common fault handler.
- */
- void
- faultalpha(Ureg *ur)
- {
- ulong addr, cause;
- int read, user;
- char buf[ERRMAX];
- uvlong x;
- x = ur->a0&0xffffffff80000000LL;
- if (x != 0LL && x != 0xffffffff80000000LL)
- iprint("faultalpha bad addr %llux pc %llux\n", ur->a0, ur->pc);
- addr = (ulong)ur->a0;
- cause = (ulong)ur->a2;
- addr &= ~(BY2PG-1);
- read = (cause !=1);
- user = (ulong)ur->status&UMODE;
- /* print("fault %s pc=0x%lux addr=0x%lux 0x%lux\n",
- read? (cause != 0) ? "ifetch" : "read" : "write", (ulong)ur->pc, addr, (ulong)ur->a1); /**/
- if(fault(addr, read) == 0)
- return;
- if(user){
- sprint(buf, "sys: trap: fault %s addr=0x%lux",
- read? (cause != 0) ? "ifetch" : "read" : "write", (ulong)ur->a0);
- postnote(up, 1, buf, NDebug);
- return;
- }
- iprint("kernel %s vaddr=0x%lux\n", read? (cause != 0) ? "ifetch" : "read" : "write", (ulong)ur->a0);
- if(0)
- mmudump();
- dumpregs(ur);
- _dumpstack(ur);
- exit(1);
- }
- /*
- * called in sysfile.c
- */
- void
- evenaddr(ulong addr)
- {
- if(addr & 3){
- postnote(up, 1, "sys: odd address", NDebug);
- error(Ebadarg);
- }
- }
|