117680Spst/*-
217680Spst * Copyright (c) 2004 Marcel Moolenaar
317680Spst * All rights reserved.
417680Spst *
517680Spst * Redistribution and use in source and binary forms, with or without
617680Spst * modification, are permitted provided that the following conditions
717680Spst * are met:
817680Spst *
917680Spst * 1. Redistributions of source code must retain the above copyright
1017680Spst *    notice, this list of conditions and the following disclaimer.
1117680Spst * 2. Redistributions in binary form must reproduce the above copyright
1217680Spst *    notice, this list of conditions and the following disclaimer in the
1317680Spst *    documentation and/or other materials provided with the distribution.
1417680Spst *
1517680Spst * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1617680Spst * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1717680Spst * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1817680Spst * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1917680Spst * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2056896Sfenner * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2156896Sfenner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2217680Spst * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2317680Spst * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2417680Spst * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25127675Sbms *
26190207Srpaulo * $FreeBSD$
2717680Spst */
2817680Spst
2956896Sfenner#ifndef _GDB_GDB_INT_H_
3056896Sfenner#define	_GDB_GDB_INT_H_
3156896Sfenner
3256896Sfennerextern struct gdb_dbgport *gdb_cur;
33127675Sbms
3417680Spstextern int gdb_listening;
3517680Spstvoid gdb_consinit(void);
3617680Spst
3717680Spstextern char *gdb_rxp;
3817680Spstextern size_t gdb_rxsz;
3917680Spstextern char *gdb_txp;
4017680Spst
4117680Spstint gdb_rx_begin(void);
4275118Sfennerint gdb_rx_equal(const char *);
4375118Sfennerint gdb_rx_mem(unsigned char *, size_t);
44127675Sbmsint gdb_rx_varhex(uintmax_t *);
45146778Ssam
4675118Sfennerstatic __inline int
4775118Sfennergdb_rx_char(void)
4875118Sfenner{
4975118Sfenner	int c;
5075118Sfenner
5175118Sfenner	if (gdb_rxsz > 0) {
5275118Sfenner		c = *gdb_rxp++;
5375118Sfenner		gdb_rxsz--;
5475118Sfenner	} else
5575118Sfenner		c = -1;
5675118Sfenner	return (c);
5775118Sfenner}
5875118Sfenner
5975118Sfennervoid gdb_tx_begin(char);
6075118Sfennerint gdb_tx_end(void);
6175118Sfennerint gdb_tx_mem(const unsigned char *, size_t);
6275118Sfennervoid gdb_tx_reg(int);
6375118Sfenner
6475118Sfennerstatic __inline void
6575118Sfennergdb_tx_char(char c)
6675118Sfenner{
6775118Sfenner	*gdb_txp++ = c;
6875118Sfenner}
6975118Sfenner
7075118Sfennerstatic __inline int
7175118Sfennergdb_tx_empty(void)
7275118Sfenner{
7375118Sfenner	gdb_tx_begin('\0');
7475118Sfenner	return (gdb_tx_end());
7575118Sfenner}
7675118Sfenner
7775118Sfennerstatic __inline void
7875118Sfennergdb_tx_hex(uintmax_t n, int sz)
7975118Sfenner{
8075118Sfenner	gdb_txp += sprintf(gdb_txp, "%0*jx", sz, n);
8175118Sfenner}
8275118Sfenner
8375118Sfennerstatic __inline int
8475118Sfennergdb_tx_err(int err)
8575118Sfenner{
8675118Sfenner	gdb_tx_begin('E');
8775118Sfenner	gdb_tx_hex(err, 2);
8875118Sfenner	return (gdb_tx_end());
8975118Sfenner}
9075118Sfenner
9175118Sfennerstatic __inline int
9275118Sfennergdb_tx_ok(void)
9375118Sfenner{
94146778Ssam	gdb_tx_begin('O');
95146778Ssam	gdb_tx_char('K');
96146778Ssam	return (gdb_tx_end());
9775118Sfenner}
9875118Sfenner
9975118Sfennerstatic __inline void
10075118Sfennergdb_tx_str(const char *s)
10175118Sfenner{
10275118Sfenner	while (*s)
10375118Sfenner		*gdb_txp++ = *s++;
10475118Sfenner}
10575118Sfenner
106172686Smlaierstatic __inline void
10775118Sfennergdb_tx_varhex(uintmax_t n)
10875118Sfenner{
10975118Sfenner	gdb_txp += sprintf(gdb_txp, "%jx", n);
11075118Sfenner}
11175118Sfenner
11275118Sfenner#endif /* !_GDB_GDB_INT_H_ */
11375118Sfenner