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 31 #ifndef _GDB_GDB_INT_H_ 32 #define _GDB_GDB_INT_H_ 33 34 #ifndef EOF 35 #define EOF (-1) 36 #endif 37 38 extern struct gdb_dbgport *gdb_cur; 39 40 extern int gdb_listening; 41 void gdb_consinit(void); 42 43 extern char *gdb_rxp; 44 extern size_t gdb_rxsz; 45 extern char *gdb_txp; 46 47 int gdb_rx_begin(void); 48 int gdb_rx_equal(const char *); 49 int gdb_rx_mem(unsigned char *, size_t); 50 int gdb_rx_varhex(uintmax_t *); 51 52 static __inline int 53 gdb_rx_char(void) 54 { 55 int c; 56 57 if (gdb_rxsz > 0) { 58 c = *gdb_rxp++; 59 gdb_rxsz--; 60 } else 61 c = EOF; 62 return (c); 63 } 64 65 void gdb_tx_begin(char); 66 int gdb_tx_end(void); 67 int gdb_tx_mem(const unsigned char *, size_t); 68 void gdb_tx_reg(int); 69 bool gdb_txbuf_has_capacity(size_t); 70 int gdb_rx_bindata(unsigned char *data, size_t datalen, size_t *amt); 71 int gdb_search_mem(const unsigned char *addr, size_t size, 72 const unsigned char *pat, size_t patlen, const unsigned char **found); 73 74 static __inline void 75 gdb_tx_char(char c) 76 { 77 *gdb_txp++ = c; 78 } 79 80 static __inline int 81 gdb_tx_empty(void) 82 { 83 gdb_tx_begin('\0'); 84 return (gdb_tx_end()); 85 } 86 87 static __inline void 88 gdb_tx_hex(uintmax_t n, int sz) 89 { 90 gdb_txp += sprintf(gdb_txp, "%0*jx", sz, n); 91 } 92 93 static __inline int 94 gdb_tx_err(int err) 95 { 96 gdb_tx_begin('E'); 97 gdb_tx_hex(err, 2); 98 return (gdb_tx_end()); 99 } 100 101 static __inline int 102 gdb_tx_ok(void) 103 { 104 gdb_tx_begin('O'); 105 gdb_tx_char('K'); 106 return (gdb_tx_end()); 107 } 108 109 static __inline void 110 gdb_tx_str(const char *s) 111 { 112 while (*s) 113 *gdb_txp++ = *s++; 114 } 115 116 static __inline void 117 gdb_tx_varhex(uintmax_t n) 118 { 119 gdb_txp += sprintf(gdb_txp, "%jx", n); 120 } 121 122 #endif /* !_GDB_GDB_INT_H_ */ 123