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; | ||||
|     } | ||||
|  | ||||
							
								
								
									
										20
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @ -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 { | ||||
|  | ||||
							
								
								
									
										65
									
								
								gdb-xml/i386-32bit-core.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								gdb-xml/i386-32bit-core.xml
									
									
									
									
									
										Normal file
									
								
							| @ -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> | ||||
							
								
								
									
										73
									
								
								gdb-xml/i386-64bit-core.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								gdb-xml/i386-64bit-core.xml
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||
|  | ||||
							
								
								
									
										143
									
								
								hw/scsi/vhost-scsi-common.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								hw/scsi/vhost-scsi-common.c
									
									
									
									
									
										Normal file
									
								
							| @ -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, | ||||
|  | ||||
							
								
								
									
										48
									
								
								include/hw/virtio/vhost-scsi-common.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								include/hw/virtio/vhost-scsi-common.h
									
									
									
									
									
										Normal file
									
								
							| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Stefan Hajnoczi
						Stefan Hajnoczi