Stackdb
Stackdb is a stackable, multi-target and -level source debugger and memory forensics library.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
target_gdb_helper_qemu.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014, 2015 The University of Utah
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #include "config.h"
20 
21 #include <errno.h>
22 #include <ctype.h>
23 #include <unistd.h>
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <fcntl.h>
27 #include <sys/socket.h>
28 #include <netdb.h>
29 #include <netinet/in.h>
30 #include <sys/mman.h>
31 #ifdef ENABLE_LIBVIRT
32 #include <libvirt/libvirt.h>
33 #include <libvirt/libvirt-qemu.h>
34 #endif
35 
36 #include "common.h"
37 #include "arch.h"
38 #include "arch_x86.h"
39 #include "arch_x86_64.h"
40 #include "regcache.h"
41 #include "target_api.h"
42 #include "target.h"
43 
44 #include "target_gdb.h"
45 #include "target_gdb_rsp.h"
46 
47 /*
48  * Ok, if we use the QEMU QMP, we can extract even more info... like
49  * more machine registers -- and if the user starts QEMU with the
50  * -mem-path option and configures our LD_PRELOADable libqemuhacks.so
51  * appropriately, we can read/write phys memory directly by mmap! This
52  * is a huge performance benefit.
53  */
54 
55 /*
56  * Local prototypes.
57  */
58 int gdb_helper_qemu_addr_v2p(struct target *target,tid_t tid,ADDR pgd,
59  ADDR vaddr,ADDR *paddr);
60 unsigned char *gdb_helper_qemu_read_tid(struct target *target,
61  tid_t tid,ADDR pgd,ADDR addr,
62  unsigned long length,
63  unsigned char *buf);
64 
68  void *ram_mmap;
69  unsigned long ram_mmap_size;
70 #ifdef ENABLE_LIBVIRT
71  virConnectPtr qemu_libvirt_conn;
72  virDomainPtr qemu_libvirt_dom;
73 #endif
74 };
75 
77  struct gdb_spec *gspec = (struct gdb_spec *)target->spec->backend_spec;
78  struct gdb_state *gstate = (struct gdb_state *)target->state;
79  struct gdb_helper_qemu_state *qstate;
80  struct stat sbuf;
81 
82  qstate = calloc(1,sizeof(*qstate));
83 
84  /* We use memcache for v2p -- create one. */
85  if (target->memcache) {
86  verror("memcache already in use!\n");
87  errno = EINVAL;
88  return -1;
89  }
90  target->memcache = memcache_create(0,0,NULL);
91 
92  if (gspec->qemu_mem_path) {
93  if (stat(gspec->qemu_mem_path,&sbuf) < 0) {
94  verror("could not stat QEMU mem-path file %s: %s (%d)!\n",
95  gspec->qemu_mem_path,strerror(errno),errno);
96  free(qstate);
97  return -1;
98  }
99  qstate->ram_mmap_size = sbuf.st_size;
100  qstate->ram_mmap_fd = open(gspec->qemu_mem_path,O_RDWR);
101  if (qstate->ram_mmap_fd < 0) {
102  verror("could not open QEMU mem-path file %s: %s (%d)!\n",
103  gspec->qemu_mem_path,strerror(errno),errno);
104  free(qstate);
105  return -1;
106  }
107  qstate->ram_mmap = mmap(NULL,qstate->ram_mmap_size,PROT_READ | PROT_WRITE,
108  MAP_SHARED,qstate->ram_mmap_fd,0);
109  if (qstate->ram_mmap == (void *) -1) {
110  verror("could not mmap QEMU mem-path file %s: %s (%d)!\n",
111  gspec->qemu_mem_path,strerror(errno),errno);
112  free(qstate);
113  return -1;
114  }
115  }
116 
117  qstate->qemu_qmp_fd = -1;
118  gstate->hops_priv = qstate;
119 
120  /*
121  * No version of QEMU hijacks userspace exceptions for us... we must
122  * have them emulated in the OS personality...
123  */
124  g_hash_table_insert(target->config,
125  strdup("OS_EMULATE_USERSPACE_EXCEPTIONS"),
126  strdup("1"));
127 
128 #ifdef ENABLE_LIBVIRT
129  qstate->qemu_libvirt_conn = 0;
130  qstate->qemu_libvirt_dom = 0;
131 #endif
132 
133  return 0;
134 }
135 
136 int __recv_til_block(int fd,char *buf,unsigned int len,int blockfirst) {
137  char sbuf[4096];
138  char *bufp;
139  unsigned int rlen;
140  unsigned int count;
141  int rc;
142  int i;
143 
144  if (buf) {
145  bufp = buf;
146  rlen = len;
147  }
148  else {
149  bufp = sbuf;
150  rlen = sizeof(sbuf);
151  }
152 
153  /*
154  * Recv everything we can until we would block; throw it away.
155  */
156  count = 0;
157  i = 0;
158  while (1) {
159  rc = recv(fd,bufp + count,rlen - count,
160  (i == 0 && blockfirst) ? 0 : MSG_DONTWAIT);
161  ++i;
162  if (rc < 0) {
163  if (errno == EAGAIN || errno == EWOULDBLOCK) {
164  break;
165  }
166  else {
167  verror("recv: %s (%d)\n",strerror(errno),errno);
168  return -1;
169  }
170  }
171  else if (rc == 0) {
172  verror("qmp server disconnected unexpectedly!\n");
173  return -1;
174  }
175  else {
176  count += (unsigned int)rc;
177  if (!buf) {
178  vdebug(9,LA_TARGET,LF_GDB,"(discarding) recv QMP '%s'\n",bufp);
179  count = 0;
180  }
181  else {
182  vdebug(9,LA_TARGET,LF_GDB,"(saving) recv QMP '%s'\n",bufp);
183  }
184 
185  if (count == rlen)
186  break;
187  }
188  }
189 
190  return count;
191 }
192 
194  struct gdb_state *gstate = (struct gdb_state *)target->state;
195  struct gdb_spec *gspec = (struct gdb_spec *)target->spec->backend_spec;
196  struct gdb_helper_qemu_state *qstate = \
197  (struct gdb_helper_qemu_state *)gstate->hops_priv;
198  struct hostent *he;
199  void *dst;
200  int addrtype;
201  int dlen;
202  struct sockaddr_in sin;
203  struct sockaddr_in6 sin6;
204  char *cmd = "{ \"execute\": \"qmp_capabilities\" }";
205 
206  /*
207  * If spec->qemu_qmp_port, connect. Set nonblocking.
208  */
209  if (gspec->qemu_qmp_hostname || gspec->qemu_qmp_port > 0) {
210  if (!gspec->qemu_qmp_hostname)
211  gspec->qemu_qmp_hostname = strdup("localhost");
212  if (gspec->qemu_qmp_port < 0)
213  gspec->qemu_qmp_port = 1235;
214 
215  he = gethostbyname(gspec->qemu_qmp_hostname);
216  if (!he) {
217  verror("gethostbyname(%s): %s (%d)!",gspec->qemu_qmp_hostname,
218  hstrerror(h_errno),h_errno);
219  goto in_err;
220  }
221 
222  addrtype = he->h_addrtype;
223  if (addrtype == AF_INET) {
224  memcpy(&sin.sin_addr,he->h_addr,he->h_length);
225  //sin.sin_addr.s_addr = INADDR_ANY;
226  dlen = sizeof(sin);
227  dst = &sin;
228  sin.sin_port = htons(gspec->qemu_qmp_port);
229  sin.sin_family = addrtype;
230  }
231  else if (addrtype == AF_INET6) {
232  memcpy(&sin6.sin6_addr,he->h_addr,he->h_length);
233  dlen = sizeof(sin6);
234  dst = &sin6;
235  sin6.sin6_port = htons(gspec->qemu_qmp_port);
236  sin6.sin6_family = addrtype;
237  }
238  else {
239  verror("unknown addrtype %d for hostname %s!\n",
240  addrtype,gspec->qemu_qmp_hostname);
241  goto in_err;
242  }
243 
244  /*
245  if (inet_pton(addrtype,he->h_addr,dst) != 1) {
246  verror("could not convert addr %s to network!\n",he->h_addr);
247  goto in_err;
248  }
249  */
250 
251  qstate->qemu_qmp_fd = socket(addrtype,SOCK_STREAM,0);
252  if (qstate->qemu_qmp_fd < 0) {
253  verror("socket(): %s\n",strerror(errno));
254  goto in_err;
255  }
256 
257  if (connect(qstate->qemu_qmp_fd,(struct sockaddr *)dst,dlen) < 0) {
258  verror("connect(%s): %s\n",he->h_name,strerror(errno));
259  goto in_err;
260  }
261 
263  "connected to tcp socket %s:%d (fd %d)\n",
264  he->h_name,gspec->qemu_qmp_port,qstate->qemu_qmp_fd);
265 
266  /*
267  * Make it nonblocking.
268  */
269  /*
270  flags = fcntl(qstate->qemu_qmp_fd,F_GETFL,0);
271  flags |= O_NONBLOCK;
272  fcntl(qstate->qemu_qmp_fd,F_SETFL,flags);
273  */
274 
275  /*
276  * Enter capabilities execution mode.
277  */
278  __recv_til_block(qstate->qemu_qmp_fd,NULL,0,0);
279  write(qstate->qemu_qmp_fd,cmd,strlen(cmd));
280  __recv_til_block(qstate->qemu_qmp_fd,NULL,0,1);
281  }
282 #ifdef ENABLE_LIBVIRT
283  else if (gspec->qemu_libvirt_domain) {
284  qstate->qemu_libvirt_conn = virConnectOpen(NULL);
285  if (!qstate->qemu_libvirt_conn)
286  return -1;
287  qstate->qemu_libvirt_dom =
288  virDomainLookupByName(qstate->qemu_libvirt_conn,
289  gspec->qemu_libvirt_domain);
290  if (!qstate->qemu_libvirt_dom) {
291  verror("could not find libvirt domain '%s'!\n",
292  gspec->qemu_libvirt_domain);
293  if (!errno)
294  errno = ECONNREFUSED;
295  virConnectClose(qstate->qemu_libvirt_conn);
296  qstate->qemu_libvirt_conn = NULL;
297  return -1;
298  }
299  }
300 #endif
301 
302  return 0;
303 
304  in_err:
305  if (qstate->qemu_qmp_fd > -1) {
306  close(qstate->qemu_qmp_fd);
307  qstate->qemu_qmp_fd = -1;
308  }
309  return -1;
310 }
311 
313  return 0;
314 }
315 
317  struct gdb_spec *xspec;
318 
319  xspec = (struct gdb_spec *)target->spec->backend_spec;
320 
321  /* XXX: invalidate caches? */
322  if (xspec->clear_mem_caches_each_exception) {
324  }
325  else
326  memcache_inc_ticks(target->memcache,1);
327 
328  return 0;
329 }
330 
332  struct gdb_spec *xspec;
333 
334  xspec = (struct gdb_spec *)target->spec->backend_spec;
335 
336  /* XXX: invalidate caches? */
337  if (xspec->clear_mem_caches_each_exception) {
339  }
340  else
341  memcache_inc_ticks(target->memcache,1);
342 
343  return 0;
344 }
345 
347  struct regcache *regcache) {
348  struct gdb_state *gstate = (struct gdb_state *)target->state;
349  struct gdb_helper_qemu_state *qstate = \
350  (struct gdb_helper_qemu_state *)gstate->hops_priv;
351  unsigned int i;
352  char *cmd = "{ \"execute\": \"human-monitor-command\","
353  " \"arguments\": { \"command-line\": \"info registers\" } }\n";
354  char *buf;
355  unsigned int bufsiz;
356  char *idx;
357  REGVAL regval;
358 
359  if (qstate->qemu_qmp_fd > 0) {
360  bufsiz = 4096;
361  buf = malloc(bufsiz);
362  __recv_til_block(qstate->qemu_qmp_fd,NULL,0,0);
363 
364  /*
365  * Send the command -- the whole thing.
366  */
367  write(qstate->qemu_qmp_fd,cmd,strlen(cmd));
368 
369  /*
370  * Block until we receive enough crap that has a GS *= *deadbeef.xs
371  */
372  __recv_til_block(qstate->qemu_qmp_fd,buf,bufsiz,1);
373  }
374 #ifdef ENABLE_LIBVIRT
375  else if (qstate->qemu_libvirt_conn) {
376  buf = NULL;
377  virDomainQemuMonitorCommand(qstate->qemu_libvirt_dom,cmd,&buf,0);
378  if (!buf) {
379  if (!errno)
380  errno = ECOMM;
381  return -1;
382  }
383  bufsiz = strlen(buf);
384  }
385 #endif
386  else {
387  errno = EINVAL;
388  return -1;
389  }
390 
391  for (i = 0; i < bufsiz; ++i) {
392  if (buf[i] == '\r' || buf[i] == '\n')
393  buf[i] = ' ';
394  }
395 
396  again:
397  if (target->arch->type == ARCH_X86_64) {
398  idx = strstr(buf,"GS =0000 ");
399  if (idx) {
400  regval = (REGVAL)strtoull(idx + strlen("GS =0000"),NULL,16);
401 
402  vdebug(9,LA_TARGET,LF_GDB,"gs_base = 0x%"PRIxREGVAL"\n",regval);
403 
404  regcache_init_reg(regcache,REG_X86_64_GS_BASE,regval);
405  }
406  else {
407  vwarnopt(9,LA_TARGET,LF_GDB,"no GS for gs_base!\n");
408 
409  if (qstate->qemu_qmp_fd > 0) {
410  __recv_til_block(qstate->qemu_qmp_fd,buf,bufsiz,1);
411  goto again;
412  }
413  }
414  }
415 
416  idx = strstr(buf,"CR0=");
417  if (idx) {
418  regval = (REGVAL)strtoull(idx + strlen("CR0="),NULL,16);
419 
420  vdebug(9,LA_TARGET,LF_GDB,"cr0 = 0x%"PRIxREGVAL"\n",regval);
421 
422  if (target->arch->type == ARCH_X86_64)
423  regcache_init_reg(regcache,REG_X86_64_CR0,regval);
424  else
425  regcache_init_reg(regcache,REG_X86_CR0,regval);
426  }
427  else {
428  vwarnopt(9,LA_TARGET,LF_GDB,"no cr0!\n");
429 
430  if (qstate->qemu_qmp_fd > 0) {
431  __recv_til_block(qstate->qemu_qmp_fd,buf,bufsiz,1);
432  goto again;
433  }
434  }
435 
436  idx = strstr(buf,"CR3=");
437  if (idx) {
438  regval = (REGVAL)strtoull(idx + strlen("CR3="),NULL,16);
439 
440  vdebug(9,LA_TARGET,LF_GDB,"cr3 = 0x%"PRIxREGVAL"\n",regval);
441 
442  if (target->arch->type == ARCH_X86_64)
443  regcache_init_reg(regcache,REG_X86_64_CR3,regval);
444  else
445  regcache_init_reg(regcache,REG_X86_CR3,regval);
446  }
447  else
448  vwarnopt(9,LA_TARGET,LF_GDB,"no cr3!\n");
449 
450  idx = strstr(buf,"CR4=");
451  if (idx) {
452  regval = (REGVAL)strtoull(idx + strlen("CR4="),NULL,16);
453 
454  vdebug(9,LA_TARGET,LF_GDB,"cr4 = 0x%"PRIxREGVAL"\n",regval);
455 
456  if (target->arch->type == ARCH_X86_64)
457  regcache_init_reg(regcache,REG_X86_64_CR4,regval);
458  else
459  regcache_init_reg(regcache,REG_X86_CR4,regval);
460  }
461  else
462  vwarnopt(9,LA_TARGET,LF_GDB,"no cr4!\n");
463 
464  idx = strstr(buf,"DR6=");
465  if (idx) {
466  regval = (REGVAL)strtoull(idx + strlen("DR6="),NULL,16);
467 
468  vdebug(9,LA_TARGET,LF_GDB,"dr6 = 0x%"PRIxREGVAL"\n",regval);
469 
470  if (target->arch->type == ARCH_X86_64)
471  regcache_init_reg(regcache,REG_X86_64_DR6,regval);
472  else
473  regcache_init_reg(regcache,REG_X86_DR6,regval);
474  }
475  else
476  vwarnopt(9,LA_TARGET,LF_GDB,"no dr6!\n");
477 
478  idx = strstr(buf,"EFER=");
479  if (idx) {
480  regval = (REGVAL)strtoull(idx + strlen("EFER="),NULL,16);
481 
482  vdebug(9,LA_TARGET,LF_GDB,"efer = 0x%"PRIxREGVAL"\n",regval);
483 
484  if (target->arch->type == ARCH_X86_64)
485  regcache_init_reg(regcache,REG_X86_64_MSR_EFER,regval);
486  else
487  regcache_init_reg(regcache,REG_X86_MSR_EFER,regval);
488  }
489  else
490  vwarnopt(9,LA_TARGET,LF_GDB,"no efer!\n");
491 
492  if (qstate->qemu_qmp_fd > 0)
493  __recv_til_block(qstate->qemu_qmp_fd,NULL,0,0);
494 
495  free(buf);
496 
497  return 0;
498 }
499 
501  tid_t tid,ADDR pgd,ADDR addr,
502  unsigned long length,
503  unsigned char *buf) {
504  struct gdb_state *xstate;
506  char *ram_mmap_start,*ram_mmap_end;
507  ADDR lvaddr;
508  OFFSET voffset = 0;
509  char *mmap = NULL;
510  unsigned long mlen;
511  ADDR paddr;
512  unsigned long i,j;
513  int rc;
514  unsigned long plength = 0;
515  char *lbuf;
516  unsigned long alen = 0;
517 
518  xstate = (struct gdb_state *)target->state;
519  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
520 
521  if (!mstate->ram_mmap) {
522  vwarnopt(5,LA_TARGET,LF_GDB,"QEMU -mem-path option not enabled!\n");
523  errno = ENOTSUP;
524  return NULL;
525  }
526 
527  if (buf)
528  lbuf = (char *)buf;
529  else if (length)
530  lbuf = malloc(length + 1);
531  else {
532  lbuf = NULL;
533  }
534 
535  ram_mmap_start = (char *)mstate->ram_mmap;
536  ram_mmap_end = (char *)mstate->ram_mmap + mstate->ram_mmap_size;
537 
538  /*
539  * Ok, translate vaddrs to paddrs page by page and read.
540  */
541 
542  lvaddr = addr & ~(__PAGE_SIZE - 1);
543  voffset = addr & (__PAGE_SIZE - 1);
544 
545  for (i = 0; length == 0 || plength < length; ++i) {
546  rc = gdb_helper_qemu_addr_v2p(target,tid,pgd,lvaddr + i * __PAGE_SIZE,
547  &paddr);
548  if (rc) {
549  verror("could not translate v 0x%"PRIxADDR"; start v 0x%"PRIxADDR"!\n",
550  lvaddr,addr);
551  if (lbuf != (char *)buf)
552  free(lbuf);
553  return NULL;
554  }
555 
556  mlen = __PAGE_SIZE;
557  if (i == 0) {
558  mlen -= voffset;
559  }
560 
561  if (length > 0 && (plength + mlen) > length)
562  mlen = (length - plength);
563 
564  mmap = ram_mmap_start + paddr;
565  if (i == 0)
566  mmap += voffset;
567 
568  if (mmap < ram_mmap_start || mmap >= ram_mmap_end) {
569  verror("Bad physical address 0x%"PRIxADDR"!\n",paddr);
570  errno = EFAULT;
571  if (lbuf != (char *)buf)
572  free(lbuf);
573  return NULL;
574  }
575  else {
576  /* If looking for string, make more room in lbuf! */
577  if (!buf && !length) {
578  alen += mlen;
579  lbuf = realloc(lbuf,alen);
580  }
581 
582  /* Copy the whole chunk to the end of the page. */
583  memcpy(lbuf + plength,mmap,mlen);
584 
585  /* If looking for string, look for '\0'. */
586  if (!buf && !length) {
587  for (j = plength; j < (plength + mlen); ++j) {
588  if (lbuf[j] == '\0')
589  break;
590  }
591  if (j < (plength + mlen)) {
592  lbuf = realloc(lbuf,plength + j + 1);
593  lbuf[j] = '\0';
594  break;
595  }
596  }
597 
598  /* Update our total bytes read. */
599  plength += mlen;
600  }
601  }
602 
603  return (unsigned char *)lbuf;
604 }
605 
607  tid_t tid,ADDR pgd,ADDR addr,
608  unsigned long length,
609  unsigned char *buf) {
610  struct gdb_state *xstate;
612  char *ram_mmap_start,*ram_mmap_end;
613  ADDR lvaddr;
614  OFFSET voffset = 0;
615  char *mmap = NULL;
616  unsigned long mlen;
617  ADDR paddr;
618  unsigned long i;
619  int rc;
620  unsigned long plength = 0;
621 
622  xstate = (struct gdb_state *)target->state;
623  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
624 
625  if (!mstate->ram_mmap) {
626  vwarnopt(5,LA_TARGET,LF_GDB,"QEMU -mem-path option not enabled!\n");
627  errno = ENOTSUP;
628  return 0;
629  }
630 
631  ram_mmap_start = (char *)mstate->ram_mmap;
632  ram_mmap_end = (char *)mstate->ram_mmap + mstate->ram_mmap_size;
633 
634  /*
635  * Ok, translate vaddrs to paddrs page by page and write.
636  */
637 
638  lvaddr = addr & ~(__PAGE_SIZE - 1);
639  voffset = addr & (__PAGE_SIZE - 1);
640 
641  for (i = 0; plength < length; ++i) {
642  rc = gdb_helper_qemu_addr_v2p(target,tid,pgd,lvaddr + i * __PAGE_SIZE,
643  &paddr);
644  if (rc) {
645  verror("could not translate v 0x%"PRIxADDR"; start v 0x%"PRIxADDR"!\n",
646  lvaddr,addr);
647  return 0;
648  }
649 
650  mlen = __PAGE_SIZE;
651  if (i == 0) {
652  mlen -= voffset;
653  }
654 
655  if ((plength + mlen) > length)
656  mlen = (length - plength);
657 
658  mmap = ram_mmap_start + paddr;
659  if (i == 0)
660  mmap += voffset;
661 
662  if (mmap < ram_mmap_start || mmap >= ram_mmap_end) {
663  verror("Bad physical address 0x%"PRIxADDR"!\n",paddr);
664  errno = EFAULT;
665  return 0;
666  }
667  else {
668  /* Copy the whole chunk to the end of the page or @length. */
669  memcpy(mmap,buf + plength,mlen);
670  /* Update our total bytes written. */
671  plength += mlen;
672  }
673  }
674 
675  return plength;
676 }
677 
678 unsigned char *gdb_helper_qemu_read_v_str(struct target *target,
679  tid_t tid,ADDR pgd,ADDR addr) {
680  int j;
681  unsigned char *lbuf = NULL;
682  int lbuf_alen;
683  int lbuf_len;
684 
685  /*
686  * Best strategy is to read page by page (starting with the remnant
687  * of the page containing @addr), or byte by byte -- depending on
688  * the GDB stub. A page should always be safe, so do that for now.
689  *
690  * Ok, turns out a page is *not* safe, and for instance, will cause
691  * the QEMU GDB stub to crash. So stick with target wordsize, ugh!!!
692  */
693 
694  //lbuf_alen = __PAGE_SIZE - (addr & (__PAGE_SIZE - 1));
695  lbuf_alen = target->arch->wordsize;
696  lbuf = realloc(lbuf,lbuf_alen);
697  lbuf_len = 0;
698 
699  do {
700  if (!gdb_helper_qemu_read_tid(target,tid,pgd,addr + lbuf_len,
701  lbuf_alen - lbuf_len,lbuf + lbuf_len)) {
702  verror("failed to read string at 0x%"PRIxADDR" (target %s)!\n",
703  addr,target->name);
704  free(lbuf);
705  return NULL;
706  }
707 
708  /*
709  * Scan the mmap as necessary for '\0', malloc as necessary, and
710  * break or keep going.
711  */
712  for (j = lbuf_len; j < lbuf_alen; ++j) {
713  if (lbuf[j] == '\0')
714  break;
715  }
716 
717  if (j < lbuf_alen) {
718  /* Found it! realloc and return. */
719  lbuf = realloc(lbuf,j + 1);
720  return lbuf;
721  }
722  else {
723  lbuf_len = lbuf_alen;
724  //lbuf_alen += __PAGE_SIZE;
725  lbuf_alen += target->arch->wordsize;
726  lbuf = realloc(lbuf,lbuf_alen);
727  }
728  } while (1);
729 
730  return (unsigned char *)lbuf;
731 }
732 
733 /*
734  * XXX NB: When we talk to the QEMU GDB, we can't seem to read/write
735  * "big chunks" without crashing the GDB stub, and thus QEMU --- so just
736  * read 1KB at a time.
737  */
738 #define GDB_MAX_IO 1024
739 
740 /*
741  * Reads a block of memory from the target. If @buf is non-NULL, we
742  * assume it is at least @length bytes long; the result is placed into
743  * @buf and @buf is returned. If @buf is NULL, we allocate a buffer
744  * large enough to hold the result (@length if @length >0; if @length is
745  * 0 we attempt to read a string at that address; we stop when we hit a
746  * NULL byte).
747  *
748  * On error, returns NULL, and sets errno.
749  */
750 unsigned char *gdb_helper_qemu_read_tid(struct target *target,
751  tid_t tid,ADDR pgd,ADDR addr,
752  unsigned long length,
753  unsigned char *buf) {
754  struct target_thread *tthread;
755  int rc;
756  int didalloc = 0;
757  unsigned long bread,left;
758  struct gdb_state *xstate;
760 
761  xstate = (struct gdb_state *)target->state;
762  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
763 
764  if (mstate->ram_mmap) {
765  vdebug(5,LA_TARGET,LF_GDB,"trying QEMU -mem-path!\n");
766 
767  return gdb_helper_qemu_read_tid_mem_path(target,tid,pgd,addr,length,buf);
768  }
769 
770  /*
771  * Check @tid is current thread or global thread or that all threads
772  * share a single address space!
773  *
774  * How to check if all threads share a single address space? Maybe
775  * just by checking the target type for now; if OS, assume threads
776  * need not share an address space; if process or higher-level,
777  * assume they do?
778  */
779  if (target->personality <= TARGET_PERSONALITY_OS && tid != TID_GLOBAL) {
780  tthread = target_load_current_thread(target,0);
781  if (!tthread) {
782  vwarn("could not load current thread; assuming tid %d is current!\n",
783  tid);
784  }
785  else {
786  if (tthread->tid != tid) {
787  verror("tid %d is not current nor global; cannot read!\n",tid);
788  return NULL;
789  }
790  }
791  }
792 
793  if (length == 0)
794  return gdb_helper_qemu_read_v_str(target,tid,pgd,addr);
795 
796  if (!buf) {
797  didalloc = 1;
798  buf = malloc(length);
799  }
800 
801  bread = 0;
802  while (bread < length) {
803  left = length - bread;
804  rc = gdb_rsp_read_mem(target,addr + bread,
805  (left) > GDB_MAX_IO ? GDB_MAX_IO : left,
806  buf + bread);
807  if (rc == 0) {
808  if (left > GDB_MAX_IO)
809  bread += GDB_MAX_IO;
810  else
811  bread += left;
812 
813  if (bread >= length)
814  return buf;
815  else
816  continue;
817  }
818  else {
819  verror("v 0x%"PRIxADDR" len %lu: %s (%d); continuing\n",
820  addr,length,strerror(errno),rc);
821  if (didalloc)
822  free(buf);
823  return NULL;
824  }
825  }
826 }
827 
828 /*
829  * Writes @length bytes from @buf to @addr. Returns the number of bytes
830  * written (and sets errno nonzero if there is an error). Successful if
831  * @return == @length.
832  */
834  tid_t tid,ADDR pgd,ADDR addr,
835  unsigned long length,
836  unsigned char *buf) {
837  struct target_thread *tthread;
838  int rc;
839  unsigned long bwrote,left;
840  struct gdb_state *xstate;
842 
843  xstate = (struct gdb_state *)target->state;
844  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
845 
846  if (mstate->ram_mmap) {
847  vdebug(5,LA_TARGET,LF_GDB,"trying QEMU -mem-path!\n");
848 
849  return gdb_helper_qemu_write_tid_mem_path(target,tid,pgd,addr,length,buf);
850  }
851 
852  /*
853  * Check @tid is current thread or global thread or that all threads
854  * share a single address space!
855  *
856  * How to check if all threads share a single address space? Maybe
857  * just by checking the target type for now; if OS, assume threads
858  * need not share an address space; if process or higher-level,
859  * assume they do?
860  */
861  if (target->personality <= TARGET_PERSONALITY_OS && tid != TID_GLOBAL) {
862  tthread = target_load_current_thread(target,0);
863  if (!tthread) {
864  vwarn("could not load current thread; assuming tid %d is current!\n",
865  tid);
866  }
867  else {
868  if (tthread->tid != tid) {
869  verror("tid %d is not current nor global; cannot read!\n",tid);
870  errno = EINVAL;
871  return 0;
872  }
873  }
874  }
875 
876  bwrote = 0;
877  while (bwrote < length) {
878  left = length - bwrote;
879  rc = gdb_rsp_write_mem(target,addr + bwrote,
880  (left) > GDB_MAX_IO ? GDB_MAX_IO : left,
881  buf + bwrote);
882  if (rc == 0) {
883  if (left > GDB_MAX_IO)
884  bwrote += GDB_MAX_IO;
885  else
886  bwrote += left;
887 
888  if (bwrote >= length)
889  return length;
890  else
891  continue;
892  }
893  else {
894  verror("v 0x%"PRIxADDR" len %lu: %s (%d)\n",
895  addr,length,strerror(errno),rc);
896  return 0;
897  }
898  }
899 
900  /* NB: only way we get here is if length == 0 */
901  return 0;
902 }
903 
905  ADDR vaddr,ADDR *paddr) {
906  struct gdb_state *xstate;
908  ADDR tvaddr,tpaddr;
909  int rc;
910 
911  xstate = (struct gdb_state *)target->state;
912  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
913 
914  if (!mstate->ram_mmap) {
915  vwarnopt(5,LA_TARGET,LF_GDB,"QEMU -mem-path option not enabled!\n");
916  errno = ENOTSUP;
917  return -1;
918  }
919 
920  /*
921  * Strip the offset bits to improve builtin/xenaccess cache perf.
922  */
923  tvaddr = vaddr & ~(__PAGE_SIZE - 1);
924 
925  rc = memcache_get_v2p(target->memcache,pgd,tvaddr,paddr,NULL);
926  if (rc == 0)
927  return 0;
928  else if (rc < 0) {
929  vwarn("error while looking up vaddr 0x%"PRIxADDR" (for vaddr"
930  " 0x%"PRIxADDR") in memcache: %s (%d); trying full lookup!\n",
931  tvaddr,vaddr,strerror(errno),rc);
932  }
933 
934  rc = target_arch_x86_v2p(target,pgd,vaddr,ARCH_X86_V2P_LMA,&tpaddr);
935  if (rc) {
936  verror("could not lookup vaddr 0x%"PRIxADDR" in tid %"PRIiTID
937  " pgd 0x%"PRIxADDR"!\n",
938  vaddr,tid,pgd);
939  return -1;
940  }
941 
942  *paddr = tpaddr | (vaddr & (__PAGE_SIZE - 1));
943 
945  "tid %"PRIiTID" vaddr 0x%"PRIxADDR" -> paddr 0x%"PRIxADDR"\n",
946  tid,vaddr,*paddr);
947 
948  memcache_set_v2p(target->memcache,pgd,vaddr,*paddr);
949 
950  return 0;
951 }
952 
954  ADDR addr) {
955  struct gdb_state *xstate;
957  char *end;
958  char *ram_mmap_start,*ram_mmap_end;
959  unsigned long mlen;
960  char *retval;
961 
962  xstate = (struct gdb_state *)target->state;
963  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
964 
965  if (!mstate->ram_mmap) {
966  vwarnopt(5,LA_TARGET,LF_GDB,"QEMU -mem-path option not enabled!\n");
967  errno = ENOTSUP;
968  return NULL;
969  }
970 
971  /*
972  * Read phys pages until we see a '\0'.
973  */
974  ram_mmap_start = (char *)mstate->ram_mmap + addr;
975  ram_mmap_end = (char *)mstate->ram_mmap + mstate->ram_mmap_size;
976  end = ram_mmap_start;
977 
978  while (end >= (char *)mstate->ram_mmap && end < ram_mmap_end) {
979  if (*end == '\0')
980  break;
981  ++end;
982  }
983 
984  mlen = end - ram_mmap_start;
985  retval = malloc(mlen + 1);
986  if (mlen > 0)
987  memcpy(retval,ram_mmap_start,mlen);
988  retval[mlen] = '\0';
989 
990  return (unsigned char *)retval;
991 }
992 
993 unsigned char *gdb_helper_qemu_read_phys(struct target *target,ADDR paddr,
994  unsigned long length,
995  unsigned char *buf) {
996  struct gdb_state *xstate;
998  char *ram_mmap_start,*ram_mmap_end;
999 
1000  xstate = (struct gdb_state *)target->state;
1001  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
1002 
1003  if (!mstate->ram_mmap) {
1004  vwarnopt(5,LA_TARGET,LF_GDB,"QEMU -mem-path option not enabled!\n");
1005  errno = ENOTSUP;
1006  return NULL;
1007  }
1008 
1009  ram_mmap_start = (char *)mstate->ram_mmap + paddr;
1010  ram_mmap_end = (char *)mstate->ram_mmap + mstate->ram_mmap_size;
1011 
1012  if (ram_mmap_start >= (char *)mstate->ram_mmap
1013  && (ram_mmap_start + length) < ram_mmap_end) {
1014  /* allocate buffer if necessary */
1015  if (!buf) {
1016  buf = malloc(length + 1);
1017  buf[length] = '\0';
1018  }
1019  memcpy(buf,ram_mmap_start,length);
1020  }
1021  else {
1022  verror("bad read paddr/length 0x%"PRIxADDR" %lu\n",paddr,length);
1023  errno = EFAULT;
1024  return NULL;
1025  }
1026 
1027  return (unsigned char *)buf;
1028 }
1029 
1030 unsigned long gdb_helper_qemu_write_phys(struct target *target,ADDR paddr,
1031  unsigned long length,
1032  unsigned char *buf) {
1033  struct gdb_state *xstate;
1034  struct gdb_helper_qemu_state *mstate;
1035  char *ram_mmap_start,*ram_mmap_end;
1036 
1037  xstate = (struct gdb_state *)target->state;
1038  mstate = (struct gdb_helper_qemu_state *)xstate->hops_priv;
1039 
1040  if (!mstate->ram_mmap) {
1041  vwarnopt(5,LA_TARGET,LF_GDB,"QEMU -mem-path option not enabled!\n");
1042  errno = ENOTSUP;
1043  return 0;
1044  }
1045 
1046  ram_mmap_start = (char *)mstate->ram_mmap + paddr;
1047  ram_mmap_end = (char *)mstate->ram_mmap + mstate->ram_mmap_size;
1048 
1049  if (ram_mmap_start >= (char *)mstate->ram_mmap
1050  && (ram_mmap_start + length) < ram_mmap_end) {
1051  memcpy(ram_mmap_start,buf,length);
1052  return length;
1053  }
1054  else {
1055  verror("bad write paddr/length 0x%"PRIxADDR" %lu\n",paddr,length);
1056  errno = EFAULT;
1057  return 0;
1058  }
1059 }
1060 
1062  struct gdb_state *gstate = (struct gdb_state *)target->state;
1063  struct gdb_helper_qemu_state *qstate = calloc(1,sizeof(*qstate));
1064 
1065  if (qstate->qemu_qmp_fd > -1) {
1066  close(qstate->qemu_qmp_fd);
1067  qstate->qemu_qmp_fd = -1;
1068  }
1069 #ifdef ENABLE_LIBVIRT
1070  else if (qstate->qemu_libvirt_conn) {
1071  qstate->qemu_libvirt_dom = 0;
1072  virConnectClose(qstate->qemu_libvirt_conn);
1073  qstate->qemu_libvirt_conn = 0;
1074  }
1075 #endif
1076 
1077  if (qstate->ram_mmap) {
1078  munmap(qstate->ram_mmap,qstate->ram_mmap_size);
1079  qstate->ram_mmap = NULL;
1080  qstate->ram_mmap_size = 0;
1081  close(qstate->ram_mmap_fd);
1082  }
1083 
1084  free(qstate);
1085  gstate->hops_priv = NULL;
1086 
1087  return 0;
1088 }
1089 
1092  .attach = gdb_helper_qemu_attach,
1093 
1094  .handle_exception_any = gdb_helper_qemu_handle_exception_any,
1095  .handle_exception_ours = gdb_helper_qemu_handle_exception_ours,
1096  .handle_pause = gdb_helper_qemu_handle_pause,
1097 
1098  .load_machine = gdb_helper_qemu_load_machine,
1099  /*
1100  * No physical address space access; see comments at top!
1101  */
1102  .addr_v2p = gdb_helper_qemu_addr_v2p,
1103  .read_phys = gdb_helper_qemu_read_phys,
1104  .write_phys = gdb_helper_qemu_write_phys,
1105 
1106  .read_tid = gdb_helper_qemu_read_tid,
1107  .write_tid = gdb_helper_qemu_write_tid,
1108 
1109  .fini = gdb_helper_qemu_fini,
1110 };
arch_type_t type
Definition: arch.h:117
int target_arch_x86_v2p(struct target *target, ADDR pgd, ADDR virt, arch_x86_v2p_flags_t flags, ADDR *phys)
#define vwarnopt(level, area, flags, format,...)
Definition: log.h:37
GHashTable * config
Definition: target_api.h:2622
void * state
Definition: target_api.h:2526
void * backend_spec
Definition: target_api.h:2290
int32_t tid_t
Definition: common.h:36
target_personality_t personality
Definition: target_api.h:2515
Definition: log.h:175
#define REG_X86_64_CR4
Definition: arch_x86_64.h:140
static uint64_t unsigned int i
int gdb_helper_qemu_handle_exception_any(struct target *target)
int __recv_til_block(int fd, char *buf, unsigned int len, int blockfirst)
int regcache_init_reg(struct regcache *regcache, REG reg, REGVAL regval)
Definition: regcache.c:153
struct malloc_state * mstate
Definition: dlmalloc.c:2609
#define REG_X86_CR4
Definition: arch_x86.h:103
char * qemu_mem_path
Definition: target_gdb.h:61
int gdb_rsp_write_mem(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
#define REG_X86_CR3
Definition: arch_x86.h:102
int32_t OFFSET
Definition: common.h:65
unsigned char * gdb_helper_qemu_read_tid(struct target *target, tid_t tid, ADDR pgd, ADDR addr, unsigned long length, unsigned char *buf)
#define verror(format,...)
Definition: log.h:30
unsigned char * gdb_helper_qemu_read_tid_mem_path(struct target *target, tid_t tid, ADDR pgd, ADDR addr, unsigned long length, unsigned char *buf)
#define REG_X86_MSR_EFER
Definition: arch_x86.h:114
unsigned long gdb_helper_qemu_write_phys(struct target *target, ADDR paddr, unsigned long length, unsigned char *buf)
int gdb_helper_qemu_attach(struct target *target)
unsigned char * gdb_helper_qemu_read_phys(struct target *target, ADDR paddr, unsigned long length, unsigned char *buf)
#define vwarn(format,...)
Definition: log.h:33
void free(void *ptr)
Definition: debugserver.c:207
struct target_thread * target_load_current_thread(struct target *target, int force)
Definition: target_api.c:1305
int memcache_get_v2p(struct memcache *memcache, ADDR tag, ADDR va, ADDR *pa, void **tag_priv)
Definition: memcache.c:232
int gdb_helper_qemu_handle_exception_ours(struct target *target)
int gdb_helper_qemu_addr_v2p(struct target *target, tid_t tid, ADDR pgd, ADDR vaddr, ADDR *paddr)
unsigned int clear_mem_caches_each_exception
Definition: target_gdb.h:39
int memcache_set_v2p(struct memcache *memcache, ADDR tag, ADDR va, ADDR pa)
Definition: memcache.c:369
#define __PAGE_SIZE
#define REG_X86_64_DR6
Definition: arch_x86_64.h:151
void * hops_priv
Definition: target_gdb.h:132
void * mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
Definition: qemuhacks.c:213
struct memcache * memcache
Definition: target_api.h:2791
#define REG_X86_DR6
Definition: arch_x86.h:111
unsigned long gdb_helper_qemu_write_tid_mem_path(struct target *target, tid_t tid, ADDR pgd, ADDR addr, unsigned long length, unsigned char *buf)
unsigned char * gdb_helper_qemu_read_v_str(struct target *target, tid_t tid, ADDR pgd, ADDR addr)
int len
Definition: dumptarget.c:52
#define REG_X86_64_MSR_EFER
Definition: arch_x86_64.h:154
#define PROT_WRITE
Definition: common.h:107
#define vdebug(devel, areas, flags, format,...)
Definition: log.h:302
int memcache_invalidate_all(struct memcache *memcache)
Definition: memcache.c:138
void * realloc(void *ptr, size_t size)
Definition: debugserver.c:221
Definition: log.h:172
struct arch * arch
Definition: target_api.h:2603
unsigned int wordsize
Definition: arch.h:121
void * calloc(size_t nmemb, size_t size)
Definition: debugserver.c:200
unsigned long gdb_helper_qemu_write_tid(struct target *target, tid_t tid, ADDR pgd, ADDR addr, unsigned long length, unsigned char *buf)
Definition: log.h:70
int gdb_rsp_read_mem(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
uint32_t REGVAL
Definition: common.h:66
int gdb_helper_qemu_fini(struct target *target)
int gdb_helper_qemu_load_machine(struct target *target, struct regcache *regcache)
#define PRIiTID
Definition: common.h:37
int gdb_helper_qemu_init(struct target *target)
int h_errno
#define REG_X86_64_GS_BASE
Definition: arch_x86_64.h:110
uint32_t ADDR
Definition: common.h:64
char * name
Definition: target_api.h:2521
struct memcache * memcache_create(unsigned long int max_v2p, unsigned long int max_mmap_size, memcache_tag_priv_dtor pdtor)
Definition: memcache.c:33
void memcache_inc_ticks(struct memcache *memcache, unsigned int new_ticks)
Definition: memcache.c:220
#define PROT_READ
Definition: common.h:106
#define PRIxADDR
Definition: common.h:67
struct target_spec * spec
Definition: target_api.h:2605
#define REG_X86_CR0
Definition: arch_x86.h:99
void * malloc(size_t size)
Definition: debugserver.c:214
#define REG_X86_64_CR0
Definition: arch_x86_64.h:136
unsigned char * gdb_helper_qemu_read_phys_str(struct target *target, ADDR addr)
#define GDB_MAX_IO
int gdb_helper_qemu_handle_pause(struct target *target)
int(* init)(struct target *target)
Definition: target_gdb.h:147
#define REG_X86_64_CR3
Definition: arch_x86_64.h:139
#define TID_GLOBAL
Definition: target_api.h:145
struct gdb_helper_ops gdb_helper_ops_qemu
#define PRIxREGVAL
Definition: common.h:72