fptrap.c 707 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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. #include "../port/error.h"
  9. char *fpcause[] =
  10. {
  11. "invalid operation",
  12. "division by zero",
  13. "overflow",
  14. "underflow",
  15. "inexact operation",
  16. "integer overflow",
  17. };
  18. char *fpexcname(Ureg*, ulong, char*);
  19. void
  20. fptrap(Ureg *ur)
  21. {
  22. char buf[ERRMAX];
  23. int i;
  24. ulong reason;
  25. ur->pc &= ~2;
  26. reason = (ulong)ur->a0;
  27. for (i = 1; i < 6; i++)
  28. if (reason & (1<<i)) {
  29. sprint(buf, "fp: %s", fpcause[i-1]);
  30. goto found;
  31. }
  32. sprint(buf, "fp: code 0x%lux", reason);
  33. found:
  34. fataltrap(ur, buf);
  35. }
  36. char*
  37. fpexcname(Ureg *ur, ulong fcr31, char *buf)
  38. {
  39. USED(ur, fcr31, buf);
  40. return buf;
  41. }