bpt.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ctype.h>
  4. #include <bio.h>
  5. #include <mach.h>
  6. #define Extern extern
  7. #include "sparc.h"
  8. void
  9. dobplist(void)
  10. {
  11. Breakpoint *b;
  12. char buf[512];
  13. for(b = bplist; b; b = b->next) {
  14. switch(b->type) {
  15. case Instruction:
  16. Bprint(bioout, "0x%lux,%d:b %d done, at ", b->addr, b->count, b->done);
  17. symoff(buf, sizeof(buf), b->addr, CTEXT);
  18. Bprint(bioout, "%s", buf);
  19. break;
  20. case Access:
  21. Bprint(bioout, "0x%lux,%d:ba %d done, at ", b->addr, b->count, b->done);
  22. symoff(buf, sizeof(buf), b->addr, CDATA);
  23. Bprint(bioout, "%s", buf);
  24. break;
  25. case Read:
  26. Bprint(bioout, "0x%lux,%d:br %d done, at ", b->addr, b->count, b->done);
  27. symoff(buf, sizeof(buf), b->addr, CDATA);
  28. Bprint(bioout, "%s", buf);
  29. break;
  30. case Write:
  31. Bprint(bioout, "0x%lux,%d:bw %d done, at ", b->addr, b->count, b->done);
  32. symoff(buf, sizeof(buf), b->addr, CDATA);
  33. Bprint(bioout, "%s", buf);
  34. break;
  35. case Equal:
  36. Bprint(bioout, "0x%lux,%d:be at ", b->addr, b->count);
  37. symoff(buf, sizeof(buf), b->addr, CDATA);
  38. Bprint(bioout, "%s", buf);
  39. break;
  40. }
  41. Bprint(bioout, "\n");
  42. }
  43. }
  44. void
  45. breakpoint(char *addr, char *cp)
  46. {
  47. Breakpoint *b;
  48. int type;
  49. cp = nextc(cp);
  50. type = Instruction;
  51. switch(*cp) {
  52. case 'r':
  53. membpt++;
  54. type = Read;
  55. break;
  56. case 'a':
  57. membpt++;
  58. type = Access;
  59. break;
  60. case 'w':
  61. membpt++;
  62. type = Write;
  63. break;
  64. case 'e':
  65. membpt++;
  66. type = Equal;
  67. break;
  68. }
  69. b = emalloc(sizeof(Breakpoint));
  70. b->addr = expr(addr);
  71. b->type = type;
  72. b->count = cmdcount;
  73. b->done = cmdcount;
  74. b->next = bplist;
  75. bplist = b;
  76. }
  77. void
  78. delbpt(char *addr)
  79. {
  80. Breakpoint *b, **l;
  81. ulong baddr;
  82. baddr = expr(addr);
  83. l = &bplist;
  84. for(b = *l; b; b = b->next) {
  85. if(b->addr == baddr) {
  86. if(b->type != Instruction)
  87. membpt++;
  88. *l = b->next;
  89. free(b);
  90. return;
  91. }
  92. l = &b->next;
  93. }
  94. Bprint(bioout, "no breakpoint\n");
  95. }
  96. void
  97. brkchk(ulong addr, int type)
  98. {
  99. Breakpoint *b;
  100. for(b = bplist; b; b = b->next) {
  101. if(b->addr == addr && (b->type&type)) {
  102. if(b->type == Equal && getmem_4(addr) == b->count) {
  103. count = 1;
  104. atbpt = 1;
  105. return;
  106. }
  107. if(--b->done == 0) {
  108. b->done = b->count;
  109. count = 1;
  110. atbpt = 1;
  111. return;
  112. }
  113. }
  114. }
  115. }