qtest: split configuration of qtest accelerator and chardev
qtest uses the icount infrastructure to implement a test-driven vm_clock. This however is not necessary when using -qtest as a "probe" together with a normal TCG-, KVM- or Xen-based virtual machine. Hence, split out the call to configure_icount into a new function that is called only for "-machine accel=qtest"; and disable those commands when running with an accelerator other than qtest. This also fixes an assertion failure with "qemu-system-x86_64 -machine accel=qtest" but no -qtest option. This is a valid case, albeit somewhat weird; nothing will happen in the VM but you'll still be able to interact with the monitor or the GUI. Now that qtest_init is not limited to an int(void) function, change global variables that are not used outside qtest_init to arguments. And finally, cleanup useless parts of include/sysemu/qtest.h. The file is not used at all for user-only emulation, and qtest is not available on Win32 due to its usage of sigwait. Reported-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Tested-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
		
							parent
							
								
									83d08f2673
								
							
						
					
					
						commit
						d4fce24f3a
					
				@ -16,38 +16,23 @@
 | 
			
		||||
 | 
			
		||||
#include "qemu-common.h"
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_USER_ONLY)
 | 
			
		||||
extern bool qtest_allowed;
 | 
			
		||||
extern const char *qtest_chrdev;
 | 
			
		||||
extern const char *qtest_log;
 | 
			
		||||
 | 
			
		||||
static inline bool qtest_enabled(void)
 | 
			
		||||
{
 | 
			
		||||
    return qtest_allowed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qtest_init_accel(void);
 | 
			
		||||
void qtest_init(const char *qtest_chrdev, const char *qtest_log);
 | 
			
		||||
 | 
			
		||||
static inline int qtest_available(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_POSIX
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qtest_init(void);
 | 
			
		||||
#else
 | 
			
		||||
static inline bool qtest_enabled(void)
 | 
			
		||||
{
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int qtest_available(void)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int qtest_init(void)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								qtest.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								qtest.c
									
									
									
									
									
								
							@ -22,8 +22,6 @@
 | 
			
		||||
 | 
			
		||||
#define MAX_IRQ 256
 | 
			
		||||
 | 
			
		||||
const char *qtest_chrdev;
 | 
			
		||||
const char *qtest_log;
 | 
			
		||||
bool qtest_allowed;
 | 
			
		||||
 | 
			
		||||
static DeviceState *irq_intercept_dev;
 | 
			
		||||
@ -406,7 +404,7 @@ static void qtest_process_command(CharDriverState *chr, gchar **words)
 | 
			
		||||
 | 
			
		||||
        qtest_send_prefix(chr);
 | 
			
		||||
        qtest_send(chr, "OK\n");
 | 
			
		||||
    } else if (strcmp(words[0], "clock_step") == 0) {
 | 
			
		||||
    } else if (qtest_enabled() && strcmp(words[0], "clock_step") == 0) {
 | 
			
		||||
        int64_t ns;
 | 
			
		||||
 | 
			
		||||
        if (words[1]) {
 | 
			
		||||
@ -417,7 +415,7 @@ static void qtest_process_command(CharDriverState *chr, gchar **words)
 | 
			
		||||
        qtest_clock_warp(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ns);
 | 
			
		||||
        qtest_send_prefix(chr);
 | 
			
		||||
        qtest_send(chr, "OK %"PRIi64"\n", (int64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL));
 | 
			
		||||
    } else if (strcmp(words[0], "clock_set") == 0) {
 | 
			
		||||
    } else if (qtest_enabled() && strcmp(words[0], "clock_set") == 0) {
 | 
			
		||||
        int64_t ns;
 | 
			
		||||
 | 
			
		||||
        g_assert(words[1]);
 | 
			
		||||
@ -502,13 +500,17 @@ static void qtest_event(void *opaque, int event)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qtest_init(void)
 | 
			
		||||
int qtest_init_accel(void)
 | 
			
		||||
{
 | 
			
		||||
    configure_icount("0");
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qtest_init(const char *qtest_chrdev, const char *qtest_log)
 | 
			
		||||
{
 | 
			
		||||
    CharDriverState *chr;
 | 
			
		||||
 | 
			
		||||
    g_assert(qtest_chrdev != NULL);
 | 
			
		||||
 | 
			
		||||
    configure_icount("0");
 | 
			
		||||
    chr = qemu_chr_new("qtest", qtest_chrdev, NULL);
 | 
			
		||||
 | 
			
		||||
    qemu_chr_add_handlers(chr, qtest_can_read, qtest_read, qtest_event, chr);
 | 
			
		||||
@ -525,6 +527,4 @@ int qtest_init(void)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    qtest_chr = chr;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										8
									
								
								vl.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								vl.c
									
									
									
									
									
								
							@ -2624,7 +2624,7 @@ static struct {
 | 
			
		||||
    { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed },
 | 
			
		||||
    { "xen", "Xen", xen_available, xen_init, &xen_allowed },
 | 
			
		||||
    { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed },
 | 
			
		||||
    { "qtest", "QTest", qtest_available, qtest_init, &qtest_allowed },
 | 
			
		||||
    { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int configure_accelerator(void)
 | 
			
		||||
@ -2836,6 +2836,8 @@ int main(int argc, char **argv, char **envp)
 | 
			
		||||
    QEMUMachine *machine;
 | 
			
		||||
    const char *cpu_model;
 | 
			
		||||
    const char *vga_model = "none";
 | 
			
		||||
    const char *qtest_chrdev = NULL;
 | 
			
		||||
    const char *qtest_log = NULL;
 | 
			
		||||
    const char *pid_file = NULL;
 | 
			
		||||
    const char *incoming = NULL;
 | 
			
		||||
#ifdef CONFIG_VNC
 | 
			
		||||
@ -4043,8 +4045,8 @@ int main(int argc, char **argv, char **envp)
 | 
			
		||||
 | 
			
		||||
    configure_accelerator();
 | 
			
		||||
 | 
			
		||||
    if (!qtest_enabled() && qtest_chrdev) {
 | 
			
		||||
        qtest_init();
 | 
			
		||||
    if (qtest_chrdev) {
 | 
			
		||||
        qtest_init(qtest_chrdev, qtest_log);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    machine_opts = qemu_get_machine_opts();
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user