gdbstub.c 43.6 KB
Newer Older
B
bellard 已提交
1 2
/*
 * gdb server stub
3
 *
B
bellard 已提交
4
 * Copyright (c) 2003-2005 Fabrice Bellard
B
bellard 已提交
5 6 7 8 9 10 11 12 13 14 15 16
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
B
bellard 已提交
18
 */
19
#include "config.h"
P
pbrook 已提交
20
#include "qemu-common.h"
B
bellard 已提交
21 22 23 24 25 26 27
#ifdef CONFIG_USER_ONLY
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
28
#include <fcntl.h>
B
bellard 已提交
29 30 31

#include "qemu.h"
#else
32
#include "monitor/monitor.h"
33
#include "sysemu/char.h"
34
#include "sysemu/sysemu.h"
35
#include "exec/gdbstub.h"
B
bellard 已提交
36
#endif
B
bellard 已提交
37

P
pbrook 已提交
38 39
#define MAX_PACKET_LENGTH 4096

40
#include "cpu.h"
41
#include "qemu/sockets.h"
42
#include "sysemu/kvm.h"
43

44 45
static inline int target_memory_rw_debug(CPUState *cpu, target_ulong addr,
                                         uint8_t *buf, int len, bool is_write)
46
{
47 48 49 50 51 52
    CPUClass *cc = CPU_GET_CLASS(cpu);

    if (cc->memory_rw_debug) {
        return cc->memory_rw_debug(cpu, addr, buf, len, is_write);
    }
    return cpu_memory_rw_debug(cpu, addr, buf, len, is_write);
53
}
54 55 56 57

enum {
    GDB_SIGNAL_0 = 0,
    GDB_SIGNAL_INT = 2,
58
    GDB_SIGNAL_QUIT = 3,
59
    GDB_SIGNAL_TRAP = 5,
60 61 62 63
    GDB_SIGNAL_ABRT = 6,
    GDB_SIGNAL_ALRM = 14,
    GDB_SIGNAL_IO = 23,
    GDB_SIGNAL_XCPU = 24,
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
    GDB_SIGNAL_UNKNOWN = 143
};

#ifdef CONFIG_USER_ONLY

/* Map target signal numbers to GDB protocol signal numbers and vice
 * versa.  For user emulation's currently supported systems, we can
 * assume most signals are defined.
 */

static int gdb_signal_table[] = {
    0,
    TARGET_SIGHUP,
    TARGET_SIGINT,
    TARGET_SIGQUIT,
    TARGET_SIGILL,
    TARGET_SIGTRAP,
    TARGET_SIGABRT,
    -1, /* SIGEMT */
    TARGET_SIGFPE,
    TARGET_SIGKILL,
    TARGET_SIGBUS,
    TARGET_SIGSEGV,
    TARGET_SIGSYS,
    TARGET_SIGPIPE,
    TARGET_SIGALRM,
    TARGET_SIGTERM,
    TARGET_SIGURG,
    TARGET_SIGSTOP,
    TARGET_SIGTSTP,
    TARGET_SIGCONT,
    TARGET_SIGCHLD,
    TARGET_SIGTTIN,
    TARGET_SIGTTOU,
    TARGET_SIGIO,
    TARGET_SIGXCPU,
    TARGET_SIGXFSZ,
    TARGET_SIGVTALRM,
    TARGET_SIGPROF,
    TARGET_SIGWINCH,
    -1, /* SIGLOST */
    TARGET_SIGUSR1,
    TARGET_SIGUSR2,
B
blueswir1 已提交
107
#ifdef TARGET_SIGPWR
108
    TARGET_SIGPWR,
B
blueswir1 已提交
109 110 111
#else
    -1,
#endif
112 113 114 115 116 117 118 119 120 121 122 123
    -1, /* SIGPOLL */
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
    -1,
B
blueswir1 已提交
124
#ifdef __SIGRTMIN
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
    __SIGRTMIN + 1,
    __SIGRTMIN + 2,
    __SIGRTMIN + 3,
    __SIGRTMIN + 4,
    __SIGRTMIN + 5,
    __SIGRTMIN + 6,
    __SIGRTMIN + 7,
    __SIGRTMIN + 8,
    __SIGRTMIN + 9,
    __SIGRTMIN + 10,
    __SIGRTMIN + 11,
    __SIGRTMIN + 12,
    __SIGRTMIN + 13,
    __SIGRTMIN + 14,
    __SIGRTMIN + 15,
    __SIGRTMIN + 16,
    __SIGRTMIN + 17,
    __SIGRTMIN + 18,
    __SIGRTMIN + 19,
    __SIGRTMIN + 20,
    __SIGRTMIN + 21,
    __SIGRTMIN + 22,
    __SIGRTMIN + 23,
    __SIGRTMIN + 24,
    __SIGRTMIN + 25,
    __SIGRTMIN + 26,
    __SIGRTMIN + 27,
    __SIGRTMIN + 28,
    __SIGRTMIN + 29,
    __SIGRTMIN + 30,
    __SIGRTMIN + 31,
    -1, /* SIGCANCEL */
    __SIGRTMIN,
    __SIGRTMIN + 32,
    __SIGRTMIN + 33,
    __SIGRTMIN + 34,
    __SIGRTMIN + 35,
    __SIGRTMIN + 36,
    __SIGRTMIN + 37,
    __SIGRTMIN + 38,
    __SIGRTMIN + 39,
    __SIGRTMIN + 40,
    __SIGRTMIN + 41,
    __SIGRTMIN + 42,
    __SIGRTMIN + 43,
    __SIGRTMIN + 44,
    __SIGRTMIN + 45,
    __SIGRTMIN + 46,
    __SIGRTMIN + 47,
    __SIGRTMIN + 48,
    __SIGRTMIN + 49,
    __SIGRTMIN + 50,
    __SIGRTMIN + 51,
    __SIGRTMIN + 52,
    __SIGRTMIN + 53,
    __SIGRTMIN + 54,
    __SIGRTMIN + 55,
    __SIGRTMIN + 56,
    __SIGRTMIN + 57,
    __SIGRTMIN + 58,
    __SIGRTMIN + 59,
    __SIGRTMIN + 60,
    __SIGRTMIN + 61,
    __SIGRTMIN + 62,
    __SIGRTMIN + 63,
    __SIGRTMIN + 64,
    __SIGRTMIN + 65,
    __SIGRTMIN + 66,
    __SIGRTMIN + 67,
    __SIGRTMIN + 68,
    __SIGRTMIN + 69,
    __SIGRTMIN + 70,
    __SIGRTMIN + 71,
    __SIGRTMIN + 72,
    __SIGRTMIN + 73,
    __SIGRTMIN + 74,
    __SIGRTMIN + 75,
    __SIGRTMIN + 76,
    __SIGRTMIN + 77,
    __SIGRTMIN + 78,
    __SIGRTMIN + 79,
    __SIGRTMIN + 80,
    __SIGRTMIN + 81,
    __SIGRTMIN + 82,
    __SIGRTMIN + 83,
    __SIGRTMIN + 84,
    __SIGRTMIN + 85,
    __SIGRTMIN + 86,
    __SIGRTMIN + 87,
    __SIGRTMIN + 88,
    __SIGRTMIN + 89,
    __SIGRTMIN + 90,
    __SIGRTMIN + 91,
    __SIGRTMIN + 92,
    __SIGRTMIN + 93,
    __SIGRTMIN + 94,
    __SIGRTMIN + 95,
    -1, /* SIGINFO */
    -1, /* UNKNOWN */
    -1, /* DEFAULT */
    -1,
    -1,
    -1,
    -1,
    -1,
    -1
B
blueswir1 已提交
231
#endif
232
};
B
bellard 已提交
233
#else
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
/* In system mode we only need SIGINT and SIGTRAP; other signals
   are not yet supported.  */

enum {
    TARGET_SIGINT = 2,
    TARGET_SIGTRAP = 5
};

static int gdb_signal_table[] = {
    -1,
    -1,
    TARGET_SIGINT,
    -1,
    -1,
    TARGET_SIGTRAP
};
#endif

#ifdef CONFIG_USER_ONLY
static int target_signal_to_gdb (int sig)
{
    int i;
    for (i = 0; i < ARRAY_SIZE (gdb_signal_table); i++)
        if (gdb_signal_table[i] == sig)
            return i;
    return GDB_SIGNAL_UNKNOWN;
}
B
bellard 已提交
261
#endif
B
bellard 已提交
262

263 264 265 266 267 268 269 270
static int gdb_signal_to_target (int sig)
{
    if (sig < ARRAY_SIZE (gdb_signal_table))
        return gdb_signal_table[sig];
    else
        return -1;
}

B
bellard 已提交
271
//#define DEBUG_GDB
B
bellard 已提交
272

P
pbrook 已提交
273 274 275 276 277 278 279 280 281
typedef struct GDBRegisterState {
    int base_reg;
    int num_regs;
    gdb_reg_cb get_reg;
    gdb_reg_cb set_reg;
    const char *xml;
    struct GDBRegisterState *next;
} GDBRegisterState;

282
enum RSState {
283
    RS_INACTIVE,
284 285 286 287 288 289
    RS_IDLE,
    RS_GETLINE,
    RS_CHKSUM1,
    RS_CHKSUM2,
};
typedef struct GDBState {
290 291
    CPUState *c_cpu; /* current CPU for step/continue ops */
    CPUState *g_cpu; /* current CPU for other ops */
292
    CPUState *query_cpu; /* for q{f|s}ThreadInfo */
B
bellard 已提交
293
    enum RSState state; /* parsing state */
P
pbrook 已提交
294
    char line_buf[MAX_PACKET_LENGTH];
295 296
    int line_buf_index;
    int line_csum;
P
pbrook 已提交
297
    uint8_t last_packet[MAX_PACKET_LENGTH + 4];
298
    int last_packet_len;
299
    int signal;
B
bellard 已提交
300
#ifdef CONFIG_USER_ONLY
301
    int fd;
B
bellard 已提交
302
    int running_state;
303 304
#else
    CharDriverState *chr;
305
    CharDriverState *mon_chr;
B
bellard 已提交
306
#endif
307 308
    char syscall_buf[256];
    gdb_syscall_complete_cb current_syscall_cb;
309
} GDBState;
B
bellard 已提交
310

311 312 313 314 315
/* By default use no IRQs and no timers while single stepping so as to
 * make single stepping like an ICE HW step.
 */
static int sstep_flags = SSTEP_ENABLE|SSTEP_NOIRQ|SSTEP_NOTIMER;

316 317
static GDBState *gdbserver_state;

318
bool gdb_has_xml;
P
pbrook 已提交
319

B
bellard 已提交
320
#ifdef CONFIG_USER_ONLY
321 322 323
/* XXX: This is not thread safe.  Do we care?  */
static int gdbserver_fd = -1;

324
static int get_char(GDBState *s)
B
bellard 已提交
325 326 327 328 329
{
    uint8_t ch;
    int ret;

    for(;;) {
B
Blue Swirl 已提交
330
        ret = qemu_recv(s->fd, &ch, 1, 0);
B
bellard 已提交
331
        if (ret < 0) {
332 333
            if (errno == ECONNRESET)
                s->fd = -1;
B
bellard 已提交
334 335 336
            if (errno != EINTR && errno != EAGAIN)
                return -1;
        } else if (ret == 0) {
337 338
            close(s->fd);
            s->fd = -1;
B
bellard 已提交
339 340 341 342 343 344 345
            return -1;
        } else {
            break;
        }
    }
    return ch;
}
346
#endif
B
bellard 已提交
347

348
static enum {
P
pbrook 已提交
349 350 351 352 353 354 355 356 357 358
    GDB_SYS_UNKNOWN,
    GDB_SYS_ENABLED,
    GDB_SYS_DISABLED,
} gdb_syscall_mode;

/* If gdb is connected when the first semihosting syscall occurs then use
   remote gdb syscalls.  Otherwise use native file IO.  */
int use_gdb_syscalls(void)
{
    if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
359 360
        gdb_syscall_mode = (gdbserver_state ? GDB_SYS_ENABLED
                                            : GDB_SYS_DISABLED);
P
pbrook 已提交
361 362 363 364
    }
    return gdb_syscall_mode == GDB_SYS_ENABLED;
}

365 366 367 368 369 370
/* Resume execution.  */
static inline void gdb_continue(GDBState *s)
{
#ifdef CONFIG_USER_ONLY
    s->running_state = 1;
#else
371 372 373
    if (runstate_check(RUN_STATE_GUEST_PANICKED)) {
        runstate_set(RUN_STATE_DEBUG);
    }
374
    if (!runstate_needs_reset()) {
375 376
        vm_start();
    }
377 378 379
#endif
}

380
static void put_buffer(GDBState *s, const uint8_t *buf, int len)
B
bellard 已提交
381
{
382
#ifdef CONFIG_USER_ONLY
B
bellard 已提交
383 384 385
    int ret;

    while (len > 0) {
B
bellard 已提交
386
        ret = send(s->fd, buf, len, 0);
B
bellard 已提交
387 388 389 390 391 392 393 394
        if (ret < 0) {
            if (errno != EINTR && errno != EAGAIN)
                return;
        } else {
            buf += ret;
            len -= ret;
        }
    }
395
#else
396
    qemu_chr_fe_write(s->chr, buf, len);
397
#endif
B
bellard 已提交
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
}

static inline int fromhex(int v)
{
    if (v >= '0' && v <= '9')
        return v - '0';
    else if (v >= 'A' && v <= 'F')
        return v - 'A' + 10;
    else if (v >= 'a' && v <= 'f')
        return v - 'a' + 10;
    else
        return 0;
}

static inline int tohex(int v)
{
    if (v < 10)
        return v + '0';
    else
        return v - 10 + 'a';
}

static void memtohex(char *buf, const uint8_t *mem, int len)
{
    int i, c;
    char *q;
    q = buf;
    for(i = 0; i < len; i++) {
        c = mem[i];
        *q++ = tohex(c >> 4);
        *q++ = tohex(c & 0xf);
    }
    *q = '\0';
}

static void hextomem(uint8_t *mem, const char *buf, int len)
{
    int i;

    for(i = 0; i < len; i++) {
        mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
        buf += 2;
    }
}

/* return -1 if error, 0 if OK */
P
pbrook 已提交
444
static int put_packet_binary(GDBState *s, const char *buf, int len)
B
bellard 已提交
445
{
P
pbrook 已提交
446
    int csum, i;
T
ths 已提交
447
    uint8_t *p;
B
bellard 已提交
448 449

    for(;;) {
450 451 452 453
        p = s->last_packet;
        *(p++) = '$';
        memcpy(p, buf, len);
        p += len;
B
bellard 已提交
454 455 456 457
        csum = 0;
        for(i = 0; i < len; i++) {
            csum += buf[i];
        }
458 459 460
        *(p++) = '#';
        *(p++) = tohex((csum >> 4) & 0xf);
        *(p++) = tohex((csum) & 0xf);
B
bellard 已提交
461

462
        s->last_packet_len = p - s->last_packet;
T
ths 已提交
463
        put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
B
bellard 已提交
464

465 466 467
#ifdef CONFIG_USER_ONLY
        i = get_char(s);
        if (i < 0)
B
bellard 已提交
468
            return -1;
469
        if (i == '+')
B
bellard 已提交
470
            break;
471 472 473
#else
        break;
#endif
B
bellard 已提交
474 475 476 477
    }
    return 0;
}

P
pbrook 已提交
478 479 480 481 482 483
/* return -1 if error, 0 if OK */
static int put_packet(GDBState *s, const char *buf)
{
#ifdef DEBUG_GDB
    printf("reply='%s'\n", buf);
#endif
B
bellard 已提交
484

P
pbrook 已提交
485 486 487
    return put_packet_binary(s, buf, strlen(buf));
}

488
#if defined(TARGET_PPC)
B
bellard 已提交
489

490 491 492 493 494
#if defined (TARGET_PPC64)
#define GDB_CORE_XML "power64-core.xml"
#else
#define GDB_CORE_XML "power-core.xml"
#endif
B
bellard 已提交
495

B
bellard 已提交
496
#elif defined (TARGET_ARM)
B
bellard 已提交
497

P
pbrook 已提交
498
#define GDB_CORE_XML "arm-core.xml"
P
pbrook 已提交
499

P
pbrook 已提交
500
#elif defined (TARGET_M68K)
501

P
pbrook 已提交
502
#define GDB_CORE_XML "cf-core.xml"
503

P
pbrook 已提交
504
#endif
505

P
pbrook 已提交
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
#ifdef GDB_CORE_XML
/* Encode data using the encoding for 'x' packets.  */
static int memtox(char *buf, const char *mem, int len)
{
    char *p = buf;
    char c;

    while (len--) {
        c = *(mem++);
        switch (c) {
        case '#': case '$': case '*': case '}':
            *(p++) = '}';
            *(p++) = c ^ 0x20;
            break;
        default:
            *(p++) = c;
            break;
        }
    }
    return p - buf;
}
527

A
aurel32 已提交
528
static const char *get_feature_xml(const char *p, const char **newp)
P
pbrook 已提交
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544
{
    size_t len;
    int i;
    const char *name;
    static char target_xml[1024];

    len = 0;
    while (p[len] && p[len] != ':')
        len++;
    *newp = p + len;

    name = NULL;
    if (strncmp(p, "target.xml", len) == 0) {
        /* Generate the XML description for this CPU.  */
        if (!target_xml[0]) {
            GDBRegisterState *r;
545
            CPUState *cpu = first_cpu;
P
pbrook 已提交
546

B
blueswir1 已提交
547 548 549 550 551 552
            snprintf(target_xml, sizeof(target_xml),
                     "<?xml version=\"1.0\"?>"
                     "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
                     "<target>"
                     "<xi:include href=\"%s\"/>",
                     GDB_CORE_XML);
P
pbrook 已提交
553

554
            for (r = cpu->gdb_regs; r; r = r->next) {
555 556 557
                pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
                pstrcat(target_xml, sizeof(target_xml), r->xml);
                pstrcat(target_xml, sizeof(target_xml), "\"/>");
P
pbrook 已提交
558
            }
559
            pstrcat(target_xml, sizeof(target_xml), "</target>");
P
pbrook 已提交
560 561 562 563 564 565 566 567 568 569 570
        }
        return target_xml;
    }
    for (i = 0; ; i++) {
        name = xml_builtin[i][0];
        if (!name || (strncmp(name, p, len) == 0 && strlen(name) == len))
            break;
    }
    return name ? xml_builtin[i][1] : NULL;
}
#endif
571

572
static int gdb_read_register(CPUState *cpu, uint8_t *mem_buf, int reg)
P
pbrook 已提交
573
{
574
    CPUClass *cc = CPU_GET_CLASS(cpu);
575
    CPUArchState *env = cpu->env_ptr;
P
pbrook 已提交
576
    GDBRegisterState *r;
577

578
    if (reg < cc->gdb_num_core_regs) {
579
        return cc->gdb_read_register(cpu, mem_buf, reg);
580
    }
581

582
    for (r = cpu->gdb_regs; r; r = r->next) {
P
pbrook 已提交
583 584 585 586 587
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
            return r->get_reg(env, mem_buf, reg - r->base_reg);
        }
    }
    return 0;
588 589
}

590
static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
591
{
592
    CPUClass *cc = CPU_GET_CLASS(cpu);
593
    CPUArchState *env = cpu->env_ptr;
P
pbrook 已提交
594
    GDBRegisterState *r;
595

596
    if (reg < cc->gdb_num_core_regs) {
597
        return cc->gdb_write_register(cpu, mem_buf, reg);
598
    }
P
pbrook 已提交
599

600
    for (r = cpu->gdb_regs; r; r = r->next) {
P
pbrook 已提交
601 602 603 604
        if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
            return r->set_reg(env, mem_buf, reg - r->base_reg);
        }
    }
B
bellard 已提交
605 606 607
    return 0;
}

P
pbrook 已提交
608 609 610 611 612 613
/* Register a supplemental set of CPU registers.  If g_pos is nonzero it
   specifies the first register number and these registers are included in
   a standard "g" packet.  Direction is relative to gdb, i.e. get_reg is
   gdb reading a CPU register, and set_reg is gdb modifying a CPU register.
 */

614 615 616
void gdb_register_coprocessor(CPUState *cpu,
                              gdb_reg_cb get_reg, gdb_reg_cb set_reg,
                              int num_regs, const char *xml, int g_pos)
B
bellard 已提交
617
{
P
pbrook 已提交
618 619 620
    GDBRegisterState *s;
    GDBRegisterState **p;

621
    p = &cpu->gdb_regs;
P
pbrook 已提交
622 623 624 625 626 627
    while (*p) {
        /* Check for duplicates.  */
        if (strcmp((*p)->xml, xml) == 0)
            return;
        p = &(*p)->next;
    }
S
Stefan Weil 已提交
628 629

    s = g_new0(GDBRegisterState, 1);
630
    s->base_reg = cpu->gdb_num_regs;
S
Stefan Weil 已提交
631 632 633 634 635
    s->num_regs = num_regs;
    s->get_reg = get_reg;
    s->set_reg = set_reg;
    s->xml = xml;

P
pbrook 已提交
636
    /* Add to end of list.  */
637
    cpu->gdb_num_regs += num_regs;
P
pbrook 已提交
638 639 640 641 642 643 644
    *p = s;
    if (g_pos) {
        if (g_pos != s->base_reg) {
            fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n"
                    "Expected %d got %d\n", xml, g_pos, s->base_reg);
        }
    }
B
bellard 已提交
645 646
}

647 648 649 650 651 652 653 654
#ifndef CONFIG_USER_ONLY
static const int xlat_gdb_type[] = {
    [GDB_WATCHPOINT_WRITE]  = BP_GDB | BP_MEM_WRITE,
    [GDB_WATCHPOINT_READ]   = BP_GDB | BP_MEM_READ,
    [GDB_WATCHPOINT_ACCESS] = BP_GDB | BP_MEM_ACCESS,
};
#endif

655
static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
656
{
657
    CPUState *cpu;
658
    CPUArchState *env;
659 660
    int err = 0;

661
    if (kvm_enabled()) {
662
        return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
663
    }
664

665 666 667
    switch (type) {
    case GDB_BREAKPOINT_SW:
    case GDB_BREAKPOINT_HW:
668 669
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
            env = cpu->env_ptr;
670 671 672 673 674
            err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
            if (err)
                break;
        }
        return err;
675 676 677 678
#ifndef CONFIG_USER_ONLY
    case GDB_WATCHPOINT_WRITE:
    case GDB_WATCHPOINT_READ:
    case GDB_WATCHPOINT_ACCESS:
679 680
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
            env = cpu->env_ptr;
681 682 683 684 685 686
            err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
                                        NULL);
            if (err)
                break;
        }
        return err;
687 688 689 690 691 692
#endif
    default:
        return -ENOSYS;
    }
}

693
static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
694
{
695
    CPUState *cpu;
696
    CPUArchState *env;
697 698
    int err = 0;

699
    if (kvm_enabled()) {
700
        return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
701
    }
702

703 704 705
    switch (type) {
    case GDB_BREAKPOINT_SW:
    case GDB_BREAKPOINT_HW:
706 707
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
            env = cpu->env_ptr;
708 709 710 711 712
            err = cpu_breakpoint_remove(env, addr, BP_GDB);
            if (err)
                break;
        }
        return err;
713 714 715 716
#ifndef CONFIG_USER_ONLY
    case GDB_WATCHPOINT_WRITE:
    case GDB_WATCHPOINT_READ:
    case GDB_WATCHPOINT_ACCESS:
717 718
        for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
            env = cpu->env_ptr;
719 720 721 722 723
            err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
            if (err)
                break;
        }
        return err;
724 725 726 727 728 729
#endif
    default:
        return -ENOSYS;
    }
}

730
static void gdb_breakpoint_remove_all(void)
731
{
732
    CPUState *cpu;
733
    CPUArchState *env;
734

735
    if (kvm_enabled()) {
736
        kvm_remove_all_breakpoints(gdbserver_state->c_cpu);
737 738 739
        return;
    }

740 741
    for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
        env = cpu->env_ptr;
742
        cpu_breakpoint_remove_all(env, BP_GDB);
743
#ifndef CONFIG_USER_ONLY
744
        cpu_watchpoint_remove_all(env, BP_GDB);
745
#endif
746
    }
747 748
}

A
aurel32 已提交
749 750
static void gdb_set_cpu_pc(GDBState *s, target_ulong pc)
{
751
    CPUState *cpu = s->c_cpu;
752 753 754 755 756
    CPUClass *cc = CPU_GET_CLASS(cpu);

    cpu_synchronize_state(cpu);
    if (cc->set_pc) {
        cc->set_pc(cpu, pc);
N
Nathan Froyd 已提交
757
    }
A
aurel32 已提交
758 759
}

760
static CPUState *find_cpu(uint32_t thread_id)
761
{
762
    CPUState *cpu;
763

764
    for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
765
        if (cpu_index(cpu) == thread_id) {
766
            return cpu;
767
        }
768
    }
769 770

    return NULL;
771 772
}

773
static int gdb_handle_packet(GDBState *s, const char *line_buf)
B
bellard 已提交
774
{
775
    CPUState *cpu;
B
bellard 已提交
776
    const char *p;
777 778
    uint32_t thread;
    int ch, reg_size, type, res;
P
pbrook 已提交
779 780 781
    char buf[MAX_PACKET_LENGTH];
    uint8_t mem_buf[MAX_PACKET_LENGTH];
    uint8_t *registers;
782
    target_ulong addr, len;
783

784 785 786 787 788 789 790
#ifdef DEBUG_GDB
    printf("command='%s'\n", line_buf);
#endif
    p = line_buf;
    ch = *p++;
    switch(ch) {
    case '?':
B
bellard 已提交
791
        /* TODO: Make this return the correct value for user-mode.  */
792
        snprintf(buf, sizeof(buf), "T%02xthread:%02x;", GDB_SIGNAL_TRAP,
793
                 cpu_index(s->c_cpu));
794
        put_packet(s, buf);
795 796 797 798
        /* Remove all the breakpoints when this query is issued,
         * because gdb is doing and initial connect and the state
         * should be cleaned up.
         */
799
        gdb_breakpoint_remove_all();
800 801 802
        break;
    case 'c':
        if (*p != '\0') {
803
            addr = strtoull(p, (char **)&p, 16);
A
aurel32 已提交
804
            gdb_set_cpu_pc(s, addr);
805
        }
806
        s->signal = 0;
807
        gdb_continue(s);
B
bellard 已提交
808
	return RS_IDLE;
809
    case 'C':
810 811 812
        s->signal = gdb_signal_to_target (strtoul(p, (char **)&p, 16));
        if (s->signal == -1)
            s->signal = 0;
813 814
        gdb_continue(s);
        return RS_IDLE;
J
Jan Kiszka 已提交
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
    case 'v':
        if (strncmp(p, "Cont", 4) == 0) {
            int res_signal, res_thread;

            p += 4;
            if (*p == '?') {
                put_packet(s, "vCont;c;C;s;S");
                break;
            }
            res = 0;
            res_signal = 0;
            res_thread = 0;
            while (*p) {
                int action, signal;

                if (*p++ != ';') {
                    res = 0;
                    break;
                }
                action = *p++;
                signal = 0;
                if (action == 'C' || action == 'S') {
                    signal = strtoul(p, (char **)&p, 16);
                } else if (action != 'c' && action != 's') {
                    res = 0;
                    break;
                }
                thread = 0;
                if (*p == ':') {
                    thread = strtoull(p+1, (char **)&p, 16);
                }
                action = tolower(action);
                if (res == 0 || (res == 'c' && action == 's')) {
                    res = action;
                    res_signal = signal;
                    res_thread = thread;
                }
            }
            if (res) {
                if (res_thread != -1 && res_thread != 0) {
855 856
                    cpu = find_cpu(res_thread);
                    if (cpu == NULL) {
J
Jan Kiszka 已提交
857 858 859
                        put_packet(s, "E22");
                        break;
                    }
860
                    s->c_cpu = cpu;
J
Jan Kiszka 已提交
861 862
                }
                if (res == 's') {
863
                    cpu_single_step(s->c_cpu, sstep_flags);
J
Jan Kiszka 已提交
864 865 866 867 868 869 870 871 872
                }
                s->signal = res_signal;
                gdb_continue(s);
                return RS_IDLE;
            }
            break;
        } else {
            goto unknown_command;
        }
873
    case 'k':
874
#ifdef CONFIG_USER_ONLY
875 876 877
        /* Kill the target */
        fprintf(stderr, "\nQEMU: Terminated via GDBstub\n");
        exit(0);
878
#endif
879 880
    case 'D':
        /* Detach packet */
881
        gdb_breakpoint_remove_all();
D
Daniel Gutson 已提交
882
        gdb_syscall_mode = GDB_SYS_DISABLED;
883 884 885
        gdb_continue(s);
        put_packet(s, "OK");
        break;
886 887
    case 's':
        if (*p != '\0') {
888
            addr = strtoull(p, (char **)&p, 16);
A
aurel32 已提交
889
            gdb_set_cpu_pc(s, addr);
890
        }
891
        cpu_single_step(s->c_cpu, sstep_flags);
892
        gdb_continue(s);
B
bellard 已提交
893
	return RS_IDLE;
P
pbrook 已提交
894 895 896 897 898 899 900 901 902 903 904 905 906 907 908
    case 'F':
        {
            target_ulong ret;
            target_ulong err;

            ret = strtoull(p, (char **)&p, 16);
            if (*p == ',') {
                p++;
                err = strtoull(p, (char **)&p, 16);
            } else {
                err = 0;
            }
            if (*p == ',')
                p++;
            type = *p;
909
            if (s->current_syscall_cb) {
910
                s->current_syscall_cb(s->c_cpu, ret, err);
911 912
                s->current_syscall_cb = NULL;
            }
P
pbrook 已提交
913 914 915
            if (type == 'C') {
                put_packet(s, "T02");
            } else {
916
                gdb_continue(s);
P
pbrook 已提交
917 918 919
            }
        }
        break;
920
    case 'g':
921
        cpu_synchronize_state(s->g_cpu);
P
pbrook 已提交
922
        len = 0;
923
        for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) {
924
            reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr);
P
pbrook 已提交
925 926 927
            len += reg_size;
        }
        memtohex(buf, mem_buf, len);
928 929 930
        put_packet(s, buf);
        break;
    case 'G':
931
        cpu_synchronize_state(s->g_cpu);
P
pbrook 已提交
932
        registers = mem_buf;
933 934
        len = strlen(p) / 2;
        hextomem((uint8_t *)registers, p, len);
935
        for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) {
936
            reg_size = gdb_write_register(s->g_cpu, registers, addr);
P
pbrook 已提交
937 938 939
            len -= reg_size;
            registers += reg_size;
        }
940 941 942
        put_packet(s, "OK");
        break;
    case 'm':
943
        addr = strtoull(p, (char **)&p, 16);
944 945
        if (*p == ',')
            p++;
946
        len = strtoull(p, NULL, 16);
947
        if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len, false) != 0) {
948 949 950 951 952
            put_packet (s, "E14");
        } else {
            memtohex(buf, mem_buf, len);
            put_packet(s, buf);
        }
953 954
        break;
    case 'M':
955
        addr = strtoull(p, (char **)&p, 16);
956 957
        if (*p == ',')
            p++;
958
        len = strtoull(p, (char **)&p, 16);
959
        if (*p == ':')
960 961
            p++;
        hextomem(mem_buf, p, len);
962
        if (target_memory_rw_debug(s->g_cpu, addr, mem_buf, len,
963
                                   true) != 0) {
B
bellard 已提交
964
            put_packet(s, "E14");
965
        } else {
966
            put_packet(s, "OK");
967
        }
968
        break;
P
pbrook 已提交
969 970 971 972 973 974 975
    case 'p':
        /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable.
           This works, but can be very slow.  Anything new enough to
           understand XML also knows how to use this properly.  */
        if (!gdb_has_xml)
            goto unknown_command;
        addr = strtoull(p, (char **)&p, 16);
976
        reg_size = gdb_read_register(s->g_cpu, mem_buf, addr);
P
pbrook 已提交
977 978 979 980 981 982 983 984 985 986 987 988 989 990 991
        if (reg_size) {
            memtohex(buf, mem_buf, reg_size);
            put_packet(s, buf);
        } else {
            put_packet(s, "E14");
        }
        break;
    case 'P':
        if (!gdb_has_xml)
            goto unknown_command;
        addr = strtoull(p, (char **)&p, 16);
        if (*p == '=')
            p++;
        reg_size = strlen(p) / 2;
        hextomem(mem_buf, p, reg_size);
992
        gdb_write_register(s->g_cpu, mem_buf, addr);
P
pbrook 已提交
993 994
        put_packet(s, "OK");
        break;
995 996 997 998 999
    case 'Z':
    case 'z':
        type = strtoul(p, (char **)&p, 16);
        if (*p == ',')
            p++;
1000
        addr = strtoull(p, (char **)&p, 16);
1001 1002
        if (*p == ',')
            p++;
1003
        len = strtoull(p, (char **)&p, 16);
1004
        if (ch == 'Z')
1005
            res = gdb_breakpoint_insert(addr, len, type);
1006
        else
1007
            res = gdb_breakpoint_remove(addr, len, type);
1008 1009 1010
        if (res >= 0)
             put_packet(s, "OK");
        else if (res == -ENOSYS)
P
pbrook 已提交
1011
            put_packet(s, "");
1012 1013
        else
            put_packet(s, "E22");
1014
        break;
1015 1016 1017 1018 1019 1020 1021
    case 'H':
        type = *p++;
        thread = strtoull(p, (char **)&p, 16);
        if (thread == -1 || thread == 0) {
            put_packet(s, "OK");
            break;
        }
1022 1023
        cpu = find_cpu(thread);
        if (cpu == NULL) {
1024 1025 1026 1027 1028
            put_packet(s, "E22");
            break;
        }
        switch (type) {
        case 'c':
1029
            s->c_cpu = cpu;
1030 1031 1032
            put_packet(s, "OK");
            break;
        case 'g':
1033
            s->g_cpu = cpu;
1034 1035 1036 1037 1038 1039 1040 1041 1042
            put_packet(s, "OK");
            break;
        default:
             put_packet(s, "E22");
             break;
        }
        break;
    case 'T':
        thread = strtoull(p, (char **)&p, 16);
1043
        cpu = find_cpu(thread);
1044

1045
        if (cpu != NULL) {
1046 1047
            put_packet(s, "OK");
        } else {
1048
            put_packet(s, "E22");
1049
        }
1050
        break;
1051
    case 'q':
1052 1053 1054 1055
    case 'Q':
        /* parse any 'q' packets here */
        if (!strcmp(p,"qemu.sstepbits")) {
            /* Query Breakpoint bit definitions */
B
blueswir1 已提交
1056 1057 1058 1059
            snprintf(buf, sizeof(buf), "ENABLE=%x,NOIRQ=%x,NOTIMER=%x",
                     SSTEP_ENABLE,
                     SSTEP_NOIRQ,
                     SSTEP_NOTIMER);
1060 1061 1062 1063 1064 1065 1066
            put_packet(s, buf);
            break;
        } else if (strncmp(p,"qemu.sstep",10) == 0) {
            /* Display or change the sstep_flags */
            p += 10;
            if (*p != '=') {
                /* Display current setting */
B
blueswir1 已提交
1067
                snprintf(buf, sizeof(buf), "0x%x", sstep_flags);
1068 1069 1070 1071 1072 1073 1074 1075
                put_packet(s, buf);
                break;
            }
            p++;
            type = strtoul(p, (char **)&p, 16);
            sstep_flags = type;
            put_packet(s, "OK");
            break;
1076 1077 1078 1079 1080 1081
        } else if (strcmp(p,"C") == 0) {
            /* "Current thread" remains vague in the spec, so always return
             *  the first CPU (gdb returns the first thread). */
            put_packet(s, "QC1");
            break;
        } else if (strcmp(p,"fThreadInfo") == 0) {
1082
            s->query_cpu = first_cpu;
1083 1084 1085 1086
            goto report_cpuinfo;
        } else if (strcmp(p,"sThreadInfo") == 0) {
        report_cpuinfo:
            if (s->query_cpu) {
1087
                snprintf(buf, sizeof(buf), "m%x", cpu_index(s->query_cpu));
1088
                put_packet(s, buf);
1089
                s->query_cpu = s->query_cpu->next_cpu;
1090 1091 1092 1093 1094
            } else
                put_packet(s, "l");
            break;
        } else if (strncmp(p,"ThreadExtraInfo,", 16) == 0) {
            thread = strtoull(p+16, (char **)&p, 16);
1095 1096
            cpu = find_cpu(thread);
            if (cpu != NULL) {
1097
                cpu_synchronize_state(cpu);
1098
                len = snprintf((char *)mem_buf, sizeof(mem_buf),
1099
                               "CPU#%d [%s]", cpu->cpu_index,
1100
                               cpu->halted ? "halted " : "running");
1101 1102 1103
                memtohex(buf, mem_buf, len);
                put_packet(s, buf);
            }
1104
            break;
1105
        }
B
blueswir1 已提交
1106
#ifdef CONFIG_USER_ONLY
1107
        else if (strncmp(p, "Offsets", 7) == 0) {
1108 1109
            CPUArchState *env = s->c_cpu->env_ptr;
            TaskState *ts = env->opaque;
1110

B
blueswir1 已提交
1111 1112 1113 1114 1115 1116
            snprintf(buf, sizeof(buf),
                     "Text=" TARGET_ABI_FMT_lx ";Data=" TARGET_ABI_FMT_lx
                     ";Bss=" TARGET_ABI_FMT_lx,
                     ts->info->code_offset,
                     ts->info->data_offset,
                     ts->info->data_offset);
1117 1118 1119
            put_packet(s, buf);
            break;
        }
B
blueswir1 已提交
1120
#else /* !CONFIG_USER_ONLY */
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
        else if (strncmp(p, "Rcmd,", 5) == 0) {
            int len = strlen(p + 5);

            if ((len % 2) != 0) {
                put_packet(s, "E01");
                break;
            }
            hextomem(mem_buf, p + 5, len);
            len = len / 2;
            mem_buf[len++] = 0;
1131
            qemu_chr_be_write(s->mon_chr, mem_buf, len);
1132 1133 1134
            put_packet(s, "OK");
            break;
        }
B
blueswir1 已提交
1135
#endif /* !CONFIG_USER_ONLY */
P
pbrook 已提交
1136
        if (strncmp(p, "Supported", 9) == 0) {
B
blueswir1 已提交
1137
            snprintf(buf, sizeof(buf), "PacketSize=%x", MAX_PACKET_LENGTH);
P
pbrook 已提交
1138
#ifdef GDB_CORE_XML
1139
            pstrcat(buf, sizeof(buf), ";qXfer:features:read+");
P
pbrook 已提交
1140 1141 1142 1143 1144 1145 1146 1147 1148
#endif
            put_packet(s, buf);
            break;
        }
#ifdef GDB_CORE_XML
        if (strncmp(p, "Xfer:features:read:", 19) == 0) {
            const char *xml;
            target_ulong total_len;

1149
            gdb_has_xml = true;
P
pbrook 已提交
1150
            p += 19;
1151
            xml = get_feature_xml(p, &p);
P
pbrook 已提交
1152
            if (!xml) {
B
blueswir1 已提交
1153
                snprintf(buf, sizeof(buf), "E00");
P
pbrook 已提交
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
                put_packet(s, buf);
                break;
            }

            if (*p == ':')
                p++;
            addr = strtoul(p, (char **)&p, 16);
            if (*p == ',')
                p++;
            len = strtoul(p, (char **)&p, 16);

            total_len = strlen(xml);
            if (addr > total_len) {
B
blueswir1 已提交
1167
                snprintf(buf, sizeof(buf), "E00");
P
pbrook 已提交
1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
                put_packet(s, buf);
                break;
            }
            if (len > (MAX_PACKET_LENGTH - 5) / 2)
                len = (MAX_PACKET_LENGTH - 5) / 2;
            if (len < total_len - addr) {
                buf[0] = 'm';
                len = memtox(buf + 1, xml + addr, len);
            } else {
                buf[0] = 'l';
                len = memtox(buf + 1, xml + addr, total_len - addr);
            }
            put_packet_binary(s, buf, len + 1);
            break;
        }
#endif
        /* Unrecognised 'q' command.  */
        goto unknown_command;

1187
    default:
P
pbrook 已提交
1188
    unknown_command:
1189 1190 1191 1192 1193 1194 1195 1196
        /* put empty packet */
        buf[0] = '\0';
        put_packet(s, buf);
        break;
    }
    return RS_IDLE;
}

1197
void gdb_set_stop_cpu(CPUState *cpu)
1198
{
1199 1200
    gdbserver_state->c_cpu = cpu;
    gdbserver_state->g_cpu = cpu;
1201 1202
}

B
bellard 已提交
1203
#ifndef CONFIG_USER_ONLY
1204
static void gdb_vm_state_change(void *opaque, int running, RunState state)
1205
{
1206
    GDBState *s = gdbserver_state;
1207 1208
    CPUArchState *env = s->c_cpu->env_ptr;
    CPUState *cpu = s->c_cpu;
1209
    char buf[256];
1210
    const char *type;
1211 1212
    int ret;

1213 1214 1215 1216 1217 1218
    if (running || s->state == RS_INACTIVE) {
        return;
    }
    /* Is there a GDB syscall waiting to be sent?  */
    if (s->current_syscall_cb) {
        put_packet(s, s->syscall_buf);
P
pbrook 已提交
1219
        return;
J
Jan Kiszka 已提交
1220
    }
1221
    switch (state) {
1222
    case RUN_STATE_DEBUG:
1223 1224
        if (env->watchpoint_hit) {
            switch (env->watchpoint_hit->flags & BP_MEM_ACCESS) {
1225
            case BP_MEM_READ:
1226 1227
                type = "r";
                break;
1228
            case BP_MEM_ACCESS:
1229 1230 1231 1232 1233 1234
                type = "a";
                break;
            default:
                type = "";
                break;
            }
1235 1236
            snprintf(buf, sizeof(buf),
                     "T%02xthread:%02x;%swatch:" TARGET_FMT_lx ";",
1237
                     GDB_SIGNAL_TRAP, cpu_index(cpu), type,
1238 1239
                     env->watchpoint_hit->vaddr);
            env->watchpoint_hit = NULL;
1240
            goto send_packet;
1241
        }
1242
        tb_flush(env);
1243
        ret = GDB_SIGNAL_TRAP;
1244
        break;
1245
    case RUN_STATE_PAUSED:
1246
        ret = GDB_SIGNAL_INT;
1247
        break;
1248
    case RUN_STATE_SHUTDOWN:
1249 1250
        ret = GDB_SIGNAL_QUIT;
        break;
1251
    case RUN_STATE_IO_ERROR:
1252 1253
        ret = GDB_SIGNAL_IO;
        break;
1254
    case RUN_STATE_WATCHDOG:
1255 1256
        ret = GDB_SIGNAL_ALRM;
        break;
1257
    case RUN_STATE_INTERNAL_ERROR:
1258 1259
        ret = GDB_SIGNAL_ABRT;
        break;
1260 1261
    case RUN_STATE_SAVE_VM:
    case RUN_STATE_RESTORE_VM:
1262
        return;
1263
    case RUN_STATE_FINISH_MIGRATE:
1264 1265 1266 1267 1268
        ret = GDB_SIGNAL_XCPU;
        break;
    default:
        ret = GDB_SIGNAL_UNKNOWN;
        break;
B
bellard 已提交
1269
    }
1270
    snprintf(buf, sizeof(buf), "T%02xthread:%02x;", ret, cpu_index(cpu));
1271 1272

send_packet:
1273
    put_packet(s, buf);
1274 1275

    /* disable single step if it was enabled */
1276
    cpu_single_step(cpu, 0);
1277
}
B
bellard 已提交
1278
#endif
1279

P
pbrook 已提交
1280 1281
/* Send a gdb syscall request.
   This accepts limited printf-style format specifiers, specifically:
P
pbrook 已提交
1282 1283 1284
    %x  - target_ulong argument printed in hex.
    %lx - 64-bit argument printed in hex.
    %s  - string pointer (target_ulong) and length (int) pair.  */
1285
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
P
pbrook 已提交
1286 1287 1288
{
    va_list va;
    char *p;
1289
    char *p_end;
P
pbrook 已提交
1290
    target_ulong addr;
P
pbrook 已提交
1291
    uint64_t i64;
P
pbrook 已提交
1292 1293
    GDBState *s;

1294
    s = gdbserver_state;
P
pbrook 已提交
1295 1296
    if (!s)
        return;
1297
    s->current_syscall_cb = cb;
P
pbrook 已提交
1298
#ifndef CONFIG_USER_ONLY
1299
    vm_stop(RUN_STATE_DEBUG);
P
pbrook 已提交
1300 1301
#endif
    va_start(va, fmt);
1302 1303
    p = s->syscall_buf;
    p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
P
pbrook 已提交
1304 1305 1306 1307 1308 1309 1310
    *(p++) = 'F';
    while (*fmt) {
        if (*fmt == '%') {
            fmt++;
            switch (*fmt++) {
            case 'x':
                addr = va_arg(va, target_ulong);
1311
                p += snprintf(p, p_end - p, TARGET_FMT_lx, addr);
P
pbrook 已提交
1312
                break;
P
pbrook 已提交
1313 1314 1315 1316
            case 'l':
                if (*(fmt++) != 'x')
                    goto bad_format;
                i64 = va_arg(va, uint64_t);
1317
                p += snprintf(p, p_end - p, "%" PRIx64, i64);
P
pbrook 已提交
1318
                break;
P
pbrook 已提交
1319 1320
            case 's':
                addr = va_arg(va, target_ulong);
1321
                p += snprintf(p, p_end - p, TARGET_FMT_lx "/%x",
B
blueswir1 已提交
1322
                              addr, va_arg(va, int));
P
pbrook 已提交
1323 1324
                break;
            default:
P
pbrook 已提交
1325
            bad_format:
P
pbrook 已提交
1326 1327 1328 1329 1330 1331 1332 1333
                fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
                        fmt - 1);
                break;
            }
        } else {
            *(p++) = *(fmt++);
        }
    }
P
pbrook 已提交
1334
    *p = 0;
P
pbrook 已提交
1335 1336
    va_end(va);
#ifdef CONFIG_USER_ONLY
1337
    put_packet(s, s->syscall_buf);
1338
    gdb_handlesig(s->c_cpu, 0);
P
pbrook 已提交
1339
#else
1340 1341 1342 1343 1344 1345
    /* In this case wait to send the syscall packet until notification that
       the CPU has stopped.  This must be done because if the packet is sent
       now the reply from the syscall request could be received while the CPU
       is still in the running state, which can cause packets to be dropped
       and state transition 'T' packets to be sent while the syscall is still
       being processed.  */
1346
    cpu_exit(s->c_cpu);
P
pbrook 已提交
1347 1348 1349
#endif
}

B
bellard 已提交
1350
static void gdb_read_byte(GDBState *s, int ch)
1351 1352
{
    int i, csum;
T
ths 已提交
1353
    uint8_t reply;
1354

B
bellard 已提交
1355
#ifndef CONFIG_USER_ONLY
1356 1357 1358 1359 1360 1361 1362
    if (s->last_packet_len) {
        /* Waiting for a response to the last packet.  If we see the start
           of a new command then abandon the previous response.  */
        if (ch == '-') {
#ifdef DEBUG_GDB
            printf("Got NACK, retransmitting\n");
#endif
T
ths 已提交
1363
            put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375
        }
#ifdef DEBUG_GDB
        else if (ch == '+')
            printf("Got ACK\n");
        else
            printf("Got '%c' when expecting ACK/NACK\n", ch);
#endif
        if (ch == '+' || ch == '$')
            s->last_packet_len = 0;
        if (ch != '$')
            return;
    }
1376
    if (runstate_is_running()) {
1377 1378
        /* when the CPU is running, we cannot do anything except stop
           it when receiving a char */
1379
        vm_stop(RUN_STATE_PAUSED);
1380
    } else
B
bellard 已提交
1381
#endif
B
bellard 已提交
1382
    {
1383 1384 1385 1386 1387
        switch(s->state) {
        case RS_IDLE:
            if (ch == '$') {
                s->line_buf_index = 0;
                s->state = RS_GETLINE;
B
bellard 已提交
1388
            }
B
bellard 已提交
1389
            break;
1390 1391 1392 1393 1394
        case RS_GETLINE:
            if (ch == '#') {
            s->state = RS_CHKSUM1;
            } else if (s->line_buf_index >= sizeof(s->line_buf) - 1) {
                s->state = RS_IDLE;
B
bellard 已提交
1395
            } else {
1396
            s->line_buf[s->line_buf_index++] = ch;
B
bellard 已提交
1397 1398
            }
            break;
1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410
        case RS_CHKSUM1:
            s->line_buf[s->line_buf_index] = '\0';
            s->line_csum = fromhex(ch) << 4;
            s->state = RS_CHKSUM2;
            break;
        case RS_CHKSUM2:
            s->line_csum |= fromhex(ch);
            csum = 0;
            for(i = 0; i < s->line_buf_index; i++) {
                csum += s->line_buf[i];
            }
            if (s->line_csum != (csum & 0xff)) {
T
ths 已提交
1411 1412
                reply = '-';
                put_buffer(s, &reply, 1);
1413
                s->state = RS_IDLE;
B
bellard 已提交
1414
            } else {
T
ths 已提交
1415 1416
                reply = '+';
                put_buffer(s, &reply, 1);
1417
                s->state = gdb_handle_packet(s, s->line_buf);
B
bellard 已提交
1418 1419
            }
            break;
P
pbrook 已提交
1420 1421
        default:
            abort();
1422 1423 1424 1425
        }
    }
}

P
Paul Brook 已提交
1426
/* Tell the remote gdb that the process has exited.  */
1427
void gdb_exit(CPUArchState *env, int code)
P
Paul Brook 已提交
1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
{
  GDBState *s;
  char buf[4];

  s = gdbserver_state;
  if (!s) {
      return;
  }
#ifdef CONFIG_USER_ONLY
  if (gdbserver_fd < 0 || s->fd < 0) {
      return;
  }
#endif

  snprintf(buf, sizeof(buf), "W%02x", (uint8_t)code);
  put_packet(s, buf);
1444 1445 1446

#ifndef CONFIG_USER_ONLY
  if (s->chr) {
1447
      qemu_chr_delete(s->chr);
1448 1449
  }
#endif
P
Paul Brook 已提交
1450 1451
}

B
bellard 已提交
1452
#ifdef CONFIG_USER_ONLY
1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465
int
gdb_queuesig (void)
{
    GDBState *s;

    s = gdbserver_state;

    if (gdbserver_fd < 0 || s->fd < 0)
        return 0;
    else
        return 1;
}

B
bellard 已提交
1466
int
1467
gdb_handlesig(CPUState *cpu, int sig)
B
bellard 已提交
1468
{
1469
    CPUArchState *env = cpu->env_ptr;
1470 1471 1472
    GDBState *s;
    char buf[256];
    int n;
B
bellard 已提交
1473

1474 1475 1476 1477
    s = gdbserver_state;
    if (gdbserver_fd < 0 || s->fd < 0) {
        return sig;
    }
B
bellard 已提交
1478

1479
    /* disable single step if it was enabled */
1480
    cpu_single_step(cpu, 0);
1481
    tb_flush(env);
B
bellard 已提交
1482

1483 1484 1485 1486 1487 1488 1489 1490 1491
    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;
    }
B
bellard 已提交
1492

1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507
    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;
B
bellard 已提交
1508
        }
1509 1510 1511 1512
    }
    sig = s->signal;
    s->signal = 0;
    return sig;
B
bellard 已提交
1513
}
1514

1515
/* Tell the remote gdb that the process has exited due to SIG.  */
1516
void gdb_signalled(CPUArchState *env, int sig)
1517
{
1518 1519
    GDBState *s;
    char buf[4];
1520

1521 1522 1523 1524
    s = gdbserver_state;
    if (gdbserver_fd < 0 || s->fd < 0) {
        return;
    }
1525

1526 1527
    snprintf(buf, sizeof(buf), "X%02x", target_signal_to_gdb(sig));
    put_packet(s, buf);
1528
}
B
bellard 已提交
1529

1530
static void gdb_accept(void)
1531 1532 1533 1534
{
    GDBState *s;
    struct sockaddr_in sockaddr;
    socklen_t len;
1535
    int fd;
1536 1537 1538 1539 1540 1541 1542 1543

    for(;;) {
        len = sizeof(sockaddr);
        fd = accept(gdbserver_fd, (struct sockaddr *)&sockaddr, &len);
        if (fd < 0 && errno != EINTR) {
            perror("accept");
            return;
        } else if (fd >= 0) {
K
Kevin Wolf 已提交
1544 1545 1546
#ifndef _WIN32
            fcntl(fd, F_SETFD, FD_CLOEXEC);
#endif
B
bellard 已提交
1547 1548 1549
            break;
        }
    }
1550 1551

    /* set short latency */
1552
    socket_set_nodelay(fd);
1553

1554
    s = g_malloc0(sizeof(GDBState));
1555 1556
    s->c_cpu = first_cpu;
    s->g_cpu = first_cpu;
1557
    s->fd = fd;
1558
    gdb_has_xml = false;
1559

1560
    gdbserver_state = s;
P
pbrook 已提交
1561

1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574
    fcntl(fd, F_SETFL, O_NONBLOCK);
}

static int gdbserver_open(int port)
{
    struct sockaddr_in sockaddr;
    int fd, val, ret;

    fd = socket(PF_INET, SOCK_STREAM, 0);
    if (fd < 0) {
        perror("socket");
        return -1;
    }
K
Kevin Wolf 已提交
1575 1576 1577
#ifndef _WIN32
    fcntl(fd, F_SETFD, FD_CLOEXEC);
#endif
1578 1579 1580

    /* allow fast reuse */
    val = 1;
1581
    qemu_setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
1582 1583 1584 1585 1586 1587 1588

    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(port);
    sockaddr.sin_addr.s_addr = 0;
    ret = bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
    if (ret < 0) {
        perror("bind");
1589
        close(fd);
1590 1591 1592 1593 1594
        return -1;
    }
    ret = listen(fd, 0);
    if (ret < 0) {
        perror("listen");
1595
        close(fd);
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
        return -1;
    }
    return fd;
}

int gdbserver_start(int port)
{
    gdbserver_fd = gdbserver_open(port);
    if (gdbserver_fd < 0)
        return -1;
    /* accept connections */
1607
    gdb_accept();
1608 1609
    return 0;
}
1610 1611

/* Disable gdb stub for child processes.  */
1612
void gdbserver_fork(CPUArchState *env)
1613 1614
{
    GDBState *s = gdbserver_state;
E
edgar_igl 已提交
1615
    if (gdbserver_fd < 0 || s->fd < 0)
1616 1617 1618 1619 1620 1621
      return;
    close(s->fd);
    s->fd = -1;
    cpu_breakpoint_remove_all(env, BP_GDB);
    cpu_watchpoint_remove_all(env, BP_GDB);
}
B
bellard 已提交
1622
#else
T
ths 已提交
1623
static int gdb_chr_can_receive(void *opaque)
1624
{
P
pbrook 已提交
1625 1626 1627
  /* We can handle an arbitrarily large amount of data.
   Pick the maximum packet size, which is as good as anything.  */
  return MAX_PACKET_LENGTH;
1628 1629
}

T
ths 已提交
1630
static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
1631 1632 1633 1634
{
    int i;

    for (i = 0; i < size; i++) {
1635
        gdb_read_byte(gdbserver_state, buf[i]);
1636 1637 1638 1639 1640 1641
    }
}

static void gdb_chr_event(void *opaque, int event)
{
    switch (event) {
1642
    case CHR_EVENT_OPENED:
1643
        vm_stop(RUN_STATE_PAUSED);
1644
        gdb_has_xml = false;
1645 1646 1647 1648 1649 1650
        break;
    default:
        break;
    }
}

1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679
static void gdb_monitor_output(GDBState *s, const char *msg, int len)
{
    char buf[MAX_PACKET_LENGTH];

    buf[0] = 'O';
    if (len > (MAX_PACKET_LENGTH/2) - 1)
        len = (MAX_PACKET_LENGTH/2) - 1;
    memtohex(buf + 1, (uint8_t *)msg, len);
    put_packet(s, buf);
}

static int gdb_monitor_write(CharDriverState *chr, const uint8_t *buf, int len)
{
    const char *p = (const char *)buf;
    int max_sz;

    max_sz = (sizeof(gdbserver_state->last_packet) - 2) / 2;
    for (;;) {
        if (len <= max_sz) {
            gdb_monitor_output(gdbserver_state, p, len);
            break;
        }
        gdb_monitor_output(gdbserver_state, p, max_sz);
        p += max_sz;
        len -= max_sz;
    }
    return len;
}

1680 1681 1682
#ifndef _WIN32
static void gdb_sigterm_handler(int signal)
{
1683
    if (runstate_is_running()) {
1684
        vm_stop(RUN_STATE_PAUSED);
J
Jan Kiszka 已提交
1685
    }
1686 1687 1688 1689
}
#endif

int gdbserver_start(const char *device)
1690 1691
{
    GDBState *s;
1692
    char gdbstub_device_name[128];
1693 1694
    CharDriverState *chr = NULL;
    CharDriverState *mon_chr;
1695

1696 1697 1698 1699 1700 1701 1702 1703
    if (!device)
        return -1;
    if (strcmp(device, "none") != 0) {
        if (strstart(device, "tcp:", NULL)) {
            /* enforce required TCP attributes */
            snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
                     "%s,nowait,nodelay,server", device);
            device = gdbstub_device_name;
1704
        }
1705 1706 1707
#ifndef _WIN32
        else if (strcmp(device, "stdio") == 0) {
            struct sigaction act;
1708

1709 1710 1711 1712 1713
            memset(&act, 0, sizeof(act));
            act.sa_handler = gdb_sigterm_handler;
            sigaction(SIGINT, &act, NULL);
        }
#endif
1714
        chr = qemu_chr_new("gdb", device, NULL);
1715 1716 1717
        if (!chr)
            return -1;

1718
        qemu_chr_fe_claim_no_fail(chr);
1719 1720
        qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
                              gdb_chr_event, NULL);
1721 1722
    }

1723 1724
    s = gdbserver_state;
    if (!s) {
1725
        s = g_malloc0(sizeof(GDBState));
1726
        gdbserver_state = s;
1727

1728 1729 1730
        qemu_add_vm_change_state_handler(gdb_vm_state_change, NULL);

        /* Initialize a monitor terminal for gdb */
1731
        mon_chr = g_malloc0(sizeof(*mon_chr));
1732 1733 1734 1735
        mon_chr->chr_write = gdb_monitor_write;
        monitor_init(mon_chr, 0);
    } else {
        if (s->chr)
1736
            qemu_chr_delete(s->chr);
1737 1738 1739
        mon_chr = s->mon_chr;
        memset(s, 0, sizeof(GDBState));
    }
1740 1741
    s->c_cpu = first_cpu;
    s->g_cpu = first_cpu;
1742
    s->chr = chr;
1743 1744
    s->state = chr ? RS_IDLE : RS_INACTIVE;
    s->mon_chr = mon_chr;
1745
    s->current_syscall_cb = NULL;
1746

B
bellard 已提交
1747 1748
    return 0;
}
1749
#endif