bpt.c 2.1 KB

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