regs.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * code to keep track of registers
  3. */
  4. #include "defs.h"
  5. #include "fns.h"
  6. /*
  7. * translate a name to a magic register offset
  8. */
  9. Reglist*
  10. rname(char *name)
  11. {
  12. Reglist *rp;
  13. for (rp = mach->reglist; rp->rname; rp++)
  14. if (strcmp(name, rp->rname) == 0)
  15. return rp;
  16. return 0;
  17. }
  18. static vlong
  19. getreg(Map *map, Reglist *rp)
  20. {
  21. vlong v;
  22. long w;
  23. int ret;
  24. v = 0;
  25. ret = 0;
  26. switch (rp->rformat)
  27. {
  28. case 'x':
  29. ret = get2(map, rp->roffs, (ushort*) &w);
  30. v = w;
  31. break;
  32. case 'f':
  33. case 'X':
  34. ret = get4(map, rp->roffs, (long*) &w);
  35. v = w;
  36. break;
  37. case 'F':
  38. case 'W':
  39. case 'Y':
  40. ret = get8(map, rp->roffs, &v);
  41. break;
  42. default:
  43. werrstr("can't retrieve register %s", rp->rname);
  44. error("%r");
  45. }
  46. if (ret < 0) {
  47. werrstr("Register %s: %r", rp->rname);
  48. error("%r");
  49. }
  50. return v;
  51. }
  52. vlong
  53. rget(Map *map, char *name)
  54. {
  55. Reglist *rp;
  56. rp = rname(name);
  57. if (!rp)
  58. error("invalid register name");
  59. return getreg(map, rp);
  60. }
  61. void
  62. rput(Map *map, char *name, vlong v)
  63. {
  64. Reglist *rp;
  65. int ret;
  66. rp = rname(name);
  67. if (!rp)
  68. error("invalid register name");
  69. if (rp->rflags & RRDONLY)
  70. error("register is read-only");
  71. switch (rp->rformat)
  72. {
  73. case 'x':
  74. ret = put2(map, rp->roffs, (ushort) v);
  75. break;
  76. case 'X':
  77. case 'f':
  78. case 'F':
  79. ret = put4(map, rp->roffs, (long) v);
  80. break;
  81. case 'Y':
  82. ret = put8(map, rp->roffs, v);
  83. break;
  84. default:
  85. ret = -1;
  86. }
  87. if (ret < 0)
  88. error("can't write register");
  89. }
  90. /*
  91. * print the registers
  92. */
  93. void
  94. printregs(int c)
  95. {
  96. Reglist *rp;
  97. int i;
  98. for (i = 1, rp = mach->reglist; rp->rname; rp++, i++) {
  99. if ((rp->rflags & RFLT)) {
  100. if (c != 'R')
  101. continue;
  102. if (rp->rformat == '8' || rp->rformat == '3')
  103. continue;
  104. }
  105. if(rp->rformat == 'Y')
  106. dprint("%-8s %-20#llux", rp->rname, getreg(cormap, rp));
  107. else
  108. dprint("%-8s %-12#lux", rp->rname, (ulong)getreg(cormap, rp));
  109. if ((i % 3) == 0) {
  110. dprint("\n");
  111. i = 0;
  112. }
  113. }
  114. if (i != 1)
  115. dprint("\n");
  116. dprint ("%s\n", machdata->excep(cormap, rget));
  117. printpc();
  118. }