gdb_int.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*-
  2. * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
  3. *
  4. * Copyright (c) 2004 Marcel Moolenaar
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. *
  17. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. *
  28. * $FreeBSD$
  29. */
  30. #ifndef _GDB_GDB_INT_H_
  31. #define _GDB_GDB_INT_H_
  32. #include "opt_ddb.h"
  33. #include <sys/sysctl.h>
  34. #ifdef DDB
  35. #include <ddb/ddb.h>
  36. #endif
  37. #ifndef EOF
  38. #define EOF (-1)
  39. #endif
  40. SYSCTL_DECL(_debug_gdb);
  41. extern struct gdb_dbgport *gdb_cur;
  42. extern int gdb_listening;
  43. void gdb_consinit(void);
  44. extern char *gdb_rxp;
  45. extern size_t gdb_rxsz;
  46. extern char *gdb_txp;
  47. extern bool gdb_ackmode;
  48. #ifdef DDB
  49. /* If set, return to DDB when controlling GDB detaches. */
  50. extern bool gdb_return_to_ddb;
  51. #endif
  52. int gdb_rx_begin(void);
  53. int gdb_rx_equal(const char *);
  54. int gdb_rx_mem(unsigned char *, size_t);
  55. int gdb_rx_varhex(uintmax_t *);
  56. static __inline int
  57. gdb_rx_char(void)
  58. {
  59. int c;
  60. if (gdb_rxsz > 0) {
  61. c = *gdb_rxp++;
  62. gdb_rxsz--;
  63. } else
  64. c = EOF;
  65. return (c);
  66. }
  67. void gdb_tx_begin(char);
  68. int gdb_tx_end(void);
  69. int gdb_tx_mem(const unsigned char *, size_t);
  70. void gdb_tx_reg(int);
  71. bool gdb_txbuf_has_capacity(size_t);
  72. int gdb_rx_bindata(unsigned char *data, size_t datalen, size_t *amt);
  73. int gdb_search_mem(const unsigned char *addr, size_t size,
  74. const unsigned char *pat, size_t patlen, const unsigned char **found);
  75. static __inline void
  76. gdb_tx_char(char c)
  77. {
  78. *gdb_txp++ = c;
  79. }
  80. static __inline int
  81. gdb_tx_empty(void)
  82. {
  83. gdb_tx_begin('\0');
  84. return (gdb_tx_end());
  85. }
  86. static __inline void
  87. gdb_tx_hex(uintmax_t n, int sz)
  88. {
  89. gdb_txp += sprintf(gdb_txp, "%0*jx", sz, n);
  90. }
  91. static __inline int
  92. gdb_tx_err(int err)
  93. {
  94. gdb_tx_begin('E');
  95. gdb_tx_hex(err, 2);
  96. return (gdb_tx_end());
  97. }
  98. static __inline int
  99. gdb_tx_ok(void)
  100. {
  101. gdb_tx_begin('O');
  102. gdb_tx_char('K');
  103. return (gdb_tx_end());
  104. }
  105. static __inline void
  106. gdb_tx_str(const char *s)
  107. {
  108. while (*s)
  109. *gdb_txp++ = *s++;
  110. }
  111. static __inline void
  112. gdb_tx_varhex(uintmax_t n)
  113. {
  114. gdb_txp += sprintf(gdb_txp, "%jx", n);
  115. }
  116. static __inline void
  117. gdb_nack(void)
  118. {
  119. if (gdb_ackmode)
  120. gdb_cur->gdb_putc('-');
  121. }
  122. static __inline void
  123. gdb_ack(void)
  124. {
  125. if (gdb_ackmode)
  126. gdb_cur->gdb_putc('+');
  127. }
  128. #endif /* !_GDB_GDB_INT_H_ */