A large set of small patches. I have not included yet vhost-user-scsi,
but it'll come in the next pull request. * use GDB XML register description for x86 * use _Static_assert in QEMU_BUILD_BUG_ON * add "R:" to MAINTAINERS and get_maintainers * checkpatch improvements * dump threading fixes * first part of vhost-user-scsi support * QemuMutex tracing * vmw_pvscsi and megasas fixes * sgabios module update * use Rev3 (ACPI 2.0) FADT * deprecate -hdachs * improve -accel documentation * hax fix * qemu-char GSource bugfix -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAABAgAGBQJZDE+gAAoJEL/70l94x66DIpYH/1IOz3u8ObD8D4Lor07LkCCZ vWFnTBMgGi9gTL5JQDnukRR3cmNp9EVOtAP5Yf+v+/Xqyq/FNGnoVWxCxEby7LtN zrIXbsKMCaEcGzRNJFcbKV+KZnzkJrz92J0NHy29ruCK1AsslOXAWf4Qb1MV+fQl 6w2Upsh35usvWCNpFm2o8arzMEmNuE2xJDPKUB11GMrZT6TExq4Zqa8Zj1Ihc0sX XcDr+eeBmb65Vv3jQLntOhSWAy0Xxf/fDXYTQx+JLHFgvpSOIWMiS+fqIVXtT0bH 0E4hQrBr0qjes8n8+9WGGQW2k8Ak0QlDvrZnQ97hTeV1k6SxW+2ATO2mLeJp9TM= =5hf2 -----END PGP SIGNATURE----- Merge remote-tracking branch 'bonzini/tags/for-upstream' into staging A large set of small patches. I have not included yet vhost-user-scsi, but it'll come in the next pull request. * use GDB XML register description for x86 * use _Static_assert in QEMU_BUILD_BUG_ON * add "R:" to MAINTAINERS and get_maintainers * checkpatch improvements * dump threading fixes * first part of vhost-user-scsi support * QemuMutex tracing * vmw_pvscsi and megasas fixes * sgabios module update * use Rev3 (ACPI 2.0) FADT * deprecate -hdachs * improve -accel documentation * hax fix * qemu-char GSource bugfix # gpg: Signature made Fri 05 May 2017 06:10:40 AM EDT # gpg: using RSA key 0xBFFBD25F78C7AE83 # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * bonzini/tags/for-upstream: (21 commits) vhost-scsi: create a vhost-scsi-common abstraction libvhost-user: replace vasprintf() to fix build get_maintainer: add subsystem to reviewer output get_maintainer: --r (list reviewer) is on by default get_maintainer: it's '--pattern-depth', not '-pattern-depth' get_maintainer: Teach get_maintainer.pl about the new "R:" tag MAINTAINERS: Add "R:" tag for self-appointed reviewers Fix the -accel parameter and the documentation for 'hax' dump: Acquire BQL around vm_start() in dump thread hax: Fix memory mapping de-duplication logic checkpatch: Disallow glib asserts in main code trace: add qemu mutex lock and unlock trace events vmw_pvscsi: check message ring page count at initialisation sgabios: update for "fix wrong video attrs for int 10h,ah==13h" scsi: avoid an off-by-one error in megasas_mmio_write vl: deprecate the "-hdachs" option use _Static_assert in QEMU_BUILD_BUG_ON target/i386: Add GDB XML register description support char: Fix removing wrong GSource that be found by fd_in_tag hw/i386: Build-time assertion on pc/q35 reset register being identical. ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
						commit
						1c5d506101
					
				| 
						 | 
				
			
			@ -12,6 +12,8 @@ consult qemu-devel and not any specific individual privately.
 | 
			
		|||
Descriptions of section entries:
 | 
			
		||||
 | 
			
		||||
	M: Mail patches to: FullName <address@domain>
 | 
			
		||||
	R: Designated reviewer: FullName <address@domain>
 | 
			
		||||
	   These reviewers should be CCed on patches.
 | 
			
		||||
	L: Mailing list that is relevant to this area
 | 
			
		||||
	W: Web-page with status/info
 | 
			
		||||
	Q: Patchwork web based patch tracking system site
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ static gboolean fd_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
 | 
			
		|||
    ret = qio_channel_read(
 | 
			
		||||
        chan, (gchar *)buf, len, NULL);
 | 
			
		||||
    if (ret == 0) {
 | 
			
		||||
        remove_fd_in_watch(chr, NULL);
 | 
			
		||||
        remove_fd_in_watch(chr);
 | 
			
		||||
        qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -89,9 +89,9 @@ static void fd_chr_update_read_handler(Chardev *chr,
 | 
			
		|||
{
 | 
			
		||||
    FDChardev *s = FD_CHARDEV(chr);
 | 
			
		||||
 | 
			
		||||
    remove_fd_in_watch(chr, NULL);
 | 
			
		||||
    remove_fd_in_watch(chr);
 | 
			
		||||
    if (s->ioc_in) {
 | 
			
		||||
        chr->fd_in_tag = io_add_watch_poll(chr, s->ioc_in,
 | 
			
		||||
        chr->gsource = io_add_watch_poll(chr, s->ioc_in,
 | 
			
		||||
                                           fd_chr_read_poll,
 | 
			
		||||
                                           fd_chr_read, chr,
 | 
			
		||||
                                           context);
 | 
			
		||||
| 
						 | 
				
			
			@ -103,7 +103,7 @@ static void char_fd_finalize(Object *obj)
 | 
			
		|||
    Chardev *chr = CHARDEV(obj);
 | 
			
		||||
    FDChardev *s = FD_CHARDEV(obj);
 | 
			
		||||
 | 
			
		||||
    remove_fd_in_watch(chr, NULL);
 | 
			
		||||
    remove_fd_in_watch(chr);
 | 
			
		||||
    if (s->ioc_in) {
 | 
			
		||||
        object_unref(OBJECT(s->ioc_in));
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ static GSourceFuncs io_watch_poll_funcs = {
 | 
			
		|||
    .finalize = io_watch_poll_finalize,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
guint io_add_watch_poll(Chardev *chr,
 | 
			
		||||
GSource *io_add_watch_poll(Chardev *chr,
 | 
			
		||||
                        QIOChannel *ioc,
 | 
			
		||||
                        IOCanReadHandler *fd_can_read,
 | 
			
		||||
                        QIOChannelFunc fd_read,
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +106,6 @@ guint io_add_watch_poll(Chardev *chr,
 | 
			
		|||
                        GMainContext *context)
 | 
			
		||||
{
 | 
			
		||||
    IOWatchPoll *iwp;
 | 
			
		||||
    int tag;
 | 
			
		||||
    char *name;
 | 
			
		||||
 | 
			
		||||
    iwp = (IOWatchPoll *) g_source_new(&io_watch_poll_funcs,
 | 
			
		||||
| 
						 | 
				
			
			@ -122,21 +121,15 @@ guint io_add_watch_poll(Chardev *chr,
 | 
			
		|||
    g_source_set_name((GSource *)iwp, name);
 | 
			
		||||
    g_free(name);
 | 
			
		||||
 | 
			
		||||
    tag = g_source_attach(&iwp->parent, context);
 | 
			
		||||
    g_source_attach(&iwp->parent, context);
 | 
			
		||||
    g_source_unref(&iwp->parent);
 | 
			
		||||
    return tag;
 | 
			
		||||
    return (GSource *)iwp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void io_remove_watch_poll(guint tag, GMainContext *context)
 | 
			
		||||
static void io_remove_watch_poll(GSource *source)
 | 
			
		||||
{
 | 
			
		||||
    GSource *source;
 | 
			
		||||
    IOWatchPoll *iwp;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail(tag > 0);
 | 
			
		||||
 | 
			
		||||
    source = g_main_context_find_source_by_id(context, tag);
 | 
			
		||||
    g_return_if_fail(source != NULL);
 | 
			
		||||
 | 
			
		||||
    iwp = io_watch_poll_from_source(source);
 | 
			
		||||
    if (iwp->src) {
 | 
			
		||||
        g_source_destroy(iwp->src);
 | 
			
		||||
| 
						 | 
				
			
			@ -146,11 +139,11 @@ static void io_remove_watch_poll(guint tag, GMainContext *context)
 | 
			
		|||
    g_source_destroy(&iwp->parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void remove_fd_in_watch(Chardev *chr, GMainContext *context)
 | 
			
		||||
void remove_fd_in_watch(Chardev *chr)
 | 
			
		||||
{
 | 
			
		||||
    if (chr->fd_in_tag) {
 | 
			
		||||
        io_remove_watch_poll(chr->fd_in_tag, context);
 | 
			
		||||
        chr->fd_in_tag = 0;
 | 
			
		||||
    if (chr->gsource) {
 | 
			
		||||
        io_remove_watch_poll(chr->gsource);
 | 
			
		||||
        chr->gsource = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,14 +29,14 @@
 | 
			
		|||
#include "sysemu/char.h"
 | 
			
		||||
 | 
			
		||||
/* Can only be used for read */
 | 
			
		||||
guint io_add_watch_poll(Chardev *chr,
 | 
			
		||||
GSource *io_add_watch_poll(Chardev *chr,
 | 
			
		||||
                        QIOChannel *ioc,
 | 
			
		||||
                        IOCanReadHandler *fd_can_read,
 | 
			
		||||
                        QIOChannelFunc fd_read,
 | 
			
		||||
                        gpointer user_data,
 | 
			
		||||
                        GMainContext *context);
 | 
			
		||||
 | 
			
		||||
void remove_fd_in_watch(Chardev *chr, GMainContext *context);
 | 
			
		||||
void remove_fd_in_watch(Chardev *chr);
 | 
			
		||||
 | 
			
		||||
int io_channel_send(QIOChannel *ioc, const void *buf, size_t len);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -199,7 +199,7 @@ static void pty_chr_state(Chardev *chr, int connected)
 | 
			
		|||
            g_source_remove(s->open_tag);
 | 
			
		||||
            s->open_tag = 0;
 | 
			
		||||
        }
 | 
			
		||||
        remove_fd_in_watch(chr, NULL);
 | 
			
		||||
        remove_fd_in_watch(chr);
 | 
			
		||||
        s->connected = 0;
 | 
			
		||||
        /* (re-)connect poll interval for idle guests: once per second.
 | 
			
		||||
         * We check more frequently in case the guests sends data to
 | 
			
		||||
| 
						 | 
				
			
			@ -215,8 +215,8 @@ static void pty_chr_state(Chardev *chr, int connected)
 | 
			
		|||
            s->connected = 1;
 | 
			
		||||
            s->open_tag = g_idle_add(qemu_chr_be_generic_open_func, chr);
 | 
			
		||||
        }
 | 
			
		||||
        if (!chr->fd_in_tag) {
 | 
			
		||||
            chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
        if (!chr->gsource) {
 | 
			
		||||
            chr->gsource = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
                                               pty_chr_read_poll,
 | 
			
		||||
                                               pty_chr_read,
 | 
			
		||||
                                               chr, NULL);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -346,7 +346,7 @@ static void tcp_chr_free_connection(Chardev *chr)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    tcp_set_msgfds(chr, NULL, 0);
 | 
			
		||||
    remove_fd_in_watch(chr, NULL);
 | 
			
		||||
    remove_fd_in_watch(chr);
 | 
			
		||||
    object_unref(OBJECT(s->sioc));
 | 
			
		||||
    s->sioc = NULL;
 | 
			
		||||
    object_unref(OBJECT(s->ioc));
 | 
			
		||||
| 
						 | 
				
			
			@ -511,7 +511,7 @@ static void tcp_chr_connect(void *opaque)
 | 
			
		|||
 | 
			
		||||
    s->connected = 1;
 | 
			
		||||
    if (s->ioc) {
 | 
			
		||||
        chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
        chr->gsource = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
                                           tcp_chr_read_poll,
 | 
			
		||||
                                           tcp_chr_read,
 | 
			
		||||
                                           chr, NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -528,9 +528,9 @@ static void tcp_chr_update_read_handler(Chardev *chr,
 | 
			
		|||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    remove_fd_in_watch(chr, NULL);
 | 
			
		||||
    remove_fd_in_watch(chr);
 | 
			
		||||
    if (s->ioc) {
 | 
			
		||||
        chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
        chr->gsource = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
                                           tcp_chr_read_poll,
 | 
			
		||||
                                           tcp_chr_read, chr,
 | 
			
		||||
                                           context);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,7 +90,7 @@ static gboolean udp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
 | 
			
		|||
    ret = qio_channel_read(
 | 
			
		||||
        s->ioc, (char *)s->buf, sizeof(s->buf), NULL);
 | 
			
		||||
    if (ret <= 0) {
 | 
			
		||||
        remove_fd_in_watch(chr, NULL);
 | 
			
		||||
        remove_fd_in_watch(chr);
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
    s->bufcnt = ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -105,9 +105,9 @@ static void udp_chr_update_read_handler(Chardev *chr,
 | 
			
		|||
{
 | 
			
		||||
    UdpChardev *s = UDP_CHARDEV(chr);
 | 
			
		||||
 | 
			
		||||
    remove_fd_in_watch(chr, NULL);
 | 
			
		||||
    remove_fd_in_watch(chr);
 | 
			
		||||
    if (s->ioc) {
 | 
			
		||||
        chr->fd_in_tag = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
        chr->gsource = io_add_watch_poll(chr, s->ioc,
 | 
			
		||||
                                           udp_chr_read_poll,
 | 
			
		||||
                                           udp_chr_read, chr,
 | 
			
		||||
                                           context);
 | 
			
		||||
| 
						 | 
				
			
			@ -119,7 +119,7 @@ static void char_udp_finalize(Object *obj)
 | 
			
		|||
    Chardev *chr = CHARDEV(obj);
 | 
			
		||||
    UdpChardev *s = UDP_CHARDEV(obj);
 | 
			
		||||
 | 
			
		||||
    remove_fd_in_watch(chr, NULL);
 | 
			
		||||
    remove_fd_in_watch(chr);
 | 
			
		||||
    if (s->ioc) {
 | 
			
		||||
        object_unref(OBJECT(s->ioc));
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -554,7 +554,7 @@ void qemu_chr_fe_set_handlers(CharBackend *b,
 | 
			
		|||
    cc = CHARDEV_GET_CLASS(s);
 | 
			
		||||
    if (!opaque && !fd_can_read && !fd_read && !fd_event) {
 | 
			
		||||
        fe_open = 0;
 | 
			
		||||
        remove_fd_in_watch(s, context);
 | 
			
		||||
        remove_fd_in_watch(s);
 | 
			
		||||
    } else {
 | 
			
		||||
        fe_open = 1;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4852,6 +4852,20 @@ EOF
 | 
			
		|||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
##########################################
 | 
			
		||||
# check for _Static_assert()
 | 
			
		||||
 | 
			
		||||
have_static_assert=no
 | 
			
		||||
cat > $TMPC << EOF
 | 
			
		||||
_Static_assert(1, "success");
 | 
			
		||||
int main(void) {
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
if compile_prog "" "" ; then
 | 
			
		||||
    have_static_assert=yes
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
##########################################
 | 
			
		||||
# End of CC checks
 | 
			
		||||
# After here, no more $cc or $ld runs
 | 
			
		||||
| 
						 | 
				
			
			@ -5848,6 +5862,10 @@ if test "$have_sysmacros" = "yes" ; then
 | 
			
		|||
  echo "CONFIG_SYSMACROS=y" >> $config_host_mak
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test "$have_static_assert" = "yes" ; then
 | 
			
		||||
  echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Hold two types of flag:
 | 
			
		||||
#   CONFIG_THREAD_SETNAME_BYTHREAD  - we've got a way of setting the name on
 | 
			
		||||
#                                     a thread we have a handle to
 | 
			
		||||
| 
						 | 
				
			
			@ -6023,9 +6041,11 @@ TARGET_ABI_DIR=""
 | 
			
		|||
 | 
			
		||||
case "$target_name" in
 | 
			
		||||
  i386)
 | 
			
		||||
    gdb_xml_files="i386-32bit-core.xml"
 | 
			
		||||
  ;;
 | 
			
		||||
  x86_64)
 | 
			
		||||
    TARGET_BASE_ARCH=i386
 | 
			
		||||
    gdb_xml_files="i386-64bit-core.xml"
 | 
			
		||||
  ;;
 | 
			
		||||
  alpha)
 | 
			
		||||
    mttcg="yes"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -81,7 +81,7 @@ vu_panic(VuDev *dev, const char *msg, ...)
 | 
			
		|||
    va_list ap;
 | 
			
		||||
 | 
			
		||||
    va_start(ap, msg);
 | 
			
		||||
    (void)vasprintf(&buf, msg, ap);
 | 
			
		||||
    buf = g_strdup_vprintf(msg, ap);
 | 
			
		||||
    va_end(ap);
 | 
			
		||||
 | 
			
		||||
    dev->broken = true;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										7
									
								
								dump.c
								
								
								
								
							
							
						
						
									
										7
									
								
								dump.c
								
								
								
								
							| 
						 | 
				
			
			@ -77,7 +77,13 @@ static int dump_cleanup(DumpState *s)
 | 
			
		|||
    memory_mapping_list_free(&s->list);
 | 
			
		||||
    close(s->fd);
 | 
			
		||||
    if (s->resume) {
 | 
			
		||||
        if (s->detached) {
 | 
			
		||||
            qemu_mutex_lock_iothread();
 | 
			
		||||
        }
 | 
			
		||||
        vm_start();
 | 
			
		||||
        if (s->detached) {
 | 
			
		||||
            qemu_mutex_unlock_iothread();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1804,6 +1810,7 @@ void qmp_dump_guest_memory(bool paging, const char *file,
 | 
			
		|||
 | 
			
		||||
    if (detach_p) {
 | 
			
		||||
        /* detached dump */
 | 
			
		||||
        s->detached = true;
 | 
			
		||||
        qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread,
 | 
			
		||||
                           s, QEMU_THREAD_DETACHED);
 | 
			
		||||
    } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
<?xml version="1.0"?>
 | 
			
		||||
<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
     Copying and distribution of this file, with or without modification,
 | 
			
		||||
     are permitted in any medium without royalty provided the copyright
 | 
			
		||||
     notice and this notice are preserved.  -->
 | 
			
		||||
 | 
			
		||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
 | 
			
		||||
<feature name="org.gnu.gdb.i386.core">
 | 
			
		||||
  <flags id="i386_eflags" size="4">
 | 
			
		||||
    <field name="CF" start="0" end="0"/>
 | 
			
		||||
    <field name="" start="1" end="1"/>
 | 
			
		||||
    <field name="PF" start="2" end="2"/>
 | 
			
		||||
    <field name="AF" start="4" end="4"/>
 | 
			
		||||
    <field name="ZF" start="6" end="6"/>
 | 
			
		||||
    <field name="SF" start="7" end="7"/>
 | 
			
		||||
    <field name="TF" start="8" end="8"/>
 | 
			
		||||
    <field name="IF" start="9" end="9"/>
 | 
			
		||||
    <field name="DF" start="10" end="10"/>
 | 
			
		||||
    <field name="OF" start="11" end="11"/>
 | 
			
		||||
    <field name="NT" start="14" end="14"/>
 | 
			
		||||
    <field name="RF" start="16" end="16"/>
 | 
			
		||||
    <field name="VM" start="17" end="17"/>
 | 
			
		||||
    <field name="AC" start="18" end="18"/>
 | 
			
		||||
    <field name="VIF" start="19" end="19"/>
 | 
			
		||||
    <field name="VIP" start="20" end="20"/>
 | 
			
		||||
    <field name="ID" start="21" end="21"/>
 | 
			
		||||
  </flags>
 | 
			
		||||
 | 
			
		||||
  <reg name="eax" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="ecx" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="edx" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="ebx" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="esp" bitsize="32" type="data_ptr"/>
 | 
			
		||||
  <reg name="ebp" bitsize="32" type="data_ptr"/>
 | 
			
		||||
  <reg name="esi" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="edi" bitsize="32" type="int32"/>
 | 
			
		||||
 | 
			
		||||
  <reg name="eip" bitsize="32" type="code_ptr"/>
 | 
			
		||||
  <reg name="eflags" bitsize="32" type="i386_eflags"/>
 | 
			
		||||
  <reg name="cs" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="ss" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="ds" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="es" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="fs" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="gs" bitsize="32" type="int32"/>
 | 
			
		||||
 | 
			
		||||
  <reg name="st0" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st1" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st2" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st3" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st4" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st5" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st6" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st7" bitsize="80" type="i387_ext"/>
 | 
			
		||||
 | 
			
		||||
  <reg name="fctrl" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fstat" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="ftag" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fiseg" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fioff" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="foseg" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fooff" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fop" bitsize="32" type="int" group="float"/>
 | 
			
		||||
</feature>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
<?xml version="1.0"?>
 | 
			
		||||
<!-- Copyright (C) 2010-2015 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
     Copying and distribution of this file, with or without modification,
 | 
			
		||||
     are permitted in any medium without royalty provided the copyright
 | 
			
		||||
     notice and this notice are preserved.  -->
 | 
			
		||||
 | 
			
		||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
 | 
			
		||||
<feature name="org.gnu.gdb.i386.core">
 | 
			
		||||
  <flags id="i386_eflags" size="4">
 | 
			
		||||
    <field name="CF" start="0" end="0"/>
 | 
			
		||||
    <field name="" start="1" end="1"/>
 | 
			
		||||
    <field name="PF" start="2" end="2"/>
 | 
			
		||||
    <field name="AF" start="4" end="4"/>
 | 
			
		||||
    <field name="ZF" start="6" end="6"/>
 | 
			
		||||
    <field name="SF" start="7" end="7"/>
 | 
			
		||||
    <field name="TF" start="8" end="8"/>
 | 
			
		||||
    <field name="IF" start="9" end="9"/>
 | 
			
		||||
    <field name="DF" start="10" end="10"/>
 | 
			
		||||
    <field name="OF" start="11" end="11"/>
 | 
			
		||||
    <field name="NT" start="14" end="14"/>
 | 
			
		||||
    <field name="RF" start="16" end="16"/>
 | 
			
		||||
    <field name="VM" start="17" end="17"/>
 | 
			
		||||
    <field name="AC" start="18" end="18"/>
 | 
			
		||||
    <field name="VIF" start="19" end="19"/>
 | 
			
		||||
    <field name="VIP" start="20" end="20"/>
 | 
			
		||||
    <field name="ID" start="21" end="21"/>
 | 
			
		||||
  </flags>
 | 
			
		||||
 | 
			
		||||
  <reg name="rax" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="rbx" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="rcx" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="rdx" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="rsi" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="rdi" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="rbp" bitsize="64" type="data_ptr"/>
 | 
			
		||||
  <reg name="rsp" bitsize="64" type="data_ptr"/>
 | 
			
		||||
  <reg name="r8" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="r9" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="r10" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="r11" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="r12" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="r13" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="r14" bitsize="64" type="int64"/>
 | 
			
		||||
  <reg name="r15" bitsize="64" type="int64"/>
 | 
			
		||||
 | 
			
		||||
  <reg name="rip" bitsize="64" type="code_ptr"/>
 | 
			
		||||
  <reg name="eflags" bitsize="32" type="i386_eflags"/>
 | 
			
		||||
  <reg name="cs" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="ss" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="ds" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="es" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="fs" bitsize="32" type="int32"/>
 | 
			
		||||
  <reg name="gs" bitsize="32" type="int32"/>
 | 
			
		||||
 | 
			
		||||
  <reg name="st0" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st1" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st2" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st3" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st4" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st5" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st6" bitsize="80" type="i387_ext"/>
 | 
			
		||||
  <reg name="st7" bitsize="80" type="i387_ext"/>
 | 
			
		||||
 | 
			
		||||
  <reg name="fctrl" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fstat" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="ftag" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fiseg" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fioff" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="foseg" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fooff" bitsize="32" type="int" group="float"/>
 | 
			
		||||
  <reg name="fop" bitsize="32" type="int" group="float"/>
 | 
			
		||||
</feature>
 | 
			
		||||
| 
						 | 
				
			
			@ -272,7 +272,7 @@ build_facs(GArray *table_data, BIOSLinker *linker)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* Load chipset information in FADT */
 | 
			
		||||
static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm)
 | 
			
		||||
static void fadt_setup(AcpiFadtDescriptorRev3 *fadt, AcpiPmInfo *pm)
 | 
			
		||||
{
 | 
			
		||||
    fadt->model = 1;
 | 
			
		||||
    fadt->reserved1 = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -304,6 +304,31 @@ static void fadt_setup(AcpiFadtDescriptorRev1 *fadt, AcpiPmInfo *pm)
 | 
			
		|||
        fadt->flags |= cpu_to_le32(1 << ACPI_FADT_F_FORCE_APIC_CLUSTER_MODEL);
 | 
			
		||||
    }
 | 
			
		||||
    fadt->century = RTC_CENTURY;
 | 
			
		||||
 | 
			
		||||
    fadt->flags |= cpu_to_le32(1 << ACPI_FADT_F_RESET_REG_SUP);
 | 
			
		||||
    fadt->reset_value = 0xf;
 | 
			
		||||
    fadt->reset_register.space_id = AML_SYSTEM_IO;
 | 
			
		||||
    fadt->reset_register.bit_width = 8;
 | 
			
		||||
    fadt->reset_register.address = cpu_to_le64(ICH9_RST_CNT_IOPORT);
 | 
			
		||||
    /* The above need not be conditional on machine type because the reset port
 | 
			
		||||
     * happens to be the same on PIIX (pc) and ICH9 (q35). */
 | 
			
		||||
    QEMU_BUILD_BUG_ON(ICH9_RST_CNT_IOPORT != RCR_IOPORT);
 | 
			
		||||
 | 
			
		||||
    fadt->xpm1a_event_block.space_id = AML_SYSTEM_IO;
 | 
			
		||||
    fadt->xpm1a_event_block.bit_width = fadt->pm1_evt_len * 8;
 | 
			
		||||
    fadt->xpm1a_event_block.address = cpu_to_le64(pm->io_base);
 | 
			
		||||
 | 
			
		||||
    fadt->xpm1a_control_block.space_id = AML_SYSTEM_IO;
 | 
			
		||||
    fadt->xpm1a_control_block.bit_width = fadt->pm1_cnt_len * 8;
 | 
			
		||||
    fadt->xpm1a_control_block.address = cpu_to_le64(pm->io_base + 0x4);
 | 
			
		||||
 | 
			
		||||
    fadt->xpm_timer_block.space_id = AML_SYSTEM_IO;
 | 
			
		||||
    fadt->xpm_timer_block.bit_width = fadt->pm_tmr_len * 8;
 | 
			
		||||
    fadt->xpm_timer_block.address = cpu_to_le64(pm->io_base + 0x8);
 | 
			
		||||
 | 
			
		||||
    fadt->xgpe0_block.space_id = AML_SYSTEM_IO;
 | 
			
		||||
    fadt->xgpe0_block.bit_width = pm->gpe0_blk_len * 8;
 | 
			
		||||
    fadt->xgpe0_block.address = cpu_to_le64(pm->gpe0_blk);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -313,9 +338,10 @@ build_fadt(GArray *table_data, BIOSLinker *linker, AcpiPmInfo *pm,
 | 
			
		|||
           unsigned facs_tbl_offset, unsigned dsdt_tbl_offset,
 | 
			
		||||
           const char *oem_id, const char *oem_table_id)
 | 
			
		||||
{
 | 
			
		||||
    AcpiFadtDescriptorRev1 *fadt = acpi_data_push(table_data, sizeof(*fadt));
 | 
			
		||||
    AcpiFadtDescriptorRev3 *fadt = acpi_data_push(table_data, sizeof(*fadt));
 | 
			
		||||
    unsigned fw_ctrl_offset = (char *)&fadt->firmware_ctrl - table_data->data;
 | 
			
		||||
    unsigned dsdt_entry_offset = (char *)&fadt->dsdt - table_data->data;
 | 
			
		||||
    unsigned xdsdt_entry_offset = (char *)&fadt->Xdsdt - table_data->data;
 | 
			
		||||
 | 
			
		||||
    /* FACS address to be filled by Guest linker */
 | 
			
		||||
    bios_linker_loader_add_pointer(linker,
 | 
			
		||||
| 
						 | 
				
			
			@ -327,9 +353,12 @@ build_fadt(GArray *table_data, BIOSLinker *linker, AcpiPmInfo *pm,
 | 
			
		|||
    bios_linker_loader_add_pointer(linker,
 | 
			
		||||
        ACPI_BUILD_TABLE_FILE, dsdt_entry_offset, sizeof(fadt->dsdt),
 | 
			
		||||
        ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset);
 | 
			
		||||
    bios_linker_loader_add_pointer(linker,
 | 
			
		||||
        ACPI_BUILD_TABLE_FILE, xdsdt_entry_offset, sizeof(fadt->Xdsdt),
 | 
			
		||||
        ACPI_BUILD_TABLE_FILE, dsdt_tbl_offset);
 | 
			
		||||
 | 
			
		||||
    build_header(linker, table_data,
 | 
			
		||||
                 (void *)fadt, "FACP", sizeof(*fadt), 1, oem_id, oem_table_id);
 | 
			
		||||
                 (void *)fadt, "FACP", sizeof(*fadt), 3, oem_id, oem_table_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,12 +58,6 @@ typedef struct I440FXState {
 | 
			
		|||
#define XEN_PIIX_NUM_PIRQS      128ULL
 | 
			
		||||
#define PIIX_PIRQC              0x60
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Reset Control Register: PCI-accessible ISA-Compatible Register at address
 | 
			
		||||
 * 0xcf9, provided by the PCI/ISA bridge (PIIX3 PCI function 0, 8086:7000).
 | 
			
		||||
 */
 | 
			
		||||
#define RCR_IOPORT 0xcf9
 | 
			
		||||
 | 
			
		||||
typedef struct PIIX3State {
 | 
			
		||||
    PCIDevice dev;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,5 +10,5 @@ obj-$(CONFIG_PSERIES) += spapr_vscsi.o
 | 
			
		|||
 | 
			
		||||
ifeq ($(CONFIG_VIRTIO),y)
 | 
			
		||||
obj-y += virtio-scsi.o virtio-scsi-dataplane.o
 | 
			
		||||
obj-$(CONFIG_VHOST_SCSI) += vhost-scsi.o
 | 
			
		||||
obj-$(CONFIG_VHOST_SCSI) += vhost-scsi-common.o vhost-scsi.o
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2138,15 +2138,15 @@ static void megasas_mmio_write(void *opaque, hwaddr addr,
 | 
			
		|||
    case MFI_SEQ:
 | 
			
		||||
        trace_megasas_mmio_writel("MFI_SEQ", val);
 | 
			
		||||
        /* Magic sequence to start ADP reset */
 | 
			
		||||
        if (adp_reset_seq[s->adp_reset] == val) {
 | 
			
		||||
            s->adp_reset++;
 | 
			
		||||
        if (adp_reset_seq[s->adp_reset++] == val) {
 | 
			
		||||
            if (s->adp_reset == 6) {
 | 
			
		||||
                s->adp_reset = 0;
 | 
			
		||||
                s->diag = MFI_DIAG_WRITE_ENABLE;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            s->adp_reset = 0;
 | 
			
		||||
            s->diag = 0;
 | 
			
		||||
        }
 | 
			
		||||
        if (s->adp_reset == 6) {
 | 
			
		||||
            s->diag = MFI_DIAG_WRITE_ENABLE;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case MFI_DIAG:
 | 
			
		||||
        trace_megasas_mmio_writel("MFI_DIAG", val);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,143 @@
 | 
			
		|||
/*
 | 
			
		||||
 * vhost-scsi-common
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2016 Nutanix Inc. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *  Felipe Franciosi <felipe@nutanix.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This work is largely based on the "vhost-scsi" implementation by:
 | 
			
		||||
 *  Stefan Hajnoczi    <stefanha@linux.vnet.ibm.com>
 | 
			
		||||
 *  Nicholas Bellinger <nab@risingtidesystems.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This work is licensed under the terms of the GNU LGPL, version 2 or later.
 | 
			
		||||
 * See the COPYING.LIB file in the top-level directory.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "qemu/osdep.h"
 | 
			
		||||
#include <linux/vhost.h>
 | 
			
		||||
#include "qapi/error.h"
 | 
			
		||||
#include "qemu/error-report.h"
 | 
			
		||||
#include "migration/migration.h"
 | 
			
		||||
#include "hw/virtio/vhost.h"
 | 
			
		||||
#include "hw/virtio/vhost-scsi-common.h"
 | 
			
		||||
#include "hw/virtio/virtio-scsi.h"
 | 
			
		||||
#include "hw/virtio/virtio-bus.h"
 | 
			
		||||
#include "hw/virtio/virtio-access.h"
 | 
			
		||||
#include "hw/fw-path-provider.h"
 | 
			
		||||
 | 
			
		||||
int vhost_scsi_common_start(VHostSCSICommon *vsc)
 | 
			
		||||
{
 | 
			
		||||
    int ret, i;
 | 
			
		||||
    VirtIODevice *vdev = VIRTIO_DEVICE(vsc);
 | 
			
		||||
    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
 | 
			
		||||
    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 | 
			
		||||
 | 
			
		||||
    if (!k->set_guest_notifiers) {
 | 
			
		||||
        error_report("binding does not support guest notifiers");
 | 
			
		||||
        return -ENOSYS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = vhost_dev_enable_notifiers(&vsc->dev, vdev);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, true);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_report("Error binding guest notifier");
 | 
			
		||||
        goto err_host_notifiers;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vsc->dev.acked_features = vdev->guest_features;
 | 
			
		||||
    ret = vhost_dev_start(&vsc->dev, vdev);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_report("Error start vhost dev");
 | 
			
		||||
        goto err_guest_notifiers;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* guest_notifier_mask/pending not used yet, so just unmask
 | 
			
		||||
     * everything here.  virtio-pci will do the right thing by
 | 
			
		||||
     * enabling/disabling irqfd.
 | 
			
		||||
     */
 | 
			
		||||
    for (i = 0; i < vsc->dev.nvqs; i++) {
 | 
			
		||||
        vhost_virtqueue_mask(&vsc->dev, vdev, vsc->dev.vq_index + i, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
err_guest_notifiers:
 | 
			
		||||
    k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, false);
 | 
			
		||||
err_host_notifiers:
 | 
			
		||||
    vhost_dev_disable_notifiers(&vsc->dev, vdev);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void vhost_scsi_common_stop(VHostSCSICommon *vsc)
 | 
			
		||||
{
 | 
			
		||||
    VirtIODevice *vdev = VIRTIO_DEVICE(vsc);
 | 
			
		||||
    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
 | 
			
		||||
    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    vhost_dev_stop(&vsc->dev, vdev);
 | 
			
		||||
 | 
			
		||||
    if (k->set_guest_notifiers) {
 | 
			
		||||
        ret = k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, false);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
                error_report("vhost guest notifier cleanup failed: %d", ret);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    assert(ret >= 0);
 | 
			
		||||
 | 
			
		||||
    vhost_dev_disable_notifiers(&vsc->dev, vdev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t vhost_scsi_common_get_features(VirtIODevice *vdev, uint64_t features,
 | 
			
		||||
                                        Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(vdev);
 | 
			
		||||
 | 
			
		||||
    return vhost_get_features(&vsc->dev, vsc->feature_bits, features);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void vhost_scsi_common_set_config(VirtIODevice *vdev, const uint8_t *config)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
 | 
			
		||||
    VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
 | 
			
		||||
 | 
			
		||||
    if ((uint32_t)virtio_ldl_p(vdev, &scsiconf->sense_size) != vs->sense_size ||
 | 
			
		||||
        (uint32_t)virtio_ldl_p(vdev, &scsiconf->cdb_size) != vs->cdb_size) {
 | 
			
		||||
        error_report("vhost-scsi does not support changing the sense data and "
 | 
			
		||||
                     "CDB sizes");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Implementation of an interface to adjust firmware path
 | 
			
		||||
 * for the bootindex property handling.
 | 
			
		||||
 */
 | 
			
		||||
char *vhost_scsi_common_get_fw_dev_path(FWPathProvider *p, BusState *bus,
 | 
			
		||||
                                        DeviceState *dev)
 | 
			
		||||
{
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
 | 
			
		||||
    /* format: /channel@channel/vhost-scsi@target,lun */
 | 
			
		||||
    return g_strdup_printf("/channel@%x/%s@%x,%x", vsc->channel,
 | 
			
		||||
                           qdev_fw_name(dev), vsc->target, vsc->lun);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const TypeInfo vhost_scsi_common_info = {
 | 
			
		||||
    .name = TYPE_VHOST_SCSI_COMMON,
 | 
			
		||||
    .parent = TYPE_VIRTIO_SCSI_COMMON,
 | 
			
		||||
    .instance_size = sizeof(VHostSCSICommon),
 | 
			
		||||
    .abstract = true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void virtio_register_types(void)
 | 
			
		||||
{
 | 
			
		||||
    type_register_static(&vhost_scsi_common_info);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type_init(virtio_register_types)
 | 
			
		||||
| 
						 | 
				
			
			@ -42,13 +42,14 @@ static const int kernel_feature_bits[] = {
 | 
			
		|||
static int vhost_scsi_set_endpoint(VHostSCSI *s)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
 | 
			
		||||
    const VhostOps *vhost_ops = s->dev.vhost_ops;
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s);
 | 
			
		||||
    const VhostOps *vhost_ops = vsc->dev.vhost_ops;
 | 
			
		||||
    struct vhost_scsi_target backend;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    memset(&backend, 0, sizeof(backend));
 | 
			
		||||
    pstrcpy(backend.vhost_wwpn, sizeof(backend.vhost_wwpn), vs->conf.wwpn);
 | 
			
		||||
    ret = vhost_ops->vhost_scsi_set_endpoint(&s->dev, &backend);
 | 
			
		||||
    ret = vhost_ops->vhost_scsi_set_endpoint(&vsc->dev, &backend);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return -errno;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -58,130 +59,62 @@ static int vhost_scsi_set_endpoint(VHostSCSI *s)
 | 
			
		|||
static void vhost_scsi_clear_endpoint(VHostSCSI *s)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s);
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s);
 | 
			
		||||
    struct vhost_scsi_target backend;
 | 
			
		||||
    const VhostOps *vhost_ops = s->dev.vhost_ops;
 | 
			
		||||
    const VhostOps *vhost_ops = vsc->dev.vhost_ops;
 | 
			
		||||
 | 
			
		||||
    memset(&backend, 0, sizeof(backend));
 | 
			
		||||
    pstrcpy(backend.vhost_wwpn, sizeof(backend.vhost_wwpn), vs->conf.wwpn);
 | 
			
		||||
    vhost_ops->vhost_scsi_clear_endpoint(&s->dev, &backend);
 | 
			
		||||
    vhost_ops->vhost_scsi_clear_endpoint(&vsc->dev, &backend);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int vhost_scsi_start(VHostSCSI *s)
 | 
			
		||||
{
 | 
			
		||||
    int ret, abi_version, i;
 | 
			
		||||
    VirtIODevice *vdev = VIRTIO_DEVICE(s);
 | 
			
		||||
    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
 | 
			
		||||
    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 | 
			
		||||
    const VhostOps *vhost_ops = s->dev.vhost_ops;
 | 
			
		||||
    int ret, abi_version;
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s);
 | 
			
		||||
    const VhostOps *vhost_ops = vsc->dev.vhost_ops;
 | 
			
		||||
 | 
			
		||||
    if (!k->set_guest_notifiers) {
 | 
			
		||||
        error_report("binding does not support guest notifiers");
 | 
			
		||||
        return -ENOSYS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = vhost_ops->vhost_scsi_get_abi_version(&s->dev, &abi_version);
 | 
			
		||||
    ret = vhost_ops->vhost_scsi_get_abi_version(&vsc->dev, &abi_version);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return -errno;
 | 
			
		||||
    }
 | 
			
		||||
    if (abi_version > VHOST_SCSI_ABI_VERSION) {
 | 
			
		||||
        error_report("vhost-scsi: The running tcm_vhost kernel abi_version:"
 | 
			
		||||
                     " %d is greater than vhost_scsi userspace supports: %d, please"
 | 
			
		||||
                     " upgrade your version of QEMU", abi_version,
 | 
			
		||||
                     " %d is greater than vhost_scsi userspace supports: %d,"
 | 
			
		||||
                     " please upgrade your version of QEMU", abi_version,
 | 
			
		||||
                     VHOST_SCSI_ABI_VERSION);
 | 
			
		||||
        return -ENOSYS;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = vhost_dev_enable_notifiers(&s->dev, vdev);
 | 
			
		||||
    ret = vhost_scsi_common_start(vsc);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s->dev.acked_features = vdev->guest_features;
 | 
			
		||||
    ret = vhost_dev_start(&s->dev, vdev);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_report("Error start vhost dev");
 | 
			
		||||
        goto err_notifiers;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = vhost_scsi_set_endpoint(s);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_report("Error set vhost-scsi endpoint");
 | 
			
		||||
        goto err_vhost_stop;
 | 
			
		||||
        error_report("Error setting vhost-scsi endpoint");
 | 
			
		||||
        vhost_scsi_common_stop(vsc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = k->set_guest_notifiers(qbus->parent, s->dev.nvqs, true);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_report("Error binding guest notifier");
 | 
			
		||||
        goto err_endpoint;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* guest_notifier_mask/pending not used yet, so just unmask
 | 
			
		||||
     * everything here.  virtio-pci will do the right thing by
 | 
			
		||||
     * enabling/disabling irqfd.
 | 
			
		||||
     */
 | 
			
		||||
    for (i = 0; i < s->dev.nvqs; i++) {
 | 
			
		||||
        vhost_virtqueue_mask(&s->dev, vdev, s->dev.vq_index + i, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
err_endpoint:
 | 
			
		||||
    vhost_scsi_clear_endpoint(s);
 | 
			
		||||
err_vhost_stop:
 | 
			
		||||
    vhost_dev_stop(&s->dev, vdev);
 | 
			
		||||
err_notifiers:
 | 
			
		||||
    vhost_dev_disable_notifiers(&s->dev, vdev);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void vhost_scsi_stop(VHostSCSI *s)
 | 
			
		||||
{
 | 
			
		||||
    VirtIODevice *vdev = VIRTIO_DEVICE(s);
 | 
			
		||||
    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
 | 
			
		||||
    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    if (k->set_guest_notifiers) {
 | 
			
		||||
        ret = k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
                error_report("vhost guest notifier cleanup failed: %d", ret);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    assert(ret >= 0);
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s);
 | 
			
		||||
 | 
			
		||||
    vhost_scsi_clear_endpoint(s);
 | 
			
		||||
    vhost_dev_stop(&s->dev, vdev);
 | 
			
		||||
    vhost_dev_disable_notifiers(&s->dev, vdev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint64_t vhost_scsi_get_features(VirtIODevice *vdev,
 | 
			
		||||
                                        uint64_t features,
 | 
			
		||||
                                        Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VHostSCSI *s = VHOST_SCSI(vdev);
 | 
			
		||||
 | 
			
		||||
    return vhost_get_features(&s->dev, kernel_feature_bits, features);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void vhost_scsi_set_config(VirtIODevice *vdev,
 | 
			
		||||
                                  const uint8_t *config)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
 | 
			
		||||
    VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
 | 
			
		||||
 | 
			
		||||
    if ((uint32_t) virtio_ldl_p(vdev, &scsiconf->sense_size) != vs->sense_size ||
 | 
			
		||||
        (uint32_t) virtio_ldl_p(vdev, &scsiconf->cdb_size) != vs->cdb_size) {
 | 
			
		||||
        error_report("vhost-scsi does not support changing the sense data and CDB sizes");
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
    vhost_scsi_common_stop(vsc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void vhost_scsi_set_status(VirtIODevice *vdev, uint8_t val)
 | 
			
		||||
{
 | 
			
		||||
    VHostSCSI *s = (VHostSCSI *)vdev;
 | 
			
		||||
    VHostSCSI *s = VHOST_SCSI(vdev);
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s);
 | 
			
		||||
    bool start = (val & VIRTIO_CONFIG_S_DRIVER_OK);
 | 
			
		||||
 | 
			
		||||
    if (s->dev.started == start) {
 | 
			
		||||
    if (vsc->dev.started == start) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -190,10 +123,7 @@ static void vhost_scsi_set_status(VirtIODevice *vdev, uint8_t val)
 | 
			
		|||
 | 
			
		||||
        ret = vhost_scsi_start(s);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            error_report("virtio-scsi: unable to start vhost: %s",
 | 
			
		||||
                         strerror(-ret));
 | 
			
		||||
 | 
			
		||||
            /* There is no userspace virtio-scsi fallback so exit */
 | 
			
		||||
            error_report("unable to start vhost-scsi: %s", strerror(-ret));
 | 
			
		||||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -208,7 +138,7 @@ static void vhost_dummy_handle_output(VirtIODevice *vdev, VirtQueue *vq)
 | 
			
		|||
static void vhost_scsi_realize(DeviceState *dev, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(dev);
 | 
			
		||||
    VHostSCSI *s = VHOST_SCSI(dev);
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
 | 
			
		||||
    Error *err = NULL;
 | 
			
		||||
    int vhostfd = -1;
 | 
			
		||||
    int ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -243,21 +173,21 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
 | 
			
		|||
        goto close_fd;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    error_setg(&s->migration_blocker,
 | 
			
		||||
    error_setg(&vsc->migration_blocker,
 | 
			
		||||
               "vhost-scsi does not support migration");
 | 
			
		||||
    migrate_add_blocker(s->migration_blocker, &err);
 | 
			
		||||
    migrate_add_blocker(vsc->migration_blocker, &err);
 | 
			
		||||
    if (err) {
 | 
			
		||||
        error_propagate(errp, err);
 | 
			
		||||
        error_free(s->migration_blocker);
 | 
			
		||||
        error_free(vsc->migration_blocker);
 | 
			
		||||
        goto close_fd;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues;
 | 
			
		||||
    s->dev.vqs = g_new(struct vhost_virtqueue, s->dev.nvqs);
 | 
			
		||||
    s->dev.vq_index = 0;
 | 
			
		||||
    s->dev.backend_features = 0;
 | 
			
		||||
    vsc->dev.nvqs = VHOST_SCSI_VQ_NUM_FIXED + vs->conf.num_queues;
 | 
			
		||||
    vsc->dev.vqs = g_new(struct vhost_virtqueue, vsc->dev.nvqs);
 | 
			
		||||
    vsc->dev.vq_index = 0;
 | 
			
		||||
    vsc->dev.backend_features = 0;
 | 
			
		||||
 | 
			
		||||
    ret = vhost_dev_init(&s->dev, (void *)(uintptr_t)vhostfd,
 | 
			
		||||
    ret = vhost_dev_init(&vsc->dev, (void *)(uintptr_t)vhostfd,
 | 
			
		||||
                         VHOST_BACKEND_TYPE_KERNEL, 0);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        error_setg(errp, "vhost-scsi: vhost initialization failed: %s",
 | 
			
		||||
| 
						 | 
				
			
			@ -266,16 +196,16 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    /* At present, channel and lun both are 0 for bootable vhost-scsi disk */
 | 
			
		||||
    s->channel = 0;
 | 
			
		||||
    s->lun = 0;
 | 
			
		||||
    vsc->channel = 0;
 | 
			
		||||
    vsc->lun = 0;
 | 
			
		||||
    /* Note: we can also get the minimum tpgt from kernel */
 | 
			
		||||
    s->target = vs->conf.boot_tpgt;
 | 
			
		||||
    vsc->target = vs->conf.boot_tpgt;
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
 free_vqs:
 | 
			
		||||
    migrate_del_blocker(s->migration_blocker);
 | 
			
		||||
    g_free(s->dev.vqs);
 | 
			
		||||
    migrate_del_blocker(vsc->migration_blocker);
 | 
			
		||||
    g_free(vsc->dev.vqs);
 | 
			
		||||
 close_fd:
 | 
			
		||||
    close(vhostfd);
 | 
			
		||||
    return;
 | 
			
		||||
| 
						 | 
				
			
			@ -284,42 +214,28 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
 | 
			
		|||
static void vhost_scsi_unrealize(DeviceState *dev, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
 | 
			
		||||
    VHostSCSI *s = VHOST_SCSI(dev);
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(dev);
 | 
			
		||||
 | 
			
		||||
    migrate_del_blocker(s->migration_blocker);
 | 
			
		||||
    error_free(s->migration_blocker);
 | 
			
		||||
    migrate_del_blocker(vsc->migration_blocker);
 | 
			
		||||
    error_free(vsc->migration_blocker);
 | 
			
		||||
 | 
			
		||||
    /* This will stop vhost backend. */
 | 
			
		||||
    vhost_scsi_set_status(vdev, 0);
 | 
			
		||||
 | 
			
		||||
    vhost_dev_cleanup(&s->dev);
 | 
			
		||||
    g_free(s->dev.vqs);
 | 
			
		||||
    vhost_dev_cleanup(&vsc->dev);
 | 
			
		||||
    g_free(vsc->dev.vqs);
 | 
			
		||||
 | 
			
		||||
    virtio_scsi_common_unrealize(dev, errp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Implementation of an interface to adjust firmware path
 | 
			
		||||
 * for the bootindex property handling.
 | 
			
		||||
 */
 | 
			
		||||
static char *vhost_scsi_get_fw_dev_path(FWPathProvider *p, BusState *bus,
 | 
			
		||||
                                        DeviceState *dev)
 | 
			
		||||
{
 | 
			
		||||
    VHostSCSI *s = VHOST_SCSI(dev);
 | 
			
		||||
    /* format: channel@channel/vhost-scsi@target,lun */
 | 
			
		||||
    return g_strdup_printf("/channel@%x/%s@%x,%x", s->channel,
 | 
			
		||||
                           qdev_fw_name(dev), s->target, s->lun);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Property vhost_scsi_properties[] = {
 | 
			
		||||
    DEFINE_PROP_STRING("vhostfd", VHostSCSI, parent_obj.conf.vhostfd),
 | 
			
		||||
    DEFINE_PROP_STRING("wwpn", VHostSCSI, parent_obj.conf.wwpn),
 | 
			
		||||
    DEFINE_PROP_UINT32("boot_tpgt", VHostSCSI, parent_obj.conf.boot_tpgt, 0),
 | 
			
		||||
    DEFINE_PROP_UINT32("num_queues", VHostSCSI, parent_obj.conf.num_queues, 1),
 | 
			
		||||
    DEFINE_PROP_UINT32("max_sectors", VHostSCSI, parent_obj.conf.max_sectors,
 | 
			
		||||
                                                 0xFFFF),
 | 
			
		||||
    DEFINE_PROP_UINT32("cmd_per_lun", VHostSCSI, parent_obj.conf.cmd_per_lun,
 | 
			
		||||
                                                 128),
 | 
			
		||||
    DEFINE_PROP_STRING("vhostfd", VirtIOSCSICommon, conf.vhostfd),
 | 
			
		||||
    DEFINE_PROP_STRING("wwpn", VirtIOSCSICommon, conf.wwpn),
 | 
			
		||||
    DEFINE_PROP_UINT32("boot_tpgt", VirtIOSCSICommon, conf.boot_tpgt, 0),
 | 
			
		||||
    DEFINE_PROP_UINT32("num_queues", VirtIOSCSICommon, conf.num_queues, 1),
 | 
			
		||||
    DEFINE_PROP_UINT32("max_sectors", VirtIOSCSICommon, conf.max_sectors,
 | 
			
		||||
                       0xFFFF),
 | 
			
		||||
    DEFINE_PROP_UINT32("cmd_per_lun", VirtIOSCSICommon, conf.cmd_per_lun, 128),
 | 
			
		||||
    DEFINE_PROP_END_OF_LIST(),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -333,23 +249,25 @@ static void vhost_scsi_class_init(ObjectClass *klass, void *data)
 | 
			
		|||
    set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
 | 
			
		||||
    vdc->realize = vhost_scsi_realize;
 | 
			
		||||
    vdc->unrealize = vhost_scsi_unrealize;
 | 
			
		||||
    vdc->get_features = vhost_scsi_get_features;
 | 
			
		||||
    vdc->set_config = vhost_scsi_set_config;
 | 
			
		||||
    vdc->get_features = vhost_scsi_common_get_features;
 | 
			
		||||
    vdc->set_config = vhost_scsi_common_set_config;
 | 
			
		||||
    vdc->set_status = vhost_scsi_set_status;
 | 
			
		||||
    fwc->get_dev_path = vhost_scsi_get_fw_dev_path;
 | 
			
		||||
    fwc->get_dev_path = vhost_scsi_common_get_fw_dev_path;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void vhost_scsi_instance_init(Object *obj)
 | 
			
		||||
{
 | 
			
		||||
    VHostSCSI *dev = VHOST_SCSI(obj);
 | 
			
		||||
    VHostSCSICommon *vsc = VHOST_SCSI_COMMON(obj);
 | 
			
		||||
 | 
			
		||||
    device_add_bootindex_property(obj, &dev->bootindex, "bootindex", NULL,
 | 
			
		||||
                                  DEVICE(dev), NULL);
 | 
			
		||||
    vsc->feature_bits = kernel_feature_bits;
 | 
			
		||||
 | 
			
		||||
    device_add_bootindex_property(obj, &vsc->bootindex, "bootindex", NULL,
 | 
			
		||||
                                  DEVICE(vsc), NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const TypeInfo vhost_scsi_info = {
 | 
			
		||||
    .name = TYPE_VHOST_SCSI,
 | 
			
		||||
    .parent = TYPE_VIRTIO_SCSI_COMMON,
 | 
			
		||||
    .parent = TYPE_VHOST_SCSI_COMMON,
 | 
			
		||||
    .instance_size = sizeof(VHostSCSI),
 | 
			
		||||
    .class_init = vhost_scsi_class_init,
 | 
			
		||||
    .instance_init = vhost_scsi_instance_init,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -202,7 +202,7 @@ pvscsi_ring_init_msg(PVSCSIRingInfo *m, PVSCSICmdDescSetupMsgRing *ri)
 | 
			
		|||
    uint32_t len_log2;
 | 
			
		||||
    uint32_t ring_size;
 | 
			
		||||
 | 
			
		||||
    if (ri->numPages > PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES) {
 | 
			
		||||
    if (!ri->numPages || ri->numPages > PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES) {
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
    ring_size = ri->numPages * PVSCSI_MAX_NUM_MSG_ENTRIES_PER_PAGE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -131,17 +131,37 @@ typedef struct AcpiTableHeader AcpiTableHeader;
 | 
			
		|||
    uint8_t  duty_width;   /* Bit width of duty cycle field in p_cnt reg */ \
 | 
			
		||||
    uint8_t  day_alrm;     /* Index to day-of-month alarm in RTC CMOS RAM */ \
 | 
			
		||||
    uint8_t  mon_alrm;     /* Index to month-of-year alarm in RTC CMOS RAM */ \
 | 
			
		||||
    uint8_t  century;      /* Index to century in RTC CMOS RAM */
 | 
			
		||||
 | 
			
		||||
struct AcpiFadtDescriptorRev1
 | 
			
		||||
{
 | 
			
		||||
    ACPI_FADT_COMMON_DEF
 | 
			
		||||
    uint8_t  reserved4;              /* Reserved */
 | 
			
		||||
    uint8_t  reserved4a;             /* Reserved */
 | 
			
		||||
    uint8_t  reserved4b;             /* Reserved */
 | 
			
		||||
    uint32_t flags;
 | 
			
		||||
} QEMU_PACKED;
 | 
			
		||||
typedef struct AcpiFadtDescriptorRev1 AcpiFadtDescriptorRev1;
 | 
			
		||||
    uint8_t  century;      /* Index to century in RTC CMOS RAM */ \
 | 
			
		||||
    /* IA-PC Boot Architecture Flags (see below for individual flags) */ \
 | 
			
		||||
    uint16_t boot_flags; \
 | 
			
		||||
    uint8_t reserved;    /* Reserved, must be zero */ \
 | 
			
		||||
    /* Miscellaneous flag bits (see below for individual flags) */ \
 | 
			
		||||
    uint32_t flags; \
 | 
			
		||||
    /* 64-bit address of the Reset register */ \
 | 
			
		||||
    struct AcpiGenericAddress reset_register; \
 | 
			
		||||
    /* Value to write to the reset_register port to reset the system */ \
 | 
			
		||||
    uint8_t reset_value; \
 | 
			
		||||
    /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ \
 | 
			
		||||
    uint16_t arm_boot_flags; \
 | 
			
		||||
    uint8_t minor_revision;  /* FADT Minor Revision (ACPI 5.1) */ \
 | 
			
		||||
    uint64_t Xfacs;          /* 64-bit physical address of FACS */ \
 | 
			
		||||
    uint64_t Xdsdt;          /* 64-bit physical address of DSDT */ \
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1a Event Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xpm1a_event_block; \
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1b Event Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xpm1b_event_block; \
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1a Control Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xpm1a_control_block; \
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1b Control Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xpm1b_control_block; \
 | 
			
		||||
    /* 64-bit Extended Power Mgt 2 Control Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xpm2_control_block; \
 | 
			
		||||
    /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xpm_timer_block; \
 | 
			
		||||
    /* 64-bit Extended General Purpose Event 0 Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xgpe0_block; \
 | 
			
		||||
    /* 64-bit Extended General Purpose Event 1 Reg Blk address */ \
 | 
			
		||||
    struct AcpiGenericAddress xgpe1_block; \
 | 
			
		||||
 | 
			
		||||
struct AcpiGenericAddress {
 | 
			
		||||
    uint8_t space_id;        /* Address space where struct or register exists */
 | 
			
		||||
| 
						 | 
				
			
			@ -151,38 +171,13 @@ struct AcpiGenericAddress {
 | 
			
		|||
    uint64_t address;        /* 64-bit address of struct or register */
 | 
			
		||||
} QEMU_PACKED;
 | 
			
		||||
 | 
			
		||||
struct AcpiFadtDescriptorRev3 {
 | 
			
		||||
    ACPI_FADT_COMMON_DEF
 | 
			
		||||
} QEMU_PACKED;
 | 
			
		||||
typedef struct AcpiFadtDescriptorRev3 AcpiFadtDescriptorRev3;
 | 
			
		||||
 | 
			
		||||
struct AcpiFadtDescriptorRev5_1 {
 | 
			
		||||
    ACPI_FADT_COMMON_DEF
 | 
			
		||||
    /* IA-PC Boot Architecture Flags (see below for individual flags) */
 | 
			
		||||
    uint16_t boot_flags;
 | 
			
		||||
    uint8_t reserved;    /* Reserved, must be zero */
 | 
			
		||||
    /* Miscellaneous flag bits (see below for individual flags) */
 | 
			
		||||
    uint32_t flags;
 | 
			
		||||
    /* 64-bit address of the Reset register */
 | 
			
		||||
    struct AcpiGenericAddress reset_register;
 | 
			
		||||
    /* Value to write to the reset_register port to reset the system */
 | 
			
		||||
    uint8_t reset_value;
 | 
			
		||||
    /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */
 | 
			
		||||
    uint16_t arm_boot_flags;
 | 
			
		||||
    uint8_t minor_revision;  /* FADT Minor Revision (ACPI 5.1) */
 | 
			
		||||
    uint64_t Xfacs;          /* 64-bit physical address of FACS */
 | 
			
		||||
    uint64_t Xdsdt;          /* 64-bit physical address of DSDT */
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1a Event Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xpm1a_event_block;
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1b Event Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xpm1b_event_block;
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1a Control Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xpm1a_control_block;
 | 
			
		||||
    /* 64-bit Extended Power Mgt 1b Control Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xpm1b_control_block;
 | 
			
		||||
    /* 64-bit Extended Power Mgt 2 Control Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xpm2_control_block;
 | 
			
		||||
    /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xpm_timer_block;
 | 
			
		||||
    /* 64-bit Extended General Purpose Event 0 Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xgpe0_block;
 | 
			
		||||
    /* 64-bit Extended General Purpose Event 1 Reg Blk address */
 | 
			
		||||
    struct AcpiGenericAddress xgpe1_block;
 | 
			
		||||
    /* 64-bit Sleep Control register (ACPI 5.0) */
 | 
			
		||||
    struct AcpiGenericAddress sleep_control;
 | 
			
		||||
    /* 64-bit Sleep Status register (ACPI 5.0) */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -303,6 +303,12 @@ typedef struct PCII440FXState PCII440FXState;
 | 
			
		|||
 | 
			
		||||
#define TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "igd-passthrough-i440FX"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Reset Control Register: PCI-accessible ISA-Compatible Register at address
 | 
			
		||||
 * 0xcf9, provided by the PCI/ISA bridge (PIIX3 PCI function 0, 8086:7000).
 | 
			
		||||
 */
 | 
			
		||||
#define RCR_IOPORT 0xcf9
 | 
			
		||||
 | 
			
		||||
PCIBus *i440fx_init(const char *host_type, const char *pci_type,
 | 
			
		||||
                    PCII440FXState **pi440fx_state, int *piix_devfn,
 | 
			
		||||
                    ISABus **isa_bus, qemu_irq *pic,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,48 @@
 | 
			
		|||
/*
 | 
			
		||||
 * vhost_scsi host device
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2016 Nutanix Inc. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *  Felipe Franciosi <felipe@nutanix.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This work is licensed under the terms of the GNU LGPL, version 2 or later.
 | 
			
		||||
 * See the COPYING.LIB file in the top-level directory.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef VHOST_SCSI_COMMON_H
 | 
			
		||||
#define VHOST_SCSI_COMMON_H
 | 
			
		||||
 | 
			
		||||
#include "qemu-common.h"
 | 
			
		||||
#include "hw/qdev.h"
 | 
			
		||||
#include "hw/virtio/virtio-scsi.h"
 | 
			
		||||
#include "hw/virtio/vhost.h"
 | 
			
		||||
#include "hw/fw-path-provider.h"
 | 
			
		||||
 | 
			
		||||
#define TYPE_VHOST_SCSI_COMMON "vhost-scsi-common"
 | 
			
		||||
#define VHOST_SCSI_COMMON(obj) \
 | 
			
		||||
        OBJECT_CHECK(VHostSCSICommon, (obj), TYPE_VHOST_SCSI_COMMON)
 | 
			
		||||
 | 
			
		||||
typedef struct VHostSCSICommon {
 | 
			
		||||
    VirtIOSCSICommon parent_obj;
 | 
			
		||||
 | 
			
		||||
    Error *migration_blocker;
 | 
			
		||||
 | 
			
		||||
    struct vhost_dev dev;
 | 
			
		||||
    const int *feature_bits;
 | 
			
		||||
    int32_t bootindex;
 | 
			
		||||
    int channel;
 | 
			
		||||
    int target;
 | 
			
		||||
    int lun;
 | 
			
		||||
} VHostSCSICommon;
 | 
			
		||||
 | 
			
		||||
int vhost_scsi_common_start(VHostSCSICommon *vsc);
 | 
			
		||||
void vhost_scsi_common_stop(VHostSCSICommon *vsc);
 | 
			
		||||
char *vhost_scsi_common_get_fw_dev_path(FWPathProvider *p, BusState *bus,
 | 
			
		||||
                                        DeviceState *dev);
 | 
			
		||||
void vhost_scsi_common_set_config(VirtIODevice *vdev, const uint8_t *config);
 | 
			
		||||
uint64_t vhost_scsi_common_get_features(VirtIODevice *vdev, uint64_t features,
 | 
			
		||||
                                        Error **errp);
 | 
			
		||||
 | 
			
		||||
#endif /* VHOST_SCSI_COMMON_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,7 @@
 | 
			
		|||
#include "hw/qdev.h"
 | 
			
		||||
#include "hw/virtio/virtio-scsi.h"
 | 
			
		||||
#include "hw/virtio/vhost.h"
 | 
			
		||||
#include "hw/virtio/vhost-scsi-common.h"
 | 
			
		||||
 | 
			
		||||
enum vhost_scsi_vq_list {
 | 
			
		||||
    VHOST_SCSI_VQ_CONTROL = 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -30,15 +31,7 @@ enum vhost_scsi_vq_list {
 | 
			
		|||
        OBJECT_CHECK(VHostSCSI, (obj), TYPE_VHOST_SCSI)
 | 
			
		||||
 | 
			
		||||
typedef struct VHostSCSI {
 | 
			
		||||
    VirtIOSCSICommon parent_obj;
 | 
			
		||||
 | 
			
		||||
    Error *migration_blocker;
 | 
			
		||||
 | 
			
		||||
    struct vhost_dev dev;
 | 
			
		||||
    int32_t bootindex;
 | 
			
		||||
    int channel;
 | 
			
		||||
    int target;
 | 
			
		||||
    int lun;
 | 
			
		||||
    VHostSCSICommon parent_obj;
 | 
			
		||||
} VHostSCSI;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,8 +49,10 @@ struct VirtIOSCSIConf {
 | 
			
		|||
    uint32_t num_queues;
 | 
			
		||||
    uint32_t max_sectors;
 | 
			
		||||
    uint32_t cmd_per_lun;
 | 
			
		||||
#ifdef CONFIG_VHOST_SCSI
 | 
			
		||||
    char *vhostfd;
 | 
			
		||||
    char *wwpn;
 | 
			
		||||
#endif
 | 
			
		||||
    uint32_t boot_tpgt;
 | 
			
		||||
    IOThread *iothread;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,7 +82,9 @@
 | 
			
		|||
        int:(x) ? -1 : 1; \
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef __COUNTER__
 | 
			
		||||
#if defined(CONFIG_STATIC_ASSERT)
 | 
			
		||||
#define QEMU_BUILD_BUG_ON(x) _Static_assert(!(x), "not expecting: " #x)
 | 
			
		||||
#elif defined(__COUNTER__)
 | 
			
		||||
#define QEMU_BUILD_BUG_ON(x) typedef QEMU_BUILD_BUG_ON_STRUCT(x) \
 | 
			
		||||
    glue(qemu_build_bug_on__, __COUNTER__) __attribute__((unused))
 | 
			
		||||
#else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,7 +101,7 @@ struct Chardev {
 | 
			
		|||
    char *filename;
 | 
			
		||||
    int logfd;
 | 
			
		||||
    int be_open;
 | 
			
		||||
    guint fd_in_tag;
 | 
			
		||||
    GSource *gsource;
 | 
			
		||||
    DECLARE_BITMAP(features, QEMU_CHAR_FEATURE_LAST);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,6 +157,7 @@ typedef struct DumpState {
 | 
			
		|||
    uint32_t sh_info;
 | 
			
		||||
    bool have_section;
 | 
			
		||||
    bool resume;
 | 
			
		||||
    bool detached;
 | 
			
		||||
    ssize_t note_size;
 | 
			
		||||
    hwaddr memory_offset;
 | 
			
		||||
    int fd;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -31,7 +31,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
 | 
			
		|||
    "-machine [type=]name[,prop[=value][,...]]\n"
 | 
			
		||||
    "                selects emulated machine ('-machine help' for list)\n"
 | 
			
		||||
    "                property accel=accel1[:accel2[:...]] selects accelerator\n"
 | 
			
		||||
    "                supported accelerators are kvm, xen, tcg (default: tcg)\n"
 | 
			
		||||
    "                supported accelerators are kvm, xen, hax or tcg (default: tcg)\n"
 | 
			
		||||
    "                kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n"
 | 
			
		||||
    "                vmport=on|off|auto controls emulation of vmport (default: auto)\n"
 | 
			
		||||
    "                kvm_shadow_mem=size of KVM shadow MMU in bytes\n"
 | 
			
		||||
| 
						 | 
				
			
			@ -52,9 +52,9 @@ available machines. Supported machine properties are:
 | 
			
		|||
@table @option
 | 
			
		||||
@item accel=@var{accels1}[:@var{accels2}[:...]]
 | 
			
		||||
This is used to enable an accelerator. Depending on the target architecture,
 | 
			
		||||
kvm, xen, or tcg can be available. By default, tcg is used. If there is more
 | 
			
		||||
than one accelerator specified, the next one is used if the previous one fails
 | 
			
		||||
to initialize.
 | 
			
		||||
kvm, xen, hax or tcg can be available. By default, tcg is used. If there is
 | 
			
		||||
more than one accelerator specified, the next one is used if the previous one
 | 
			
		||||
fails to initialize.
 | 
			
		||||
@item kernel_irqchip=on|off
 | 
			
		||||
Controls in-kernel irqchip support for the chosen accelerator when available.
 | 
			
		||||
@item gfx_passthru=on|off
 | 
			
		||||
| 
						 | 
				
			
			@ -97,15 +97,15 @@ ETEXI
 | 
			
		|||
 | 
			
		||||
DEF("accel", HAS_ARG, QEMU_OPTION_accel,
 | 
			
		||||
    "-accel [accel=]accelerator[,thread=single|multi]\n"
 | 
			
		||||
    "               select accelerator ('-accel help for list')\n"
 | 
			
		||||
    "               thread=single|multi (enable multi-threaded TCG)", QEMU_ARCH_ALL)
 | 
			
		||||
    "                select accelerator (kvm, xen, hax or tcg; use 'help' for a list)\n"
 | 
			
		||||
    "                thread=single|multi (enable multi-threaded TCG)", QEMU_ARCH_ALL)
 | 
			
		||||
STEXI
 | 
			
		||||
@item -accel @var{name}[,prop=@var{value}[,...]]
 | 
			
		||||
@findex -accel
 | 
			
		||||
This is used to enable an accelerator. Depending on the target architecture,
 | 
			
		||||
kvm, xen, or tcg can be available. By default, tcg is used. If there is more
 | 
			
		||||
than one accelerator specified, the next one is used if the previous one fails
 | 
			
		||||
to initialize.
 | 
			
		||||
kvm, xen, hax or tcg can be available. By default, tcg is used. If there is
 | 
			
		||||
more than one accelerator specified, the next one is used if the previous one
 | 
			
		||||
fails to initialize.
 | 
			
		||||
@table @option
 | 
			
		||||
@item thread=single|multi
 | 
			
		||||
Controls number of TCG threads. When the TCG is multi-threaded there will be one
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
Subproject commit 23d474943dcd55d0550a3d20b3d30e9040a4f15b
 | 
			
		||||
Subproject commit cbaee52287e5f32373181cff50a00b6c4ac9015a
 | 
			
		||||
| 
						 | 
				
			
			@ -2571,6 +2571,27 @@ sub process {
 | 
			
		|||
		if ($line =~ /\bbzero\(/) {
 | 
			
		||||
			ERROR("use memset() instead of bzero()\n" . $herecurr);
 | 
			
		||||
		}
 | 
			
		||||
		my $non_exit_glib_asserts = qr{g_assert_cmpstr|
 | 
			
		||||
						g_assert_cmpint|
 | 
			
		||||
						g_assert_cmpuint|
 | 
			
		||||
						g_assert_cmphex|
 | 
			
		||||
						g_assert_cmpfloat|
 | 
			
		||||
						g_assert_true|
 | 
			
		||||
						g_assert_false|
 | 
			
		||||
						g_assert_nonnull|
 | 
			
		||||
						g_assert_null|
 | 
			
		||||
						g_assert_no_error|
 | 
			
		||||
						g_assert_error|
 | 
			
		||||
						g_test_assert_expected_messages|
 | 
			
		||||
						g_test_trap_assert_passed|
 | 
			
		||||
						g_test_trap_assert_stdout|
 | 
			
		||||
						g_test_trap_assert_stdout_unmatched|
 | 
			
		||||
						g_test_trap_assert_stderr|
 | 
			
		||||
						g_test_trap_assert_stderr_unmatched}x;
 | 
			
		||||
		if ($realfile !~ /^tests\// &&
 | 
			
		||||
			$line =~ /\b(?:$non_exit_glib_asserts)\(/) {
 | 
			
		||||
			ERROR("Use g_assert or g_assert_not_reached\n". $herecurr);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# If we have no input at all, then there is nothing to report on
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,7 @@ my $lk_path = "./";
 | 
			
		|||
my $email = 1;
 | 
			
		||||
my $email_usename = 1;
 | 
			
		||||
my $email_maintainer = 1;
 | 
			
		||||
my $email_reviewer = 1;
 | 
			
		||||
my $email_list = 1;
 | 
			
		||||
my $email_subscriber_list = 0;
 | 
			
		||||
my $email_git = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -180,6 +181,7 @@ if (!GetOptions(
 | 
			
		|||
		'remove-duplicates!' => \$email_remove_duplicates,
 | 
			
		||||
		'mailmap!' => \$email_use_mailmap,
 | 
			
		||||
		'm!' => \$email_maintainer,
 | 
			
		||||
		'r!' => \$email_reviewer,
 | 
			
		||||
		'n!' => \$email_usename,
 | 
			
		||||
		'l!' => \$email_list,
 | 
			
		||||
		's!' => \$email_subscriber_list,
 | 
			
		||||
| 
						 | 
				
			
			@ -238,7 +240,8 @@ if ($sections) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
if ($email &&
 | 
			
		||||
    ($email_maintainer + $email_list + $email_subscriber_list +
 | 
			
		||||
    ($email_maintainer + $email_reviewer +
 | 
			
		||||
     $email_list + $email_subscriber_list +
 | 
			
		||||
     $email_git + $email_git_blame) == 0) {
 | 
			
		||||
    die "$P: Please select at least 1 email option\n";
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -718,6 +721,7 @@ MAINTAINER field selection options:
 | 
			
		|||
    --hg-since => hg history to use (default: $email_hg_since)
 | 
			
		||||
    --interactive => display a menu (mostly useful if used with the --git option)
 | 
			
		||||
    --m => include maintainer(s) if any
 | 
			
		||||
    --r => include reviewer(s) if any
 | 
			
		||||
    --n => include name 'Full Name <addr\@domain.tld>'
 | 
			
		||||
    --l => include list(s) if any
 | 
			
		||||
    --s => include subscriber only list(s) if any
 | 
			
		||||
| 
						 | 
				
			
			@ -744,7 +748,7 @@ Other options:
 | 
			
		|||
  --help => show this help information
 | 
			
		||||
 | 
			
		||||
Default options:
 | 
			
		||||
  [--email --nogit --git-fallback --m --n --l --multiline -pattern-depth=0
 | 
			
		||||
  [--email --nogit --git-fallback --m --r --n --l --multiline --pattern-depth=0
 | 
			
		||||
   --remove-duplicates --rolestats]
 | 
			
		||||
 | 
			
		||||
Notes:
 | 
			
		||||
| 
						 | 
				
			
			@ -892,6 +896,20 @@ sub find_ending_index {
 | 
			
		|||
    return $index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_subsystem_name {
 | 
			
		||||
    my ($index) = @_;
 | 
			
		||||
 | 
			
		||||
    my $start = find_starting_index($index);
 | 
			
		||||
 | 
			
		||||
    my $subsystem = $typevalue[$start];
 | 
			
		||||
    if (length($subsystem) > 20) {
 | 
			
		||||
	$subsystem = substr($subsystem, 0, 17);
 | 
			
		||||
	$subsystem =~ s/\s*$//;
 | 
			
		||||
	$subsystem = $subsystem . "...";
 | 
			
		||||
    }
 | 
			
		||||
    return $subsystem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_maintainer_role {
 | 
			
		||||
    my ($index) = @_;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -900,12 +918,7 @@ sub get_maintainer_role {
 | 
			
		|||
    my $end = find_ending_index($index);
 | 
			
		||||
 | 
			
		||||
    my $role = "unknown";
 | 
			
		||||
    my $subsystem = $typevalue[$start];
 | 
			
		||||
    if (length($subsystem) > 20) {
 | 
			
		||||
	$subsystem = substr($subsystem, 0, 17);
 | 
			
		||||
	$subsystem =~ s/\s*$//;
 | 
			
		||||
	$subsystem = $subsystem . "...";
 | 
			
		||||
    }
 | 
			
		||||
    my $subsystem = get_subsystem_name($index);
 | 
			
		||||
 | 
			
		||||
    for ($i = $start + 1; $i < $end; $i++) {
 | 
			
		||||
	my $tv = $typevalue[$i];
 | 
			
		||||
| 
						 | 
				
			
			@ -939,16 +952,7 @@ sub get_maintainer_role {
 | 
			
		|||
sub get_list_role {
 | 
			
		||||
    my ($index) = @_;
 | 
			
		||||
 | 
			
		||||
    my $i;
 | 
			
		||||
    my $start = find_starting_index($index);
 | 
			
		||||
    my $end = find_ending_index($index);
 | 
			
		||||
 | 
			
		||||
    my $subsystem = $typevalue[$start];
 | 
			
		||||
    if (length($subsystem) > 20) {
 | 
			
		||||
	$subsystem = substr($subsystem, 0, 17);
 | 
			
		||||
	$subsystem =~ s/\s*$//;
 | 
			
		||||
	$subsystem = $subsystem . "...";
 | 
			
		||||
    }
 | 
			
		||||
    my $subsystem = get_subsystem_name($index);
 | 
			
		||||
 | 
			
		||||
    if ($subsystem eq "THE REST") {
 | 
			
		||||
	$subsystem = "";
 | 
			
		||||
| 
						 | 
				
			
			@ -1022,6 +1026,23 @@ sub add_categories {
 | 
			
		|||
		    my $role = get_maintainer_role($i);
 | 
			
		||||
		    push_email_addresses($pvalue, $role);
 | 
			
		||||
		}
 | 
			
		||||
	    } elsif ($ptype eq "R") {
 | 
			
		||||
		my ($name, $address) = parse_email($pvalue);
 | 
			
		||||
		if ($name eq "") {
 | 
			
		||||
		    if ($i > 0) {
 | 
			
		||||
			my $tv = $typevalue[$i - 1];
 | 
			
		||||
			if ($tv =~ m/^(.):\s*(.*)/) {
 | 
			
		||||
			    if ($1 eq "P") {
 | 
			
		||||
				$name = $2;
 | 
			
		||||
				$pvalue = format_email($name, $address, $email_usename);
 | 
			
		||||
			    }
 | 
			
		||||
			}
 | 
			
		||||
		    }
 | 
			
		||||
		}
 | 
			
		||||
		if ($email_reviewer) {
 | 
			
		||||
		    my $subsystem = get_subsystem_name($i);
 | 
			
		||||
		    push_email_addresses($pvalue, "reviewer:$subsystem");
 | 
			
		||||
		}
 | 
			
		||||
	    } elsif ($ptype eq "T") {
 | 
			
		||||
		push(@scm, $pvalue);
 | 
			
		||||
	    } elsif ($ptype eq "W") {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2577,6 +2577,15 @@ out:
 | 
			
		|||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gchar *x86_gdb_arch_name(CPUState *cs)
 | 
			
		||||
{
 | 
			
		||||
#ifdef TARGET_X86_64
 | 
			
		||||
    return g_strdup("i386:x86-64");
 | 
			
		||||
#else
 | 
			
		||||
    return g_strdup("i386");
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
X86CPU *cpu_x86_init(const char *cpu_model)
 | 
			
		||||
{
 | 
			
		||||
    return X86_CPU(cpu_generic_init(TYPE_X86_CPU, cpu_model));
 | 
			
		||||
| 
						 | 
				
			
			@ -4056,10 +4065,14 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
 | 
			
		|||
    cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
 | 
			
		||||
    cc->vmsd = &vmstate_x86_cpu;
 | 
			
		||||
#endif
 | 
			
		||||
    /* CPU_NB_REGS * 2 = general regs + xmm regs
 | 
			
		||||
     * 25 = eip, eflags, 6 seg regs, st[0-7], fctrl,...,fop, mxcsr.
 | 
			
		||||
     */
 | 
			
		||||
    cc->gdb_num_core_regs = CPU_NB_REGS * 2 + 25;
 | 
			
		||||
    cc->gdb_arch_name = x86_gdb_arch_name;
 | 
			
		||||
#ifdef TARGET_X86_64
 | 
			
		||||
    cc->gdb_core_xml_file = "i386-64bit-core.xml";
 | 
			
		||||
    cc->gdb_num_core_regs = 40;
 | 
			
		||||
#else
 | 
			
		||||
    cc->gdb_core_xml_file = "i386-32bit-core.xml";
 | 
			
		||||
    cc->gdb_num_core_regs = 32;
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef CONFIG_USER_ONLY
 | 
			
		||||
    cc->debug_excp_handler = breakpoint_handler;
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,10 +106,10 @@ static void hax_update_mapping(uint64_t start_pa, uint32_t size,
 | 
			
		|||
                               uint64_t host_va, uint8_t flags)
 | 
			
		||||
{
 | 
			
		||||
    uint64_t end_pa = start_pa + size;
 | 
			
		||||
    uint32_t chunk_sz;
 | 
			
		||||
    HAXMapping *entry, *next;
 | 
			
		||||
 | 
			
		||||
    QTAILQ_FOREACH_SAFE(entry, &mappings, entry, next) {
 | 
			
		||||
        uint32_t chunk_sz;
 | 
			
		||||
        if (start_pa >= entry->start_pa + entry->size) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +121,16 @@ static void hax_update_mapping(uint64_t start_pa, uint32_t size,
 | 
			
		|||
            start_pa += chunk_sz;
 | 
			
		||||
            host_va += chunk_sz;
 | 
			
		||||
            size -= chunk_sz;
 | 
			
		||||
        } else if (start_pa > entry->start_pa) {
 | 
			
		||||
            /* split the existing chunk at start_pa */
 | 
			
		||||
            chunk_sz = start_pa - entry->start_pa;
 | 
			
		||||
            hax_insert_mapping_before(entry, entry->start_pa, chunk_sz,
 | 
			
		||||
                                      entry->host_va, entry->flags);
 | 
			
		||||
            entry->start_pa += chunk_sz;
 | 
			
		||||
            entry->host_va += chunk_sz;
 | 
			
		||||
            entry->size -= chunk_sz;
 | 
			
		||||
        }
 | 
			
		||||
        /* now start_pa == entry->start_pa */
 | 
			
		||||
        chunk_sz = MIN(size, entry->size);
 | 
			
		||||
        if (chunk_sz) {
 | 
			
		||||
            bool nop = hax_mapping_is_opposite(entry, host_va, flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -165,8 +174,14 @@ static void hax_process_section(MemoryRegionSection *section, uint8_t flags)
 | 
			
		|||
    unsigned int delta;
 | 
			
		||||
    uint64_t host_va;
 | 
			
		||||
 | 
			
		||||
    /* We only care about RAM pages */
 | 
			
		||||
    /* We only care about RAM and ROM regions */
 | 
			
		||||
    if (!memory_region_is_ram(mr)) {
 | 
			
		||||
        if (memory_region_is_romd(mr)) {
 | 
			
		||||
            /* HAXM kernel module does not support ROMD yet  */
 | 
			
		||||
            fprintf(stderr, "%s: Warning: Ignoring ROMD region 0x%016" PRIx64
 | 
			
		||||
                    "->0x%016" PRIx64 "\n", __func__, start_pa,
 | 
			
		||||
                    start_pa + size);
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,6 +87,16 @@ typedef struct {
 | 
			
		|||
    g_assert_cmpstr(ACPI_ASSERT_CMP_str, ==, expected); \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define ACPI_READ_GENERIC_ADDRESS(field, addr)       \
 | 
			
		||||
    do {                                             \
 | 
			
		||||
        ACPI_READ_FIELD((field).space_id, addr);     \
 | 
			
		||||
        ACPI_READ_FIELD((field).bit_width, addr);    \
 | 
			
		||||
        ACPI_READ_FIELD((field).bit_offset, addr);   \
 | 
			
		||||
        ACPI_READ_FIELD((field).access_width, addr); \
 | 
			
		||||
        ACPI_READ_FIELD((field).address, addr);      \
 | 
			
		||||
    } while (0);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t acpi_calc_checksum(const uint8_t *data, int len);
 | 
			
		||||
uint32_t acpi_find_rsdp_address(void);
 | 
			
		||||
void acpi_parse_rsdp_table(uint32_t addr, AcpiRsdpDescriptor *rsdp_table);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ typedef struct {
 | 
			
		|||
    uint32_t rsdp_addr;
 | 
			
		||||
    AcpiRsdpDescriptor rsdp_table;
 | 
			
		||||
    AcpiRsdtDescriptorRev1 rsdt_table;
 | 
			
		||||
    AcpiFadtDescriptorRev1 fadt_table;
 | 
			
		||||
    AcpiFadtDescriptorRev3 fadt_table;
 | 
			
		||||
    AcpiFacsDescriptorRev1 facs_table;
 | 
			
		||||
    uint32_t *rsdt_tables_addr;
 | 
			
		||||
    int rsdt_tables_nr;
 | 
			
		||||
| 
						 | 
				
			
			@ -126,7 +126,7 @@ static void test_acpi_rsdt_table(test_data *data)
 | 
			
		|||
 | 
			
		||||
static void test_acpi_fadt_table(test_data *data)
 | 
			
		||||
{
 | 
			
		||||
    AcpiFadtDescriptorRev1 *fadt_table = &data->fadt_table;
 | 
			
		||||
    AcpiFadtDescriptorRev3 *fadt_table = &data->fadt_table;
 | 
			
		||||
    uint32_t addr;
 | 
			
		||||
 | 
			
		||||
    /* FADT table comes first */
 | 
			
		||||
| 
						 | 
				
			
			@ -168,10 +168,23 @@ static void test_acpi_fadt_table(test_data *data)
 | 
			
		|||
    ACPI_READ_FIELD(fadt_table->day_alrm, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->mon_alrm, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->century, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->reserved4, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->reserved4a, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->reserved4b, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->boot_flags, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->reserved, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->flags, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->reset_register, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->reset_value, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->arm_boot_flags, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->minor_revision, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->Xfacs, addr);
 | 
			
		||||
    ACPI_READ_FIELD(fadt_table->Xdsdt, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xpm1a_event_block, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xpm1b_event_block, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xpm1a_control_block, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xpm1b_control_block, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xpm2_control_block, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xpm_timer_block, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xgpe0_block, addr);
 | 
			
		||||
    ACPI_READ_GENERIC_ADDRESS(fadt_table->xgpe1_block, addr);
 | 
			
		||||
 | 
			
		||||
    ACPI_ASSERT_CMP(fadt_table->signature, "FACP");
 | 
			
		||||
    g_assert(!acpi_calc_checksum((uint8_t *)fadt_table, fadt_table->length));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@
 | 
			
		|||
#include "qemu/thread.h"
 | 
			
		||||
#include "qemu/atomic.h"
 | 
			
		||||
#include "qemu/notify.h"
 | 
			
		||||
#include "trace.h"
 | 
			
		||||
 | 
			
		||||
static bool name_threads;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -60,17 +61,30 @@ void qemu_mutex_lock(QemuMutex *mutex)
 | 
			
		|||
    err = pthread_mutex_lock(&mutex->lock);
 | 
			
		||||
    if (err)
 | 
			
		||||
        error_exit(err, __func__);
 | 
			
		||||
 | 
			
		||||
    trace_qemu_mutex_locked(mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qemu_mutex_trylock(QemuMutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
    return pthread_mutex_trylock(&mutex->lock);
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    err = pthread_mutex_trylock(&mutex->lock);
 | 
			
		||||
    if (err == 0) {
 | 
			
		||||
        trace_qemu_mutex_locked(mutex);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (err != EBUSY) {
 | 
			
		||||
        error_exit(err, __func__);
 | 
			
		||||
    }
 | 
			
		||||
    return -EBUSY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_mutex_unlock(QemuMutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    trace_qemu_mutex_unlocked(mutex);
 | 
			
		||||
    err = pthread_mutex_unlock(&mutex->lock);
 | 
			
		||||
    if (err)
 | 
			
		||||
        error_exit(err, __func__);
 | 
			
		||||
| 
						 | 
				
			
			@ -130,7 +144,9 @@ void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
 | 
			
		|||
{
 | 
			
		||||
    int err;
 | 
			
		||||
 | 
			
		||||
    trace_qemu_mutex_unlocked(mutex);
 | 
			
		||||
    err = pthread_cond_wait(&cond->cond, &mutex->lock);
 | 
			
		||||
    trace_qemu_mutex_locked(mutex);
 | 
			
		||||
    if (err)
 | 
			
		||||
        error_exit(err, __func__);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
#include "qemu-common.h"
 | 
			
		||||
#include "qemu/thread.h"
 | 
			
		||||
#include "qemu/notify.h"
 | 
			
		||||
#include "trace.h"
 | 
			
		||||
#include <process.h>
 | 
			
		||||
 | 
			
		||||
static bool name_threads;
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +56,7 @@ void qemu_mutex_destroy(QemuMutex *mutex)
 | 
			
		|||
void qemu_mutex_lock(QemuMutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
    AcquireSRWLockExclusive(&mutex->lock);
 | 
			
		||||
    trace_qemu_mutex_locked(mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qemu_mutex_trylock(QemuMutex *mutex)
 | 
			
		||||
| 
						 | 
				
			
			@ -62,11 +64,16 @@ int qemu_mutex_trylock(QemuMutex *mutex)
 | 
			
		|||
    int owned;
 | 
			
		||||
 | 
			
		||||
    owned = TryAcquireSRWLockExclusive(&mutex->lock);
 | 
			
		||||
    return !owned;
 | 
			
		||||
    if (owned) {
 | 
			
		||||
        trace_qemu_mutex_locked(mutex);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return -EBUSY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_mutex_unlock(QemuMutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
    trace_qemu_mutex_unlocked(mutex);
 | 
			
		||||
    ReleaseSRWLockExclusive(&mutex->lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +125,9 @@ void qemu_cond_broadcast(QemuCond *cond)
 | 
			
		|||
 | 
			
		||||
void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex)
 | 
			
		||||
{
 | 
			
		||||
    trace_qemu_mutex_unlocked(mutex);
 | 
			
		||||
    SleepConditionVariableSRW(&cond->var, &mutex->lock, INFINITE, 0);
 | 
			
		||||
    trace_qemu_mutex_locked(mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_sem_init(QemuSemaphore *sem, int init)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,3 +55,7 @@ lockcnt_futex_wait_prepare(const void *lockcnt, int expected, int new) "lockcnt
 | 
			
		|||
lockcnt_futex_wait(const void *lockcnt, int val) "lockcnt %p waiting on %d"
 | 
			
		||||
lockcnt_futex_wait_resume(const void *lockcnt, int new) "lockcnt %p after wait: %d"
 | 
			
		||||
lockcnt_futex_wake(const void *lockcnt) "lockcnt %p waking up one waiter"
 | 
			
		||||
 | 
			
		||||
# util/qemu-thread-posix.c
 | 
			
		||||
qemu_mutex_locked(void *lock) "locked mutex %p"
 | 
			
		||||
qemu_mutex_unlocked(void *lock) "unlocked mutex %p"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										23
									
								
								vl.c
								
								
								
								
							
							
						
						
									
										23
									
								
								vl.c
								
								
								
								
							| 
						 | 
				
			
			@ -3727,26 +3727,21 @@ int main(int argc, char **argv, char **envp)
 | 
			
		|||
                qdev_prop_register_global(&kvm_pit_lost_tick_policy);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case QEMU_OPTION_accel:
 | 
			
		||||
            case QEMU_OPTION_accel: {
 | 
			
		||||
                QemuOpts *accel_opts;
 | 
			
		||||
 | 
			
		||||
                accel_opts = qemu_opts_parse_noisily(qemu_find_opts("accel"),
 | 
			
		||||
                                                     optarg, true);
 | 
			
		||||
                optarg = qemu_opt_get(accel_opts, "accel");
 | 
			
		||||
 | 
			
		||||
                olist = qemu_find_opts("machine");
 | 
			
		||||
                if (strcmp("kvm", optarg) == 0) {
 | 
			
		||||
                    qemu_opts_parse_noisily(olist, "accel=kvm", false);
 | 
			
		||||
                } else if (strcmp("xen", optarg) == 0) {
 | 
			
		||||
                    qemu_opts_parse_noisily(olist, "accel=xen", false);
 | 
			
		||||
                } else if (strcmp("tcg", optarg) == 0) {
 | 
			
		||||
                    qemu_opts_parse_noisily(olist, "accel=tcg", false);
 | 
			
		||||
                } else {
 | 
			
		||||
                    if (!is_help_option(optarg)) {
 | 
			
		||||
                        error_printf("Unknown accelerator: %s", optarg);
 | 
			
		||||
                    }
 | 
			
		||||
                    error_printf("Supported accelerators: kvm, xen, tcg\n");
 | 
			
		||||
                if (!optarg || is_help_option(optarg)) {
 | 
			
		||||
                    error_printf("Possible accelerators: kvm, xen, hax, tcg\n");
 | 
			
		||||
                    exit(1);
 | 
			
		||||
                }
 | 
			
		||||
                accel_opts = qemu_opts_create(qemu_find_opts("machine"), NULL,
 | 
			
		||||
                                              false, &error_abort);
 | 
			
		||||
                qemu_opt_set(accel_opts, "accel", optarg, &error_abort);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case QEMU_OPTION_usb:
 | 
			
		||||
                olist = qemu_find_opts("machine");
 | 
			
		||||
                qemu_opts_parse_noisily(olist, "usb=on", false);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue