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