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 #ifndef _WIN32 20 #include <sys/socket.h> 21 #include <sys/wait.h> 22 #include <sys/un.h> 23 #endif /* _WIN32 */ 24 #ifdef __linux__ 25 #include <sys/prctl.h> 26 #endif /* __linux__ */ 27 #ifdef __FreeBSD__ 28 #include <sys/procctl.h> 29 #endif /* __FreeBSD__ */ 30 31 #include "libqtest.h" 32 #include "libqmp.h" 33 #include "qemu/ctype.h" 34 #include "qemu/cutils.h" 35 #include "qemu/sockets.h" 36 #include "qapi/qmp/qdict.h" 37 #include "qapi/qmp/qjson.h" 38 #include "qapi/qmp/qlist.h" 39 #include "qapi/qmp/qstring.h" 40 #include "qapi/qmp/qbool.h" 41 42 #define MAX_IRQ 256 43 44 #ifndef _WIN32 45 # define SOCKET_TIMEOUT 50 46 # define CMD_EXEC "exec " 47 # define DEV_STDERR "/dev/fd/2" 48 # define DEV_NULL "/dev/null" 49 #else 50 # define SOCKET_TIMEOUT 50000 51 # define CMD_EXEC "" 52 # define DEV_STDERR "2" 53 # define DEV_NULL "nul" 54 #endif 55 56 #define WAITPID_TIMEOUT 30 57 58 typedef void (*QTestSendFn)(QTestState *s, const char *buf); 59 typedef void (*ExternalSendFn)(void *s, const char *buf); 60 typedef GString* (*QTestRecvFn)(QTestState *); 61 62 typedef struct QTestClientTransportOps { 63 QTestSendFn send; /* for sending qtest commands */ 64 65 /* 66 * use external_send to send qtest command strings through functions which 67 * do not accept a QTestState as the first parameter. 68 */ 69 ExternalSendFn external_send; 70 71 QTestRecvFn recv_line; /* for receiving qtest command responses */ 72 } QTestTransportOps; 73 74 struct QTestState 75 { 76 int fd; 77 int qmp_fd; 78 pid_t qemu_pid; /* our child QEMU process */ 79 int wstatus; 80 #ifdef _WIN32 81 DWORD exit_code; 82 #endif 83 int expected_status; 84 bool big_endian; 85 bool irq_level[MAX_IRQ]; 86 GString *rx; 87 QTestTransportOps ops; 88 GList *pending_events; 89 QTestQMPEventCallback eventCB; 90 void *eventData; 91 }; 92 93 static GHookList abrt_hooks; 94 static void (*sighandler_old)(int); 95 static bool silence_spawn_log; 96 97 static int qtest_query_target_endianness(QTestState *s); 98 99 static void qtest_client_socket_send(QTestState*, const char *buf); 100 static void socket_send(int fd, const char *buf, size_t size); 101 102 static GString *qtest_client_socket_recv_line(QTestState *); 103 104 static void qtest_client_set_tx_handler(QTestState *s, QTestSendFn send); 105 static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv); 106 107 static int init_socket(const char *socket_path) 108 { 109 int sock = qtest_socket_server(socket_path); 110 qemu_set_cloexec(sock); 111 return sock; 112 } 113 114 static int socket_accept(int sock) 115 { 116 struct sockaddr_un addr; 117 socklen_t addrlen; 118 int ret; 119 /* 120 * timeout unit of blocking receive calls is different among platforms. 121 * It's in seconds on non-Windows platforms but milliseconds on Windows. 122 */ 123 #ifndef _WIN32 124 struct timeval timeout = { .tv_sec = SOCKET_TIMEOUT, 125 .tv_usec = 0 }; 126 #else 127 DWORD timeout = SOCKET_TIMEOUT; 128 #endif 129 130 if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, 131 (void *)&timeout, sizeof(timeout))) { 132 fprintf(stderr, "%s failed to set SO_RCVTIMEO: %s\n", 133 __func__, strerror(errno)); 134 close(sock); 135 return -1; 136 } 137 138 do { 139 addrlen = sizeof(addr); 140 ret = accept(sock, (struct sockaddr *)&addr, &addrlen); 141 } while (ret == -1 && errno == EINTR); 142 if (ret == -1) { 143 fprintf(stderr, "%s failed: %s\n", __func__, strerror(errno)); 144 } 145 close(sock); 146 147 return ret; 148 } 149 150 pid_t qtest_pid(QTestState *s) 151 { 152 return s->qemu_pid; 153 } 154 155 bool qtest_probe_child(QTestState *s) 156 { 157 pid_t pid = s->qemu_pid; 158 159 if (pid != -1) { 160 #ifndef _WIN32 161 pid = waitpid(pid, &s->wstatus, WNOHANG); 162 if (pid == 0) { 163 return true; 164 } 165 #else 166 GetExitCodeProcess((HANDLE)pid, &s->exit_code); 167 if (s->exit_code == STILL_ACTIVE) { 168 return true; 169 } 170 CloseHandle((HANDLE)pid); 171 #endif 172 s->qemu_pid = -1; 173 qtest_remove_abrt_handler(s); 174 } 175 return false; 176 } 177 178 void qtest_set_expected_status(QTestState *s, int status) 179 { 180 s->expected_status = status; 181 } 182 183 static void qtest_check_status(QTestState *s) 184 { 185 assert(s->qemu_pid == -1); 186 187 /* 188 * Check whether qemu exited with expected exit status; anything else is 189 * fishy and should be logged with as much detail as possible. 190 */ 191 #ifndef _WIN32 192 int wstatus = s->wstatus; 193 if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != s->expected_status) { 194 fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU " 195 "process but encountered exit status %d (expected %d)\n", 196 __FILE__, __LINE__, WEXITSTATUS(wstatus), s->expected_status); 197 abort(); 198 } else if (WIFSIGNALED(wstatus)) { 199 int sig = WTERMSIG(wstatus); 200 const char *signame = strsignal(sig) ?: "unknown ???"; 201 const char *dump = WCOREDUMP(wstatus) ? " (core dumped)" : ""; 202 203 fprintf(stderr, "%s:%d: kill_qemu() detected QEMU death " 204 "from signal %d (%s)%s\n", 205 __FILE__, __LINE__, sig, signame, dump); 206 abort(); 207 } 208 #else 209 if (s->exit_code != s->expected_status) { 210 fprintf(stderr, "%s:%d: kill_qemu() tried to terminate QEMU " 211 "process but encountered exit status %ld (expected %d)\n", 212 __FILE__, __LINE__, s->exit_code, s->expected_status); 213 abort(); 214 } 215 #endif 216 } 217 218 void qtest_wait_qemu(QTestState *s) 219 { 220 if (s->qemu_pid != -1) { 221 #ifndef _WIN32 222 pid_t pid; 223 uint64_t end; 224 225 /* poll for a while until sending SIGKILL */ 226 end = g_get_monotonic_time() + WAITPID_TIMEOUT * G_TIME_SPAN_SECOND; 227 228 do { 229 pid = waitpid(s->qemu_pid, &s->wstatus, WNOHANG); 230 if (pid != 0) { 231 break; 232 } 233 g_usleep(100 * 1000); 234 } while (g_get_monotonic_time() < end); 235 236 if (pid == 0) { 237 kill(s->qemu_pid, SIGKILL); 238 pid = RETRY_ON_EINTR(waitpid(s->qemu_pid, &s->wstatus, 0)); 239 } 240 241 assert(pid == s->qemu_pid); 242 #else 243 DWORD ret; 244 245 ret = WaitForSingleObject((HANDLE)s->qemu_pid, INFINITE); 246 assert(ret == WAIT_OBJECT_0); 247 GetExitCodeProcess((HANDLE)s->qemu_pid, &s->exit_code); 248 CloseHandle((HANDLE)s->qemu_pid); 249 #endif 250 251 s->qemu_pid = -1; 252 qtest_remove_abrt_handler(s); 253 } 254 qtest_check_status(s); 255 } 256 257 void qtest_kill_qemu(QTestState *s) 258 { 259 /* Skip wait if qtest_probe_child() already reaped */ 260 if (s->qemu_pid != -1) { 261 #ifndef _WIN32 262 kill(s->qemu_pid, SIGTERM); 263 #else 264 TerminateProcess((HANDLE)s->qemu_pid, s->expected_status); 265 #endif 266 qtest_wait_qemu(s); 267 return; 268 } 269 270 qtest_check_status(s); 271 } 272 273 static void kill_qemu_hook_func(void *s) 274 { 275 qtest_kill_qemu(s); 276 } 277 278 static void sigabrt_handler(int signo) 279 { 280 g_hook_list_invoke(&abrt_hooks, FALSE); 281 } 282 283 static void setup_sigabrt_handler(void) 284 { 285 sighandler_old = signal(SIGABRT, sigabrt_handler); 286 } 287 288 static void cleanup_sigabrt_handler(void) 289 { 290 signal(SIGABRT, sighandler_old); 291 } 292 293 static bool hook_list_is_empty(GHookList *hook_list) 294 { 295 GHook *hook = g_hook_first_valid(hook_list, TRUE); 296 297 if (!hook) { 298 return true; 299 } 300 301 g_hook_unref(hook_list, hook); 302 return false; 303 } 304 305 void qtest_add_abrt_handler(GHookFunc fn, const void *data) 306 { 307 GHook *hook; 308 309 if (!abrt_hooks.is_setup) { 310 g_hook_list_init(&abrt_hooks, sizeof(GHook)); 311 } 312 313 /* Only install SIGABRT handler once */ 314 if (hook_list_is_empty(&abrt_hooks)) { 315 setup_sigabrt_handler(); 316 } 317 318 hook = g_hook_alloc(&abrt_hooks); 319 hook->func = fn; 320 hook->data = (void *)data; 321 322 g_hook_prepend(&abrt_hooks, hook); 323 } 324 325 void qtest_remove_abrt_handler(void *data) 326 { 327 GHook *hook = g_hook_find_data(&abrt_hooks, TRUE, data); 328 329 if (!hook) { 330 return; 331 } 332 333 g_hook_destroy_link(&abrt_hooks, hook); 334 335 /* Uninstall SIGABRT handler on last instance */ 336 if (hook_list_is_empty(&abrt_hooks)) { 337 cleanup_sigabrt_handler(); 338 } 339 } 340 341 static const char *qtest_qemu_binary(const char *var) 342 { 343 const char *qemu_bin; 344 345 if (var) { 346 qemu_bin = getenv(var); 347 if (qemu_bin) { 348 return qemu_bin; 349 } 350 } 351 352 qemu_bin = getenv("QTEST_QEMU_BINARY"); 353 if (!qemu_bin) { 354 fprintf(stderr, "Environment variable QTEST_QEMU_BINARY required\n"); 355 exit(1); 356 } 357 358 return qemu_bin; 359 } 360 361 #ifdef _WIN32 362 static pid_t qtest_create_process(char *cmd) 363 { 364 STARTUPINFO si; 365 PROCESS_INFORMATION pi; 366 BOOL ret; 367 368 ZeroMemory(&si, sizeof(si)); 369 si.cb = sizeof(si); 370 ZeroMemory(&pi, sizeof(pi)); 371 372 ret = CreateProcess(NULL, /* module name */ 373 cmd, /* command line */ 374 NULL, /* process handle not inheritable */ 375 NULL, /* thread handle not inheritable */ 376 FALSE, /* set handle inheritance to FALSE */ 377 0, /* No creation flags */ 378 NULL, /* use parent's environment block */ 379 NULL, /* use parent's starting directory */ 380 &si, /* pointer to STARTUPINFO structure */ 381 &pi /* pointer to PROCESS_INFORMATION structure */ 382 ); 383 if (ret == 0) { 384 fprintf(stderr, "%s:%d: unable to create a new process (%s)\n", 385 __FILE__, __LINE__, strerror(GetLastError())); 386 abort(); 387 } 388 389 return (pid_t)pi.hProcess; 390 } 391 #endif /* _WIN32 */ 392 393 static QTestState *G_GNUC_PRINTF(2, 3) qtest_spawn_qemu(const char *qemu_bin, 394 const char *fmt, ...) 395 { 396 va_list ap; 397 QTestState *s = g_new0(QTestState, 1); 398 const char *trace = g_getenv("QTEST_TRACE"); 399 g_autofree char *tracearg = trace ? 400 g_strdup_printf("-trace %s ", trace) : g_strdup(""); 401 g_autoptr(GString) command = g_string_new(""); 402 403 va_start(ap, fmt); 404 g_string_append_printf(command, CMD_EXEC "%s %s", qemu_bin, tracearg); 405 g_string_append_vprintf(command, fmt, ap); 406 va_end(ap); 407 408 qtest_add_abrt_handler(kill_qemu_hook_func, s); 409 410 if (!silence_spawn_log) { 411 g_test_message("starting QEMU: %s", command->str); 412 } 413 414 #ifndef _WIN32 415 s->qemu_pid = fork(); 416 if (s->qemu_pid == 0) { 417 #ifdef __linux__ 418 /* 419 * Although we register a ABRT handler to kill off QEMU 420 * when g_assert() triggers, we want an extra safety 421 * net. The QEMU process might be non-functional and 422 * thus not have responded to SIGTERM. The test script 423 * might also have crashed with SEGV, in which case the 424 * cleanup handlers won't ever run. 425 * 426 * This PR_SET_PDEATHSIG setup will ensure any remaining 427 * QEMU will get terminated with SIGKILL in these cases. 428 */ 429 prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0); 430 #endif /* __linux__ */ 431 #ifdef __FreeBSD__ 432 int sig = SIGKILL; 433 procctl(P_PID, getpid(), PROC_PDEATHSIG_CTL, &sig); 434 #endif /* __FreeBSD__ */ 435 execlp("/bin/sh", "sh", "-c", command->str, NULL); 436 exit(1); 437 } 438 #else 439 s->qemu_pid = qtest_create_process(command->str); 440 #endif /* _WIN32 */ 441 442 return s; 443 } 444 445 static QTestState *qtest_init_internal(const char *qemu_bin, 446 const char *extra_args) 447 { 448 QTestState *s; 449 int sock, qmpsock, i; 450 gchar *socket_path; 451 gchar *qmp_socket_path; 452 453 socket_path = g_strdup_printf("%s/qtest-%d.sock", 454 g_get_tmp_dir(), getpid()); 455 qmp_socket_path = g_strdup_printf("%s/qtest-%d.qmp", 456 g_get_tmp_dir(), getpid()); 457 458 /* 459 * It's possible that if an earlier test run crashed it might 460 * have left a stale unix socket lying around. Delete any 461 * stale old socket to avoid spurious test failures with 462 * tests/libqtest.c:70:init_socket: assertion failed (ret != -1): (-1 != -1) 463 */ 464 unlink(socket_path); 465 unlink(qmp_socket_path); 466 467 socket_init(); 468 sock = init_socket(socket_path); 469 qmpsock = init_socket(qmp_socket_path); 470 471 s = qtest_spawn_qemu(qemu_bin, 472 "-qtest unix:%s " 473 "-qtest-log %s " 474 "-chardev socket,path=%s,id=char0 " 475 "-mon chardev=char0,mode=control " 476 "-display none " 477 "-audio none " 478 "%s" 479 " -accel qtest", 480 socket_path, 481 getenv("QTEST_LOG") ? DEV_STDERR : DEV_NULL, 482 qmp_socket_path, 483 extra_args ?: ""); 484 485 qtest_client_set_rx_handler(s, qtest_client_socket_recv_line); 486 qtest_client_set_tx_handler(s, qtest_client_socket_send); 487 488 s->fd = socket_accept(sock); 489 if (s->fd >= 0) { 490 s->qmp_fd = socket_accept(qmpsock); 491 } 492 unlink(socket_path); 493 unlink(qmp_socket_path); 494 g_free(socket_path); 495 g_free(qmp_socket_path); 496 497 g_assert(s->fd >= 0 && s->qmp_fd >= 0); 498 499 s->rx = g_string_new(""); 500 for (i = 0; i < MAX_IRQ; i++) { 501 s->irq_level[i] = false; 502 } 503 504 /* 505 * Stopping QEMU for debugging is not supported on Windows. 506 * 507 * Using DebugActiveProcess() API can suspend the QEMU process, 508 * but gdb cannot attach to the process. Using the undocumented 509 * NtSuspendProcess() can suspend the QEMU process and gdb can 510 * attach to the process, but gdb cannot resume it. 511 */ 512 #ifndef _WIN32 513 if (getenv("QTEST_STOP")) { 514 kill(s->qemu_pid, SIGSTOP); 515 } 516 #endif 517 return s; 518 } 519 520 QTestState *qtest_init_without_qmp_handshake(const char *extra_args) 521 { 522 return qtest_init_internal(qtest_qemu_binary(NULL), extra_args); 523 } 524 525 QTestState *qtest_init_with_env_no_handshake(const char *var, 526 const char *extra_args) 527 { 528 return qtest_init_internal(qtest_qemu_binary(var), extra_args); 529 } 530 531 QTestState *qtest_init_with_env(const char *var, const char *extra_args) 532 { 533 QTestState *s = qtest_init_internal(qtest_qemu_binary(var), extra_args); 534 QDict *greeting; 535 536 /* ask endianness of the target */ 537 538 s->big_endian = qtest_query_target_endianness(s); 539 540 /* Read the QMP greeting and then do the handshake */ 541 greeting = qtest_qmp_receive(s); 542 qobject_unref(greeting); 543 qobject_unref(qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }")); 544 545 return s; 546 } 547 548 QTestState *qtest_init(const char *extra_args) 549 { 550 return qtest_init_with_env(NULL, extra_args); 551 } 552 553 QTestState *qtest_vinitf(const char *fmt, va_list ap) 554 { 555 char *args = g_strdup_vprintf(fmt, ap); 556 QTestState *s; 557 558 s = qtest_init(args); 559 g_free(args); 560 return s; 561 } 562 563 QTestState *qtest_initf(const char *fmt, ...) 564 { 565 va_list ap; 566 QTestState *s; 567 568 va_start(ap, fmt); 569 s = qtest_vinitf(fmt, ap); 570 va_end(ap); 571 return s; 572 } 573 574 QTestState *qtest_init_with_serial(const char *extra_args, int *sock_fd) 575 { 576 int sock_fd_init; 577 g_autofree char *sock_dir = NULL; 578 char *sock_path; 579 QTestState *qts; 580 581 sock_dir = g_dir_make_tmp("qtest-serial-XXXXXX", NULL); 582 g_assert_true(sock_dir != NULL); 583 sock_path = g_strdup_printf("%s/sock", sock_dir); 584 585 socket_init(); 586 sock_fd_init = init_socket(sock_path); 587 588 qts = qtest_initf("-chardev socket,id=s0,path=%s -serial chardev:s0 %s", 589 sock_path, extra_args); 590 591 *sock_fd = socket_accept(sock_fd_init); 592 593 unlink(sock_path); 594 g_free(sock_path); 595 rmdir(sock_dir); 596 597 g_assert_true(*sock_fd >= 0); 598 599 return qts; 600 } 601 602 void qtest_quit(QTestState *s) 603 { 604 qtest_remove_abrt_handler(s); 605 606 qtest_kill_qemu(s); 607 close(s->fd); 608 close(s->qmp_fd); 609 g_string_free(s->rx, true); 610 611 for (GList *it = s->pending_events; it != NULL; it = it->next) { 612 qobject_unref((QDict *)it->data); 613 } 614 615 g_list_free(s->pending_events); 616 617 g_free(s); 618 } 619 620 static void socket_send(int fd, const char *buf, size_t size) 621 { 622 ssize_t res = qemu_send_full(fd, buf, size); 623 624 assert(res == size); 625 } 626 627 static void qtest_client_socket_send(QTestState *s, const char *buf) 628 { 629 socket_send(s->fd, buf, strlen(buf)); 630 } 631 632 static void G_GNUC_PRINTF(2, 3) qtest_sendf(QTestState *s, const char *fmt, ...) 633 { 634 va_list ap; 635 636 va_start(ap, fmt); 637 gchar *str = g_strdup_vprintf(fmt, ap); 638 va_end(ap); 639 640 s->ops.send(s, str); 641 g_free(str); 642 } 643 644 static GString *qtest_client_socket_recv_line(QTestState *s) 645 { 646 GString *line; 647 size_t offset; 648 char *eol; 649 650 while ((eol = strchr(s->rx->str, '\n')) == NULL) { 651 ssize_t len; 652 char buffer[1024]; 653 654 len = recv(s->fd, buffer, sizeof(buffer), 0); 655 if (len == -1 && errno == EINTR) { 656 continue; 657 } 658 659 if (len == -1 || len == 0) { 660 fprintf(stderr, "Broken pipe\n"); 661 abort(); 662 } 663 664 g_string_append_len(s->rx, buffer, len); 665 } 666 667 offset = eol - s->rx->str; 668 line = g_string_new_len(s->rx->str, offset); 669 g_string_erase(s->rx, 0, offset + 1); 670 671 return line; 672 } 673 674 static gchar **qtest_rsp_args(QTestState *s, int expected_args) 675 { 676 GString *line; 677 gchar **words; 678 int i; 679 680 redo: 681 line = s->ops.recv_line(s); 682 words = g_strsplit(line->str, " ", 0); 683 g_string_free(line, TRUE); 684 685 if (strcmp(words[0], "IRQ") == 0) { 686 long irq; 687 int ret; 688 689 g_assert(words[1] != NULL); 690 g_assert(words[2] != NULL); 691 692 ret = qemu_strtol(words[2], NULL, 0, &irq); 693 g_assert(!ret); 694 g_assert_cmpint(irq, >=, 0); 695 g_assert_cmpint(irq, <, MAX_IRQ); 696 697 if (strcmp(words[1], "raise") == 0) { 698 s->irq_level[irq] = true; 699 } else { 700 s->irq_level[irq] = false; 701 } 702 703 g_strfreev(words); 704 goto redo; 705 } 706 707 g_assert(words[0] != NULL); 708 g_assert_cmpstr(words[0], ==, "OK"); 709 710 for (i = 0; i < expected_args; i++) { 711 g_assert(words[i] != NULL); 712 } 713 714 return words; 715 } 716 717 static void qtest_rsp(QTestState *s) 718 { 719 gchar **words = qtest_rsp_args(s, 0); 720 721 g_strfreev(words); 722 } 723 724 static int qtest_query_target_endianness(QTestState *s) 725 { 726 gchar **args; 727 int big_endian; 728 729 qtest_sendf(s, "endianness\n"); 730 args = qtest_rsp_args(s, 1); 731 g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0); 732 big_endian = strcmp(args[1], "big") == 0; 733 g_strfreev(args); 734 735 return big_endian; 736 } 737 738 QDict *qtest_qmp_receive(QTestState *s) 739 { 740 while (true) { 741 QDict *response = qtest_qmp_receive_dict(s); 742 743 if (!qdict_get_try_str(response, "event")) { 744 return response; 745 } 746 747 if (!s->eventCB || 748 !s->eventCB(s, qdict_get_str(response, "event"), 749 response, s->eventData)) { 750 /* Stash the event for a later consumption */ 751 s->pending_events = g_list_append(s->pending_events, response); 752 } else { 753 qobject_unref(response); 754 } 755 } 756 } 757 758 QDict *qtest_qmp_receive_dict(QTestState *s) 759 { 760 return qmp_fd_receive(s->qmp_fd); 761 } 762 763 int qtest_socket_server(const char *socket_path) 764 { 765 struct sockaddr_un addr; 766 int sock; 767 int ret; 768 769 sock = socket(PF_UNIX, SOCK_STREAM, 0); 770 g_assert_cmpint(sock, !=, -1); 771 772 addr.sun_family = AF_UNIX; 773 snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socket_path); 774 775 ret = RETRY_ON_EINTR(bind(sock, (struct sockaddr *)&addr, sizeof(addr))); 776 g_assert_cmpint(ret, !=, -1); 777 ret = listen(sock, 1); 778 g_assert_cmpint(ret, !=, -1); 779 780 return sock; 781 } 782 783 #ifndef _WIN32 784 void qtest_qmp_vsend_fds(QTestState *s, int *fds, size_t fds_num, 785 const char *fmt, va_list ap) 786 { 787 qmp_fd_vsend_fds(s->qmp_fd, fds, fds_num, fmt, ap); 788 } 789 #endif 790 791 void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap) 792 { 793 qmp_fd_vsend(s->qmp_fd, fmt, ap); 794 } 795 796 #ifndef _WIN32 797 QDict *qtest_vqmp_fds(QTestState *s, int *fds, size_t fds_num, 798 const char *fmt, va_list ap) 799 { 800 qtest_qmp_vsend_fds(s, fds, fds_num, fmt, ap); 801 802 /* Receive reply */ 803 return qtest_qmp_receive(s); 804 } 805 #endif 806 807 QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap) 808 { 809 qtest_qmp_vsend(s, fmt, ap); 810 811 /* Receive reply */ 812 return qtest_qmp_receive(s); 813 } 814 815 #ifndef _WIN32 816 QDict *qtest_qmp_fds(QTestState *s, int *fds, size_t fds_num, 817 const char *fmt, ...) 818 { 819 va_list ap; 820 QDict *response; 821 822 va_start(ap, fmt); 823 response = qtest_vqmp_fds(s, fds, fds_num, fmt, ap); 824 va_end(ap); 825 return response; 826 } 827 #endif 828 829 QDict *qtest_qmp(QTestState *s, const char *fmt, ...) 830 { 831 va_list ap; 832 QDict *response; 833 834 va_start(ap, fmt); 835 response = qtest_vqmp(s, fmt, ap); 836 va_end(ap); 837 return response; 838 } 839 840 void qtest_qmp_send(QTestState *s, const char *fmt, ...) 841 { 842 va_list ap; 843 844 va_start(ap, fmt); 845 qtest_qmp_vsend(s, fmt, ap); 846 va_end(ap); 847 } 848 849 void qtest_qmp_send_raw(QTestState *s, const char *fmt, ...) 850 { 851 va_list ap; 852 853 va_start(ap, fmt); 854 qmp_fd_vsend_raw(s->qmp_fd, fmt, ap); 855 va_end(ap); 856 } 857 858 void qtest_qmp_set_event_callback(QTestState *s, 859 QTestQMPEventCallback cb, void *opaque) 860 { 861 s->eventCB = cb; 862 s->eventData = opaque; 863 } 864 865 QDict *qtest_qmp_event_ref(QTestState *s, const char *event) 866 { 867 while (s->pending_events) { 868 869 GList *first = s->pending_events; 870 QDict *response = (QDict *)first->data; 871 872 s->pending_events = g_list_delete_link(s->pending_events, first); 873 874 if (!strcmp(qdict_get_str(response, "event"), event)) { 875 return response; 876 } 877 qobject_unref(response); 878 } 879 return NULL; 880 } 881 882 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event) 883 { 884 QDict *response = qtest_qmp_event_ref(s, event); 885 886 if (response) { 887 return response; 888 } 889 890 for (;;) { 891 response = qtest_qmp_receive_dict(s); 892 if ((qdict_haskey(response, "event")) && 893 (strcmp(qdict_get_str(response, "event"), event) == 0)) { 894 return response; 895 } 896 qobject_unref(response); 897 } 898 } 899 900 void qtest_qmp_eventwait(QTestState *s, const char *event) 901 { 902 QDict *response; 903 904 response = qtest_qmp_eventwait_ref(s, event); 905 qobject_unref(response); 906 } 907 908 char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap) 909 { 910 char *cmd; 911 QDict *resp; 912 char *ret; 913 914 cmd = g_strdup_vprintf(fmt, ap); 915 resp = qtest_qmp(s, "{'execute': 'human-monitor-command'," 916 " 'arguments': {'command-line': %s}}", 917 cmd); 918 ret = g_strdup(qdict_get_try_str(resp, "return")); 919 g_assert(ret); 920 qobject_unref(resp); 921 g_free(cmd); 922 return ret; 923 } 924 925 char *qtest_hmp(QTestState *s, const char *fmt, ...) 926 { 927 va_list ap; 928 char *ret; 929 930 va_start(ap, fmt); 931 ret = qtest_vhmp(s, fmt, ap); 932 va_end(ap); 933 return ret; 934 } 935 936 const char *qtest_get_arch(void) 937 { 938 const char *qemu = qtest_qemu_binary(NULL); 939 const char *end = strrchr(qemu, '-'); 940 941 if (!end) { 942 fprintf(stderr, "Can't determine architecture from binary name.\n"); 943 exit(1); 944 } 945 946 if (!strstr(qemu, "-system-")) { 947 fprintf(stderr, "QTEST_QEMU_BINARY must end with *-system-<arch> " 948 "where 'arch' is the target\narchitecture (x86_64, aarch64, " 949 "etc).\n"); 950 exit(1); 951 } 952 953 return end + 1; 954 } 955 956 bool qtest_has_accel(const char *accel_name) 957 { 958 if (g_str_equal(accel_name, "tcg")) { 959 #if defined(CONFIG_TCG) 960 return true; 961 #else 962 return false; 963 #endif 964 } else if (g_str_equal(accel_name, "kvm")) { 965 int i; 966 const char *arch = qtest_get_arch(); 967 const char *targets[] = { CONFIG_KVM_TARGETS }; 968 969 for (i = 0; i < ARRAY_SIZE(targets); i++) { 970 if (!strncmp(targets[i], arch, strlen(arch))) { 971 if (!access("/dev/kvm", R_OK | W_OK)) { 972 return true; 973 } 974 } 975 } 976 } else { 977 /* not implemented */ 978 g_assert_not_reached(); 979 } 980 return false; 981 } 982 983 bool qtest_get_irq(QTestState *s, int num) 984 { 985 /* dummy operation in order to make sure irq is up to date */ 986 qtest_inb(s, 0); 987 988 return s->irq_level[num]; 989 } 990 991 void qtest_module_load(QTestState *s, const char *prefix, const char *libname) 992 { 993 qtest_sendf(s, "module_load %s %s\n", prefix, libname); 994 qtest_rsp(s); 995 } 996 997 static int64_t qtest_clock_rsp(QTestState *s) 998 { 999 gchar **words; 1000 int64_t clock; 1001 words = qtest_rsp_args(s, 2); 1002 clock = g_ascii_strtoll(words[1], NULL, 0); 1003 g_strfreev(words); 1004 return clock; 1005 } 1006 1007 int64_t qtest_clock_step_next(QTestState *s) 1008 { 1009 qtest_sendf(s, "clock_step\n"); 1010 return qtest_clock_rsp(s); 1011 } 1012 1013 int64_t qtest_clock_step(QTestState *s, int64_t step) 1014 { 1015 qtest_sendf(s, "clock_step %"PRIi64"\n", step); 1016 return qtest_clock_rsp(s); 1017 } 1018 1019 int64_t qtest_clock_set(QTestState *s, int64_t val) 1020 { 1021 qtest_sendf(s, "clock_set %"PRIi64"\n", val); 1022 return qtest_clock_rsp(s); 1023 } 1024 1025 void qtest_irq_intercept_out(QTestState *s, const char *qom_path) 1026 { 1027 qtest_sendf(s, "irq_intercept_out %s\n", qom_path); 1028 qtest_rsp(s); 1029 } 1030 1031 void qtest_irq_intercept_out_named(QTestState *s, const char *qom_path, const char *name) 1032 { 1033 qtest_sendf(s, "irq_intercept_out %s %s\n", qom_path, name); 1034 qtest_rsp(s); 1035 } 1036 1037 void qtest_irq_intercept_in(QTestState *s, const char *qom_path) 1038 { 1039 qtest_sendf(s, "irq_intercept_in %s\n", qom_path); 1040 qtest_rsp(s); 1041 } 1042 1043 void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name, 1044 int num, int level) 1045 { 1046 if (!name) { 1047 name = "unnamed-gpio-in"; 1048 } 1049 qtest_sendf(s, "set_irq_in %s %s %d %d\n", qom_path, name, num, level); 1050 qtest_rsp(s); 1051 } 1052 1053 static void qtest_out(QTestState *s, const char *cmd, uint16_t addr, uint32_t value) 1054 { 1055 qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value); 1056 qtest_rsp(s); 1057 } 1058 1059 void qtest_outb(QTestState *s, uint16_t addr, uint8_t value) 1060 { 1061 qtest_out(s, "outb", addr, value); 1062 } 1063 1064 void qtest_outw(QTestState *s, uint16_t addr, uint16_t value) 1065 { 1066 qtest_out(s, "outw", addr, value); 1067 } 1068 1069 void qtest_outl(QTestState *s, uint16_t addr, uint32_t value) 1070 { 1071 qtest_out(s, "outl", addr, value); 1072 } 1073 1074 static uint32_t qtest_in(QTestState *s, const char *cmd, uint16_t addr) 1075 { 1076 gchar **args; 1077 int ret; 1078 unsigned long value; 1079 1080 qtest_sendf(s, "%s 0x%x\n", cmd, addr); 1081 args = qtest_rsp_args(s, 2); 1082 ret = qemu_strtoul(args[1], NULL, 0, &value); 1083 g_assert(!ret && value <= UINT32_MAX); 1084 g_strfreev(args); 1085 1086 return value; 1087 } 1088 1089 uint8_t qtest_inb(QTestState *s, uint16_t addr) 1090 { 1091 return qtest_in(s, "inb", addr); 1092 } 1093 1094 uint16_t qtest_inw(QTestState *s, uint16_t addr) 1095 { 1096 return qtest_in(s, "inw", addr); 1097 } 1098 1099 uint32_t qtest_inl(QTestState *s, uint16_t addr) 1100 { 1101 return qtest_in(s, "inl", addr); 1102 } 1103 1104 static void qtest_write(QTestState *s, const char *cmd, uint64_t addr, 1105 uint64_t value) 1106 { 1107 qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value); 1108 qtest_rsp(s); 1109 } 1110 1111 void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value) 1112 { 1113 qtest_write(s, "writeb", addr, value); 1114 } 1115 1116 void qtest_writew(QTestState *s, uint64_t addr, uint16_t value) 1117 { 1118 qtest_write(s, "writew", addr, value); 1119 } 1120 1121 void qtest_writel(QTestState *s, uint64_t addr, uint32_t value) 1122 { 1123 qtest_write(s, "writel", addr, value); 1124 } 1125 1126 void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value) 1127 { 1128 qtest_write(s, "writeq", addr, value); 1129 } 1130 1131 static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr) 1132 { 1133 gchar **args; 1134 int ret; 1135 uint64_t value; 1136 1137 qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr); 1138 args = qtest_rsp_args(s, 2); 1139 ret = qemu_strtou64(args[1], NULL, 0, &value); 1140 g_assert(!ret); 1141 g_strfreev(args); 1142 1143 return value; 1144 } 1145 1146 uint8_t qtest_readb(QTestState *s, uint64_t addr) 1147 { 1148 return qtest_read(s, "readb", addr); 1149 } 1150 1151 uint16_t qtest_readw(QTestState *s, uint64_t addr) 1152 { 1153 return qtest_read(s, "readw", addr); 1154 } 1155 1156 uint32_t qtest_readl(QTestState *s, uint64_t addr) 1157 { 1158 return qtest_read(s, "readl", addr); 1159 } 1160 1161 uint64_t qtest_readq(QTestState *s, uint64_t addr) 1162 { 1163 return qtest_read(s, "readq", addr); 1164 } 1165 1166 static int hex2nib(char ch) 1167 { 1168 if (ch >= '0' && ch <= '9') { 1169 return ch - '0'; 1170 } else if (ch >= 'a' && ch <= 'f') { 1171 return 10 + (ch - 'a'); 1172 } else if (ch >= 'A' && ch <= 'F') { 1173 return 10 + (ch - 'a'); 1174 } else { 1175 return -1; 1176 } 1177 } 1178 1179 void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size) 1180 { 1181 uint8_t *ptr = data; 1182 gchar **args; 1183 size_t i; 1184 1185 if (!size) { 1186 return; 1187 } 1188 1189 qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size); 1190 args = qtest_rsp_args(s, 2); 1191 1192 for (i = 0; i < size; i++) { 1193 ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4; 1194 ptr[i] |= hex2nib(args[1][2 + (i * 2) + 1]); 1195 } 1196 1197 g_strfreev(args); 1198 } 1199 1200 uint64_t qtest_rtas_call(QTestState *s, const char *name, 1201 uint32_t nargs, uint64_t args, 1202 uint32_t nret, uint64_t ret) 1203 { 1204 qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n", 1205 name, nargs, args, nret, ret); 1206 qtest_rsp(s); 1207 return 0; 1208 } 1209 1210 void qtest_add_func(const char *str, void (*fn)(void)) 1211 { 1212 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str); 1213 g_test_add_func(path, fn); 1214 g_free(path); 1215 } 1216 1217 void qtest_add_data_func_full(const char *str, void *data, 1218 void (*fn)(const void *), 1219 GDestroyNotify data_free_func) 1220 { 1221 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str); 1222 g_test_add_data_func_full(path, data, fn, data_free_func); 1223 g_free(path); 1224 } 1225 1226 void qtest_add_data_func(const char *str, const void *data, 1227 void (*fn)(const void *)) 1228 { 1229 gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str); 1230 g_test_add_data_func(path, data, fn); 1231 g_free(path); 1232 } 1233 1234 void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size) 1235 { 1236 gchar *bdata; 1237 1238 bdata = g_base64_encode(data, size); 1239 qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size); 1240 s->ops.send(s, bdata); 1241 s->ops.send(s, "\n"); 1242 qtest_rsp(s); 1243 g_free(bdata); 1244 } 1245 1246 void qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size) 1247 { 1248 gchar **args; 1249 size_t len; 1250 1251 qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size); 1252 args = qtest_rsp_args(s, 2); 1253 1254 g_base64_decode_inplace(args[1], &len); 1255 if (size != len) { 1256 fprintf(stderr, "bufread: asked for %zu bytes but decoded %zu\n", 1257 size, len); 1258 len = MIN(len, size); 1259 } 1260 1261 memcpy(data, args[1], len); 1262 g_strfreev(args); 1263 } 1264 1265 void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size) 1266 { 1267 const uint8_t *ptr = data; 1268 size_t i; 1269 char *enc; 1270 1271 if (!size) { 1272 return; 1273 } 1274 1275 enc = g_malloc(2 * size + 1); 1276 1277 for (i = 0; i < size; i++) { 1278 sprintf(&enc[i * 2], "%02x", ptr[i]); 1279 } 1280 1281 qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc); 1282 qtest_rsp(s); 1283 g_free(enc); 1284 } 1285 1286 void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size) 1287 { 1288 qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size, pattern); 1289 qtest_rsp(s); 1290 } 1291 1292 QDict *qtest_vqmp_assert_failure_ref(QTestState *qts, 1293 const char *fmt, va_list args) 1294 { 1295 QDict *response; 1296 QDict *ret; 1297 1298 response = qtest_vqmp(qts, fmt, args); 1299 1300 g_assert(response); 1301 if (!qdict_haskey(response, "error")) { 1302 g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true); 1303 g_test_message("%s", s->str); 1304 } 1305 g_assert(qdict_haskey(response, "error")); 1306 g_assert(!qdict_haskey(response, "return")); 1307 ret = qdict_get_qdict(response, "error"); 1308 qobject_ref(ret); 1309 qobject_unref(response); 1310 1311 return ret; 1312 } 1313 1314 QDict *qtest_vqmp_assert_success_ref(QTestState *qts, 1315 const char *fmt, va_list args) 1316 { 1317 QDict *response; 1318 QDict *ret; 1319 1320 response = qtest_vqmp(qts, fmt, args); 1321 1322 g_assert(response); 1323 if (!qdict_haskey(response, "return")) { 1324 g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true); 1325 g_test_message("%s", s->str); 1326 } 1327 g_assert(qdict_haskey(response, "return")); 1328 ret = qdict_get_qdict(response, "return"); 1329 qobject_ref(ret); 1330 qobject_unref(response); 1331 1332 return ret; 1333 } 1334 1335 void qtest_vqmp_assert_success(QTestState *qts, 1336 const char *fmt, va_list args) 1337 { 1338 QDict *response; 1339 1340 response = qtest_vqmp_assert_success_ref(qts, fmt, args); 1341 1342 qobject_unref(response); 1343 } 1344 1345 #ifndef _WIN32 1346 QDict *qtest_vqmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds, 1347 const char *fmt, va_list args) 1348 { 1349 QDict *response; 1350 QDict *ret; 1351 1352 response = qtest_vqmp_fds(qts, fds, nfds, fmt, args); 1353 1354 g_assert(response); 1355 if (!qdict_haskey(response, "return")) { 1356 g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(response), true); 1357 g_test_message("%s", s->str); 1358 } 1359 g_assert(qdict_haskey(response, "return")); 1360 ret = qdict_get_qdict(response, "return"); 1361 qobject_ref(ret); 1362 qobject_unref(response); 1363 1364 return ret; 1365 } 1366 1367 void qtest_vqmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds, 1368 const char *fmt, va_list args) 1369 { 1370 QDict *response; 1371 response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, args); 1372 qobject_unref(response); 1373 } 1374 #endif /* !_WIN32 */ 1375 1376 QDict *qtest_qmp_assert_failure_ref(QTestState *qts, const char *fmt, ...) 1377 { 1378 QDict *response; 1379 va_list ap; 1380 1381 va_start(ap, fmt); 1382 response = qtest_vqmp_assert_failure_ref(qts, fmt, ap); 1383 va_end(ap); 1384 return response; 1385 } 1386 1387 QDict *qtest_qmp_assert_success_ref(QTestState *qts, const char *fmt, ...) 1388 { 1389 QDict *response; 1390 va_list ap; 1391 va_start(ap, fmt); 1392 response = qtest_vqmp_assert_success_ref(qts, fmt, ap); 1393 va_end(ap); 1394 return response; 1395 } 1396 1397 void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...) 1398 { 1399 va_list ap; 1400 va_start(ap, fmt); 1401 qtest_vqmp_assert_success(qts, fmt, ap); 1402 va_end(ap); 1403 } 1404 1405 #ifndef _WIN32 1406 QDict *qtest_qmp_fds_assert_success_ref(QTestState *qts, int *fds, size_t nfds, 1407 const char *fmt, ...) 1408 { 1409 QDict *response; 1410 va_list ap; 1411 va_start(ap, fmt); 1412 response = qtest_vqmp_fds_assert_success_ref(qts, fds, nfds, fmt, ap); 1413 va_end(ap); 1414 return response; 1415 } 1416 1417 void qtest_qmp_fds_assert_success(QTestState *qts, int *fds, size_t nfds, 1418 const char *fmt, ...) 1419 { 1420 va_list ap; 1421 va_start(ap, fmt); 1422 qtest_vqmp_fds_assert_success(qts, fds, nfds, fmt, ap); 1423 va_end(ap); 1424 } 1425 #endif /* !_WIN32 */ 1426 1427 bool qtest_big_endian(QTestState *s) 1428 { 1429 return s->big_endian; 1430 } 1431 1432 static bool qtest_check_machine_version(const char *mname, const char *basename, 1433 int major, int minor) 1434 { 1435 char *newname; 1436 bool is_equal; 1437 1438 newname = g_strdup_printf("%s-%i.%i", basename, major, minor); 1439 is_equal = g_str_equal(mname, newname); 1440 g_free(newname); 1441 1442 return is_equal; 1443 } 1444 1445 static bool qtest_is_old_versioned_machine(const char *mname) 1446 { 1447 const char *dash = strrchr(mname, '-'); 1448 const char *dot = strrchr(mname, '.'); 1449 const char *chr; 1450 char *bname; 1451 const int major = QEMU_VERSION_MAJOR; 1452 const int minor = QEMU_VERSION_MINOR; 1453 bool res = false; 1454 1455 if (dash && dot && dot > dash) { 1456 for (chr = dash + 1; *chr; chr++) { 1457 if (!qemu_isdigit(*chr) && *chr != '.') { 1458 return false; 1459 } 1460 } 1461 /* 1462 * Now check if it is one of the latest versions. Check major + 1 1463 * and minor + 1 versions as well, since they might already exist 1464 * in the development branch. 1465 */ 1466 bname = g_strdup(mname); 1467 bname[dash - mname] = 0; 1468 res = !qtest_check_machine_version(mname, bname, major + 1, 0) && 1469 !qtest_check_machine_version(mname, bname, major, minor + 1) && 1470 !qtest_check_machine_version(mname, bname, major, minor); 1471 g_free(bname); 1472 } 1473 1474 return res; 1475 } 1476 1477 struct MachInfo { 1478 char *name; 1479 char *alias; 1480 }; 1481 1482 struct CpuModel { 1483 char *name; 1484 char *alias_of; 1485 bool deprecated; 1486 }; 1487 1488 static void qtest_free_machine_list(struct MachInfo *machines) 1489 { 1490 if (machines) { 1491 for (int i = 0; machines[i].name != NULL; i++) { 1492 g_free(machines[i].name); 1493 g_free(machines[i].alias); 1494 } 1495 1496 g_free(machines); 1497 } 1498 } 1499 1500 /* 1501 * Returns an array with pointers to the available machine names. 1502 * The terminating entry has the name set to NULL. 1503 */ 1504 static struct MachInfo *qtest_get_machines(const char *var) 1505 { 1506 static struct MachInfo *machines; 1507 static char *qemu_var; 1508 QDict *response, *minfo; 1509 QList *list; 1510 const QListEntry *p; 1511 QObject *qobj; 1512 QString *qstr; 1513 QTestState *qts; 1514 int idx; 1515 1516 if (g_strcmp0(qemu_var, var)) { 1517 g_free(qemu_var); 1518 qemu_var = g_strdup(var); 1519 1520 /* new qemu, clear the cache */ 1521 qtest_free_machine_list(machines); 1522 machines = NULL; 1523 } 1524 1525 if (machines) { 1526 return machines; 1527 } 1528 1529 silence_spawn_log = !g_test_verbose(); 1530 1531 qts = qtest_init_with_env(qemu_var, "-machine none"); 1532 response = qtest_qmp(qts, "{ 'execute': 'query-machines' }"); 1533 g_assert(response); 1534 list = qdict_get_qlist(response, "return"); 1535 g_assert(list); 1536 1537 machines = g_new(struct MachInfo, qlist_size(list) + 1); 1538 1539 for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) { 1540 minfo = qobject_to(QDict, qlist_entry_obj(p)); 1541 g_assert(minfo); 1542 1543 qobj = qdict_get(minfo, "name"); 1544 g_assert(qobj); 1545 qstr = qobject_to(QString, qobj); 1546 g_assert(qstr); 1547 machines[idx].name = g_strdup(qstring_get_str(qstr)); 1548 1549 qobj = qdict_get(minfo, "alias"); 1550 if (qobj) { /* The alias is optional */ 1551 qstr = qobject_to(QString, qobj); 1552 g_assert(qstr); 1553 machines[idx].alias = g_strdup(qstring_get_str(qstr)); 1554 } else { 1555 machines[idx].alias = NULL; 1556 } 1557 } 1558 1559 qtest_quit(qts); 1560 qobject_unref(response); 1561 1562 silence_spawn_log = false; 1563 1564 memset(&machines[idx], 0, sizeof(struct MachInfo)); /* Terminating entry */ 1565 return machines; 1566 } 1567 1568 static struct CpuModel *qtest_get_cpu_models(void) 1569 { 1570 static struct CpuModel *cpus; 1571 QDict *response, *minfo; 1572 QList *list; 1573 const QListEntry *p; 1574 QObject *qobj; 1575 QString *qstr; 1576 QBool *qbool; 1577 QTestState *qts; 1578 int idx; 1579 1580 if (cpus) { 1581 return cpus; 1582 } 1583 1584 silence_spawn_log = !g_test_verbose(); 1585 1586 qts = qtest_init_with_env(NULL, "-machine none"); 1587 response = qtest_qmp(qts, "{ 'execute': 'query-cpu-definitions' }"); 1588 g_assert(response); 1589 list = qdict_get_qlist(response, "return"); 1590 g_assert(list); 1591 1592 cpus = g_new0(struct CpuModel, qlist_size(list) + 1); 1593 1594 for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) { 1595 minfo = qobject_to(QDict, qlist_entry_obj(p)); 1596 g_assert(minfo); 1597 1598 qobj = qdict_get(minfo, "name"); 1599 g_assert(qobj); 1600 qstr = qobject_to(QString, qobj); 1601 g_assert(qstr); 1602 cpus[idx].name = g_strdup(qstring_get_str(qstr)); 1603 1604 qobj = qdict_get(minfo, "alias_of"); 1605 if (qobj) { /* old machines do not report aliases */ 1606 qstr = qobject_to(QString, qobj); 1607 g_assert(qstr); 1608 cpus[idx].alias_of = g_strdup(qstring_get_str(qstr)); 1609 } else { 1610 cpus[idx].alias_of = NULL; 1611 } 1612 1613 qobj = qdict_get(minfo, "deprecated"); 1614 qbool = qobject_to(QBool, qobj); 1615 g_assert(qbool); 1616 cpus[idx].deprecated = qbool_get_bool(qbool); 1617 } 1618 1619 qtest_quit(qts); 1620 qobject_unref(response); 1621 1622 silence_spawn_log = false; 1623 1624 return cpus; 1625 } 1626 1627 bool qtest_has_cpu_model(const char *cpu) 1628 { 1629 struct CpuModel *cpus; 1630 int i; 1631 1632 cpus = qtest_get_cpu_models(); 1633 1634 for (i = 0; cpus[i].name != NULL; i++) { 1635 if (g_str_equal(cpu, cpus[i].name) || 1636 (cpus[i].alias_of && g_str_equal(cpu, cpus[i].alias_of))) { 1637 return true; 1638 } 1639 } 1640 1641 return false; 1642 } 1643 1644 void qtest_cb_for_every_machine(void (*cb)(const char *machine), 1645 bool skip_old_versioned) 1646 { 1647 struct MachInfo *machines; 1648 int i; 1649 1650 machines = qtest_get_machines(NULL); 1651 1652 for (i = 0; machines[i].name != NULL; i++) { 1653 /* Ignore machines that cannot be used for qtests */ 1654 if (!strncmp("xenfv", machines[i].name, 5) || 1655 g_str_equal("xenpv", machines[i].name) || 1656 g_str_equal("xenpvh", machines[i].name)) { 1657 continue; 1658 } 1659 if (!skip_old_versioned || 1660 !qtest_is_old_versioned_machine(machines[i].name)) { 1661 cb(machines[i].name); 1662 } 1663 } 1664 } 1665 1666 char *qtest_resolve_machine_alias(const char *var, const char *alias) 1667 { 1668 struct MachInfo *machines; 1669 int i; 1670 1671 machines = qtest_get_machines(var); 1672 1673 for (i = 0; machines[i].name != NULL; i++) { 1674 if (machines[i].alias && g_str_equal(alias, machines[i].alias)) { 1675 return g_strdup(machines[i].name); 1676 } 1677 } 1678 1679 return NULL; 1680 } 1681 1682 bool qtest_has_machine_with_env(const char *var, const char *machine) 1683 { 1684 struct MachInfo *machines; 1685 int i; 1686 1687 machines = qtest_get_machines(var); 1688 1689 for (i = 0; machines[i].name != NULL; i++) { 1690 if (g_str_equal(machine, machines[i].name) || 1691 (machines[i].alias && g_str_equal(machine, machines[i].alias))) { 1692 return true; 1693 } 1694 } 1695 1696 return false; 1697 } 1698 1699 bool qtest_has_machine(const char *machine) 1700 { 1701 return qtest_has_machine_with_env(NULL, machine); 1702 } 1703 1704 bool qtest_has_device(const char *device) 1705 { 1706 static QList *list; 1707 const QListEntry *p; 1708 QObject *qobj; 1709 QString *qstr; 1710 QDict *devinfo; 1711 int idx; 1712 1713 if (!list) { 1714 QDict *resp; 1715 QDict *args; 1716 QTestState *qts = qtest_init("-machine none"); 1717 1718 args = qdict_new(); 1719 qdict_put_bool(args, "abstract", false); 1720 qdict_put_str(args, "implements", "device"); 1721 1722 resp = qtest_qmp(qts, "{'execute': 'qom-list-types', 'arguments': %p }", 1723 args); 1724 g_assert(qdict_haskey(resp, "return")); 1725 list = qdict_get_qlist(resp, "return"); 1726 qobject_ref(list); 1727 qobject_unref(resp); 1728 1729 qtest_quit(qts); 1730 } 1731 1732 for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) { 1733 devinfo = qobject_to(QDict, qlist_entry_obj(p)); 1734 g_assert(devinfo); 1735 1736 qobj = qdict_get(devinfo, "name"); 1737 g_assert(qobj); 1738 qstr = qobject_to(QString, qobj); 1739 g_assert(qstr); 1740 if (g_str_equal(qstring_get_str(qstr), device)) { 1741 return true; 1742 } 1743 } 1744 1745 return false; 1746 } 1747 1748 /* 1749 * Generic hot-plugging test via the device_add QMP commands. 1750 */ 1751 void qtest_qmp_device_add_qdict(QTestState *qts, const char *drv, 1752 const QDict *arguments) 1753 { 1754 QDict *resp; 1755 QDict *args = arguments ? qdict_clone_shallow(arguments) : qdict_new(); 1756 1757 g_assert(!qdict_haskey(args, "driver")); 1758 qdict_put_str(args, "driver", drv); 1759 resp = qtest_qmp(qts, "{'execute': 'device_add', 'arguments': %p}", args); 1760 g_assert(resp); 1761 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */ 1762 if (qdict_haskey(resp, "error")) { 1763 fprintf(stderr, "error: %s\n", 1764 qdict_get_str(qdict_get_qdict(resp, "error"), "desc")); 1765 } 1766 g_assert(!qdict_haskey(resp, "error")); 1767 qobject_unref(resp); 1768 } 1769 1770 void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id, 1771 const char *fmt, ...) 1772 { 1773 QDict *args; 1774 va_list ap; 1775 1776 va_start(ap, fmt); 1777 args = qdict_from_vjsonf_nofail(fmt, ap); 1778 va_end(ap); 1779 1780 g_assert(!qdict_haskey(args, "id")); 1781 qdict_put_str(args, "id", id); 1782 1783 qtest_qmp_device_add_qdict(qts, driver, args); 1784 qobject_unref(args); 1785 } 1786 1787 void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd) 1788 { 1789 QDict *resp; 1790 1791 #ifdef WIN32 1792 WSAPROTOCOL_INFOW info; 1793 g_autofree char *info64 = NULL; 1794 SOCKET s; 1795 1796 assert(fd_is_socket(fd)); 1797 s = _get_osfhandle(fd); 1798 if (WSADuplicateSocketW(s, GetProcessId((HANDLE)qts->qemu_pid), &info) == SOCKET_ERROR) { 1799 g_autofree char *emsg = g_win32_error_message(WSAGetLastError()); 1800 g_error("WSADuplicateSocketW failed: %s", emsg); 1801 } 1802 info64 = g_base64_encode((guchar *)&info, sizeof(info)); 1803 resp = qtest_qmp(qts, "{'execute': 'get-win32-socket'," 1804 "'arguments': {'fdname': 'fdname', 'info': %s}}", info64); 1805 #else 1806 resp = qtest_qmp_fds(qts, &fd, 1, "{'execute': 'getfd'," 1807 "'arguments': {'fdname': 'fdname'}}"); 1808 #endif 1809 g_assert(resp); 1810 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */ 1811 g_assert(!qdict_haskey(resp, "error")); 1812 qobject_unref(resp); 1813 1814 resp = qtest_qmp( 1815 qts, "{'execute': 'add_client'," 1816 "'arguments': {'protocol': %s, 'fdname': 'fdname'}}", protocol); 1817 g_assert(resp); 1818 g_assert(!qdict_haskey(resp, "event")); /* We don't expect any events */ 1819 g_assert(!qdict_haskey(resp, "error")); 1820 qobject_unref(resp); 1821 } 1822 1823 /* 1824 * Generic hot-unplugging test via the device_del QMP command. 1825 * Device deletion will get one response and one event. For example: 1826 * 1827 * {'execute': 'device_del','arguments': { 'id': 'scsi-hd'}} 1828 * 1829 * will get this one: 1830 * 1831 * {"timestamp": {"seconds": 1505289667, "microseconds": 569862}, 1832 * "event": "DEVICE_DELETED", "data": {"device": "scsi-hd", 1833 * "path": "/machine/peripheral/scsi-hd"}} 1834 * 1835 * and this one: 1836 * 1837 * {"return": {}} 1838 */ 1839 void qtest_qmp_device_del_send(QTestState *qts, const char *id) 1840 { 1841 QDict *rsp = qtest_qmp(qts, "{'execute': 'device_del', " 1842 "'arguments': {'id': %s}}", id); 1843 g_assert(rsp); 1844 g_assert(qdict_haskey(rsp, "return")); 1845 g_assert(!qdict_haskey(rsp, "error")); 1846 qobject_unref(rsp); 1847 } 1848 1849 void qtest_qmp_device_del(QTestState *qts, const char *id) 1850 { 1851 qtest_qmp_device_del_send(qts, id); 1852 qtest_qmp_eventwait(qts, "DEVICE_DELETED"); 1853 } 1854 1855 static void qtest_client_set_tx_handler(QTestState *s, 1856 QTestSendFn send) 1857 { 1858 s->ops.send = send; 1859 } 1860 static void qtest_client_set_rx_handler(QTestState *s, QTestRecvFn recv) 1861 { 1862 s->ops.recv_line = recv; 1863 } 1864 /* A type-safe wrapper for s->send() */ 1865 static void send_wrapper(QTestState *s, const char *buf) 1866 { 1867 s->ops.external_send(s, buf); 1868 } 1869 1870 static GString *qtest_client_inproc_recv_line(QTestState *s) 1871 { 1872 GString *line; 1873 size_t offset; 1874 char *eol; 1875 1876 eol = strchr(s->rx->str, '\n'); 1877 offset = eol - s->rx->str; 1878 line = g_string_new_len(s->rx->str, offset); 1879 g_string_erase(s->rx, 0, offset + 1); 1880 return line; 1881 } 1882 1883 QTestState *qtest_inproc_init(QTestState **s, bool log, const char* arch, 1884 void (*send)(void*, const char*)) 1885 { 1886 QTestState *qts; 1887 qts = g_new0(QTestState, 1); 1888 qts->pending_events = NULL; 1889 *s = qts; /* Expose qts early on, since the query endianness relies on it */ 1890 qts->wstatus = 0; 1891 for (int i = 0; i < MAX_IRQ; i++) { 1892 qts->irq_level[i] = false; 1893 } 1894 1895 qtest_client_set_rx_handler(qts, qtest_client_inproc_recv_line); 1896 1897 /* send() may not have a matching prototype, so use a type-safe wrapper */ 1898 qts->ops.external_send = send; 1899 qtest_client_set_tx_handler(qts, send_wrapper); 1900 1901 qts->big_endian = qtest_query_target_endianness(qts); 1902 1903 /* 1904 * Set a dummy path for QTEST_QEMU_BINARY. Doesn't need to exist, but this 1905 * way, qtest_get_arch works for inproc qtest. 1906 */ 1907 gchar *bin_path = g_strconcat("/qemu-system-", arch, NULL); 1908 if (!g_setenv("QTEST_QEMU_BINARY", bin_path, 0)) { 1909 fprintf(stderr, 1910 "Could not set environment variable QTEST_QEMU_BINARY\n"); 1911 exit(1); 1912 } 1913 g_free(bin_path); 1914 1915 return qts; 1916 } 1917 1918 void qtest_client_inproc_recv(void *opaque, const char *str) 1919 { 1920 QTestState *qts = *(QTestState **)opaque; 1921 1922 if (!qts->rx) { 1923 qts->rx = g_string_new(NULL); 1924 } 1925 g_string_append(qts->rx, str); 1926 return; 1927 } 1928 1929 void qtest_qom_set_bool(QTestState *s, const char *path, const char *property, 1930 bool value) 1931 { 1932 QDict *r; 1933 1934 r = qtest_qmp(s, "{ 'execute': 'qom-set', 'arguments': " 1935 "{ 'path': %s, 'property': %s, 'value': %i } }", 1936 path, property, value); 1937 qobject_unref(r); 1938 } 1939 1940 bool qtest_qom_get_bool(QTestState *s, const char *path, const char *property) 1941 { 1942 QDict *r; 1943 bool b; 1944 1945 r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': " 1946 "{ 'path': %s, 'property': %s } }", path, property); 1947 b = qdict_get_bool(r, "return"); 1948 qobject_unref(r); 1949 1950 return b; 1951 } 1952 1953 bool have_qemu_img(void) 1954 { 1955 char *rpath; 1956 const char *path = getenv("QTEST_QEMU_IMG"); 1957 if (!path) { 1958 return false; 1959 } 1960 1961 rpath = realpath(path, NULL); 1962 if (!rpath) { 1963 return false; 1964 } else { 1965 free(rpath); 1966 return true; 1967 } 1968 } 1969 1970 bool mkimg(const char *file, const char *fmt, unsigned size_mb) 1971 { 1972 gchar *cli; 1973 bool ret; 1974 int rc; 1975 GError *err = NULL; 1976 char *qemu_img_path; 1977 gchar *out, *out2; 1978 char *qemu_img_abs_path; 1979 1980 qemu_img_path = getenv("QTEST_QEMU_IMG"); 1981 if (!qemu_img_path) { 1982 return false; 1983 } 1984 qemu_img_abs_path = realpath(qemu_img_path, NULL); 1985 if (!qemu_img_abs_path) { 1986 return false; 1987 } 1988 1989 cli = g_strdup_printf("%s create -f %s %s %uM", qemu_img_abs_path, 1990 fmt, file, size_mb); 1991 ret = g_spawn_command_line_sync(cli, &out, &out2, &rc, &err); 1992 if (err || !g_spawn_check_exit_status(rc, &err)) { 1993 fprintf(stderr, "%s\n", err->message); 1994 g_error_free(err); 1995 } 1996 1997 g_free(out); 1998 g_free(out2); 1999 g_free(cli); 2000 free(qemu_img_abs_path); 2001 2002 return ret && !err; 2003 } 2004