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 34*dda17b36SConrad Meyer #include "opt_ddb.h" 35*dda17b36SConrad Meyer 3610f6c05cSConrad Meyer #include <sys/sysctl.h> 3710f6c05cSConrad Meyer 38*dda17b36SConrad Meyer #ifdef DDB 39*dda17b36SConrad Meyer #include <ddb/ddb.h> 40*dda17b36SConrad Meyer #endif 41*dda17b36SConrad 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*dda17b36SConrad Meyer #ifdef DDB 58*dda17b36SConrad Meyer /* If set, return to DDB when controlling GDB detaches. */ 59*dda17b36SConrad Meyer extern bool gdb_return_to_ddb; 60*dda17b36SConrad Meyer #endif 61*dda17b36SConrad Meyer 6272d44f31SMarcel Moolenaar int gdb_rx_begin(void); 6372d44f31SMarcel Moolenaar int gdb_rx_equal(const char *); 6472d44f31SMarcel Moolenaar int gdb_rx_mem(unsigned char *, size_t); 6572d44f31SMarcel Moolenaar int gdb_rx_varhex(uintmax_t *); 6672d44f31SMarcel Moolenaar 6772d44f31SMarcel Moolenaar static __inline int 6872d44f31SMarcel Moolenaar gdb_rx_char(void) 6972d44f31SMarcel Moolenaar { 7072d44f31SMarcel Moolenaar int c; 7172d44f31SMarcel Moolenaar 7272d44f31SMarcel Moolenaar if (gdb_rxsz > 0) { 7372d44f31SMarcel Moolenaar c = *gdb_rxp++; 7472d44f31SMarcel Moolenaar gdb_rxsz--; 7572d44f31SMarcel Moolenaar } else 765df6fa43SConrad Meyer c = EOF; 7772d44f31SMarcel Moolenaar return (c); 7872d44f31SMarcel Moolenaar } 7972d44f31SMarcel Moolenaar 8072d44f31SMarcel Moolenaar void gdb_tx_begin(char); 8172d44f31SMarcel Moolenaar int gdb_tx_end(void); 8272d44f31SMarcel Moolenaar int gdb_tx_mem(const unsigned char *, size_t); 8372d44f31SMarcel Moolenaar void gdb_tx_reg(int); 84130ef1adSConrad Meyer bool gdb_txbuf_has_capacity(size_t); 8527ecc2adSBenno Rice int gdb_rx_bindata(unsigned char *data, size_t datalen, size_t *amt); 8627ecc2adSBenno Rice int gdb_search_mem(const unsigned char *addr, size_t size, 8727ecc2adSBenno Rice const unsigned char *pat, size_t patlen, const unsigned char **found); 8872d44f31SMarcel Moolenaar 8972d44f31SMarcel Moolenaar static __inline void 9072d44f31SMarcel Moolenaar gdb_tx_char(char c) 9172d44f31SMarcel Moolenaar { 9272d44f31SMarcel Moolenaar *gdb_txp++ = c; 9372d44f31SMarcel Moolenaar } 9472d44f31SMarcel Moolenaar 9572d44f31SMarcel Moolenaar static __inline int 9672d44f31SMarcel Moolenaar gdb_tx_empty(void) 9772d44f31SMarcel Moolenaar { 9872d44f31SMarcel Moolenaar gdb_tx_begin('\0'); 9972d44f31SMarcel Moolenaar return (gdb_tx_end()); 10072d44f31SMarcel Moolenaar } 10172d44f31SMarcel Moolenaar 10272d44f31SMarcel Moolenaar static __inline void 10372d44f31SMarcel Moolenaar gdb_tx_hex(uintmax_t n, int sz) 10472d44f31SMarcel Moolenaar { 10572d44f31SMarcel Moolenaar gdb_txp += sprintf(gdb_txp, "%0*jx", sz, n); 10672d44f31SMarcel Moolenaar } 10772d44f31SMarcel Moolenaar 10872d44f31SMarcel Moolenaar static __inline int 10972d44f31SMarcel Moolenaar gdb_tx_err(int err) 11072d44f31SMarcel Moolenaar { 11172d44f31SMarcel Moolenaar gdb_tx_begin('E'); 11272d44f31SMarcel Moolenaar gdb_tx_hex(err, 2); 11372d44f31SMarcel Moolenaar return (gdb_tx_end()); 11472d44f31SMarcel Moolenaar } 11572d44f31SMarcel Moolenaar 11672d44f31SMarcel Moolenaar static __inline int 11772d44f31SMarcel Moolenaar gdb_tx_ok(void) 11872d44f31SMarcel Moolenaar { 11972d44f31SMarcel Moolenaar gdb_tx_begin('O'); 12072d44f31SMarcel Moolenaar gdb_tx_char('K'); 12172d44f31SMarcel Moolenaar return (gdb_tx_end()); 12272d44f31SMarcel Moolenaar } 12372d44f31SMarcel Moolenaar 12472d44f31SMarcel Moolenaar static __inline void 12572d44f31SMarcel Moolenaar gdb_tx_str(const char *s) 12672d44f31SMarcel Moolenaar { 12772d44f31SMarcel Moolenaar while (*s) 12872d44f31SMarcel Moolenaar *gdb_txp++ = *s++; 12972d44f31SMarcel Moolenaar } 13072d44f31SMarcel Moolenaar 13172d44f31SMarcel Moolenaar static __inline void 13272d44f31SMarcel Moolenaar gdb_tx_varhex(uintmax_t n) 13372d44f31SMarcel Moolenaar { 13472d44f31SMarcel Moolenaar gdb_txp += sprintf(gdb_txp, "%jx", n); 13572d44f31SMarcel Moolenaar } 13672d44f31SMarcel Moolenaar 13772d44f31SMarcel Moolenaar #endif /* !_GDB_GDB_INT_H_ */ 138