Changeset View
Changeset View
Standalone View
Standalone View
sys/gdb/gdb_packet.c
Show First 20 Lines • Show All 128 Lines • ▼ Show 20 Lines | while (gdb_rxsz < sizeof(gdb_rxbuf) - 1) { | ||||
gdb_rxbuf[gdb_rxsz++] = c; | gdb_rxbuf[gdb_rxsz++] = c; | ||||
cksum += c; | cksum += c; | ||||
} | } | ||||
gdb_rxbuf[gdb_rxsz] = 0; | gdb_rxbuf[gdb_rxsz] = 0; | ||||
cksum &= 0xff; | cksum &= 0xff; | ||||
/* Bail out on a buffer overflow. */ | /* Bail out on a buffer overflow. */ | ||||
if (c != '#') { | if (c != '#') { | ||||
gdb_cur->gdb_putc('-'); | gdb_nack(); | ||||
return (ENOSPC); | return (ENOSPC); | ||||
} | } | ||||
/* | |||||
* In Not-AckMode, we can assume reliable transport and neither | |||||
* need to verify checksums nor send Ack/Nack. | |||||
*/ | |||||
if (!gdb_ackmode) | |||||
break; | |||||
c = gdb_getc(); | c = gdb_getc(); | ||||
cksum -= (C2N(c) << 4) & 0xf0; | cksum -= (C2N(c) << 4) & 0xf0; | ||||
c = gdb_getc(); | c = gdb_getc(); | ||||
cksum -= C2N(c) & 0x0f; | cksum -= C2N(c) & 0x0f; | ||||
gdb_cur->gdb_putc((cksum == 0) ? '+' : '-'); | if (cksum == 0) { | ||||
if (cksum != 0) | gdb_ack(); | ||||
} else { | |||||
gdb_nack(); | |||||
printf("GDB: packet `%s' has invalid checksum\n", | printf("GDB: packet `%s' has invalid checksum\n", | ||||
gdb_rxbuf); | gdb_rxbuf); | ||||
} | |||||
} while (cksum != 0); | } while (cksum != 0); | ||||
gdb_rxp = gdb_rxbuf; | gdb_rxp = gdb_rxbuf; | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
gdb_rx_equal(const char *str) | gdb_rx_equal(const char *str) | ||||
▲ Show 20 Lines • Show All 174 Lines • ▼ Show 20 Lines | do { | ||||
gdb_cur->gdb_putc('#'); | gdb_cur->gdb_putc('#'); | ||||
c = cksum >> 4; | c = cksum >> 4; | ||||
gdb_cur->gdb_putc(N2C(c)); | gdb_cur->gdb_putc(N2C(c)); | ||||
c = cksum & 0x0f; | c = cksum & 0x0f; | ||||
gdb_cur->gdb_putc(N2C(c)); | gdb_cur->gdb_putc(N2C(c)); | ||||
getack: | getack: | ||||
/* | |||||
* In NoAckMode, it is assumed that the underlying transport is | |||||
* reliable and thus neither conservant sends acknowledgements; | |||||
* there is nothing to wait for here. | |||||
*/ | |||||
if (!gdb_ackmode) | |||||
break; | |||||
c = gdb_getc(); | c = gdb_getc(); | ||||
} while (c != '+'); | } while (c != '+'); | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
gdb_tx_mem(const unsigned char *addr, size_t size) | gdb_tx_mem(const unsigned char *addr, size_t size) | ||||
▲ Show 20 Lines • Show All 82 Lines • Show Last 20 Lines |