1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2017-2018 John H. Baldwin <jhb@FreeBSD.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 #include <sys/cdefs.h> 29 __FBSDID("$FreeBSD$"); 30 31 #include <sys/param.h> 32 #ifndef WITHOUT_CAPSICUM 33 #include <sys/capsicum.h> 34 #endif 35 #include <sys/endian.h> 36 #include <sys/ioctl.h> 37 #include <sys/mman.h> 38 #include <sys/queue.h> 39 #include <sys/socket.h> 40 #include <machine/atomic.h> 41 #include <machine/specialreg.h> 42 #include <machine/vmm.h> 43 #include <netinet/in.h> 44 #include <assert.h> 45 #ifndef WITHOUT_CAPSICUM 46 #include <capsicum_helpers.h> 47 #endif 48 #include <err.h> 49 #include <errno.h> 50 #include <fcntl.h> 51 #include <netdb.h> 52 #include <pthread.h> 53 #include <pthread_np.h> 54 #include <stdbool.h> 55 #include <stdio.h> 56 #include <stdlib.h> 57 #include <string.h> 58 #include <sysexits.h> 59 #include <unistd.h> 60 #include <vmmapi.h> 61 62 #include "bhyverun.h" 63 #include "config.h" 64 #include "gdb.h" 65 #include "mem.h" 66 #include "mevent.h" 67 68 /* 69 * GDB_SIGNAL_* numbers are part of the GDB remote protocol. Most stops 70 * use SIGTRAP. 71 */ 72 #define GDB_SIGNAL_TRAP 5 73 74 static void gdb_resume_vcpus(void); 75 static void check_command(int fd); 76 77 static struct mevent *read_event, *write_event; 78 79 static cpuset_t vcpus_active, vcpus_suspended, vcpus_waiting; 80 static pthread_mutex_t gdb_lock; 81 static pthread_cond_t idle_vcpus; 82 static bool first_stop, report_next_stop, swbreak_enabled; 83 84 /* 85 * An I/O buffer contains 'capacity' bytes of room at 'data'. For a 86 * read buffer, 'start' is unused and 'len' contains the number of 87 * valid bytes in the buffer. For a write buffer, 'start' is set to 88 * the index of the next byte in 'data' to send, and 'len' contains 89 * the remaining number of valid bytes to send. 90 */ 91 struct io_buffer { 92 uint8_t *data; 93 size_t capacity; 94 size_t start; 95 size_t len; 96 }; 97 98 struct breakpoint { 99 uint64_t gpa; 100 uint8_t shadow_inst; 101 TAILQ_ENTRY(breakpoint) link; 102 }; 103 104 /* 105 * When a vCPU stops to due to an event that should be reported to the 106 * debugger, information about the event is stored in this structure. 107 * The vCPU thread then sets 'stopped_vcpu' if it is not already set 108 * and stops other vCPUs so the event can be reported. The 109 * report_stop() function reports the event for the 'stopped_vcpu' 110 * vCPU. When the debugger resumes execution via continue or step, 111 * the event for 'stopped_vcpu' is cleared. vCPUs will loop in their 112 * event handlers until the associated event is reported or disabled. 113 * 114 * An idle vCPU will have all of the boolean fields set to false. 115 * 116 * When a vCPU is stepped, 'stepping' is set to true when the vCPU is 117 * released to execute the stepped instruction. When the vCPU reports 118 * the stepping trap, 'stepped' is set. 119 * 120 * When a vCPU hits a breakpoint set by the debug server, 121 * 'hit_swbreak' is set to true. 122 */ 123 struct vcpu_state { 124 bool stepping; 125 bool stepped; 126 bool hit_swbreak; 127 }; 128 129 static struct io_buffer cur_comm, cur_resp; 130 static uint8_t cur_csum; 131 static struct vmctx *ctx; 132 static int cur_fd = -1; 133 static TAILQ_HEAD(, breakpoint) breakpoints; 134 static struct vcpu_state *vcpu_state; 135 static int cur_vcpu, stopped_vcpu; 136 static bool gdb_active = false; 137 138 const int gdb_regset[] = { 139 VM_REG_GUEST_RAX, 140 VM_REG_GUEST_RBX, 141 VM_REG_GUEST_RCX, 142 VM_REG_GUEST_RDX, 143 VM_REG_GUEST_RSI, 144 VM_REG_GUEST_RDI, 145 VM_REG_GUEST_RBP, 146 VM_REG_GUEST_RSP, 147 VM_REG_GUEST_R8, 148 VM_REG_GUEST_R9, 149 VM_REG_GUEST_R10, 150 VM_REG_GUEST_R11, 151 VM_REG_GUEST_R12, 152 VM_REG_GUEST_R13, 153 VM_REG_GUEST_R14, 154 VM_REG_GUEST_R15, 155 VM_REG_GUEST_RIP, 156 VM_REG_GUEST_RFLAGS, 157 VM_REG_GUEST_CS, 158 VM_REG_GUEST_SS, 159 VM_REG_GUEST_DS, 160 VM_REG_GUEST_ES, 161 VM_REG_GUEST_FS, 162 VM_REG_GUEST_GS 163 }; 164 165 const int gdb_regsize[] = { 166 8, 167 8, 168 8, 169 8, 170 8, 171 8, 172 8, 173 8, 174 8, 175 8, 176 8, 177 8, 178 8, 179 8, 180 8, 181 8, 182 8, 183 4, 184 4, 185 4, 186 4, 187 4, 188 4, 189 4 190 }; 191 192 #ifdef GDB_LOG 193 #include <stdarg.h> 194 #include <stdio.h> 195 196 static void __printflike(1, 2) 197 debug(const char *fmt, ...) 198 { 199 static FILE *logfile; 200 va_list ap; 201 202 if (logfile == NULL) { 203 logfile = fopen("/tmp/bhyve_gdb.log", "w"); 204 if (logfile == NULL) 205 return; 206 #ifndef WITHOUT_CAPSICUM 207 if (caph_limit_stream(fileno(logfile), CAPH_WRITE) == -1) { 208 fclose(logfile); 209 logfile = NULL; 210 return; 211 } 212 #endif 213 setlinebuf(logfile); 214 } 215 va_start(ap, fmt); 216 vfprintf(logfile, fmt, ap); 217 va_end(ap); 218 } 219 #else 220 #define debug(...) 221 #endif 222 223 static void remove_all_sw_breakpoints(void); 224 225 static int 226 guest_paging_info(int vcpu, struct vm_guest_paging *paging) 227 { 228 uint64_t regs[4]; 229 const int regset[4] = { 230 VM_REG_GUEST_CR0, 231 VM_REG_GUEST_CR3, 232 VM_REG_GUEST_CR4, 233 VM_REG_GUEST_EFER 234 }; 235 236 if (vm_get_register_set(ctx, vcpu, nitems(regset), regset, regs) == -1) 237 return (-1); 238 239 /* 240 * For the debugger, always pretend to be the kernel (CPL 0), 241 * and if long-mode is enabled, always parse addresses as if 242 * in 64-bit mode. 243 */ 244 paging->cr3 = regs[1]; 245 paging->cpl = 0; 246 if (regs[3] & EFER_LMA) 247 paging->cpu_mode = CPU_MODE_64BIT; 248 else if (regs[0] & CR0_PE) 249 paging->cpu_mode = CPU_MODE_PROTECTED; 250 else 251 paging->cpu_mode = CPU_MODE_REAL; 252 if (!(regs[0] & CR0_PG)) 253 paging->paging_mode = PAGING_MODE_FLAT; 254 else if (!(regs[2] & CR4_PAE)) 255 paging->paging_mode = PAGING_MODE_32; 256 else if (regs[3] & EFER_LME) 257 paging->paging_mode = (regs[2] & CR4_LA57) ? 258 PAGING_MODE_64_LA57 : PAGING_MODE_64; 259 else 260 paging->paging_mode = PAGING_MODE_PAE; 261 return (0); 262 } 263 264 /* 265 * Map a guest virtual address to a physical address (for a given vcpu). 266 * If a guest virtual address is valid, return 1. If the address is 267 * not valid, return 0. If an error occurs obtaining the mapping, 268 * return -1. 269 */ 270 static int 271 guest_vaddr2paddr(int vcpu, uint64_t vaddr, uint64_t *paddr) 272 { 273 struct vm_guest_paging paging; 274 int fault; 275 276 if (guest_paging_info(vcpu, &paging) == -1) 277 return (-1); 278 279 /* 280 * Always use PROT_READ. We really care if the VA is 281 * accessible, not if the current vCPU can write. 282 */ 283 if (vm_gla2gpa_nofault(ctx, vcpu, &paging, vaddr, PROT_READ, paddr, 284 &fault) == -1) 285 return (-1); 286 if (fault) 287 return (0); 288 return (1); 289 } 290 291 static void 292 io_buffer_reset(struct io_buffer *io) 293 { 294 295 io->start = 0; 296 io->len = 0; 297 } 298 299 /* Available room for adding data. */ 300 static size_t 301 io_buffer_avail(struct io_buffer *io) 302 { 303 304 return (io->capacity - (io->start + io->len)); 305 } 306 307 static uint8_t * 308 io_buffer_head(struct io_buffer *io) 309 { 310 311 return (io->data + io->start); 312 } 313 314 static uint8_t * 315 io_buffer_tail(struct io_buffer *io) 316 { 317 318 return (io->data + io->start + io->len); 319 } 320 321 static void 322 io_buffer_advance(struct io_buffer *io, size_t amount) 323 { 324 325 assert(amount <= io->len); 326 io->start += amount; 327 io->len -= amount; 328 } 329 330 static void 331 io_buffer_consume(struct io_buffer *io, size_t amount) 332 { 333 334 io_buffer_advance(io, amount); 335 if (io->len == 0) { 336 io->start = 0; 337 return; 338 } 339 340 /* 341 * XXX: Consider making this move optional and compacting on a 342 * future read() before realloc(). 343 */ 344 memmove(io->data, io_buffer_head(io), io->len); 345 io->start = 0; 346 } 347 348 static void 349 io_buffer_grow(struct io_buffer *io, size_t newsize) 350 { 351 uint8_t *new_data; 352 size_t avail, new_cap; 353 354 avail = io_buffer_avail(io); 355 if (newsize <= avail) 356 return; 357 358 new_cap = io->capacity + (newsize - avail); 359 new_data = realloc(io->data, new_cap); 360 if (new_data == NULL) 361 err(1, "Failed to grow GDB I/O buffer"); 362 io->data = new_data; 363 io->capacity = new_cap; 364 } 365 366 static bool 367 response_pending(void) 368 { 369 370 if (cur_resp.start == 0 && cur_resp.len == 0) 371 return (false); 372 if (cur_resp.start + cur_resp.len == 1 && cur_resp.data[0] == '+') 373 return (false); 374 return (true); 375 } 376 377 static void 378 close_connection(void) 379 { 380 381 /* 382 * XXX: This triggers a warning because mevent does the close 383 * before the EV_DELETE. 384 */ 385 pthread_mutex_lock(&gdb_lock); 386 mevent_delete(write_event); 387 mevent_delete_close(read_event); 388 write_event = NULL; 389 read_event = NULL; 390 io_buffer_reset(&cur_comm); 391 io_buffer_reset(&cur_resp); 392 cur_fd = -1; 393 394 remove_all_sw_breakpoints(); 395 396 /* Clear any pending events. */ 397 memset(vcpu_state, 0, guest_ncpus * sizeof(*vcpu_state)); 398 399 /* Resume any stopped vCPUs. */ 400 gdb_resume_vcpus(); 401 pthread_mutex_unlock(&gdb_lock); 402 } 403 404 static uint8_t 405 hex_digit(uint8_t nibble) 406 { 407 408 if (nibble <= 9) 409 return (nibble + '0'); 410 else 411 return (nibble + 'a' - 10); 412 } 413 414 static uint8_t 415 parse_digit(uint8_t v) 416 { 417 418 if (v >= '0' && v <= '9') 419 return (v - '0'); 420 if (v >= 'a' && v <= 'f') 421 return (v - 'a' + 10); 422 if (v >= 'A' && v <= 'F') 423 return (v - 'A' + 10); 424 return (0xF); 425 } 426 427 /* Parses big-endian hexadecimal. */ 428 static uintmax_t 429 parse_integer(const uint8_t *p, size_t len) 430 { 431 uintmax_t v; 432 433 v = 0; 434 while (len > 0) { 435 v <<= 4; 436 v |= parse_digit(*p); 437 p++; 438 len--; 439 } 440 return (v); 441 } 442 443 static uint8_t 444 parse_byte(const uint8_t *p) 445 { 446 447 return (parse_digit(p[0]) << 4 | parse_digit(p[1])); 448 } 449 450 static void 451 send_pending_data(int fd) 452 { 453 ssize_t nwritten; 454 455 if (cur_resp.len == 0) { 456 mevent_disable(write_event); 457 return; 458 } 459 nwritten = write(fd, io_buffer_head(&cur_resp), cur_resp.len); 460 if (nwritten == -1) { 461 warn("Write to GDB socket failed"); 462 close_connection(); 463 } else { 464 io_buffer_advance(&cur_resp, nwritten); 465 if (cur_resp.len == 0) 466 mevent_disable(write_event); 467 else 468 mevent_enable(write_event); 469 } 470 } 471 472 /* Append a single character to the output buffer. */ 473 static void 474 send_char(uint8_t data) 475 { 476 io_buffer_grow(&cur_resp, 1); 477 *io_buffer_tail(&cur_resp) = data; 478 cur_resp.len++; 479 } 480 481 /* Append an array of bytes to the output buffer. */ 482 static void 483 send_data(const uint8_t *data, size_t len) 484 { 485 486 io_buffer_grow(&cur_resp, len); 487 memcpy(io_buffer_tail(&cur_resp), data, len); 488 cur_resp.len += len; 489 } 490 491 static void 492 format_byte(uint8_t v, uint8_t *buf) 493 { 494 495 buf[0] = hex_digit(v >> 4); 496 buf[1] = hex_digit(v & 0xf); 497 } 498 499 /* 500 * Append a single byte (formatted as two hex characters) to the 501 * output buffer. 502 */ 503 static void 504 send_byte(uint8_t v) 505 { 506 uint8_t buf[2]; 507 508 format_byte(v, buf); 509 send_data(buf, sizeof(buf)); 510 } 511 512 static void 513 start_packet(void) 514 { 515 516 send_char('$'); 517 cur_csum = 0; 518 } 519 520 static void 521 finish_packet(void) 522 { 523 524 send_char('#'); 525 send_byte(cur_csum); 526 debug("-> %.*s\n", (int)cur_resp.len, io_buffer_head(&cur_resp)); 527 } 528 529 /* 530 * Append a single character (for the packet payload) and update the 531 * checksum. 532 */ 533 static void 534 append_char(uint8_t v) 535 { 536 537 send_char(v); 538 cur_csum += v; 539 } 540 541 /* 542 * Append an array of bytes (for the packet payload) and update the 543 * checksum. 544 */ 545 static void 546 append_packet_data(const uint8_t *data, size_t len) 547 { 548 549 send_data(data, len); 550 while (len > 0) { 551 cur_csum += *data; 552 data++; 553 len--; 554 } 555 } 556 557 static void 558 append_string(const char *str) 559 { 560 561 append_packet_data(str, strlen(str)); 562 } 563 564 static void 565 append_byte(uint8_t v) 566 { 567 uint8_t buf[2]; 568 569 format_byte(v, buf); 570 append_packet_data(buf, sizeof(buf)); 571 } 572 573 static void 574 append_unsigned_native(uintmax_t value, size_t len) 575 { 576 size_t i; 577 578 for (i = 0; i < len; i++) { 579 append_byte(value); 580 value >>= 8; 581 } 582 } 583 584 static void 585 append_unsigned_be(uintmax_t value, size_t len) 586 { 587 char buf[len * 2]; 588 size_t i; 589 590 for (i = 0; i < len; i++) { 591 format_byte(value, buf + (len - i - 1) * 2); 592 value >>= 8; 593 } 594 append_packet_data(buf, sizeof(buf)); 595 } 596 597 static void 598 append_integer(unsigned int value) 599 { 600 601 if (value == 0) 602 append_char('0'); 603 else 604 append_unsigned_be(value, (fls(value) + 7) / 8); 605 } 606 607 static void 608 append_asciihex(const char *str) 609 { 610 611 while (*str != '\0') { 612 append_byte(*str); 613 str++; 614 } 615 } 616 617 static void 618 send_empty_response(void) 619 { 620 621 start_packet(); 622 finish_packet(); 623 } 624 625 static void 626 send_error(int error) 627 { 628 629 start_packet(); 630 append_char('E'); 631 append_byte(error); 632 finish_packet(); 633 } 634 635 static void 636 send_ok(void) 637 { 638 639 start_packet(); 640 append_string("OK"); 641 finish_packet(); 642 } 643 644 static int 645 parse_threadid(const uint8_t *data, size_t len) 646 { 647 648 if (len == 1 && *data == '0') 649 return (0); 650 if (len == 2 && memcmp(data, "-1", 2) == 0) 651 return (-1); 652 if (len == 0) 653 return (-2); 654 return (parse_integer(data, len)); 655 } 656 657 /* 658 * Report the current stop event to the debugger. If the stop is due 659 * to an event triggered on a specific vCPU such as a breakpoint or 660 * stepping trap, stopped_vcpu will be set to the vCPU triggering the 661 * stop. If 'set_cur_vcpu' is true, then cur_vcpu will be updated to 662 * the reporting vCPU for vCPU events. 663 */ 664 static void 665 report_stop(bool set_cur_vcpu) 666 { 667 struct vcpu_state *vs; 668 669 start_packet(); 670 if (stopped_vcpu == -1) { 671 append_char('S'); 672 append_byte(GDB_SIGNAL_TRAP); 673 } else { 674 vs = &vcpu_state[stopped_vcpu]; 675 if (set_cur_vcpu) 676 cur_vcpu = stopped_vcpu; 677 append_char('T'); 678 append_byte(GDB_SIGNAL_TRAP); 679 append_string("thread:"); 680 append_integer(stopped_vcpu + 1); 681 append_char(';'); 682 if (vs->hit_swbreak) { 683 debug("$vCPU %d reporting swbreak\n", stopped_vcpu); 684 if (swbreak_enabled) 685 append_string("swbreak:;"); 686 } else if (vs->stepped) 687 debug("$vCPU %d reporting step\n", stopped_vcpu); 688 else 689 debug("$vCPU %d reporting ???\n", stopped_vcpu); 690 } 691 finish_packet(); 692 report_next_stop = false; 693 } 694 695 /* 696 * If this stop is due to a vCPU event, clear that event to mark it as 697 * acknowledged. 698 */ 699 static void 700 discard_stop(void) 701 { 702 struct vcpu_state *vs; 703 704 if (stopped_vcpu != -1) { 705 vs = &vcpu_state[stopped_vcpu]; 706 vs->hit_swbreak = false; 707 vs->stepped = false; 708 stopped_vcpu = -1; 709 } 710 report_next_stop = true; 711 } 712 713 static void 714 gdb_finish_suspend_vcpus(void) 715 { 716 717 if (first_stop) { 718 first_stop = false; 719 stopped_vcpu = -1; 720 } else if (report_next_stop) { 721 assert(!response_pending()); 722 report_stop(true); 723 send_pending_data(cur_fd); 724 } 725 } 726 727 /* 728 * vCPU threads invoke this function whenever the vCPU enters the 729 * debug server to pause or report an event. vCPU threads wait here 730 * as long as the debug server keeps them suspended. 731 */ 732 static void 733 _gdb_cpu_suspend(int vcpu, bool report_stop) 734 { 735 736 debug("$vCPU %d suspending\n", vcpu); 737 CPU_SET(vcpu, &vcpus_waiting); 738 if (report_stop && CPU_CMP(&vcpus_waiting, &vcpus_suspended) == 0) 739 gdb_finish_suspend_vcpus(); 740 while (CPU_ISSET(vcpu, &vcpus_suspended)) 741 pthread_cond_wait(&idle_vcpus, &gdb_lock); 742 CPU_CLR(vcpu, &vcpus_waiting); 743 debug("$vCPU %d resuming\n", vcpu); 744 } 745 746 /* 747 * Invoked at the start of a vCPU thread's execution to inform the 748 * debug server about the new thread. 749 */ 750 void 751 gdb_cpu_add(int vcpu) 752 { 753 754 if (!gdb_active) 755 return; 756 debug("$vCPU %d starting\n", vcpu); 757 pthread_mutex_lock(&gdb_lock); 758 assert(vcpu < guest_ncpus); 759 CPU_SET(vcpu, &vcpus_active); 760 if (!TAILQ_EMPTY(&breakpoints)) { 761 vm_set_capability(ctx, vcpu, VM_CAP_BPT_EXIT, 1); 762 debug("$vCPU %d enabled breakpoint exits\n", vcpu); 763 } 764 765 /* 766 * If a vcpu is added while vcpus are stopped, suspend the new 767 * vcpu so that it will pop back out with a debug exit before 768 * executing the first instruction. 769 */ 770 if (!CPU_EMPTY(&vcpus_suspended)) { 771 CPU_SET(vcpu, &vcpus_suspended); 772 _gdb_cpu_suspend(vcpu, false); 773 } 774 pthread_mutex_unlock(&gdb_lock); 775 } 776 777 /* 778 * Invoked by vCPU before resuming execution. This enables stepping 779 * if the vCPU is marked as stepping. 780 */ 781 static void 782 gdb_cpu_resume(int vcpu) 783 { 784 struct vcpu_state *vs; 785 int error; 786 787 vs = &vcpu_state[vcpu]; 788 789 /* 790 * Any pending event should already be reported before 791 * resuming. 792 */ 793 assert(vs->hit_swbreak == false); 794 assert(vs->stepped == false); 795 if (vs->stepping) { 796 error = vm_set_capability(ctx, vcpu, VM_CAP_MTRAP_EXIT, 1); 797 assert(error == 0); 798 } 799 } 800 801 /* 802 * Handler for VM_EXITCODE_DEBUG used to suspend a vCPU when the guest 803 * has been suspended due to an event on different vCPU or in response 804 * to a guest-wide suspend such as Ctrl-C or the stop on attach. 805 */ 806 void 807 gdb_cpu_suspend(int vcpu) 808 { 809 810 if (!gdb_active) 811 return; 812 pthread_mutex_lock(&gdb_lock); 813 _gdb_cpu_suspend(vcpu, true); 814 gdb_cpu_resume(vcpu); 815 pthread_mutex_unlock(&gdb_lock); 816 } 817 818 static void 819 gdb_suspend_vcpus(void) 820 { 821 822 assert(pthread_mutex_isowned_np(&gdb_lock)); 823 debug("suspending all CPUs\n"); 824 vcpus_suspended = vcpus_active; 825 vm_suspend_cpu(ctx, -1); 826 if (CPU_CMP(&vcpus_waiting, &vcpus_suspended) == 0) 827 gdb_finish_suspend_vcpus(); 828 } 829 830 /* 831 * Handler for VM_EXITCODE_MTRAP reported when a vCPU single-steps via 832 * the VT-x-specific MTRAP exit. 833 */ 834 void 835 gdb_cpu_mtrap(int vcpu) 836 { 837 struct vcpu_state *vs; 838 839 if (!gdb_active) 840 return; 841 debug("$vCPU %d MTRAP\n", vcpu); 842 pthread_mutex_lock(&gdb_lock); 843 vs = &vcpu_state[vcpu]; 844 if (vs->stepping) { 845 vs->stepping = false; 846 vs->stepped = true; 847 vm_set_capability(ctx, vcpu, VM_CAP_MTRAP_EXIT, 0); 848 while (vs->stepped) { 849 if (stopped_vcpu == -1) { 850 debug("$vCPU %d reporting step\n", vcpu); 851 stopped_vcpu = vcpu; 852 gdb_suspend_vcpus(); 853 } 854 _gdb_cpu_suspend(vcpu, true); 855 } 856 gdb_cpu_resume(vcpu); 857 } 858 pthread_mutex_unlock(&gdb_lock); 859 } 860 861 static struct breakpoint * 862 find_breakpoint(uint64_t gpa) 863 { 864 struct breakpoint *bp; 865 866 TAILQ_FOREACH(bp, &breakpoints, link) { 867 if (bp->gpa == gpa) 868 return (bp); 869 } 870 return (NULL); 871 } 872 873 void 874 gdb_cpu_breakpoint(int vcpu, struct vm_exit *vmexit) 875 { 876 struct breakpoint *bp; 877 struct vcpu_state *vs; 878 uint64_t gpa; 879 int error; 880 881 if (!gdb_active) { 882 fprintf(stderr, "vm_loop: unexpected VMEXIT_DEBUG\n"); 883 exit(4); 884 } 885 pthread_mutex_lock(&gdb_lock); 886 error = guest_vaddr2paddr(vcpu, vmexit->rip, &gpa); 887 assert(error == 1); 888 bp = find_breakpoint(gpa); 889 if (bp != NULL) { 890 vs = &vcpu_state[vcpu]; 891 assert(vs->stepping == false); 892 assert(vs->stepped == false); 893 assert(vs->hit_swbreak == false); 894 vs->hit_swbreak = true; 895 vm_set_register(ctx, vcpu, VM_REG_GUEST_RIP, vmexit->rip); 896 for (;;) { 897 if (stopped_vcpu == -1) { 898 debug("$vCPU %d reporting breakpoint at rip %#lx\n", vcpu, 899 vmexit->rip); 900 stopped_vcpu = vcpu; 901 gdb_suspend_vcpus(); 902 } 903 _gdb_cpu_suspend(vcpu, true); 904 if (!vs->hit_swbreak) { 905 /* Breakpoint reported. */ 906 break; 907 } 908 bp = find_breakpoint(gpa); 909 if (bp == NULL) { 910 /* Breakpoint was removed. */ 911 vs->hit_swbreak = false; 912 break; 913 } 914 } 915 gdb_cpu_resume(vcpu); 916 } else { 917 debug("$vCPU %d injecting breakpoint at rip %#lx\n", vcpu, 918 vmexit->rip); 919 error = vm_set_register(ctx, vcpu, 920 VM_REG_GUEST_ENTRY_INST_LENGTH, vmexit->u.bpt.inst_length); 921 assert(error == 0); 922 error = vm_inject_exception(ctx, vcpu, IDT_BP, 0, 0, 0); 923 assert(error == 0); 924 } 925 pthread_mutex_unlock(&gdb_lock); 926 } 927 928 static bool 929 gdb_step_vcpu(int vcpu) 930 { 931 int error, val; 932 933 debug("$vCPU %d step\n", vcpu); 934 error = vm_get_capability(ctx, vcpu, VM_CAP_MTRAP_EXIT, &val); 935 if (error < 0) 936 return (false); 937 938 discard_stop(); 939 vcpu_state[vcpu].stepping = true; 940 vm_resume_cpu(ctx, vcpu); 941 CPU_CLR(vcpu, &vcpus_suspended); 942 pthread_cond_broadcast(&idle_vcpus); 943 return (true); 944 } 945 946 static void 947 gdb_resume_vcpus(void) 948 { 949 950 assert(pthread_mutex_isowned_np(&gdb_lock)); 951 vm_resume_cpu(ctx, -1); 952 debug("resuming all CPUs\n"); 953 CPU_ZERO(&vcpus_suspended); 954 pthread_cond_broadcast(&idle_vcpus); 955 } 956 957 static void 958 gdb_read_regs(void) 959 { 960 uint64_t regvals[nitems(gdb_regset)]; 961 int i; 962 963 if (vm_get_register_set(ctx, cur_vcpu, nitems(gdb_regset), 964 gdb_regset, regvals) == -1) { 965 send_error(errno); 966 return; 967 } 968 start_packet(); 969 for (i = 0; i < nitems(regvals); i++) 970 append_unsigned_native(regvals[i], gdb_regsize[i]); 971 finish_packet(); 972 } 973 974 static void 975 gdb_read_mem(const uint8_t *data, size_t len) 976 { 977 uint64_t gpa, gva, val; 978 uint8_t *cp; 979 size_t resid, todo, bytes; 980 bool started; 981 int error; 982 983 /* Skip 'm' */ 984 data += 1; 985 len -= 1; 986 987 /* Parse and consume address. */ 988 cp = memchr(data, ',', len); 989 if (cp == NULL || cp == data) { 990 send_error(EINVAL); 991 return; 992 } 993 gva = parse_integer(data, cp - data); 994 len -= (cp - data) + 1; 995 data += (cp - data) + 1; 996 997 /* Parse length. */ 998 resid = parse_integer(data, len); 999 1000 started = false; 1001 while (resid > 0) { 1002 error = guest_vaddr2paddr(cur_vcpu, gva, &gpa); 1003 if (error == -1) { 1004 if (started) 1005 finish_packet(); 1006 else 1007 send_error(errno); 1008 return; 1009 } 1010 if (error == 0) { 1011 if (started) 1012 finish_packet(); 1013 else 1014 send_error(EFAULT); 1015 return; 1016 } 1017 1018 /* Read bytes from current page. */ 1019 todo = getpagesize() - gpa % getpagesize(); 1020 if (todo > resid) 1021 todo = resid; 1022 1023 cp = paddr_guest2host(ctx, gpa, todo); 1024 if (cp != NULL) { 1025 /* 1026 * If this page is guest RAM, read it a byte 1027 * at a time. 1028 */ 1029 if (!started) { 1030 start_packet(); 1031 started = true; 1032 } 1033 while (todo > 0) { 1034 append_byte(*cp); 1035 cp++; 1036 gpa++; 1037 gva++; 1038 resid--; 1039 todo--; 1040 } 1041 } else { 1042 /* 1043 * If this page isn't guest RAM, try to handle 1044 * it via MMIO. For MMIO requests, use 1045 * aligned reads of words when possible. 1046 */ 1047 while (todo > 0) { 1048 if (gpa & 1 || todo == 1) 1049 bytes = 1; 1050 else if (gpa & 2 || todo == 2) 1051 bytes = 2; 1052 else 1053 bytes = 4; 1054 error = read_mem(ctx, cur_vcpu, gpa, &val, 1055 bytes); 1056 if (error == 0) { 1057 if (!started) { 1058 start_packet(); 1059 started = true; 1060 } 1061 gpa += bytes; 1062 gva += bytes; 1063 resid -= bytes; 1064 todo -= bytes; 1065 while (bytes > 0) { 1066 append_byte(val); 1067 val >>= 8; 1068 bytes--; 1069 } 1070 } else { 1071 if (started) 1072 finish_packet(); 1073 else 1074 send_error(EFAULT); 1075 return; 1076 } 1077 } 1078 } 1079 assert(resid == 0 || gpa % getpagesize() == 0); 1080 } 1081 if (!started) 1082 start_packet(); 1083 finish_packet(); 1084 } 1085 1086 static void 1087 gdb_write_mem(const uint8_t *data, size_t len) 1088 { 1089 uint64_t gpa, gva, val; 1090 uint8_t *cp; 1091 size_t resid, todo, bytes; 1092 int error; 1093 1094 /* Skip 'M' */ 1095 data += 1; 1096 len -= 1; 1097 1098 /* Parse and consume address. */ 1099 cp = memchr(data, ',', len); 1100 if (cp == NULL || cp == data) { 1101 send_error(EINVAL); 1102 return; 1103 } 1104 gva = parse_integer(data, cp - data); 1105 len -= (cp - data) + 1; 1106 data += (cp - data) + 1; 1107 1108 /* Parse and consume length. */ 1109 cp = memchr(data, ':', len); 1110 if (cp == NULL || cp == data) { 1111 send_error(EINVAL); 1112 return; 1113 } 1114 resid = parse_integer(data, cp - data); 1115 len -= (cp - data) + 1; 1116 data += (cp - data) + 1; 1117 1118 /* Verify the available bytes match the length. */ 1119 if (len != resid * 2) { 1120 send_error(EINVAL); 1121 return; 1122 } 1123 1124 while (resid > 0) { 1125 error = guest_vaddr2paddr(cur_vcpu, gva, &gpa); 1126 if (error == -1) { 1127 send_error(errno); 1128 return; 1129 } 1130 if (error == 0) { 1131 send_error(EFAULT); 1132 return; 1133 } 1134 1135 /* Write bytes to current page. */ 1136 todo = getpagesize() - gpa % getpagesize(); 1137 if (todo > resid) 1138 todo = resid; 1139 1140 cp = paddr_guest2host(ctx, gpa, todo); 1141 if (cp != NULL) { 1142 /* 1143 * If this page is guest RAM, write it a byte 1144 * at a time. 1145 */ 1146 while (todo > 0) { 1147 assert(len >= 2); 1148 *cp = parse_byte(data); 1149 data += 2; 1150 len -= 2; 1151 cp++; 1152 gpa++; 1153 gva++; 1154 resid--; 1155 todo--; 1156 } 1157 } else { 1158 /* 1159 * If this page isn't guest RAM, try to handle 1160 * it via MMIO. For MMIO requests, use 1161 * aligned writes of words when possible. 1162 */ 1163 while (todo > 0) { 1164 if (gpa & 1 || todo == 1) { 1165 bytes = 1; 1166 val = parse_byte(data); 1167 } else if (gpa & 2 || todo == 2) { 1168 bytes = 2; 1169 val = be16toh(parse_integer(data, 4)); 1170 } else { 1171 bytes = 4; 1172 val = be32toh(parse_integer(data, 8)); 1173 } 1174 error = write_mem(ctx, cur_vcpu, gpa, val, 1175 bytes); 1176 if (error == 0) { 1177 gpa += bytes; 1178 gva += bytes; 1179 resid -= bytes; 1180 todo -= bytes; 1181 data += 2 * bytes; 1182 len -= 2 * bytes; 1183 } else { 1184 send_error(EFAULT); 1185 return; 1186 } 1187 } 1188 } 1189 assert(resid == 0 || gpa % getpagesize() == 0); 1190 } 1191 assert(len == 0); 1192 send_ok(); 1193 } 1194 1195 static bool 1196 set_breakpoint_caps(bool enable) 1197 { 1198 cpuset_t mask; 1199 int vcpu; 1200 1201 mask = vcpus_active; 1202 while (!CPU_EMPTY(&mask)) { 1203 vcpu = CPU_FFS(&mask) - 1; 1204 CPU_CLR(vcpu, &mask); 1205 if (vm_set_capability(ctx, vcpu, VM_CAP_BPT_EXIT, 1206 enable ? 1 : 0) < 0) 1207 return (false); 1208 debug("$vCPU %d %sabled breakpoint exits\n", vcpu, 1209 enable ? "en" : "dis"); 1210 } 1211 return (true); 1212 } 1213 1214 static void 1215 remove_all_sw_breakpoints(void) 1216 { 1217 struct breakpoint *bp, *nbp; 1218 uint8_t *cp; 1219 1220 if (TAILQ_EMPTY(&breakpoints)) 1221 return; 1222 1223 TAILQ_FOREACH_SAFE(bp, &breakpoints, link, nbp) { 1224 debug("remove breakpoint at %#lx\n", bp->gpa); 1225 cp = paddr_guest2host(ctx, bp->gpa, 1); 1226 *cp = bp->shadow_inst; 1227 TAILQ_REMOVE(&breakpoints, bp, link); 1228 free(bp); 1229 } 1230 TAILQ_INIT(&breakpoints); 1231 set_breakpoint_caps(false); 1232 } 1233 1234 static void 1235 update_sw_breakpoint(uint64_t gva, int kind, bool insert) 1236 { 1237 struct breakpoint *bp; 1238 uint64_t gpa; 1239 uint8_t *cp; 1240 int error; 1241 1242 if (kind != 1) { 1243 send_error(EINVAL); 1244 return; 1245 } 1246 1247 error = guest_vaddr2paddr(cur_vcpu, gva, &gpa); 1248 if (error == -1) { 1249 send_error(errno); 1250 return; 1251 } 1252 if (error == 0) { 1253 send_error(EFAULT); 1254 return; 1255 } 1256 1257 cp = paddr_guest2host(ctx, gpa, 1); 1258 1259 /* Only permit breakpoints in guest RAM. */ 1260 if (cp == NULL) { 1261 send_error(EFAULT); 1262 return; 1263 } 1264 1265 /* Find any existing breakpoint. */ 1266 bp = find_breakpoint(gpa); 1267 1268 /* 1269 * Silently ignore duplicate commands since the protocol 1270 * requires these packets to be idempotent. 1271 */ 1272 if (insert) { 1273 if (bp == NULL) { 1274 if (TAILQ_EMPTY(&breakpoints) && 1275 !set_breakpoint_caps(true)) { 1276 send_empty_response(); 1277 return; 1278 } 1279 bp = malloc(sizeof(*bp)); 1280 bp->gpa = gpa; 1281 bp->shadow_inst = *cp; 1282 *cp = 0xcc; /* INT 3 */ 1283 TAILQ_INSERT_TAIL(&breakpoints, bp, link); 1284 debug("new breakpoint at %#lx\n", gpa); 1285 } 1286 } else { 1287 if (bp != NULL) { 1288 debug("remove breakpoint at %#lx\n", gpa); 1289 *cp = bp->shadow_inst; 1290 TAILQ_REMOVE(&breakpoints, bp, link); 1291 free(bp); 1292 if (TAILQ_EMPTY(&breakpoints)) 1293 set_breakpoint_caps(false); 1294 } 1295 } 1296 send_ok(); 1297 } 1298 1299 static void 1300 parse_breakpoint(const uint8_t *data, size_t len) 1301 { 1302 uint64_t gva; 1303 uint8_t *cp; 1304 bool insert; 1305 int kind, type; 1306 1307 insert = data[0] == 'Z'; 1308 1309 /* Skip 'Z/z' */ 1310 data += 1; 1311 len -= 1; 1312 1313 /* Parse and consume type. */ 1314 cp = memchr(data, ',', len); 1315 if (cp == NULL || cp == data) { 1316 send_error(EINVAL); 1317 return; 1318 } 1319 type = parse_integer(data, cp - data); 1320 len -= (cp - data) + 1; 1321 data += (cp - data) + 1; 1322 1323 /* Parse and consume address. */ 1324 cp = memchr(data, ',', len); 1325 if (cp == NULL || cp == data) { 1326 send_error(EINVAL); 1327 return; 1328 } 1329 gva = parse_integer(data, cp - data); 1330 len -= (cp - data) + 1; 1331 data += (cp - data) + 1; 1332 1333 /* Parse and consume kind. */ 1334 cp = memchr(data, ';', len); 1335 if (cp == data) { 1336 send_error(EINVAL); 1337 return; 1338 } 1339 if (cp != NULL) { 1340 /* 1341 * We do not advertise support for either the 1342 * ConditionalBreakpoints or BreakpointCommands 1343 * features, so we should not be getting conditions or 1344 * commands from the remote end. 1345 */ 1346 send_empty_response(); 1347 return; 1348 } 1349 kind = parse_integer(data, len); 1350 data += len; 1351 len = 0; 1352 1353 switch (type) { 1354 case 0: 1355 update_sw_breakpoint(gva, kind, insert); 1356 break; 1357 default: 1358 send_empty_response(); 1359 break; 1360 } 1361 } 1362 1363 static bool 1364 command_equals(const uint8_t *data, size_t len, const char *cmd) 1365 { 1366 1367 if (strlen(cmd) > len) 1368 return (false); 1369 return (memcmp(data, cmd, strlen(cmd)) == 0); 1370 } 1371 1372 static void 1373 check_features(const uint8_t *data, size_t len) 1374 { 1375 char *feature, *next_feature, *str, *value; 1376 bool supported; 1377 1378 str = malloc(len + 1); 1379 memcpy(str, data, len); 1380 str[len] = '\0'; 1381 next_feature = str; 1382 1383 while ((feature = strsep(&next_feature, ";")) != NULL) { 1384 /* 1385 * Null features shouldn't exist, but skip if they 1386 * do. 1387 */ 1388 if (strcmp(feature, "") == 0) 1389 continue; 1390 1391 /* 1392 * Look for the value or supported / not supported 1393 * flag. 1394 */ 1395 value = strchr(feature, '='); 1396 if (value != NULL) { 1397 *value = '\0'; 1398 value++; 1399 supported = true; 1400 } else { 1401 value = feature + strlen(feature) - 1; 1402 switch (*value) { 1403 case '+': 1404 supported = true; 1405 break; 1406 case '-': 1407 supported = false; 1408 break; 1409 default: 1410 /* 1411 * This is really a protocol error, 1412 * but we just ignore malformed 1413 * features for ease of 1414 * implementation. 1415 */ 1416 continue; 1417 } 1418 value = NULL; 1419 } 1420 1421 if (strcmp(feature, "swbreak") == 0) 1422 swbreak_enabled = supported; 1423 } 1424 free(str); 1425 1426 start_packet(); 1427 1428 /* This is an arbitrary limit. */ 1429 append_string("PacketSize=4096"); 1430 append_string(";swbreak+"); 1431 finish_packet(); 1432 } 1433 1434 static void 1435 gdb_query(const uint8_t *data, size_t len) 1436 { 1437 1438 /* 1439 * TODO: 1440 * - qSearch 1441 */ 1442 if (command_equals(data, len, "qAttached")) { 1443 start_packet(); 1444 append_char('1'); 1445 finish_packet(); 1446 } else if (command_equals(data, len, "qC")) { 1447 start_packet(); 1448 append_string("QC"); 1449 append_integer(cur_vcpu + 1); 1450 finish_packet(); 1451 } else if (command_equals(data, len, "qfThreadInfo")) { 1452 cpuset_t mask; 1453 bool first; 1454 int vcpu; 1455 1456 if (CPU_EMPTY(&vcpus_active)) { 1457 send_error(EINVAL); 1458 return; 1459 } 1460 mask = vcpus_active; 1461 start_packet(); 1462 append_char('m'); 1463 first = true; 1464 while (!CPU_EMPTY(&mask)) { 1465 vcpu = CPU_FFS(&mask) - 1; 1466 CPU_CLR(vcpu, &mask); 1467 if (first) 1468 first = false; 1469 else 1470 append_char(','); 1471 append_integer(vcpu + 1); 1472 } 1473 finish_packet(); 1474 } else if (command_equals(data, len, "qsThreadInfo")) { 1475 start_packet(); 1476 append_char('l'); 1477 finish_packet(); 1478 } else if (command_equals(data, len, "qSupported")) { 1479 data += strlen("qSupported"); 1480 len -= strlen("qSupported"); 1481 check_features(data, len); 1482 } else if (command_equals(data, len, "qThreadExtraInfo")) { 1483 char buf[16]; 1484 int tid; 1485 1486 data += strlen("qThreadExtraInfo"); 1487 len -= strlen("qThreadExtraInfo"); 1488 if (*data != ',') { 1489 send_error(EINVAL); 1490 return; 1491 } 1492 tid = parse_threadid(data + 1, len - 1); 1493 if (tid <= 0 || !CPU_ISSET(tid - 1, &vcpus_active)) { 1494 send_error(EINVAL); 1495 return; 1496 } 1497 1498 snprintf(buf, sizeof(buf), "vCPU %d", tid - 1); 1499 start_packet(); 1500 append_asciihex(buf); 1501 finish_packet(); 1502 } else 1503 send_empty_response(); 1504 } 1505 1506 static void 1507 handle_command(const uint8_t *data, size_t len) 1508 { 1509 1510 /* Reject packets with a sequence-id. */ 1511 if (len >= 3 && data[0] >= '0' && data[0] <= '9' && 1512 data[0] >= '0' && data[0] <= '9' && data[2] == ':') { 1513 send_empty_response(); 1514 return; 1515 } 1516 1517 switch (*data) { 1518 case 'c': 1519 if (len != 1) { 1520 send_error(EINVAL); 1521 break; 1522 } 1523 1524 discard_stop(); 1525 gdb_resume_vcpus(); 1526 break; 1527 case 'D': 1528 send_ok(); 1529 1530 /* TODO: Resume any stopped CPUs. */ 1531 break; 1532 case 'g': { 1533 gdb_read_regs(); 1534 break; 1535 } 1536 case 'H': { 1537 int tid; 1538 1539 if (data[1] != 'g' && data[1] != 'c') { 1540 send_error(EINVAL); 1541 break; 1542 } 1543 tid = parse_threadid(data + 2, len - 2); 1544 if (tid == -2) { 1545 send_error(EINVAL); 1546 break; 1547 } 1548 1549 if (CPU_EMPTY(&vcpus_active)) { 1550 send_error(EINVAL); 1551 break; 1552 } 1553 if (tid == -1 || tid == 0) 1554 cur_vcpu = CPU_FFS(&vcpus_active) - 1; 1555 else if (CPU_ISSET(tid - 1, &vcpus_active)) 1556 cur_vcpu = tid - 1; 1557 else { 1558 send_error(EINVAL); 1559 break; 1560 } 1561 send_ok(); 1562 break; 1563 } 1564 case 'm': 1565 gdb_read_mem(data, len); 1566 break; 1567 case 'M': 1568 gdb_write_mem(data, len); 1569 break; 1570 case 'T': { 1571 int tid; 1572 1573 tid = parse_threadid(data + 1, len - 1); 1574 if (tid <= 0 || !CPU_ISSET(tid - 1, &vcpus_active)) { 1575 send_error(EINVAL); 1576 return; 1577 } 1578 send_ok(); 1579 break; 1580 } 1581 case 'q': 1582 gdb_query(data, len); 1583 break; 1584 case 's': 1585 if (len != 1) { 1586 send_error(EINVAL); 1587 break; 1588 } 1589 1590 /* Don't send a reply until a stop occurs. */ 1591 if (!gdb_step_vcpu(cur_vcpu)) { 1592 send_error(EOPNOTSUPP); 1593 break; 1594 } 1595 break; 1596 case 'z': 1597 case 'Z': 1598 parse_breakpoint(data, len); 1599 break; 1600 case '?': 1601 report_stop(false); 1602 break; 1603 case 'G': /* TODO */ 1604 case 'v': 1605 /* Handle 'vCont' */ 1606 /* 'vCtrlC' */ 1607 case 'p': /* TODO */ 1608 case 'P': /* TODO */ 1609 case 'Q': /* TODO */ 1610 case 't': /* TODO */ 1611 case 'X': /* TODO */ 1612 default: 1613 send_empty_response(); 1614 } 1615 } 1616 1617 /* Check for a valid packet in the command buffer. */ 1618 static void 1619 check_command(int fd) 1620 { 1621 uint8_t *head, *hash, *p, sum; 1622 size_t avail, plen; 1623 1624 for (;;) { 1625 avail = cur_comm.len; 1626 if (avail == 0) 1627 return; 1628 head = io_buffer_head(&cur_comm); 1629 switch (*head) { 1630 case 0x03: 1631 debug("<- Ctrl-C\n"); 1632 io_buffer_consume(&cur_comm, 1); 1633 1634 gdb_suspend_vcpus(); 1635 break; 1636 case '+': 1637 /* ACK of previous response. */ 1638 debug("<- +\n"); 1639 if (response_pending()) 1640 io_buffer_reset(&cur_resp); 1641 io_buffer_consume(&cur_comm, 1); 1642 if (stopped_vcpu != -1 && report_next_stop) { 1643 report_stop(true); 1644 send_pending_data(fd); 1645 } 1646 break; 1647 case '-': 1648 /* NACK of previous response. */ 1649 debug("<- -\n"); 1650 if (response_pending()) { 1651 cur_resp.len += cur_resp.start; 1652 cur_resp.start = 0; 1653 if (cur_resp.data[0] == '+') 1654 io_buffer_advance(&cur_resp, 1); 1655 debug("-> %.*s\n", (int)cur_resp.len, 1656 io_buffer_head(&cur_resp)); 1657 } 1658 io_buffer_consume(&cur_comm, 1); 1659 send_pending_data(fd); 1660 break; 1661 case '$': 1662 /* Packet. */ 1663 1664 if (response_pending()) { 1665 warnx("New GDB command while response in " 1666 "progress"); 1667 io_buffer_reset(&cur_resp); 1668 } 1669 1670 /* Is packet complete? */ 1671 hash = memchr(head, '#', avail); 1672 if (hash == NULL) 1673 return; 1674 plen = (hash - head + 1) + 2; 1675 if (avail < plen) 1676 return; 1677 debug("<- %.*s\n", (int)plen, head); 1678 1679 /* Verify checksum. */ 1680 for (sum = 0, p = head + 1; p < hash; p++) 1681 sum += *p; 1682 if (sum != parse_byte(hash + 1)) { 1683 io_buffer_consume(&cur_comm, plen); 1684 debug("-> -\n"); 1685 send_char('-'); 1686 send_pending_data(fd); 1687 break; 1688 } 1689 send_char('+'); 1690 1691 handle_command(head + 1, hash - (head + 1)); 1692 io_buffer_consume(&cur_comm, plen); 1693 if (!response_pending()) 1694 debug("-> +\n"); 1695 send_pending_data(fd); 1696 break; 1697 default: 1698 /* XXX: Possibly drop connection instead. */ 1699 debug("-> %02x\n", *head); 1700 io_buffer_consume(&cur_comm, 1); 1701 break; 1702 } 1703 } 1704 } 1705 1706 static void 1707 gdb_readable(int fd, enum ev_type event, void *arg) 1708 { 1709 ssize_t nread; 1710 int pending; 1711 1712 if (ioctl(fd, FIONREAD, &pending) == -1) { 1713 warn("FIONREAD on GDB socket"); 1714 return; 1715 } 1716 1717 /* 1718 * 'pending' might be zero due to EOF. We need to call read 1719 * with a non-zero length to detect EOF. 1720 */ 1721 if (pending == 0) 1722 pending = 1; 1723 1724 /* Ensure there is room in the command buffer. */ 1725 io_buffer_grow(&cur_comm, pending); 1726 assert(io_buffer_avail(&cur_comm) >= pending); 1727 1728 nread = read(fd, io_buffer_tail(&cur_comm), io_buffer_avail(&cur_comm)); 1729 if (nread == 0) { 1730 close_connection(); 1731 } else if (nread == -1) { 1732 if (errno == EAGAIN) 1733 return; 1734 1735 warn("Read from GDB socket"); 1736 close_connection(); 1737 } else { 1738 cur_comm.len += nread; 1739 pthread_mutex_lock(&gdb_lock); 1740 check_command(fd); 1741 pthread_mutex_unlock(&gdb_lock); 1742 } 1743 } 1744 1745 static void 1746 gdb_writable(int fd, enum ev_type event, void *arg) 1747 { 1748 1749 send_pending_data(fd); 1750 } 1751 1752 static void 1753 new_connection(int fd, enum ev_type event, void *arg) 1754 { 1755 int optval, s; 1756 1757 s = accept4(fd, NULL, NULL, SOCK_NONBLOCK); 1758 if (s == -1) { 1759 if (arg != NULL) 1760 err(1, "Failed accepting initial GDB connection"); 1761 1762 /* Silently ignore errors post-startup. */ 1763 return; 1764 } 1765 1766 optval = 1; 1767 if (setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)) == 1768 -1) { 1769 warn("Failed to disable SIGPIPE for GDB connection"); 1770 close(s); 1771 return; 1772 } 1773 1774 pthread_mutex_lock(&gdb_lock); 1775 if (cur_fd != -1) { 1776 close(s); 1777 warnx("Ignoring additional GDB connection."); 1778 } 1779 1780 read_event = mevent_add(s, EVF_READ, gdb_readable, NULL); 1781 if (read_event == NULL) { 1782 if (arg != NULL) 1783 err(1, "Failed to setup initial GDB connection"); 1784 pthread_mutex_unlock(&gdb_lock); 1785 return; 1786 } 1787 write_event = mevent_add(s, EVF_WRITE, gdb_writable, NULL); 1788 if (write_event == NULL) { 1789 if (arg != NULL) 1790 err(1, "Failed to setup initial GDB connection"); 1791 mevent_delete_close(read_event); 1792 read_event = NULL; 1793 } 1794 1795 cur_fd = s; 1796 cur_vcpu = 0; 1797 stopped_vcpu = -1; 1798 1799 /* Break on attach. */ 1800 first_stop = true; 1801 report_next_stop = false; 1802 gdb_suspend_vcpus(); 1803 pthread_mutex_unlock(&gdb_lock); 1804 } 1805 1806 #ifndef WITHOUT_CAPSICUM 1807 void 1808 limit_gdb_socket(int s) 1809 { 1810 cap_rights_t rights; 1811 unsigned long ioctls[] = { FIONREAD }; 1812 1813 cap_rights_init(&rights, CAP_ACCEPT, CAP_EVENT, CAP_READ, CAP_WRITE, 1814 CAP_SETSOCKOPT, CAP_IOCTL); 1815 if (caph_rights_limit(s, &rights) == -1) 1816 errx(EX_OSERR, "Unable to apply rights for sandbox"); 1817 if (caph_ioctls_limit(s, ioctls, nitems(ioctls)) == -1) 1818 errx(EX_OSERR, "Unable to apply rights for sandbox"); 1819 } 1820 #endif 1821 1822 void 1823 init_gdb(struct vmctx *_ctx) 1824 { 1825 int error, flags, optval, s; 1826 struct addrinfo hints; 1827 struct addrinfo *gdbaddr; 1828 const char *saddr, *value; 1829 char *sport; 1830 bool wait; 1831 1832 value = get_config_value("gdb.port"); 1833 if (value == NULL) 1834 return; 1835 sport = strdup(value); 1836 if (sport == NULL) 1837 errx(4, "Failed to allocate memory"); 1838 1839 wait = get_config_bool_default("gdb.wait", false); 1840 1841 saddr = get_config_value("gdb.address"); 1842 if (saddr == NULL) { 1843 saddr = "localhost"; 1844 } 1845 1846 debug("==> starting on %s:%s, %swaiting\n", 1847 saddr, sport, wait ? "" : "not "); 1848 1849 error = pthread_mutex_init(&gdb_lock, NULL); 1850 if (error != 0) 1851 errc(1, error, "gdb mutex init"); 1852 error = pthread_cond_init(&idle_vcpus, NULL); 1853 if (error != 0) 1854 errc(1, error, "gdb cv init"); 1855 1856 memset(&hints, 0, sizeof(hints)); 1857 hints.ai_family = AF_UNSPEC; 1858 hints.ai_socktype = SOCK_STREAM; 1859 hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE; 1860 1861 error = getaddrinfo(saddr, sport, &hints, &gdbaddr); 1862 if (error != 0) 1863 errx(1, "gdb address resolution: %s", gai_strerror(error)); 1864 1865 ctx = _ctx; 1866 s = socket(gdbaddr->ai_family, gdbaddr->ai_socktype, 0); 1867 if (s < 0) 1868 err(1, "gdb socket create"); 1869 1870 optval = 1; 1871 (void)setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); 1872 1873 if (bind(s, gdbaddr->ai_addr, gdbaddr->ai_addrlen) < 0) 1874 err(1, "gdb socket bind"); 1875 1876 if (listen(s, 1) < 0) 1877 err(1, "gdb socket listen"); 1878 1879 stopped_vcpu = -1; 1880 TAILQ_INIT(&breakpoints); 1881 vcpu_state = calloc(guest_ncpus, sizeof(*vcpu_state)); 1882 if (wait) { 1883 /* 1884 * Set vcpu 0 in vcpus_suspended. This will trigger the 1885 * logic in gdb_cpu_add() to suspend the first vcpu before 1886 * it starts execution. The vcpu will remain suspended 1887 * until a debugger connects. 1888 */ 1889 CPU_SET(0, &vcpus_suspended); 1890 stopped_vcpu = 0; 1891 } 1892 1893 flags = fcntl(s, F_GETFL); 1894 if (fcntl(s, F_SETFL, flags | O_NONBLOCK) == -1) 1895 err(1, "Failed to mark gdb socket non-blocking"); 1896 1897 #ifndef WITHOUT_CAPSICUM 1898 limit_gdb_socket(s); 1899 #endif 1900 mevent_add(s, EVF_READ, new_connection, NULL); 1901 gdb_active = true; 1902 freeaddrinfo(gdbaddr); 1903 free(sport); 1904 } 1905