1 /* 2 * QTest 3 * 4 * Copyright IBM, Corp. 2012 5 * Copyright Red Hat, Inc. 2012 6 * Copyright SUSE LINUX Products GmbH 2013 7 * 8 * Authors: 9 * Anthony Liguori <aliguori@us.ibm.com> 10 * Paolo Bonzini <pbonzini@redhat.com> 11 * Andreas Färber <afaerber@suse.de> 12 * 13 * This work is licensed under the terms of the GNU GPL, version 2 or later. 14 * See the COPYING file in the top-level directory. 15 */ 16 17 #include "qemu/osdep.h" 18 19 #include <sys/socket.h> 20 #include <sys/wait.h> 21 #include <sys/un.h> 22 #ifdef __linux__ 23 #include <sys/prctl.h> 24 #endif /* __linux__ */ 25 26 #include "libqtest.h" 27 #include "libqmp.h" 28 #include "qemu/ctype.h" 29 #include "qemu/cutils.h" 30 #include "qapi/qmp/qdict.h" 31 #include "qapi/qmp/qjson.h" 32 #include "qapi/qmp/qlist.h" 33 #include "qapi/qmp/qstring.h" 34 35 #define MAX_IRQ 256 36 #define SOCKET_TIMEOUT 50 37 38 typedef void (*QTestSendFn)(QTestState *s, const char *buf); 39 typedef void (*ExternalSendFn)(void *s, const char *buf); 40 typedef GString* (*QTestRecvFn)(QTestState *); 41 42 typedef struct QTestClientTransportOps { 43 QTestSendFn send; /* for sending qtest commands */ 44 45 /* 46 * use external_send to send qtest command strings through functions which 47 * do not accept a QTestState as the first parameter. 48 */ 49 ExternalSendFn external_send; 50 51 QTestRecvFn recv_line; /* for receiving qtest command responses */ 52 } QTestTransportOps; 53 54 struct QTestState 55 { 56 int fd; 57 int qmp_fd; 58 pid_t qemu_pid; /* our child QEMU process */ 59 int wstatus; 60 int expected_status; 61 bool big_endian; 62 bool irq_level[MAX_IRQ]; 63 GString *rx; 64 QTestTransportOps ops; 65 GList *pending_events; 66 }; 67 68 static GHookList abrt_hooks; 69 static void (*sighandler_old)(int); 70 71 static int qtest_query_target_endianness(QTestState *s); 72 73 static void qtest_client_socket_send(QTestState*, const char *buf); 74 static void socket_send(int fd, const char *buf, size_t size); 75 76 static GString *qtest_client_socket_recv_line(QTestState *); 77 78 static void qtest_client_set_tx_handler(QTestState *s, QTestSendFn send); 79 static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv); 80 81 static int init_socket(const char *socket_path) 82 { 83 int sock = qtest_socket_server(socket_path); 84 qemu_set_cloexec(sock); 85 return sock; 86 } 87 88 static int socket_accept(int sock) 89 { 90 struct sockaddr_un addr; 91 socklen_t addrlen; 92 int ret; 93 struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT, 94 .tv_usec = 0 }; 95 96 if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, 97 (void *)&timeout, sizeof(timeout))) { 98 fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n", 99 __func__, strerror(errno)); 100 closesocket(sock); 101 return -1; 102 } 103 104 do { 105 addrlen = sizeof(addr); 106 ret = accept(sock, (struct sockaddr *)&addr, &addrlen); 107 } while (ret == -1 && errno == EINTR); 108 if (ret == -1) { 109 fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno)); 110 } 111 closesocket(sock); 112 113 return ret; 114 } 115 116 bool qtest_probe_child(QTestState *s) 117 { 118 pid_t pid = s->qemu_pid; 119 120 if (pid != -1) { 121 pid = waitpid(pid, &s->wstatus, WNOHANG); 122 if (pid == 0) { 123 return true; 124 } 125 s->qemu_pid = -1; 126 } 127 return false; 128 } 129 130 void qtest_set_expected_status(QTestState *s, int status) 131 { 132 s->expected_status = status; 133 } 134 135 void qtest_kill_qemu(QTestState *s) 136 { 137 pid_t pid = s->qemu_pid; 138 int wstatus; 139 140 /* Skip wait if qtest_probe_child already reaped. */ 141 if (pid != -1) { 142 kill(pid, SIGTERM); 143 TFR(pid = waitpid(s->qemu_pid, &s->wstatus, 0)); 144 assert(pid == s->qemu_pid); 145 s->qemu_pid = -1; 146 } 147 148 /* 149 * Check whether qemu exited with expected exit status; anything else is 150 * fishy and should be logged with as much detail as possible. 151 */ 152 wstatus = s->wstatus; 153 if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) { 154 fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU " 155 "process but encountered exit status %d (expected %d)\n", 156 __FILE__, __LINE__, WEXITSTATUS(wstatus), s->expected_status); 157 abort(); 158 } else if (WIFSIGNALED(wstatus)) { 159 int sig = WTERMSIG(wstatus); 160 const char *signame = strsignal(sig) ?: "unknown ???"; 161 const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : ""; 162 163 fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death " 164 "from signal %d (%s)%s\n", 165 __FILE__, __LINE__, sig, signame, dump); 166 abort(); 167 } 168 } 169 170 static void kill_qemu_hook_func(void *s) 171 { 172 qtest_kill_qemu(s); 173 } 174 175 static void sigabrt_handler(int signo) 176 { 177 g_hook_list_invoke(&abrt_hooks, FALSE); 178 } 179 180 static void setup_sigabrt_handler(void) 181 { 182 sighandler_old = signal(SIGABRT, sigabrt_handler); 183 } 184 185 static void cleanup_sigabrt_handler(void) 186 { 187 signal(SIGABRT, sighandler_old); 188 } 189 190 static bool hook_list_is_empty(GHookList *hook_list) 191 { 192 GHook *hook = g_hook_first_valid(hook_list, TRUE); 193 194 if (!hook) { 195 return true; 196 } 197 198 g_hook_unref(hook_list, hook); 199 return false; 200 } 201 202 void qtest_add_abrt_handler(GHookFunc fn, const void *data) 203 { 204 GHook *hook; 205 206 if (!abrt_hooks.is_setup) { 207 g_hook_list_init(&abrt_hooks, sizeof(GHook)); 208 } 209 210 /* Only install SIGABRT handler once */ 211 if (hook_list_is_empty(&abrt_hooks)) { 212 setup_sigabrt_handler(); 213 } 214 215 hook = g_hook_alloc(&abrt_hooks); 216 hook->func = fn; 217 hook->data = (void *)data; 218 219 g_hook_prepend(&abrt_hooks, hook); 220 } 221 222 void qtest_remove_abrt_handler(void *data) 223 { 224 GHook *hook = g_hook_find_data(&abrt_hooks, TRUE, data); 225 g_hook_destroy_link(&abrt_hooks, hook); 226 227 /* Uninstall SIGABRT handler on last instance */ 228 if (hook_list_is_empty(&abrt_hooks)) { 229 cleanup_sigabrt_handler(); 230 } 231 } 232 233 static const char *qtest_qemu_binary(void) 234 { 235 const char *qemu_bin; 236 237 qemu_bin = getenv("QTEST_QEMU_BINARY"); 238 if (!qemu_bin) { 239 fprintf(stderr, "Environment variable QTEST_QEMU_BINARY required\n"); 240 exit(1); 241 } 242 243 return qemu_bin; 244 } 245 246 QTestState *qtest_init_without_qmp_handshake(const char *extra_args) 247 { 248 QTestState *s; 249 int sock, qmpsock, i; 250 gchar *socket_path; 251 gchar *qmp_socket_path; 252 gchar *command; 253 const char *qemu_binary = qtest_qemu_binary(); 254 const char *trace = g_getenv("QTEST_TRACE"); 255 g_autofree char *tracearg = trace ? 256 g_strdup_printf("-trace %s ", trace) : g_strdup(""); 257 258 s = g_new(QTestState, 1); 259 260 socket_path = g_strdup_printf("%s/qtest-%d.sock", 261 g_get_tmp_dir(), getpid()); 262 qmp_socket_path = g_strdup_printf("%s/qtest-%d.qmp", 263 g_get_tmp_dir(), getpid()); 264 265 /* It's possible that if an earlier test run crashed it might 266 * have left a stale unix socket lying around. Delete any 267 * stale old socket to avoid spurious test failures with 268 * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 != -1) 269 */ 270 unlink(socket_path); 271 unlink(qmp_socket_path); 272 273 sock = init_socket(socket_path); 274 qmpsock = init_socket(qmp_socket_path); 275 276 qtest_client_set_rx_handler(s, qtest_client_socket_recv_line); 277 qtest_client_set_tx_handler(s, qtest_client_socket_send); 278 279 qtest_add_abrt_handler(kill_qemu_hook_func, s); 280 281 command = g_strdup_printf("exec %s %s" 282 "-qtest unix:%s " 283 "-qtest-log %s " 284 "-chardev socket,path=%s,id=char0 " 285 "-mon chardev=char0,mode=control " 286 "-display none " 287 "%s" 288 " -accel qtest", 289 qemu_binary, tracearg, socket_path, 290 getenv("QTEST_LOG") ? "/dev/fd/2" : "/dev/null", 291 qmp_socket_path, 292 extra_args ?: ""); 293 294 g_test_message("starting QEMU: %s", command); 295 296 s->pending_events = NULL; 297 s->wstatus = 0; 298 s->expected_status = 0; 299 s->qemu_pid = fork(); 300 if (s->qemu_pid == 0) { 301 #ifdef __linux__ 302 /* 303 * Although we register a ABRT handler to kill off QEMU 304 * when g_assert() triggers, we want an extra safety 305 * net. The QEMU process might be non-functional and 306 * thus not have responded to SIGTERM. The test script 307 * might also have crashed with SEGV, in which case the 308 * cleanup handlers won't ever run. 309 * 310 * This PR_SET_PDEATHSIG setup will ensure any remaining 311 * QEMU will get terminated with SIGKILL in these cases. 312 */ 313 prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0); 314 #endif /* __linux__ */ 315 if (!g_setenv("QEMU_AUDIO_DRV", "none", true)) { 316 exit(1); 317 } 318 execlp("/bin/sh", "sh", "-c", command, NULL); 319 exit(1); 320 } 321 322 g_free(command); 323 s->fd = socket_accept(sock); 324 if (s->fd >= 0) { 325 s->qmp_fd = socket_accept(qmpsock); 326 } 327 unlink(socket_path); 328 unlink(qmp_socket_path); 329 g_free(socket_path); 330 g_free(qmp_socket_path); 331 332 g_assert(s->fd >= 0 && s->qmp_fd >= 0); 333 334 s->rx = g_string_new(""); 335 for (i = 0; i < MAX_IRQ; i++) { 336 s->irq_level[i] = false; 337 } 338 339 if (getenv("QTEST_STOP")) { 340 kill(s->qemu_pid, SIGSTOP); 341 } 342 343 /* ask endianness of the target */ 344 345 s->big_endian = qtest_query_target_endianness(s); 346 347 return s; 348 } 349 350 QTestState *qtest_init(const char *extra_args) 351 { 352 QTestState *s = qtest_init_without_qmp_handshake(extra_args); 353 QDict *greeting; 354 355 /* Read the QMP greeting and then do the handshake */ 356 greeting = qtest_qmp_receive(s); 357 qobject_unref(greeting); 358 qobject_unref(qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }")); 359 360 return s; 361 } 362 363 QTestState *qtest_vinitf(const char *fmt, va_list ap) 364 { 365 char *args = g_strdup_vprintf(fmt, ap); 366 QTestState *s; 367 368 s = qtest_init(args); 369 g_free(args); 370 return s; 371 } 372 373 QTestState *qtest_initf(const char *fmt, ...) 374 { 375 va_list ap; 376 QTestState *s; 377 378 va_start(ap, fmt); 379 s = qtest_vinitf(fmt, ap); 380 va_end(ap); 381 return s; 382 } 383 384 QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd) 385 { 386 int sock_fd_init; 387 g_autofree char *sock_dir = NULL; 388 char *sock_path; 389 QTestState *qts; 390 391 sock_dir = g_dir_make_tmp("qtest-serial-XXXXXX", NULL); 392 g_assert_true(sock_dir != NULL); 393 sock_path = g_strdup_printf("%s/sock", sock_dir); 394 395 sock_fd_init = init_socket(sock_path); 396 397 qts = qtest_initf("-chardev socket,id=s0,path=%s -serial chardev:s0 %s", 398 sock_path, extra_args); 399 400 *sock_fd = socket_accept(sock_fd_init); 401 402 unlink(sock_path); 403 g_free(sock_path); 404 rmdir(sock_dir); 405 406 g_assert_true(*sock_fd >= 0); 407 408 return qts; 409 } 410 411 void qtest_quit(QTestState *s) 412 { 413 qtest_remove_abrt_handler(s); 414 415 qtest_kill_qemu(s); 416 closesocket(s->fd); 417 closesocket(s->qmp_fd); 418 g_string_free(s->rx, true); 419 420 for (GList *it = s->pending_events; it != NULL; it = it->next) { 421 qobject_unref((QDict *)it->data); 422 } 423 424 g_list_free(s->pending_events); 425 426 g_free(s); 427 } 428 429 static void socket_send(int fd, const char *buf, size_t size) 430 { 431 size_t res = qemu_write_full(fd, buf, size); 432 433 assert(res == size); 434 } 435 436 static void qtest_client_socket_send(QTestState *s, const char *buf) 437 { 438 socket_send(s->fd, buf, strlen(buf)); 439 } 440 441 static void G_GNUC_PRINTF(2, 3) qtest_sendf(QTestState *s, const char *fmt, ...) 442 { 443 va_list ap; 444 445 va_start(ap, fmt); 446 gchar *str = g_strdup_vprintf(fmt, ap); 447 va_end(ap); 448 449 s->ops.send(s, str); 450 g_free(str); 451 } 452 453 static GString *qtest_client_socket_recv_line(QTestState *s) 454 { 455 GString *line; 456 size_t offset; 457 char *eol; 458 459 while ((eol = strchr(s->rx->str, '\n')) == NULL) { 460 ssize_t len; 461 char buffer[1024]; 462 463 len = read(s->fd, buffer, sizeof(buffer)); 464 if (len == -1 && errno == EINTR) { 465 continue; 466 } 467 468 if (len == -1 || len == 0) { 469 fprintf(stderr, "Broken pipe\n"); 470 abort(); 471 } 472 473 g_string_append_len(s->rx, buffer, len); 474 } 475 476 offset = eol - s->rx->str; 477 line = g_string_new_len(s->rx->str, offset); 478 g_string_erase(s->rx, 0, offset + 1); 479 480 return line; 481 } 482 483 static gchar **qtest_rsp_args(QTestState *s, int expected_args) 484 { 485 GString *line; 486 gchar **words; 487 int i; 488 489 redo: 490 line = s->ops.recv_line(s); 491 words = g_strsplit(line->str, " ", 0); 492 g_string_free(line, TRUE); 493 494 if (strcmp(words[0], "IRQ") == 0) { 495 long irq; 496 int ret; 497 498 g_assert(words[1] != NULL); 499 g_assert(words[2] != NULL); 500 501 ret = qemu_strtol(words[2], NULL, 0, &irq); 502 g_assert(!ret); 503 g_assert_cmpint(irq, >=, 0); 504 g_assert_cmpint(irq, <, MAX_IRQ); 505 506 if (strcmp(words[1], "raise") == 0) { 507 s->irq_level[irq] = true; 508 } else { 509 s->irq_level[irq] = false; 510 } 511 512 g_strfreev(words); 513 goto redo; 514 } 515 516 g_assert(words[0] != NULL); 517 g_assert_cmpstr(words[0], ==, "OK"); 518 519 for (i = 0; i < expected_args; i++) { 520 g_assert(words[i] != NULL); 521 } 522 523 return words; 524 } 525 526 static void qtest_rsp(QTestState *s) 527 { 528 gchar **words = qtest_rsp_args(s, 0); 529 530 g_strfreev(words); 531 } 532 533 static int qtest_query_target_endianness(QTestState *s) 534 { 535 gchar **args; 536 int big_endian; 537 538 qtest_sendf(s, "endianness\n"); 539 args = qtest_rsp_args(s, 1); 540 g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0); 541 big_endian = strcmp(args[1], "big") == 0; 542 g_strfreev(args); 543 544 return big_endian; 545 } 546 547 QDict *qtest_qmp_receive(QTestState *s) 548 { 549 while (true) { 550 QDict *response = qtest_qmp_receive_dict(s); 551 552 if (!qdict_get_try_str(response, "event")) { 553 return response; 554 } 555 /* Stash the event for a later consumption */ 556 s->pending_events = g_list_append(s->pending_events, response); 557 } 558 } 559 560 QDict *qtest_qmp_receive_dict(QTestState *s) 561 { 562 return qmp_fd_receive(s->qmp_fd); 563 } 564 565 int qtest_socket_server(const char *socket_path) 566 { 567 struct sockaddr_un addr; 568 int sock; 569 int ret; 570 571 sock = socket(PF_UNIX, SOCK_STREAM, 0); 572 g_assert_cmpint(sock, !=, -1); 573 574 addr.sun_family = AF_UNIX; 575 snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path); 576 577 do { 578 ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); 579 } while (ret == -1 && errno == EINTR); 580 g_assert_cmpint(ret, !=, -1); 581 ret = listen(sock, 1); 582 g_assert_cmpint(ret, !=, -1); 583 584 return sock; 585 } 586 587 #ifndef _WIN32 588 void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num, 589 const char *fmt, va_list ap) 590 { 591 qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, ap); 592 } 593 #endif 594 595 void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap) 596 { 597 qmp_fd_vsend(s->qmp_fd, fmt, ap); 598 } 599 600 #ifndef _WIN32 601 QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num, 602 const char *fmt, va_list ap) 603 { 604 qtest_qmp_vsend_fds(s, fds, fds_num, fmt, ap); 605 606 /* Receive reply */ 607 return qtest_qmp_receive(s); 608 } 609 #endif 610 611 QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap) 612 { 613 qtest_qmp_vsend(s, fmt, ap); 614 615 /* Receive reply */ 616 return qtest_qmp_receive(s); 617 } 618 619 #ifndef _WIN32 620 QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num, 621 const char *fmt, ...) 622 { 623 va_list ap; 624 QDict *response; 625 626 va_start(ap, fmt); 627 response = qtest_vqmp_fds(s, fds, fds_num, fmt, ap); 628 va_end(ap); 629 return response; 630 } 631 #endif 632 633 QDict *qtest_qmp(QTestState *s, const char *fmt, ...) 634 { 635 va_list ap; 636 QDict *response; 637 638 va_start(ap, fmt); 639 response = qtest_vqmp(s, fmt, ap); 640 va_end(ap); 641 return response; 642 } 643 644 void qtest_qmp_send(QTestState *s, const char *fmt, ...) 645 { 646 va_list ap; 647 648 va_start(ap, fmt); 649 qtest_qmp_vsend(s, fmt, ap); 650 va_end(ap); 651 } 652 653 void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...) 654 { 655 va_list ap; 656 657 va_start(ap, fmt); 658 qmp_fd_vsend_raw(s->qmp_fd, fmt, ap); 659 va_end(ap); 660 } 661 662 QDict *qtest_qmp_event_ref(QTestState *s, const char *event) 663 { 664 while (s->pending_events) { 665 666 GList *first = s->pending_events; 667 QDict *response = (QDict *)first->data; 668 669 s->pending_events = g_list_delete_link(s->pending_events, first); 670 671 if (!strcmp(qdict_get_str(response, "event"), event)) { 672 return response; 673 } 674 qobject_unref(response); 675 } 676 return NULL; 677 } 678 679 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event) 680 { 681 QDict *response = qtest_qmp_event_ref(s, event); 682 683 if (response) { 684 return response; 685 } 686 687 for (;;) { 688 response = qtest_qmp_receive_dict(s); 689 if ((qdict_haskey(response, "event")) && 690 (strcmp(qdict_get_str(response, "event"), event) == 0)) { 691 return response; 692 } 693 qobject_unref(response); 694 } 695 } 696 697 void qtest_qmp_eventwait(QTestState *s, const char *event) 698 { 699 QDict *response; 700 701 response = qtest_qmp_eventwait_ref(s, event); 702 qobject_unref(response); 703 } 704 705 char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap) 706 { 707 char *cmd; 708 QDict *resp; 709 char *ret; 710 711 cmd = g_strdup_vprintf(fmt, ap); 712 resp = qtest_qmp(s, "{'execute': 'human-monitor-command'," 713 " 'arguments': {'command-line': %s}}", 714 cmd); 715 ret = g_strdup(qdict_get_try_str(resp, "return")); 716 g_assert(ret); 717 qobject_unref(resp); 718 g_free(cmd); 719 return ret; 720 } 721 722 char *qtest_hmp(QTestState *s, const char *fmt, ...) 723 { 724 va_list ap; 725 char *ret; 726 727 va_start(ap, fmt); 728 ret = qtest_vhmp(s, fmt, ap); 729 va_end(ap); 730 return ret; 731 } 732 733 const char *qtest_get_arch(void) 734 { 735 const char *qemu = qtest_qemu_binary(); 736 const char *end = strrchr(qemu, '-'); 737 738 if (!end) { 739 fprintf(stderr, "Can't determine architecture from binary name.\n"); 740 exit(1); 741 } 742 743 if (!strstr(qemu, "-system-")) { 744 fprintf(stderr, "QTEST_QEMU_BINARY must end with *-system-<arch> " 745 "where 'arch' is the target\narchitecture (x86_64, aarch64, " 746 "etc).\n"); 747 exit(1); 748 } 749 750 return end + 1; 751 } 752 753 bool qtest_has_accel(const char *accel_name) 754 { 755 if (g_str_equal(accel_name, "tcg")) { 756 #if defined(CONFIG_TCG) 757 return true; 758 #else 759 return false; 760 #endif 761 } else if (g_str_equal(accel_name, "kvm")) { 762 int i; 763 const char *arch = qtest_get_arch(); 764 const char *targets[] = { CONFIG_KVM_TARGETS }; 765 766 for (i = 0; i < ARRAY_SIZE(targets); i++) { 767 if (!strncmp(targets[i], arch, strlen(arch))) { 768 if (!access("/dev/kvm", R_OK | W_OK)) { 769 return true; 770 } 771 } 772 } 773 } else { 774 /* not implemented */ 775 g_assert_not_reached(); 776 } 777 return false; 778 } 779 780 bool qtest_get_irq(QTestState *s, int num) 781 { 782 /* dummy operation in order to make sure irq is up to date */ 783 qtest_inb(s, 0); 784 785 return s->irq_level[num]; 786 } 787 788 void qtest_module_load(QTestState *s, const char *prefix, const char *libname) 789 { 790 qtest_sendf(s, "module_load %s %s\n", prefix, libname); 791 qtest_rsp(s); 792 } 793 794 static int64_t qtest_clock_rsp(QTestState *s) 795 { 796 gchar **words; 797 int64_t clock; 798 words = qtest_rsp_args(s, 2); 799 clock = g_ascii_strtoll(words[1], NULL, 0); 800 g_strfreev(words); 801 return clock; 802 } 803 804 int64_t qtest_clock_step_next(QTestState *s) 805 { 806 qtest_sendf(s, "clock_step\n"); 807 return qtest_clock_rsp(s); 808 } 809 810 int64_t qtest_clock_step(QTestState *s, int64_t step) 811 { 812 qtest_sendf(s, "clock_step %"PRIi64"\n", step); 813 return qtest_clock_rsp(s); 814 } 815 816 int64_t qtest_clock_set(QTestState *s, int64_t val) 817 { 818 qtest_sendf(s, "clock_set %"PRIi64"\n", val); 819 return qtest_clock_rsp(s); 820 } 821 822 void qtest_irq_intercept_out(QTestState *s, const char *qom_path) 823 { 824 qtest_sendf(s, "irq_intercept_out %s\n", qom_path); 825 qtest_rsp(s); 826 } 827 828 void qtest_irq_intercept_in(QTestState *s, const char *qom_path) 829 { 830 qtest_sendf(s, "irq_intercept_in %s\n", qom_path); 831 qtest_rsp(s); 832 } 833 834 void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name, 835 int num, int level) 836 { 837 if (!name) { 838 name = "unnamed-gpio-in"; 839 } 840 qtest_sendf(s, "set_irq_in %s %s %d %d\n", qom_path, name, num, level); 841 qtest_rsp(s); 842 } 843 844 static void qtest_out(QTestState *s, const char *cmd, uint16_t addr, uint32_t value) 845 { 846 qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value); 847 qtest_rsp(s); 848 } 849 850 void qtest_outb(QTestState *s, uint16_t addr, uint8_t value) 851 { 852 qtest_out(s, "outb", addr, value); 853 } 854 855 void qtest_outw(QTestState *s, uint16_t addr, uint16_t value) 856 { 857 qtest_out(s, "outw", addr, value); 858 } 859 860 void qtest_outl(QTestState *s, uint16_t addr, uint32_t value) 861 { 862 qtest_out(s, "outl", addr, value); 863 } 864 865 static uint32_t qtest_in(QTestState *s, const char *cmd, uint16_t addr) 866 { 867 gchar **args; 868 int ret; 869 unsigned long value; 870 871 qtest_sendf(s, "%s 0x%x\n", cmd, addr); 872 args = qtest_rsp_args(s, 2); 873 ret = qemu_strtoul(args[1], NULL, 0, &value); 874 g_assert(!ret && value <= UINT32_MAX); 875 g_strfreev(args); 876 877 return value; 878 } 879 880 uint8_t qtest_inb(QTestState *s, uint16_t addr) 881 { 882 return qtest_in(s, "inb", addr); 883 } 884 885 uint16_t qtest_inw(QTestState *s, uint16_t addr) 886 { 887 return qtest_in(s, "inw", addr); 888 } 889 890 uint32_t qtest_inl(QTestState *s, uint16_t addr) 891 { 892 return qtest_in(s, "inl", addr); 893 } 894 895 static void qtest_write(QTestState *s, const char *cmd, uint64_t addr, 896 uint64_t value) 897 { 898 qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value); 899 qtest_rsp(s); 900 } 901 902 void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value) 903 { 904 qtest_write(s, "writeb", addr, value); 905 } 906 907 void qtest_writew(QTestState *s, uint64_t addr, uint16_t value) 908 { 909 qtest_write(s, "writew", addr, value); 910 } 911 912 void qtest_writel(QTestState *s, uint64_t addr, uint32_t value) 913 { 914 qtest_write(s, "writel", addr, value); 915 } 916 917 void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value) 918 { 919 qtest_write(s, "writeq", addr, value); 920 } 921 922 static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr) 923 { 924 gchar **args; 925 int ret; 926 uint64_t value; 927 928 qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr); 929 args = qtest_rsp_args(s, 2); 930 ret = qemu_strtou64(args[1], NULL, 0, &value); 931 g_assert(!ret); 932 g_strfreev(args); 933 934 return value; 935 } 936 937 uint8_t qtest_readb(QTestState *s, uint64_t addr) 938 { 939 return qtest_read(s, "readb", addr); 940 } 941 942 uint16_t qtest_readw(QTestState *s, uint64_t addr) 943 { 944 return qtest_read(s, "readw", addr); 945 } 946 947 uint32_t qtest_readl(QTestState *s, uint64_t addr) 948 { 949 return qtest_read(s, "readl", addr); 950 } 951 952 uint64_t qtest_readq(QTestState *s, uint64_t addr) 953 { 954 return qtest_read(s, "readq", addr); 955 } 956 957 static int hex2nib(char ch) 958 { 959 if (ch >= '0' && ch <= '9') { 960 return ch - '0'; 961 } else if (ch >= 'a' && ch <= 'f') { 962 return 10 + (ch - 'a'); 963 } else if (ch >= 'A' && ch <= 'F') { 964 return 10 + (ch - 'a'); 965 } else { 966 return -1; 967 } 968 } 969 970 void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size) 971 { 972 uint8_t *ptr = data; 973 gchar **args; 974 size_t i; 975 976 if (!size) { 977 return; 978 } 979 980 qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size); 981 args = qtest_rsp_args(s, 2); 982 983 for (i = 0; i < size; i++) { 984 ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4; 985 ptr[i] |= hex2nib(args[1][2 + (i * 2) + 1]); 986 } 987 988 g_strfreev(args); 989 } 990 991 uint64_t qtest_rtas_call(QTestState *s, const char *name, 992 uint32_t nargs, uint64_t args, 993 uint32_t nret, uint64_t ret) 994 { 995 qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n", 996 name, nargs, args, nret, ret); 997 qtest_rsp(s); 998 return 0; 999 } 1000 1001 void qtest_add_func(const char *str, void (*fn)(void)) 1002 { 1003 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str); 1004 g_test_add_func(path, fn); 1005 g_free(path); 1006 } 1007 1008 void qtest_add_data_func_full(const char *str, void *data, 1009 void (*fn)(const void *), 1010 GDestroyNotify data_free_func) 1011 { 1012 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str); 1013 g_test_add_data_func_full(path, data, fn, data_free_func); 1014 g_free(path); 1015 } 1016 1017 void qtest_add_data_func(const char *str, const void *data, 1018 void (*fn)(const void *)) 1019 { 1020 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str); 1021 g_test_add_data_func(path, data, fn); 1022 g_free(path); 1023 } 1024 1025 void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size) 1026 { 1027 gchar *bdata; 1028 1029 bdata = g_base64_encode(data, size); 1030 qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size); 1031 s->ops.send(s, bdata); 1032 s->ops.send(s, "\n"); 1033 qtest_rsp(s); 1034 g_free(bdata); 1035 } 1036 1037 void qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size) 1038 { 1039 gchar **args; 1040 size_t len; 1041 1042 qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size); 1043 args = qtest_rsp_args(s, 2); 1044 1045 g_base64_decode_inplace(args[1], &len); 1046 if (size != len) { 1047 fprintf(stderr, "bufread: asked for %zu bytes but decoded %zu\n", 1048 size, len); 1049 len = MIN(len, size); 1050 } 1051 1052 memcpy(data, args[1], len); 1053 g_strfreev(args); 1054 } 1055 1056 void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size) 1057 { 1058 const uint8_t *ptr = data; 1059 size_t i; 1060 char *enc; 1061 1062 if (!size) { 1063 return; 1064 } 1065 1066 enc = g_malloc(2 * size + 1); 1067 1068 for (i = 0; i < size; i++) { 1069 sprintf(&enc[i * 2], "%02x", ptr[i]); 1070 } 1071 1072 qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc); 1073 qtest_rsp(s); 1074 g_free(enc); 1075 } 1076 1077 void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size) 1078 { 1079 qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size, pattern); 1080 qtest_rsp(s); 1081 } 1082 1083 void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...) 1084 { 1085 va_list ap; 1086 QDict *response; 1087 1088 va_start(ap, fmt); 1089 response = qtest_vqmp(qts, fmt, ap); 1090 va_end(ap); 1091 1092 g_assert(response); 1093 if (!qdict_haskey(response, "return")) { 1094 GString *s = qobject_to_json_pretty(QOBJECT(response), true); 1095 g_test_message("%s", s->str); 1096 g_string_free(s, true); 1097 } 1098 g_assert(qdict_haskey(response, "return")); 1099 qobject_unref(response); 1100 } 1101 1102 bool qtest_big_endian(QTestState *s) 1103 { 1104 return s->big_endian; 1105 } 1106 1107 static bool qtest_check_machine_version(const char *mname, const char *basename, 1108 int major, int minor) 1109 { 1110 char *newname; 1111 bool is_equal; 1112 1113 newname = g_strdup_printf("%s-%i.%i", basename, major, minor); 1114 is_equal = g_str_equal(mname, newname); 1115 g_free(newname); 1116 1117 return is_equal; 1118 } 1119 1120 static bool qtest_is_old_versioned_machine(const char *mname) 1121 { 1122 const char *dash = strrchr(mname, '-'); 1123 const char *dot = strrchr(mname, '.'); 1124 const char *chr; 1125 char *bname; 1126 const int major = QEMU_VERSION_MAJOR; 1127 const int minor = QEMU_VERSION_MINOR; 1128 bool res = false; 1129 1130 if (dash && dot && dot > dash) { 1131 for (chr = dash + 1; *chr; chr++) { 1132 if (!qemu_isdigit(*chr) && *chr != '.') { 1133 return false; 1134 } 1135 } 1136 /* 1137 * Now check if it is one of the latest versions. Check major + 1 1138 * and minor + 1 versions as well, since they might already exist 1139 * in the development branch. 1140 */ 1141 bname = g_strdup(mname); 1142 bname[dash - mname] = 0; 1143 res = !qtest_check_machine_version(mname, bname, major + 1, 0) && 1144 !qtest_check_machine_version(mname, bname, major, minor + 1) && 1145 !qtest_check_machine_version(mname, bname, major, minor); 1146 g_free(bname); 1147 } 1148 1149 return res; 1150 } 1151 1152 struct MachInfo { 1153 char *name; 1154 char *alias; 1155 }; 1156 1157 /* 1158 * Returns an array with pointers to the available machine names. 1159 * The terminating entry has the name set to NULL. 1160 */ 1161 static struct MachInfo *qtest_get_machines(void) 1162 { 1163 static struct MachInfo *machines; 1164 QDict *response, *minfo; 1165 QList *list; 1166 const QListEntry *p; 1167 QObject *qobj; 1168 QString *qstr; 1169 QTestState *qts; 1170 int idx; 1171 1172 if (machines) { 1173 return machines; 1174 } 1175 1176 qts = qtest_init("-machine none"); 1177 response = qtest_qmp(qts, "{ 'execute': 'query-machines' }"); 1178 g_assert(response); 1179 list = qdict_get_qlist(response, "return"); 1180 g_assert(list); 1181 1182 machines = g_new(struct MachInfo, qlist_size(list) + 1); 1183 1184 for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) { 1185 minfo = qobject_to(QDict, qlist_entry_obj(p)); 1186 g_assert(minfo); 1187 1188 qobj = qdict_get(minfo, "name"); 1189 g_assert(qobj); 1190 qstr = qobject_to(QString, qobj); 1191 g_assert(qstr); 1192 machines[idx].name = g_strdup(qstring_get_str(qstr)); 1193 1194 qobj = qdict_get(minfo, "alias"); 1195 if (qobj) { /* The alias is optional */ 1196 qstr = qobject_to(QString, qobj); 1197 g_assert(qstr); 1198 machines[idx].alias = g_strdup(qstring_get_str(qstr)); 1199 } else { 1200 machines[idx].alias = NULL; 1201 } 1202 } 1203 1204 qtest_quit(qts); 1205 qobject_unref(response); 1206 1207 memset(&machines[idx], 0, sizeof(struct MachInfo)); /* Terminating entry */ 1208 return machines; 1209 } 1210 1211 void qtest_cb_for_every_machine(void (*cb)(const char *machine), 1212 bool skip_old_versioned) 1213 { 1214 struct MachInfo *machines; 1215 int i; 1216 1217 machines = qtest_get_machines(); 1218 1219 for (i = 0; machines[i].name != NULL; i++) { 1220 /* Ignore machines that cannot be used for qtests */ 1221 if (!strncmp("xenfv", machines[i].name, 5) || 1222 g_str_equal("xenpv", machines[i].name)) { 1223 continue; 1224 } 1225 if (!skip_old_versioned || 1226 !qtest_is_old_versioned_machine(machines[i].name)) { 1227 cb(machines[i].name); 1228 } 1229 } 1230 } 1231 1232 bool qtest_has_machine(const char *machine) 1233 { 1234 struct MachInfo *machines; 1235 int i; 1236 1237 machines = qtest_get_machines(); 1238 1239 for (i = 0; machines[i].name != NULL; i++) { 1240 if (g_str_equal(machine, machines[i].name) || 1241 (machines[i].alias && g_str_equal(machine, machines[i].alias))) { 1242 return true; 1243 } 1244 } 1245 1246 return false; 1247 } 1248 1249 bool qtest_has_device(const char *device) 1250 { 1251 static QList *list; 1252 const QListEntry *p; 1253 QObject *qobj; 1254 QString *qstr; 1255 QDict *devinfo; 1256 int idx; 1257 1258 if (!list) { 1259 QDict *resp; 1260 QDict *args; 1261 QTestState *qts = qtest_init("-machine none"); 1262 1263 args = qdict_new(); 1264 qdict_put_bool(args, "abstract", false); 1265 qdict_put_str(args, "implements", "device"); 1266 1267 resp = qtest_qmp(qts, "{'execute': 'qom-list-types', 'arguments': %p }", 1268 args); 1269 g_assert(qdict_haskey(resp, "return")); 1270 list = qdict_get_qlist(resp, "return"); 1271 qobject_ref(list); 1272 qobject_unref(resp); 1273 1274 qtest_quit(qts); 1275 } 1276 1277 for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) { 1278 devinfo = qobject_to(QDict, qlist_entry_obj(p)); 1279 g_assert(devinfo); 1280 1281 qobj = qdict_get(devinfo, "name"); 1282 g_assert(qobj); 1283 qstr = qobject_to(QString, qobj); 1284 g_assert(qstr); 1285 if (g_str_equal(qstring_get_str(qstr), device)) { 1286 return true; 1287 } 1288 } 1289 1290 return false; 1291 } 1292 1293 /* 1294 * Generic hot-plugging test via the device_add QMP commands. 1295 */ 1296 void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv, 1297 const QDict *arguments) 1298 { 1299 QDict *resp; 1300 QDict *args = arguments ? qdict_clone_shallow(arguments) : qdict_new(); 1301 1302 g_assert(!qdict_haskey(args, "driver")); 1303 qdict_put_str(args, "driver", drv); 1304 resp = qtest_qmp(qts, "{'execute': 'device_add', 'arguments': %p}", args); 1305 g_assert(resp); 1306 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */ 1307 g_assert(!qdict_haskey(resp, "error")); 1308 qobject_unref(resp); 1309 } 1310 1311 void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id, 1312 const char *fmt, ...) 1313 { 1314 QDict *args; 1315 va_list ap; 1316 1317 va_start(ap, fmt); 1318 args = qdict_from_vjsonf_nofail(fmt, ap); 1319 va_end(ap); 1320 1321 g_assert(!qdict_haskey(args, "id")); 1322 qdict_put_str(args, "id", id); 1323 1324 qtest_qmp_device_add_qdict(qts, driver, args); 1325 qobject_unref(args); 1326 } 1327 1328 #ifndef _WIN32 1329 void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd) 1330 { 1331 QDict *resp; 1332 1333 resp = qtest_qmp_fds(qts, &fd, 1, "{'execute': 'getfd'," 1334 "'arguments': {'fdname': 'fdname'}}"); 1335 g_assert(resp); 1336 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */ 1337 g_assert(!qdict_haskey(resp, "error")); 1338 qobject_unref(resp); 1339 1340 resp = qtest_qmp( 1341 qts, "{'execute': 'add_client'," 1342 "'arguments': {'protocol': %s, 'fdname': 'fdname'}}", protocol); 1343 g_assert(resp); 1344 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */ 1345 g_assert(!qdict_haskey(resp, "error")); 1346 qobject_unref(resp); 1347 } 1348 #endif 1349 1350 /* 1351 * Generic hot-unplugging test via the device_del QMP command. 1352 * Device deletion will get one response and one event. For example: 1353 * 1354 * {'execute': 'device_del','arguments': { 'id': 'scsi-hd'}} 1355 * 1356 * will get this one: 1357 * 1358 * {"timestamp": {"seconds": 1505289667, "microseconds": 569862}, 1359 * "event": "DEVICE_DELETED", "data": {"device": "scsi-hd", 1360 * "path": "/machine/peripheral/scsi-hd"}} 1361 * 1362 * and this one: 1363 * 1364 * {"return": {}} 1365 */ 1366 void qtest_qmp_device_del_send(QTestState *qts, const char *id) 1367 { 1368 QDict *rsp = qtest_qmp(qts, "{'execute': 'device_del', " 1369 "'arguments': {'id': %s}}", id); 1370 g_assert(rsp); 1371 g_assert(qdict_haskey(rsp, "return")); 1372 g_assert(!qdict_haskey(rsp, "error")); 1373 qobject_unref(rsp); 1374 } 1375 1376 void qtest_qmp_device_del(QTestState *qts, const char *id) 1377 { 1378 qtest_qmp_device_del_send(qts, id); 1379 qtest_qmp_eventwait(qts, "DEVICE_DELETED"); 1380 } 1381 1382 static void qtest_client_set_tx_handler(QTestState *s, 1383 QTestSendFn send) 1384 { 1385 s->ops.send = send; 1386 } 1387 static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv) 1388 { 1389 s->ops.recv_line = recv; 1390 } 1391 /* A type-safe wrapper for s->send() */ 1392 static void send_wrapper(QTestState *s, const char *buf) 1393 { 1394 s->ops.external_send(s, buf); 1395 } 1396 1397 static GString *qtest_client_inproc_recv_line(QTestState *s) 1398 { 1399 GString *line; 1400 size_t offset; 1401 char *eol; 1402 1403 eol = strchr(s->rx->str, '\n'); 1404 offset = eol - s->rx->str; 1405 line = g_string_new_len(s->rx->str, offset); 1406 g_string_erase(s->rx, 0, offset + 1); 1407 return line; 1408 } 1409 1410 QTestState *qtest_inproc_init(QTestState **s, bool log, const char* arch, 1411 void (*send)(void*, const char*)) 1412 { 1413 QTestState *qts; 1414 qts = g_new0(QTestState, 1); 1415 qts->pending_events = NULL; 1416 *s = qts; /* Expose qts early on, since the query endianness relies on it */ 1417 qts->wstatus = 0; 1418 for (int i = 0; i < MAX_IRQ; i++) { 1419 qts->irq_level[i] = false; 1420 } 1421 1422 qtest_client_set_rx_handler(qts, qtest_client_inproc_recv_line); 1423 1424 /* send() may not have a matching protoype, so use a type-safe wrapper */ 1425 qts->ops.external_send = send; 1426 qtest_client_set_tx_handler(qts, send_wrapper); 1427 1428 qts->big_endian = qtest_query_target_endianness(qts); 1429 1430 /* 1431 * Set a dummy path for QTEST_QEMU_BINARY. Doesn't need to exist, but this 1432 * way, qtest_get_arch works for inproc qtest. 1433 */ 1434 gchar *bin_path = g_strconcat("/qemu-system-", arch, NULL); 1435 g_setenv("QTEST_QEMU_BINARY", bin_path, 0); 1436 g_free(bin_path); 1437 1438 return qts; 1439 } 1440 1441 void qtest_client_inproc_recv(void *opaque, const char *str) 1442 { 1443 QTestState *qts = *(QTestState **)opaque; 1444 1445 if (!qts->rx) { 1446 qts->rx = g_string_new(NULL); 1447 } 1448 g_string_append(qts->rx, str); 1449 return; 1450 } 1451 1452 void qtest_qom_set_bool(QTestState *s, const char *path, const char *property, 1453 bool value) 1454 { 1455 QDict *r; 1456 1457 r = qtest_qmp(s, "{ 'execute': 'qom-set', 'arguments': " 1458 "{ 'path': %s, 'property': %s, 'value': %i } }", 1459 path, property, value); 1460 qobject_unref(r); 1461 } 1462 1463 bool qtest_qom_get_bool(QTestState *s, const char *path, const char *property) 1464 { 1465 QDict *r; 1466 bool b; 1467 1468 r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': " 1469 "{ 'path': %s, 'property': %s } }", path, property); 1470 b = qdict_get_bool(r, "return"); 1471 qobject_unref(r); 1472 1473 return b; 1474 } 1475