]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/bhyve/gdb.c
mld6query: Fix typo s/linkocal/linklocal/
[FreeBSD/FreeBSD.git] / usr.sbin / bhyve / gdb.c
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/socket.h>
39 #include <machine/atomic.h>
40 #include <machine/specialreg.h>
41 #include <machine/vmm.h>
42 #include <netinet/in.h>
43 #include <assert.h>
44 #ifndef WITHOUT_CAPSICUM
45 #include <capsicum_helpers.h>
46 #endif
47 #include <err.h>
48 #include <errno.h>
49 #include <fcntl.h>
50 #include <pthread.h>
51 #include <pthread_np.h>
52 #include <stdbool.h>
53 #include <stdio.h>
54 #include <stdlib.h>
55 #include <string.h>
56 #include <sysexits.h>
57 #include <unistd.h>
58 #include <vmmapi.h>
59
60 #include "bhyverun.h"
61 #include "mem.h"
62 #include "mevent.h"
63
64 /*
65  * GDB_SIGNAL_* numbers are part of the GDB remote protocol.  Most stops
66  * use SIGTRAP.
67  */
68 #define GDB_SIGNAL_TRAP         5
69
70 static void gdb_resume_vcpus(void);
71 static void check_command(int fd);
72
73 static struct mevent *read_event, *write_event;
74
75 static cpuset_t vcpus_active, vcpus_suspended, vcpus_waiting;
76 static pthread_mutex_t gdb_lock;
77 static pthread_cond_t idle_vcpus;
78 static bool stop_pending, first_stop;
79 static int stepping_vcpu, stopped_vcpu;
80
81 /*
82  * An I/O buffer contains 'capacity' bytes of room at 'data'.  For a
83  * read buffer, 'start' is unused and 'len' contains the number of
84  * valid bytes in the buffer.  For a write buffer, 'start' is set to
85  * the index of the next byte in 'data' to send, and 'len' contains
86  * the remaining number of valid bytes to send.
87  */
88 struct io_buffer {
89         uint8_t *data;
90         size_t capacity;
91         size_t start;
92         size_t len;
93 };
94
95 static struct io_buffer cur_comm, cur_resp;
96 static uint8_t cur_csum;
97 static int cur_vcpu;
98 static struct vmctx *ctx;
99 static int cur_fd = -1;
100
101 const int gdb_regset[] = {
102         VM_REG_GUEST_RAX,
103         VM_REG_GUEST_RBX,
104         VM_REG_GUEST_RCX,
105         VM_REG_GUEST_RDX,
106         VM_REG_GUEST_RSI,
107         VM_REG_GUEST_RDI,
108         VM_REG_GUEST_RBP,
109         VM_REG_GUEST_RSP,
110         VM_REG_GUEST_R8,
111         VM_REG_GUEST_R9,
112         VM_REG_GUEST_R10,
113         VM_REG_GUEST_R11,
114         VM_REG_GUEST_R12,
115         VM_REG_GUEST_R13,
116         VM_REG_GUEST_R14,
117         VM_REG_GUEST_R15,
118         VM_REG_GUEST_RIP,
119         VM_REG_GUEST_RFLAGS,
120         VM_REG_GUEST_CS,
121         VM_REG_GUEST_SS,
122         VM_REG_GUEST_DS,
123         VM_REG_GUEST_ES,
124         VM_REG_GUEST_FS,
125         VM_REG_GUEST_GS
126 };
127
128 const int gdb_regsize[] = {
129         8,
130         8,
131         8,
132         8,
133         8,
134         8,
135         8,
136         8,
137         8,
138         8,
139         8,
140         8,
141         8,
142         8,
143         8,
144         8,
145         8,
146         4,
147         4,
148         4,
149         4,
150         4,
151         4,
152         4
153 };
154
155 #ifdef GDB_LOG
156 #include <stdarg.h>
157 #include <stdio.h>
158
159 static void __printflike(1, 2)
160 debug(const char *fmt, ...)
161 {
162         static FILE *logfile;
163         va_list ap;
164
165         if (logfile == NULL) {
166                 logfile = fopen("/tmp/bhyve_gdb.log", "w");
167                 if (logfile == NULL)
168                         return;
169 #ifndef WITHOUT_CAPSICUM
170                 if (caph_limit_stream(fileno(logfile), CAPH_WRITE) == -1) {
171                         fclose(logfile);
172                         logfile = NULL;
173                         return;
174                 }
175 #endif
176                 setlinebuf(logfile);
177         }
178         va_start(ap, fmt);
179         vfprintf(logfile, fmt, ap);
180         va_end(ap);
181 }
182 #else
183 #define debug(...)
184 #endif
185
186 static int
187 guest_paging_info(int vcpu, struct vm_guest_paging *paging)
188 {
189         uint64_t regs[4];
190         const int regset[4] = {
191                 VM_REG_GUEST_CR0,
192                 VM_REG_GUEST_CR3,
193                 VM_REG_GUEST_CR4,
194                 VM_REG_GUEST_EFER
195         };
196
197         if (vm_get_register_set(ctx, vcpu, nitems(regset), regset, regs) == -1)
198                 return (-1);
199
200         /*
201          * For the debugger, always pretend to be the kernel (CPL 0),
202          * and if long-mode is enabled, always parse addresses as if
203          * in 64-bit mode.
204          */
205         paging->cr3 = regs[1];
206         paging->cpl = 0;
207         if (regs[3] & EFER_LMA)
208                 paging->cpu_mode = CPU_MODE_64BIT;
209         else if (regs[0] & CR0_PE)
210                 paging->cpu_mode = CPU_MODE_PROTECTED;
211         else
212                 paging->cpu_mode = CPU_MODE_REAL;
213         if (!(regs[0] & CR0_PG))
214                 paging->paging_mode = PAGING_MODE_FLAT;
215         else if (!(regs[2] & CR4_PAE))
216                 paging->paging_mode = PAGING_MODE_32;
217         else if (regs[3] & EFER_LME)
218                 paging->paging_mode = PAGING_MODE_64;
219         else
220                 paging->paging_mode = PAGING_MODE_PAE;
221         return (0);
222 }
223
224 /*
225  * Map a guest virtual address to a physical address (for a given vcpu).
226  * If a guest virtual address is valid, return 1.  If the address is
227  * not valid, return 0.  If an error occurs obtaining the mapping,
228  * return -1.
229  */
230 static int
231 guest_vaddr2paddr(int vcpu, uint64_t vaddr, uint64_t *paddr)
232 {
233         struct vm_guest_paging paging;
234         int fault;
235
236         if (guest_paging_info(vcpu, &paging) == -1)
237                 return (-1);
238
239         /*
240          * Always use PROT_READ.  We really care if the VA is
241          * accessible, not if the current vCPU can write.
242          */
243         if (vm_gla2gpa_nofault(ctx, vcpu, &paging, vaddr, PROT_READ, paddr,
244             &fault) == -1)
245                 return (-1);
246         if (fault)
247                 return (0);
248         return (1);
249 }
250
251 static void
252 io_buffer_reset(struct io_buffer *io)
253 {
254
255         io->start = 0;
256         io->len = 0;
257 }
258
259 /* Available room for adding data. */
260 static size_t
261 io_buffer_avail(struct io_buffer *io)
262 {
263
264         return (io->capacity - (io->start + io->len));
265 }
266
267 static uint8_t *
268 io_buffer_head(struct io_buffer *io)
269 {
270
271         return (io->data + io->start);
272 }
273
274 static uint8_t *
275 io_buffer_tail(struct io_buffer *io)
276 {
277
278         return (io->data + io->start + io->len);
279 }
280
281 static void
282 io_buffer_advance(struct io_buffer *io, size_t amount)
283 {
284
285         assert(amount <= io->len);
286         io->start += amount;
287         io->len -= amount;
288 }
289
290 static void
291 io_buffer_consume(struct io_buffer *io, size_t amount)
292 {
293
294         io_buffer_advance(io, amount);
295         if (io->len == 0) {
296                 io->start = 0;
297                 return;
298         }
299
300         /*
301          * XXX: Consider making this move optional and compacting on a
302          * future read() before realloc().
303          */
304         memmove(io->data, io_buffer_head(io), io->len);
305         io->start = 0;
306 }
307
308 static void
309 io_buffer_grow(struct io_buffer *io, size_t newsize)
310 {
311         uint8_t *new_data;
312         size_t avail, new_cap;
313
314         avail = io_buffer_avail(io);
315         if (newsize <= avail)
316                 return;
317
318         new_cap = io->capacity + (newsize - avail);
319         new_data = realloc(io->data, new_cap);
320         if (new_data == NULL)
321                 err(1, "Failed to grow GDB I/O buffer");
322         io->data = new_data;
323         io->capacity = new_cap;
324 }
325
326 static bool
327 response_pending(void)
328 {
329
330         if (cur_resp.start == 0 && cur_resp.len == 0)
331                 return (false);
332         if (cur_resp.start + cur_resp.len == 1 && cur_resp.data[0] == '+')
333                 return (false);
334         return (true);
335 }
336
337 static void
338 close_connection(void)
339 {
340
341         /*
342          * XXX: This triggers a warning because mevent does the close
343          * before the EV_DELETE.
344          */
345         pthread_mutex_lock(&gdb_lock);
346         mevent_delete(write_event);
347         mevent_delete_close(read_event);
348         write_event = NULL;
349         read_event = NULL;
350         io_buffer_reset(&cur_comm);
351         io_buffer_reset(&cur_resp);
352         cur_fd = -1;
353
354         /* Resume any stopped vCPUs. */
355         gdb_resume_vcpus();
356         pthread_mutex_unlock(&gdb_lock);
357 }
358
359 static uint8_t
360 hex_digit(uint8_t nibble)
361 {
362
363         if (nibble <= 9)
364                 return (nibble + '0');
365         else
366                 return (nibble + 'a' - 10);
367 }
368
369 static uint8_t
370 parse_digit(uint8_t v)
371 {
372
373         if (v >= '0' && v <= '9')
374                 return (v - '0');
375         if (v >= 'a' && v <= 'f')
376                 return (v - 'a' + 10);
377         if (v >= 'A' && v <= 'F')
378                 return (v - 'A' + 10);
379         return (0xF);
380 }
381
382 /* Parses big-endian hexadecimal. */
383 static uintmax_t
384 parse_integer(const uint8_t *p, size_t len)
385 {
386         uintmax_t v;
387
388         v = 0;
389         while (len > 0) {
390                 v <<= 4;
391                 v |= parse_digit(*p);
392                 p++;
393                 len--;
394         }
395         return (v);
396 }
397
398 static uint8_t
399 parse_byte(const uint8_t *p)
400 {
401
402         return (parse_digit(p[0]) << 4 | parse_digit(p[1]));
403 }
404
405 static void
406 send_pending_data(int fd)
407 {
408         ssize_t nwritten;
409
410         if (cur_resp.len == 0) {
411                 mevent_disable(write_event);
412                 return;
413         }
414         nwritten = write(fd, io_buffer_head(&cur_resp), cur_resp.len);
415         if (nwritten == -1) {
416                 warn("Write to GDB socket failed");
417                 close_connection();
418         } else {
419                 io_buffer_advance(&cur_resp, nwritten);
420                 if (cur_resp.len == 0)
421                         mevent_disable(write_event);
422                 else
423                         mevent_enable(write_event);
424         }
425 }
426
427 /* Append a single character to the output buffer. */
428 static void
429 send_char(uint8_t data)
430 {
431         io_buffer_grow(&cur_resp, 1);
432         *io_buffer_tail(&cur_resp) = data;
433         cur_resp.len++;
434 }
435
436 /* Append an array of bytes to the output buffer. */
437 static void
438 send_data(const uint8_t *data, size_t len)
439 {
440
441         io_buffer_grow(&cur_resp, len);
442         memcpy(io_buffer_tail(&cur_resp), data, len);
443         cur_resp.len += len;
444 }
445
446 static void
447 format_byte(uint8_t v, uint8_t *buf)
448 {
449
450         buf[0] = hex_digit(v >> 4);
451         buf[1] = hex_digit(v & 0xf);
452 }
453
454 /*
455  * Append a single byte (formatted as two hex characters) to the
456  * output buffer.
457  */
458 static void
459 send_byte(uint8_t v)
460 {
461         uint8_t buf[2];
462
463         format_byte(v, buf);
464         send_data(buf, sizeof(buf));
465 }
466
467 static void
468 start_packet(void)
469 {
470
471         send_char('$');
472         cur_csum = 0;
473 }
474
475 static void
476 finish_packet(void)
477 {
478
479         send_char('#');
480         send_byte(cur_csum);
481         debug("-> %.*s\n", (int)cur_resp.len, io_buffer_head(&cur_resp));
482 }
483
484 /*
485  * Append a single character (for the packet payload) and update the
486  * checksum.
487  */
488 static void
489 append_char(uint8_t v)
490 {
491
492         send_char(v);
493         cur_csum += v;
494 }
495
496 /*
497  * Append an array of bytes (for the packet payload) and update the
498  * checksum.
499  */
500 static void
501 append_packet_data(const uint8_t *data, size_t len)
502 {
503
504         send_data(data, len);
505         while (len > 0) {
506                 cur_csum += *data;
507                 data++;
508                 len--;
509         }
510 }
511
512 static void
513 append_string(const char *str)
514 {
515
516         append_packet_data(str, strlen(str));
517 }
518
519 static void
520 append_byte(uint8_t v)
521 {
522         uint8_t buf[2];
523
524         format_byte(v, buf);
525         append_packet_data(buf, sizeof(buf));
526 }
527
528 static void
529 append_unsigned_native(uintmax_t value, size_t len)
530 {
531         size_t i;
532
533         for (i = 0; i < len; i++) {
534                 append_byte(value);
535                 value >>= 8;
536         }
537 }
538
539 static void
540 append_unsigned_be(uintmax_t value, size_t len)
541 {
542         char buf[len * 2];
543         size_t i;
544
545         for (i = 0; i < len; i++) {
546                 format_byte(value, buf + (len - i - 1) * 2);
547                 value >>= 8;
548         }
549         append_packet_data(buf, sizeof(buf));
550 }
551
552 static void
553 append_integer(unsigned int value)
554 {
555
556         if (value == 0)
557                 append_char('0');
558         else
559                 append_unsigned_be(value, fls(value) + 7 / 8);
560 }
561
562 static void
563 append_asciihex(const char *str)
564 {
565
566         while (*str != '\0') {
567                 append_byte(*str);
568                 str++;
569         }
570 }
571
572 static void
573 send_empty_response(void)
574 {
575
576         start_packet();
577         finish_packet();
578 }
579
580 static void
581 send_error(int error)
582 {
583
584         start_packet();
585         append_char('E');
586         append_byte(error);
587         finish_packet();
588 }
589
590 static void
591 send_ok(void)
592 {
593
594         start_packet();
595         append_string("OK");
596         finish_packet();
597 }
598
599 static int
600 parse_threadid(const uint8_t *data, size_t len)
601 {
602
603         if (len == 1 && *data == '0')
604                 return (0);
605         if (len == 2 && memcmp(data, "-1", 2) == 0)
606                 return (-1);
607         if (len == 0)
608                 return (-2);
609         return (parse_integer(data, len));
610 }
611
612 static void
613 report_stop(void)
614 {
615
616         start_packet();
617         if (stopped_vcpu == -1)
618                 append_char('S');
619         else
620                 append_char('T');
621         append_byte(GDB_SIGNAL_TRAP);
622         if (stopped_vcpu != -1) {
623                 append_string("thread:");
624                 append_integer(stopped_vcpu + 1);
625                 append_char(';');
626         }
627         stopped_vcpu = -1;
628         finish_packet();
629 }
630
631 static void
632 gdb_finish_suspend_vcpus(void)
633 {
634
635         if (first_stop) {
636                 first_stop = false;
637                 stopped_vcpu = -1;
638         } else if (response_pending())
639                 stop_pending = true;
640         else {
641                 report_stop();
642                 send_pending_data(cur_fd);
643         }
644 }
645
646 static void
647 _gdb_cpu_suspend(int vcpu, bool report_stop)
648 {
649
650         debug("$vCPU %d suspending\n", vcpu);
651         CPU_SET(vcpu, &vcpus_waiting);
652         if (report_stop && CPU_CMP(&vcpus_waiting, &vcpus_suspended) == 0)
653                 gdb_finish_suspend_vcpus();
654         while (CPU_ISSET(vcpu, &vcpus_suspended) && vcpu != stepping_vcpu)
655                 pthread_cond_wait(&idle_vcpus, &gdb_lock);
656         CPU_CLR(vcpu, &vcpus_waiting);
657         debug("$vCPU %d resuming\n", vcpu);
658 }
659
660 void
661 gdb_cpu_add(int vcpu)
662 {
663
664         debug("$vCPU %d starting\n", vcpu);
665         pthread_mutex_lock(&gdb_lock);
666         CPU_SET(vcpu, &vcpus_active);
667
668         /*
669          * If a vcpu is added while vcpus are stopped, suspend the new
670          * vcpu so that it will pop back out with a debug exit before
671          * executing the first instruction.
672          */
673         if (!CPU_EMPTY(&vcpus_suspended)) {
674                 CPU_SET(vcpu, &vcpus_suspended);
675                 _gdb_cpu_suspend(vcpu, false);
676         }
677         pthread_mutex_unlock(&gdb_lock);
678 }
679
680 void
681 gdb_cpu_suspend(int vcpu)
682 {
683
684         pthread_mutex_lock(&gdb_lock);
685         _gdb_cpu_suspend(vcpu, true);
686         pthread_mutex_unlock(&gdb_lock);
687 }
688
689 void
690 gdb_cpu_mtrap(int vcpu)
691 {
692
693         debug("$vCPU %d MTRAP\n", vcpu);
694         pthread_mutex_lock(&gdb_lock);
695         if (vcpu == stepping_vcpu) {
696                 stepping_vcpu = -1;
697                 vm_set_capability(ctx, vcpu, VM_CAP_MTRAP_EXIT, 0);
698                 vm_suspend_cpu(ctx, vcpu);
699                 assert(stopped_vcpu == -1);
700                 stopped_vcpu = vcpu;
701                 _gdb_cpu_suspend(vcpu, true);
702         }
703         pthread_mutex_unlock(&gdb_lock);
704 }
705
706 static void
707 gdb_suspend_vcpus(void)
708 {
709
710         assert(pthread_mutex_isowned_np(&gdb_lock));
711         debug("suspending all CPUs\n");
712         vcpus_suspended = vcpus_active;
713         vm_suspend_cpu(ctx, -1);
714         if (CPU_CMP(&vcpus_waiting, &vcpus_suspended) == 0)
715                 gdb_finish_suspend_vcpus();
716 }
717
718 static bool
719 gdb_step_vcpu(int vcpu)
720 {
721         int error, val;
722
723         debug("$vCPU %d step\n", vcpu);
724         error = vm_get_capability(ctx, vcpu, VM_CAP_MTRAP_EXIT, &val);
725         if (error < 0)
726                 return (false);
727         error = vm_set_capability(ctx, vcpu, VM_CAP_MTRAP_EXIT, 1);
728         vm_resume_cpu(ctx, vcpu);
729         stepping_vcpu = vcpu;
730         pthread_cond_broadcast(&idle_vcpus);
731         return (true);
732 }
733
734 static void
735 gdb_resume_vcpus(void)
736 {
737
738         assert(pthread_mutex_isowned_np(&gdb_lock));
739         vm_resume_cpu(ctx, -1);
740         debug("resuming all CPUs\n");
741         CPU_ZERO(&vcpus_suspended);
742         pthread_cond_broadcast(&idle_vcpus);
743 }
744
745 static void
746 gdb_read_regs(void)
747 {
748         uint64_t regvals[nitems(gdb_regset)];
749         int i;
750
751         if (vm_get_register_set(ctx, cur_vcpu, nitems(gdb_regset),
752             gdb_regset, regvals) == -1) {
753                 send_error(errno);
754                 return;
755         }
756         start_packet();
757         for (i = 0; i < nitems(regvals); i++)
758                 append_unsigned_native(regvals[i], gdb_regsize[i]);
759         finish_packet();
760 }
761
762 static void
763 gdb_read_mem(const uint8_t *data, size_t len)
764 {
765         uint64_t gpa, gva, val;
766         uint8_t *cp;
767         size_t resid, todo, bytes;
768         bool started;
769         int error;
770
771         /* Skip 'm' */
772         data += 1;
773         len -= 1;
774
775         /* Parse and consume address. */
776         cp = memchr(data, ',', len);
777         if (cp == NULL || cp == data) {
778                 send_error(EINVAL);
779                 return;
780         }
781         gva = parse_integer(data, cp - data);
782         len -= (cp - data) + 1;
783         data += (cp - data) + 1;
784
785         /* Parse length. */
786         resid = parse_integer(data, len);
787
788         started = false;
789         while (resid > 0) {
790                 error = guest_vaddr2paddr(cur_vcpu, gva, &gpa);
791                 if (error == -1) {
792                         if (started)
793                                 finish_packet();
794                         else
795                                 send_error(errno);
796                         return;
797                 }
798                 if (error == 0) {
799                         if (started)
800                                 finish_packet();
801                         else
802                                 send_error(EFAULT);
803                         return;
804                 }
805
806                 /* Read bytes from current page. */
807                 todo = getpagesize() - gpa % getpagesize();
808                 if (todo > resid)
809                         todo = resid;
810
811                 cp = paddr_guest2host(ctx, gpa, todo);
812                 if (cp != NULL) {
813                         /*
814                          * If this page is guest RAM, read it a byte
815                          * at a time.
816                          */
817                         if (!started) {
818                                 start_packet();
819                                 started = true;
820                         }
821                         while (todo > 0) {
822                                 append_byte(*cp);
823                                 cp++;
824                                 gpa++;
825                                 gva++;
826                                 resid--;
827                                 todo--;
828                         }
829                 } else {
830                         /*
831                          * If this page isn't guest RAM, try to handle
832                          * it via MMIO.  For MMIO requests, use
833                          * aligned reads of words when possible.
834                          */
835                         while (todo > 0) {
836                                 if (gpa & 1 || todo == 1)
837                                         bytes = 1;
838                                 else if (gpa & 2 || todo == 2)
839                                         bytes = 2;
840                                 else
841                                         bytes = 4;
842                                 error = read_mem(ctx, cur_vcpu, gpa, &val,
843                                     bytes);
844                                 if (error == 0) {
845                                         if (!started) {
846                                                 start_packet();
847                                                 started = true;
848                                         }
849                                         gpa += bytes;
850                                         gva += bytes;
851                                         resid -= bytes;
852                                         todo -= bytes;
853                                         while (bytes > 0) {
854                                                 append_byte(val);
855                                                 val >>= 8;
856                                                 bytes--;
857                                         }
858                                 } else {
859                                         if (started)
860                                                 finish_packet();
861                                         else
862                                                 send_error(EFAULT);
863                                         return;
864                                 }
865                         }
866                 }
867                 assert(resid == 0 || gpa % getpagesize() == 0);
868         }
869         if (!started)
870                 start_packet();
871         finish_packet();
872 }
873
874 static void
875 gdb_write_mem(const uint8_t *data, size_t len)
876 {
877         uint64_t gpa, gva, val;
878         uint8_t *cp;
879         size_t resid, todo, bytes;
880         int error;
881
882         /* Skip 'M' */
883         data += 1;
884         len -= 1;
885
886         /* Parse and consume address. */
887         cp = memchr(data, ',', len);
888         if (cp == NULL || cp == data) {
889                 send_error(EINVAL);
890                 return;
891         }
892         gva = parse_integer(data, cp - data);
893         len -= (cp - data) + 1;
894         data += (cp - data) + 1;
895
896         /* Parse and consume length. */
897         cp = memchr(data, ':', len);
898         if (cp == NULL || cp == data) {
899                 send_error(EINVAL);
900                 return;
901         }
902         resid = parse_integer(data, cp - data);
903         len -= (cp - data) + 1;
904         data += (cp - data) + 1;
905
906         /* Verify the available bytes match the length. */
907         if (len != resid * 2) {
908                 send_error(EINVAL);
909                 return;
910         }
911
912         while (resid > 0) {
913                 error = guest_vaddr2paddr(cur_vcpu, gva, &gpa);
914                 if (error == -1) {
915                         send_error(errno);
916                         return;
917                 }
918                 if (error == 0) {
919                         send_error(EFAULT);
920                         return;
921                 }
922
923                 /* Write bytes to current page. */
924                 todo = getpagesize() - gpa % getpagesize();
925                 if (todo > resid)
926                         todo = resid;
927
928                 cp = paddr_guest2host(ctx, gpa, todo);
929                 if (cp != NULL) {
930                         /*
931                          * If this page is guest RAM, write it a byte
932                          * at a time.
933                          */
934                         while (todo > 0) {
935                                 assert(len >= 2);
936                                 *cp = parse_byte(data);
937                                 data += 2;
938                                 len -= 2;
939                                 cp++;
940                                 gpa++;
941                                 gva++;
942                                 resid--;
943                                 todo--;
944                         }
945                 } else {
946                         /*
947                          * If this page isn't guest RAM, try to handle
948                          * it via MMIO.  For MMIO requests, use
949                          * aligned writes of words when possible.
950                          */
951                         while (todo > 0) {
952                                 if (gpa & 1 || todo == 1) {
953                                         bytes = 1;
954                                         val = parse_byte(data);
955                                 } else if (gpa & 2 || todo == 2) {
956                                         bytes = 2;
957                                         val = be16toh(parse_integer(data, 4));
958                                 } else {
959                                         bytes = 4;
960                                         val = be32toh(parse_integer(data, 8));
961                                 }
962                                 error = write_mem(ctx, cur_vcpu, gpa, val,
963                                     bytes);
964                                 if (error == 0) {
965                                         gpa += bytes;
966                                         gva += bytes;
967                                         resid -= bytes;
968                                         todo -= bytes;
969                                         data += 2 * bytes;
970                                         len -= 2 * bytes;
971                                 } else {
972                                         send_error(EFAULT);
973                                         return;
974                                 }
975                         }
976                 }
977                 assert(resid == 0 || gpa % getpagesize() == 0);
978         }
979         assert(len == 0);
980         send_ok();
981 }
982
983 static bool
984 command_equals(const uint8_t *data, size_t len, const char *cmd)
985 {
986
987         if (strlen(cmd) > len)
988                 return (false);
989         return (memcmp(data, cmd, strlen(cmd)) == 0);
990 }
991
992 static void
993 check_features(const uint8_t *data, size_t len)
994 {
995         char *feature, *next_feature, *str, *value;
996         bool supported;
997
998         str = malloc(len + 1);
999         memcpy(str, data, len);
1000         str[len] = '\0';
1001         next_feature = str;
1002
1003         while ((feature = strsep(&next_feature, ";")) != NULL) {
1004                 /*
1005                  * Null features shouldn't exist, but skip if they
1006                  * do.
1007                  */
1008                 if (strcmp(feature, "") == 0)
1009                         continue;
1010
1011                 /*
1012                  * Look for the value or supported / not supported
1013                  * flag.
1014                  */
1015                 value = strchr(feature, '=');
1016                 if (value != NULL) {
1017                         *value = '\0';
1018                         value++;
1019                         supported = true;
1020                 } else {
1021                         value = feature + strlen(feature) - 1;
1022                         switch (*value) {
1023                         case '+':
1024                                 supported = true;
1025                                 break;
1026                         case '-':
1027                                 supported = false;
1028                                 break;
1029                         default:
1030                                 /*
1031                                  * This is really a protocol error,
1032                                  * but we just ignore malformed
1033                                  * features for ease of
1034                                  * implementation.
1035                                  */
1036                                 continue;
1037                         }
1038                         value = NULL;
1039                 }
1040
1041                 /* No currently supported features. */
1042         }
1043         free(str);
1044
1045         start_packet();
1046
1047         /* This is an arbitrary limit. */
1048         append_string("PacketSize=4096");
1049         finish_packet();
1050 }
1051
1052 static void
1053 gdb_query(const uint8_t *data, size_t len)
1054 {
1055
1056         /*
1057          * TODO:
1058          * - qSearch
1059          */
1060         if (command_equals(data, len, "qAttached")) {
1061                 start_packet();
1062                 append_char('1');
1063                 finish_packet();
1064         } else if (command_equals(data, len, "qC")) {
1065                 start_packet();
1066                 append_string("QC");
1067                 append_integer(cur_vcpu + 1);
1068                 finish_packet();
1069         } else if (command_equals(data, len, "qfThreadInfo")) {
1070                 cpuset_t mask;
1071                 bool first;
1072                 int vcpu;
1073
1074                 if (CPU_EMPTY(&vcpus_active)) {
1075                         send_error(EINVAL);
1076                         return;
1077                 }
1078                 mask = vcpus_active;
1079                 start_packet();
1080                 append_char('m');
1081                 first = true;
1082                 while (!CPU_EMPTY(&mask)) {
1083                         vcpu = CPU_FFS(&mask) - 1;
1084                         CPU_CLR(vcpu, &mask);
1085                         if (first)
1086                                 first = false;
1087                         else
1088                                 append_char(',');
1089                         append_integer(vcpu + 1);
1090                 }
1091                 finish_packet();
1092         } else if (command_equals(data, len, "qsThreadInfo")) {
1093                 start_packet();
1094                 append_char('l');
1095                 finish_packet();
1096         } else if (command_equals(data, len, "qSupported")) {
1097                 data += strlen("qSupported");
1098                 len -= strlen("qSupported");
1099                 check_features(data, len);
1100         } else if (command_equals(data, len, "qThreadExtraInfo")) {
1101                 char buf[16];
1102                 int tid;
1103
1104                 data += strlen("qThreadExtraInfo");
1105                 len -= strlen("qThreadExtraInfo");
1106                 if (*data != ',') {
1107                         send_error(EINVAL);
1108                         return;
1109                 }
1110                 tid = parse_threadid(data + 1, len - 1);
1111                 if (tid <= 0 || !CPU_ISSET(tid - 1, &vcpus_active)) {
1112                         send_error(EINVAL);
1113                         return;
1114                 }
1115
1116                 snprintf(buf, sizeof(buf), "vCPU %d", tid - 1);
1117                 start_packet();
1118                 append_asciihex(buf);
1119                 finish_packet();
1120         } else
1121                 send_empty_response();
1122 }
1123
1124 static void
1125 handle_command(const uint8_t *data, size_t len)
1126 {
1127
1128         /* Reject packets with a sequence-id. */
1129         if (len >= 3 && data[0] >= '0' && data[0] <= '9' &&
1130             data[0] >= '0' && data[0] <= '9' && data[2] == ':') {
1131                 send_empty_response();
1132                 return;
1133         }
1134
1135         switch (*data) {
1136         case 'c':
1137                 if (len != 1) {
1138                         send_error(EINVAL);
1139                         break;
1140                 }
1141
1142                 /* Don't send a reply until a stop occurs. */
1143                 gdb_resume_vcpus();
1144                 break;
1145         case 'D':
1146                 send_ok();
1147
1148                 /* TODO: Resume any stopped CPUs. */
1149                 break;
1150         case 'g': {
1151                 gdb_read_regs();
1152                 break;
1153         }
1154         case 'H': {
1155                 int tid;
1156
1157                 if (data[1] != 'g' && data[1] != 'c') {
1158                         send_error(EINVAL);
1159                         break;
1160                 }
1161                 tid = parse_threadid(data + 2, len - 2);
1162                 if (tid == -2) {
1163                         send_error(EINVAL);
1164                         break;
1165                 }
1166
1167                 if (CPU_EMPTY(&vcpus_active)) {
1168                         send_error(EINVAL);
1169                         break;
1170                 }
1171                 if (tid == -1 || tid == 0)
1172                         cur_vcpu = CPU_FFS(&vcpus_active) - 1;
1173                 else if (CPU_ISSET(tid - 1, &vcpus_active))
1174                         cur_vcpu = tid - 1;
1175                 else {
1176                         send_error(EINVAL);
1177                         break;
1178                 }
1179                 send_ok();
1180                 break;
1181         }
1182         case 'm':
1183                 gdb_read_mem(data, len);
1184                 break;
1185         case 'M':
1186                 gdb_write_mem(data, len);
1187                 break;
1188         case 'T': {
1189                 int tid;
1190
1191                 tid = parse_threadid(data + 1, len - 1);
1192                 if (tid <= 0 || !CPU_ISSET(tid - 1, &vcpus_active)) {
1193                         send_error(EINVAL);
1194                         return;
1195                 }
1196                 send_ok();
1197                 break;
1198         }
1199         case 'q':
1200                 gdb_query(data, len);
1201                 break;
1202         case 's':
1203                 if (len != 1) {
1204                         send_error(EINVAL);
1205                         break;
1206                 }
1207
1208                 /* Don't send a reply until a stop occurs. */
1209                 if (!gdb_step_vcpu(cur_vcpu)) {
1210                         send_error(EOPNOTSUPP);
1211                         break;
1212                 }
1213                 break;
1214         case '?':
1215                 /* XXX: Only if stopped? */
1216                 /* For now, just report that we are always stopped. */
1217                 start_packet();
1218                 append_char('S');
1219                 append_byte(GDB_SIGNAL_TRAP);
1220                 finish_packet();
1221                 break;
1222         case 'G': /* TODO */
1223         case 'v':
1224                 /* Handle 'vCont' */
1225                 /* 'vCtrlC' */
1226         case 'p': /* TODO */
1227         case 'P': /* TODO */
1228         case 'Q': /* TODO */
1229         case 't': /* TODO */
1230         case 'X': /* TODO */
1231         case 'z': /* TODO */
1232         case 'Z': /* TODO */
1233         default:
1234                 send_empty_response();
1235         }
1236 }
1237
1238 /* Check for a valid packet in the command buffer. */
1239 static void
1240 check_command(int fd)
1241 {
1242         uint8_t *head, *hash, *p, sum;
1243         size_t avail, plen;
1244
1245         for (;;) {
1246                 avail = cur_comm.len;
1247                 if (avail == 0)
1248                         return;
1249                 head = io_buffer_head(&cur_comm);
1250                 switch (*head) {
1251                 case 0x03:
1252                         debug("<- Ctrl-C\n");
1253                         io_buffer_consume(&cur_comm, 1);
1254
1255                         gdb_suspend_vcpus();
1256                         break;
1257                 case '+':
1258                         /* ACK of previous response. */
1259                         debug("<- +\n");
1260                         if (response_pending())
1261                                 io_buffer_reset(&cur_resp);
1262                         io_buffer_consume(&cur_comm, 1);
1263                         if (stop_pending) {
1264                                 stop_pending = false;
1265                                 report_stop();
1266                                 send_pending_data(fd);
1267                         }
1268                         break;
1269                 case '-':
1270                         /* NACK of previous response. */
1271                         debug("<- -\n");
1272                         if (response_pending()) {
1273                                 cur_resp.len += cur_resp.start;
1274                                 cur_resp.start = 0;
1275                                 if (cur_resp.data[0] == '+')
1276                                         io_buffer_advance(&cur_resp, 1);
1277                                 debug("-> %.*s\n", (int)cur_resp.len,
1278                                     io_buffer_head(&cur_resp));
1279                         }
1280                         io_buffer_consume(&cur_comm, 1);
1281                         send_pending_data(fd);
1282                         break;
1283                 case '$':
1284                         /* Packet. */
1285
1286                         if (response_pending()) {
1287                                 warnx("New GDB command while response in "
1288                                     "progress");
1289                                 io_buffer_reset(&cur_resp);
1290                         }
1291
1292                         /* Is packet complete? */
1293                         hash = memchr(head, '#', avail);
1294                         if (hash == NULL)
1295                                 return;
1296                         plen = (hash - head + 1) + 2;
1297                         if (avail < plen)
1298                                 return;
1299                         debug("<- %.*s\n", (int)plen, head);
1300
1301                         /* Verify checksum. */
1302                         for (sum = 0, p = head + 1; p < hash; p++)
1303                                 sum += *p;
1304                         if (sum != parse_byte(hash + 1)) {
1305                                 io_buffer_consume(&cur_comm, plen);
1306                                 debug("-> -\n");
1307                                 send_char('-');
1308                                 send_pending_data(fd);
1309                                 break;
1310                         }
1311                         send_char('+');
1312
1313                         handle_command(head + 1, hash - (head + 1));
1314                         io_buffer_consume(&cur_comm, plen);
1315                         if (!response_pending())
1316                                 debug("-> +\n");
1317                         send_pending_data(fd);
1318                         break;
1319                 default:
1320                         /* XXX: Possibly drop connection instead. */
1321                         debug("-> %02x\n", *head);
1322                         io_buffer_consume(&cur_comm, 1);
1323                         break;
1324                 }
1325         }
1326 }
1327
1328 static void
1329 gdb_readable(int fd, enum ev_type event, void *arg)
1330 {
1331         ssize_t nread;
1332         int pending;
1333
1334         if (ioctl(fd, FIONREAD, &pending) == -1) {
1335                 warn("FIONREAD on GDB socket");
1336                 return;
1337         }
1338
1339         /*
1340          * 'pending' might be zero due to EOF.  We need to call read
1341          * with a non-zero length to detect EOF.
1342          */
1343         if (pending == 0)
1344                 pending = 1;
1345
1346         /* Ensure there is room in the command buffer. */
1347         io_buffer_grow(&cur_comm, pending);
1348         assert(io_buffer_avail(&cur_comm) >= pending);
1349
1350         nread = read(fd, io_buffer_tail(&cur_comm), io_buffer_avail(&cur_comm));
1351         if (nread == 0) {
1352                 close_connection();
1353         } else if (nread == -1) {
1354                 if (errno == EAGAIN)
1355                         return;
1356
1357                 warn("Read from GDB socket");
1358                 close_connection();
1359         } else {
1360                 cur_comm.len += nread;
1361                 pthread_mutex_lock(&gdb_lock);
1362                 check_command(fd);
1363                 pthread_mutex_unlock(&gdb_lock);
1364         }
1365 }
1366
1367 static void
1368 gdb_writable(int fd, enum ev_type event, void *arg)
1369 {
1370
1371         send_pending_data(fd);
1372 }
1373
1374 static void
1375 new_connection(int fd, enum ev_type event, void *arg)
1376 {
1377         int optval, s;
1378
1379         s = accept4(fd, NULL, NULL, SOCK_NONBLOCK);
1380         if (s == -1) {
1381                 if (arg != NULL)
1382                         err(1, "Failed accepting initial GDB connection");
1383
1384                 /* Silently ignore errors post-startup. */
1385                 return;
1386         }
1387
1388         optval = 1;
1389         if (setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)) ==
1390             -1) {
1391                 warn("Failed to disable SIGPIPE for GDB connection");
1392                 close(s);
1393                 return;
1394         }
1395
1396         pthread_mutex_lock(&gdb_lock);
1397         if (cur_fd != -1) {
1398                 close(s);
1399                 warnx("Ignoring additional GDB connection.");
1400         }
1401
1402         read_event = mevent_add(s, EVF_READ, gdb_readable, NULL);
1403         if (read_event == NULL) {
1404                 if (arg != NULL)
1405                         err(1, "Failed to setup initial GDB connection");
1406                 pthread_mutex_unlock(&gdb_lock);
1407                 return;
1408         }
1409         write_event = mevent_add(s, EVF_WRITE, gdb_writable, NULL);
1410         if (write_event == NULL) {
1411                 if (arg != NULL)
1412                         err(1, "Failed to setup initial GDB connection");
1413                 mevent_delete_close(read_event);
1414                 read_event = NULL;
1415         }
1416
1417         cur_fd = s;
1418         cur_vcpu = 0;
1419         stepping_vcpu = -1;
1420         stopped_vcpu = -1;
1421         stop_pending = false;
1422
1423         /* Break on attach. */
1424         first_stop = true;
1425         gdb_suspend_vcpus();
1426         pthread_mutex_unlock(&gdb_lock);
1427 }
1428
1429 #ifndef WITHOUT_CAPSICUM
1430 void
1431 limit_gdb_socket(int s)
1432 {
1433         cap_rights_t rights;
1434         unsigned long ioctls[] = { FIONREAD };
1435
1436         cap_rights_init(&rights, CAP_ACCEPT, CAP_EVENT, CAP_READ, CAP_WRITE,
1437             CAP_SETSOCKOPT, CAP_IOCTL);
1438         if (caph_rights_limit(s, &rights) == -1)
1439                 errx(EX_OSERR, "Unable to apply rights for sandbox");
1440         if (caph_ioctls_limit(s, ioctls, nitems(ioctls)) == -1)
1441                 errx(EX_OSERR, "Unable to apply rights for sandbox");
1442 }
1443 #endif
1444
1445 void
1446 init_gdb(struct vmctx *_ctx, int sport, bool wait)
1447 {
1448         struct sockaddr_in sin;
1449         int error, flags, s;
1450
1451         debug("==> starting on %d, %swaiting\n", sport, wait ? "" : "not ");
1452
1453         error = pthread_mutex_init(&gdb_lock, NULL);
1454         if (error != 0)
1455                 errc(1, error, "gdb mutex init");
1456         error = pthread_cond_init(&idle_vcpus, NULL);
1457         if (error != 0)
1458                 errc(1, error, "gdb cv init");
1459
1460         ctx = _ctx;
1461         s = socket(PF_INET, SOCK_STREAM, 0);
1462         if (s < 0)
1463                 err(1, "gdb socket create");
1464
1465         sin.sin_len = sizeof(sin);
1466         sin.sin_family = AF_INET;
1467         sin.sin_addr.s_addr = htonl(INADDR_ANY);
1468         sin.sin_port = htons(sport);
1469
1470         if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
1471                 err(1, "gdb socket bind");
1472
1473         if (listen(s, 1) < 0)
1474                 err(1, "gdb socket listen");
1475
1476         if (wait) {
1477                 /*
1478                  * Set vcpu 0 in vcpus_suspended.  This will trigger the
1479                  * logic in gdb_cpu_add() to suspend the first vcpu before
1480                  * it starts execution.  The vcpu will remain suspended
1481                  * until a debugger connects.
1482                  */
1483                 stepping_vcpu = -1;
1484                 stopped_vcpu = -1;
1485                 CPU_SET(0, &vcpus_suspended);
1486         }
1487
1488         flags = fcntl(s, F_GETFL);
1489         if (fcntl(s, F_SETFL, flags | O_NONBLOCK) == -1)
1490                 err(1, "Failed to mark gdb socket non-blocking");
1491
1492 #ifndef WITHOUT_CAPSICUM
1493         limit_gdb_socket(s);
1494 #endif
1495         mevent_add(s, EVF_READ, new_connection, NULL);
1496 }