1139778Simp/*- 2131899Smarcel * Copyright (c) 2004 Marcel Moolenaar 3131899Smarcel * All rights reserved. 4131899Smarcel * 5131899Smarcel * Redistribution and use in source and binary forms, with or without 6131899Smarcel * modification, are permitted provided that the following conditions 7131899Smarcel * are met: 8131899Smarcel * 9131899Smarcel * 1. Redistributions of source code must retain the above copyright 10131899Smarcel * notice, this list of conditions and the following disclaimer. 11131899Smarcel * 2. Redistributions in binary form must reproduce the above copyright 12131899Smarcel * notice, this list of conditions and the following disclaimer in the 13131899Smarcel * documentation and/or other materials provided with the distribution. 14131899Smarcel * 15131899Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16131899Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17131899Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18131899Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19131899Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20131899Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21131899Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22131899Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23131899Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24131899Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25131899Smarcel * 26131899Smarcel * $FreeBSD$ 27131899Smarcel */ 28131899Smarcel 29131899Smarcel#ifndef _GDB_GDB_INT_H_ 30131899Smarcel#define _GDB_GDB_INT_H_ 31131899Smarcel 32131899Smarcelextern struct gdb_dbgport *gdb_cur; 33131899Smarcel 34157059Ssamextern int gdb_listening; 35157059Ssamvoid gdb_consinit(void); 36157059Ssam 37131899Smarcelextern char *gdb_rxp; 38131899Smarcelextern size_t gdb_rxsz; 39131899Smarcelextern char *gdb_txp; 40131899Smarcel 41131899Smarcelint gdb_rx_begin(void); 42131899Smarcelint gdb_rx_equal(const char *); 43131899Smarcelint gdb_rx_mem(unsigned char *, size_t); 44131899Smarcelint gdb_rx_varhex(uintmax_t *); 45131899Smarcel 46131899Smarcelstatic __inline int 47131899Smarcelgdb_rx_char(void) 48131899Smarcel{ 49131899Smarcel int c; 50131899Smarcel 51131899Smarcel if (gdb_rxsz > 0) { 52131899Smarcel c = *gdb_rxp++; 53131899Smarcel gdb_rxsz--; 54131899Smarcel } else 55131899Smarcel c = -1; 56131899Smarcel return (c); 57131899Smarcel} 58131899Smarcel 59131899Smarcelvoid gdb_tx_begin(char); 60131899Smarcelint gdb_tx_end(void); 61131899Smarcelint gdb_tx_mem(const unsigned char *, size_t); 62131899Smarcelvoid gdb_tx_reg(int); 63271173Sbennoint gdb_rx_bindata(unsigned char *data, size_t datalen, size_t *amt); 64271173Sbennoint gdb_search_mem(const unsigned char *addr, size_t size, 65271173Sbenno const unsigned char *pat, size_t patlen, const unsigned char **found); 66131899Smarcel 67131899Smarcelstatic __inline void 68131899Smarcelgdb_tx_char(char c) 69131899Smarcel{ 70131899Smarcel *gdb_txp++ = c; 71131899Smarcel} 72131899Smarcel 73131899Smarcelstatic __inline int 74131899Smarcelgdb_tx_empty(void) 75131899Smarcel{ 76131899Smarcel gdb_tx_begin('\0'); 77131899Smarcel return (gdb_tx_end()); 78131899Smarcel} 79131899Smarcel 80131899Smarcelstatic __inline void 81131899Smarcelgdb_tx_hex(uintmax_t n, int sz) 82131899Smarcel{ 83131899Smarcel gdb_txp += sprintf(gdb_txp, "%0*jx", sz, n); 84131899Smarcel} 85131899Smarcel 86131899Smarcelstatic __inline int 87131899Smarcelgdb_tx_err(int err) 88131899Smarcel{ 89131899Smarcel gdb_tx_begin('E'); 90131899Smarcel gdb_tx_hex(err, 2); 91131899Smarcel return (gdb_tx_end()); 92131899Smarcel} 93131899Smarcel 94131899Smarcelstatic __inline int 95131899Smarcelgdb_tx_ok(void) 96131899Smarcel{ 97131899Smarcel gdb_tx_begin('O'); 98131899Smarcel gdb_tx_char('K'); 99131899Smarcel return (gdb_tx_end()); 100131899Smarcel} 101131899Smarcel 102131899Smarcelstatic __inline void 103131899Smarcelgdb_tx_str(const char *s) 104131899Smarcel{ 105131899Smarcel while (*s) 106131899Smarcel *gdb_txp++ = *s++; 107131899Smarcel} 108131899Smarcel 109131899Smarcelstatic __inline void 110131899Smarcelgdb_tx_varhex(uintmax_t n) 111131899Smarcel{ 112131899Smarcel gdb_txp += sprintf(gdb_txp, "%jx", n); 113131899Smarcel} 114131899Smarcel 115131899Smarcel#endif /* !_GDB_GDB_INT_H_ */ 116