gdb_handlesig(CPUState *cpu, int sig) { GDBState *s; char buf[256]; int n; s = gdbserver_state; if (gdbserver_fd < 0 || s->fd < 0) { return sig; } /* disable single step if it was enabled */ cpu_single_step(cpu, 0); tb_flush(cpu); if (sig != 0) { snprintf(buf, sizeof(buf), "S%02x", target_signal_to_gdb(sig)); put_packet(s, buf); } /* put_packet() might have detected that the peer terminated the connection. */ if (s->fd < 0) { return sig; } sig = 0; s->state = RS_IDLE; s->running_state = 0; while (s->running_state == 0) { n = read(s->fd, buf, 256); if (n > 0) { int i; for (i = 0; i < n; i++) { gdb_read_byte(s, buf[i]); } } else if (n == 0 || errno != EAGAIN) { /* XXX: Connection closed. Should probably wait for another connection before continuing. */ return sig; } } sig = s->signal; s->signal = 0; return sig; }