1fa521b03SWarner Losh /*- 2497b6b2aSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3497b6b2aSPedro F. Giffuni * 472d44f31SMarcel Moolenaar * Copyright (c) 2004 Marcel Moolenaar 572d44f31SMarcel Moolenaar * All rights reserved. 672d44f31SMarcel Moolenaar * 772d44f31SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 872d44f31SMarcel Moolenaar * modification, are permitted provided that the following conditions 972d44f31SMarcel Moolenaar * are met: 1072d44f31SMarcel Moolenaar * 1172d44f31SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 1272d44f31SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 1372d44f31SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 1472d44f31SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 1572d44f31SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 1672d44f31SMarcel Moolenaar * 1772d44f31SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1872d44f31SMarcel Moolenaar * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1972d44f31SMarcel Moolenaar * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2072d44f31SMarcel Moolenaar * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2172d44f31SMarcel Moolenaar * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2272d44f31SMarcel Moolenaar * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2372d44f31SMarcel Moolenaar * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2472d44f31SMarcel Moolenaar * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2572d44f31SMarcel Moolenaar * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2672d44f31SMarcel Moolenaar * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2772d44f31SMarcel Moolenaar * 2872d44f31SMarcel Moolenaar * $FreeBSD$ 2972d44f31SMarcel Moolenaar */ 3072d44f31SMarcel Moolenaar 3172d44f31SMarcel Moolenaar #ifndef _GDB_GDB_INT_H_ 3272d44f31SMarcel Moolenaar #define _GDB_GDB_INT_H_ 3372d44f31SMarcel Moolenaar 34dda17b36SConrad Meyer #include "opt_ddb.h" 35dda17b36SConrad Meyer 3610f6c05cSConrad Meyer #include <sys/sysctl.h> 3710f6c05cSConrad Meyer 38dda17b36SConrad Meyer #ifdef DDB 39dda17b36SConrad Meyer #include <ddb/ddb.h> 40dda17b36SConrad Meyer #endif 41dda17b36SConrad Meyer 425df6fa43SConrad Meyer #ifndef EOF 435df6fa43SConrad Meyer #define EOF (-1) 445df6fa43SConrad Meyer #endif 455df6fa43SConrad Meyer 4610f6c05cSConrad Meyer SYSCTL_DECL(_debug_gdb); 4710f6c05cSConrad Meyer 4872d44f31SMarcel Moolenaar extern struct gdb_dbgport *gdb_cur; 4972d44f31SMarcel Moolenaar 507d0c6c9fSSam Leffler extern int gdb_listening; 517d0c6c9fSSam Leffler void gdb_consinit(void); 527d0c6c9fSSam Leffler 5372d44f31SMarcel Moolenaar extern char *gdb_rxp; 5472d44f31SMarcel Moolenaar extern size_t gdb_rxsz; 5572d44f31SMarcel Moolenaar extern char *gdb_txp; 5672d44f31SMarcel Moolenaar 57*6310546dSConrad Meyer extern bool gdb_ackmode; 58*6310546dSConrad Meyer 59dda17b36SConrad Meyer #ifdef DDB 60dda17b36SConrad Meyer /* If set, return to DDB when controlling GDB detaches. */ 61dda17b36SConrad Meyer extern bool gdb_return_to_ddb; 62dda17b36SConrad Meyer #endif 63dda17b36SConrad Meyer 6472d44f31SMarcel Moolenaar int gdb_rx_begin(void); 6572d44f31SMarcel Moolenaar int gdb_rx_equal(const char *); 6672d44f31SMarcel Moolenaar int gdb_rx_mem(unsigned char *, size_t); 6772d44f31SMarcel Moolenaar int gdb_rx_varhex(uintmax_t *); 6872d44f31SMarcel Moolenaar 6972d44f31SMarcel Moolenaar static __inline int 7072d44f31SMarcel Moolenaar gdb_rx_char(void) 7172d44f31SMarcel Moolenaar { 7272d44f31SMarcel Moolenaar int c; 7372d44f31SMarcel Moolenaar 7472d44f31SMarcel Moolenaar if (gdb_rxsz > 0) { 7572d44f31SMarcel Moolenaar c = *gdb_rxp++; 7672d44f31SMarcel Moolenaar gdb_rxsz--; 7772d44f31SMarcel Moolenaar } else 785df6fa43SConrad Meyer c = EOF; 7972d44f31SMarcel Moolenaar return (c); 8072d44f31SMarcel Moolenaar } 8172d44f31SMarcel Moolenaar 8272d44f31SMarcel Moolenaar void gdb_tx_begin(char); 8372d44f31SMarcel Moolenaar int gdb_tx_end(void); 8472d44f31SMarcel Moolenaar int gdb_tx_mem(const unsigned char *, size_t); 8572d44f31SMarcel Moolenaar void gdb_tx_reg(int); 86130ef1adSConrad Meyer bool gdb_txbuf_has_capacity(size_t); 8727ecc2adSBenno Rice int gdb_rx_bindata(unsigned char *data, size_t datalen, size_t *amt); 8827ecc2adSBenno Rice int gdb_search_mem(const unsigned char *addr, size_t size, 8927ecc2adSBenno Rice const unsigned char *pat, size_t patlen, const unsigned char **found); 9072d44f31SMarcel Moolenaar 9172d44f31SMarcel Moolenaar static __inline void 9272d44f31SMarcel Moolenaar gdb_tx_char(char c) 9372d44f31SMarcel Moolenaar { 9472d44f31SMarcel Moolenaar *gdb_txp++ = c; 9572d44f31SMarcel Moolenaar } 9672d44f31SMarcel Moolenaar 9772d44f31SMarcel Moolenaar static __inline int 9872d44f31SMarcel Moolenaar gdb_tx_empty(void) 9972d44f31SMarcel Moolenaar { 10072d44f31SMarcel Moolenaar gdb_tx_begin('\0'); 10172d44f31SMarcel Moolenaar return (gdb_tx_end()); 10272d44f31SMarcel Moolenaar } 10372d44f31SMarcel Moolenaar 10472d44f31SMarcel Moolenaar static __inline void 10572d44f31SMarcel Moolenaar gdb_tx_hex(uintmax_t n, int sz) 10672d44f31SMarcel Moolenaar { 10772d44f31SMarcel Moolenaar gdb_txp += sprintf(gdb_txp, "%0*jx", sz, n); 10872d44f31SMarcel Moolenaar } 10972d44f31SMarcel Moolenaar 11072d44f31SMarcel Moolenaar static __inline int 11172d44f31SMarcel Moolenaar gdb_tx_err(int err) 11272d44f31SMarcel Moolenaar { 11372d44f31SMarcel Moolenaar gdb_tx_begin('E'); 11472d44f31SMarcel Moolenaar gdb_tx_hex(err, 2); 11572d44f31SMarcel Moolenaar return (gdb_tx_end()); 11672d44f31SMarcel Moolenaar } 11772d44f31SMarcel Moolenaar 11872d44f31SMarcel Moolenaar static __inline int 11972d44f31SMarcel Moolenaar gdb_tx_ok(void) 12072d44f31SMarcel Moolenaar { 12172d44f31SMarcel Moolenaar gdb_tx_begin('O'); 12272d44f31SMarcel Moolenaar gdb_tx_char('K'); 12372d44f31SMarcel Moolenaar return (gdb_tx_end()); 12472d44f31SMarcel Moolenaar } 12572d44f31SMarcel Moolenaar 12672d44f31SMarcel Moolenaar static __inline void 12772d44f31SMarcel Moolenaar gdb_tx_str(const char *s) 12872d44f31SMarcel Moolenaar { 12972d44f31SMarcel Moolenaar while (*s) 13072d44f31SMarcel Moolenaar *gdb_txp++ = *s++; 13172d44f31SMarcel Moolenaar } 13272d44f31SMarcel Moolenaar 13372d44f31SMarcel Moolenaar static __inline void 13472d44f31SMarcel Moolenaar gdb_tx_varhex(uintmax_t n) 13572d44f31SMarcel Moolenaar { 13672d44f31SMarcel Moolenaar gdb_txp += sprintf(gdb_txp, "%jx", n); 13772d44f31SMarcel Moolenaar } 13872d44f31SMarcel Moolenaar 139*6310546dSConrad Meyer static __inline void 140*6310546dSConrad Meyer gdb_nack(void) 141*6310546dSConrad Meyer { 142*6310546dSConrad Meyer if (gdb_ackmode) 143*6310546dSConrad Meyer gdb_cur->gdb_putc('-'); 144*6310546dSConrad Meyer } 145*6310546dSConrad Meyer 146*6310546dSConrad Meyer static __inline void 147*6310546dSConrad Meyer gdb_ack(void) 148*6310546dSConrad Meyer { 149*6310546dSConrad Meyer if (gdb_ackmode) 150*6310546dSConrad Meyer gdb_cur->gdb_putc('+'); 151*6310546dSConrad Meyer } 152*6310546dSConrad Meyer 15372d44f31SMarcel Moolenaar #endif /* !_GDB_GDB_INT_H_ */ 154