faultalpha.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 "../port/error.h"
  8. /*
  9. * find out fault address and type of access.
  10. * Call common fault handler.
  11. */
  12. void
  13. faultalpha(Ureg *ur)
  14. {
  15. ulong addr, cause;
  16. int read, user;
  17. char buf[ERRMAX];
  18. uvlong x;
  19. x = ur->a0&0xffffffff80000000LL;
  20. if (x != 0LL && x != 0xffffffff80000000LL)
  21. iprint("faultalpha bad addr %llux pc %llux\n", ur->a0, ur->pc);
  22. addr = (ulong)ur->a0;
  23. cause = (ulong)ur->a2;
  24. addr &= ~(BY2PG-1);
  25. read = (cause !=1);
  26. user = (ulong)ur->status&UMODE;
  27. /* print("fault %s pc=0x%lux addr=0x%lux 0x%lux\n",
  28. read? (cause != 0) ? "ifetch" : "read" : "write", (ulong)ur->pc, addr, (ulong)ur->a1); /**/
  29. if(fault(addr, read) == 0)
  30. return;
  31. if(user){
  32. sprint(buf, "sys: trap: fault %s addr=0x%lux",
  33. read? (cause != 0) ? "ifetch" : "read" : "write", (ulong)ur->a0);
  34. postnote(up, 1, buf, NDebug);
  35. return;
  36. }
  37. iprint("kernel %s vaddr=0x%lux\n", read? (cause != 0) ? "ifetch" : "read" : "write", (ulong)ur->a0);
  38. if(0)
  39. mmudump();
  40. dumpregs(ur);
  41. _dumpstack(ur);
  42. exit(1);
  43. }
  44. /*
  45. * called in sysfile.c
  46. */
  47. void
  48. evenaddr(ulong addr)
  49. {
  50. if(addr & 3){
  51. postnote(up, 1, "sys: odd address", NDebug);
  52. error(Ebadarg);
  53. }
  54. }