regs.c 2.0 KB

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