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