rdb.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "u.h"
  2. #include "../port/lib.h"
  3. #include "mem.h"
  4. #include "dat.h"
  5. #include "fns.h"
  6. #include "io.h"
  7. #include "ureg.h"
  8. #define DBG if(0)scrprint
  9. #pragma varargck argpos scrprint 1
  10. static Ureg ureg;
  11. static void
  12. scrprint(char *fmt, ...)
  13. {
  14. char buf[128];
  15. va_list va;
  16. int n;
  17. va_start(va, fmt);
  18. n = vseprint(buf, buf+sizeof buf, fmt, va)-buf;
  19. va_end(va);
  20. putstrn(buf, n);
  21. }
  22. static char*
  23. getline(void)
  24. {
  25. static char buf[128];
  26. int i, c;
  27. for(;;){
  28. for(i=0; i<nelem(buf) && (c=uartgetc()) != '\n'; i++){
  29. DBG("%c...", c);
  30. buf[i] = c;
  31. }
  32. if(i < nelem(buf)){
  33. buf[i] = 0;
  34. return buf;
  35. }
  36. }
  37. }
  38. static void*
  39. addr(char *s, Ureg *ureg, char **p)
  40. {
  41. ulong a;
  42. a = strtoul(s, p, 16);
  43. if(a < sizeof(Ureg))
  44. return ((uchar*)ureg)+a;
  45. return (void*)a;
  46. }
  47. static void
  48. talkrdb(Ureg *ureg)
  49. {
  50. uchar *a;
  51. char *p, *req;
  52. serialoq = nil; /* turn off serial console */
  53. kprintoq = nil; /* turn off /dev/kprint if active */
  54. // scrprint("Plan 9 debugger\n");
  55. iprint("Edebugger reset\n");
  56. for(;;){
  57. req = getline();
  58. switch(*req){
  59. case 'r':
  60. a = addr(req+1, ureg, nil);
  61. DBG("read %p\n", a);
  62. iprint("R%.8lux %.2ux %.2ux %.2ux %.2ux\n",
  63. strtoul(req+1, 0, 16), a[0], a[1], a[2], a[3]);
  64. break;
  65. case 'w':
  66. a = addr(req+1, ureg, &p);
  67. *(ulong*)a = strtoul(p, nil, 16);
  68. iprint("W\n");
  69. break;
  70. /*
  71. * case Tmput:
  72. n = min[4];
  73. if(n > 4){
  74. mesg(Rerr, Ecount);
  75. break;
  76. }
  77. a = addr(min+0);
  78. scrprint("mput %.8lux\n", a);
  79. memmove(a, min+5, n);
  80. mesg(Rmput, mout);
  81. break;
  82. *
  83. */
  84. default:
  85. DBG("unknown %c\n", *req);
  86. iprint("Eunknown message\n");
  87. break;
  88. }
  89. }
  90. }
  91. void
  92. rdb(void)
  93. {
  94. splhi();
  95. iprint("rdb...");
  96. callwithureg(talkrdb);
  97. }