HXCOMM Use DEFHEADING() to define headings in both help text and rST.
HXCOMM Text between SRST and ERST is copied to the rST version and
HXCOMM discarded from C version.
HXCOMM DEF(option, HAS_ARG/0, opt_enum, opt_help, arch_mask) is used to
HXCOMM construct option structures, enums and help message for specified
HXCOMM architectures.
HXCOMM HXCOMM can be used for comments, discarded from both rST and C.

DEFHEADING(Standard options:)

DEF("help", 0, QEMU_OPTION_h,
    "-h or -help     display this help and exit\n", QEMU_ARCH_ALL)
SRST
``-h``
    Display help and exit
ERST

DEF("version", 0, QEMU_OPTION_version,
    "-version        display version information and exit\n", QEMU_ARCH_ALL)
SRST
``-version``
    Display version information and exit
ERST

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, hax, hvf, nvmm, whpx or tcg (default: tcg)\n"
    "                vmport=on|off|auto controls emulation of vmport (default: auto)\n"
    "                dump-guest-core=on|off include guest memory in a core dump (default=on)\n"
    "                mem-merge=on|off controls memory merge support (default: on)\n"
    "                aes-key-wrap=on|off controls support for AES key wrapping (default=on)\n"
    "                dea-key-wrap=on|off controls support for DEA key wrapping (default=on)\n"
    "                suppress-vmdesc=on|off disables self-describing migration (default=off)\n"
    "                nvdimm=on|off controls NVDIMM support (default=off)\n"
    "                memory-encryption=@var{} memory encryption object to use (default=none)\n"
    "                hmat=on|off controls ACPI HMAT support (default=off)\n"
    "                memory-backend='backend-id' specifies explicitly provided backend for main RAM (default=none)\n"
    "                cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n",
    QEMU_ARCH_ALL)
SRST
``-machine [type=]name[,prop=value[,...]]``
    Select the emulated machine by name. Use ``-machine help`` to list
    available machines.

    For architectures which aim to support live migration compatibility
    across releases, each release will introduce a new versioned machine
    type. For example, the 2.8.0 release introduced machine types
    "pc-i440fx-2.8" and "pc-q35-2.8" for the x86\_64/i686 architectures.

    To allow live migration of guests from QEMU version 2.8.0, to QEMU
    version 2.9.0, the 2.9.0 version must support the "pc-i440fx-2.8"
    and "pc-q35-2.8" machines too. To allow users live migrating VMs to
    skip multiple intermediate releases when upgrading, new releases of
    QEMU will support machine types from many previous versions.

    Supported machine properties are:

    ``accel=accels1[:accels2[:...]]``
        This is used to enable an accelerator. Depending on the target
        architecture, kvm, xen, hax, hvf, nvmm, whpx 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.

    ``vmport=on|off|auto``
        Enables emulation of VMWare IO port, for vmmouse etc. auto says
        to select the value based on accel. For accel=xen the default is
        off otherwise the default is on.

    ``dump-guest-core=on|off``
        Include guest memory in a core dump. The default is on.

    ``mem-merge=on|off``
        Enables or disables memory merge support. This feature, when
        supported by the host, de-duplicates identical memory pages
        among VMs instances (enabled by default).

    ``aes-key-wrap=on|off``
        Enables or disables AES key wrapping support on s390-ccw hosts.
        This feature controls whether AES wrapping keys will be created
        to allow execution of AES cryptographic functions. The default
        is on.

    ``dea-key-wrap=on|off``
        Enables or disables DEA key wrapping support on s390-ccw hosts.
        This feature controls whether DEA wrapping keys will be created
        to allow execution of DEA cryptographic functions. The default
        is on.

    ``nvdimm=on|off``
        Enables or disables NVDIMM support. The default is off.

    ``memory-encryption=``
        Memory encryption object to use. The default is none.

    ``hmat=on|off``
        Enables or disables ACPI Heterogeneous Memory Attribute Table
        (HMAT) support. The default is off.

    ``memory-backend='id'``
        An alternative to legacy ``-mem-path`` and ``mem-prealloc`` options.
        Allows to use a memory backend as main RAM.

        For example:
        ::

            -object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
            -machine memory-backend=pc.ram
            -m 512M

        Migration compatibility note:

        * as backend id one shall use value of 'default-ram-id', advertised by
          machine type (available via ``query-machines`` QMP command), if migration
          to/from old QEMU (<5.0) is expected.
        * for machine types 4.0 and older, user shall
          use ``x-use-canonical-path-for-ramblock-id=off`` backend option
          if migration to/from old QEMU (<5.0) is expected.

        For example:
        ::

            -object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
            -machine memory-backend=pc.ram
            -m 512M

    ``cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]``
        Define a CXL Fixed Memory Window (CFMW).

        Described in the CXL 2.0 ECN: CEDT CFMWS & QTG _DSM.

        They are regions of Host Physical Addresses (HPA) on a system which
        may be interleaved across one or more CXL host bridges.  The system
        software will assign particular devices into these windows and
        configure the downstream Host-managed Device Memory (HDM) decoders
        in root ports, switch ports and devices appropriately to meet the
        interleave requirements before enabling the memory devices.

        ``targets.X=target`` provides the mapping to CXL host bridges
        which may be identified by the id provided in the -device entry.
        Multiple entries are needed to specify all the targets when
        the fixed memory window represents interleaved memory. X is the
        target index from 0.

        ``size=size`` sets the size of the CFMW. This must be a multiple of
        256MiB. The region will be aligned to 256MiB but the location is
        platform and configuration dependent.

        ``interleave-granularity=granularity`` sets the granularity of
        interleave. Default 256KiB. Only 256KiB, 512KiB, 1024KiB, 2048KiB
        4096KiB, 8192KiB and 16384KiB granularities supported.

        Example:

        ::

            -machine cxl-fmw.0.targets.0=cxl.0,cxl-fmw.0.targets.1=cxl.1,cxl-fmw.0.size=128G,cxl-fmw.0.interleave-granularity=512k
ERST

DEF("M", HAS_ARG, QEMU_OPTION_M,
    "                sgx-epc.0.memdev=memid,sgx-epc.0.node=numaid\n",
    QEMU_ARCH_ALL)

SRST
``sgx-epc.0.memdev=@var{memid},sgx-epc.0.node=@var{numaid}``
    Define an SGX EPC section.
ERST

DEF("cpu", HAS_ARG, QEMU_OPTION_cpu,
    "-cpu cpu        select CPU ('-cpu help' for list)\n", QEMU_ARCH_ALL)
SRST
``-cpu model``
    Select CPU model (``-cpu help`` for list and additional feature
    selection)
ERST

DEF("accel", HAS_ARG, QEMU_OPTION_accel,
    "-accel [accel=]accelerator[,prop[=value][,...]]\n"
    "                select accelerator (kvm, xen, hax, hvf, nvmm, whpx or tcg; use 'help' for a list)\n"
    "                igd-passthru=on|off (enable Xen integrated Intel graphics passthrough, default=off)\n"
    "                kernel-irqchip=on|off|split controls accelerated irqchip support (default=on)\n"
    "                kvm-shadow-mem=size of KVM shadow MMU in bytes\n"
    "                split-wx=on|off (enable TCG split w^x mapping)\n"
    "                tb-size=n (TCG translation block cache size)\n"
    "                dirty-ring-size=n (KVM dirty ring GFN count, default 0)\n"
    "                notify-vmexit=run|internal-error|disable,notify-window=n (enable notify VM exit and set notify window, x86 only)\n"
    "                thread=single|multi (enable multi-threaded TCG)\n", QEMU_ARCH_ALL)
SRST
``-accel name[,prop=value[,...]]``
    This is used to enable an accelerator. Depending on the target
    architecture, kvm, xen, hax, hvf, nvmm, whpx 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.

    ``igd-passthru=on|off``
        When Xen is in use, this option controls whether Intel
        integrated graphics devices can be passed through to the guest
        (default=off)

    ``kernel-irqchip=on|off|split``
        Controls KVM in-kernel irqchip support. The default is full
        acceleration of the interrupt controllers. On x86, split irqchip
        reduces the kernel attack surface, at a performance cost for
        non-MSI interrupts. Disabling the in-kernel irqchip completely
        is not recommended except for debugging purposes.

    ``kvm-shadow-mem=size``
        Defines the size of the KVM shadow MMU.

    ``split-wx=on|off``
        Controls the use of split w^x mapping for the TCG code generation
        buffer. Some operating systems require this to be enabled, and in
        such a case this will default on. On other operating systems, this
        will default off, but one may enable this for testing or debugging.

    ``tb-size=n``
        Controls the size (in MiB) of the TCG translation block cache.

    ``thread=single|multi``
        Controls number of TCG threads. When the TCG is multi-threaded
        there will be one thread per vCPU therefore taking advantage of
        additional host cores. The default is to enable multi-threading
        where both the back-end and front-ends support it and no
        incompatible TCG features have been enabled (e.g.
        icount/replay).

    ``dirty-ring-size=n``
        When the KVM accelerator is used, it controls the size of the per-vCPU
        dirty page ring buffer (number of entries for each vCPU). It should
        be a value that is power of two, and it should be 1024 or bigger (but
        still less than the maximum value that the kernel supports).  4096
        could be a good initial value if you have no idea which is the best.
        Set this value to 0 to disable the feature.  By default, this feature
        is disabled (dirty-ring-size=0).  When enabled, KVM will instead
        record dirty pages in a bitmap.

    ``notify-vmexit=run|internal-error|disable,notify-window=n``
        Enables or disables notify VM exit support on x86 host and specify
        the corresponding notify window to trigger the VM exit if enabled.
        ``run`` option enables the feature. It does nothing and continue
        if the exit happens. ``internal-error`` option enables the feature.
        It raises a internal error. ``disable`` option doesn't enable the feature.
        This feature can mitigate the CPU stuck issue due to event windows don't
        open up for a specified of time (i.e. notify-window).
        Default: notify-vmexit=run,notify-window=0.

ERST

DEF("smp", HAS_ARG, QEMU_OPTION_smp,
    "-smp [[cpus=]n][,maxcpus=maxcpus][,sockets=sockets][,dies=dies][,clusters=clusters][,cores=cores][,threads=threads]\n"
    "                set the number of initial CPUs to 'n' [default=1]\n"
    "                maxcpus= maximum number of total CPUs, including\n"
    "                offline CPUs for hotplug, etc\n"
    "                sockets= number of sockets on the machine board\n"
    "                dies= number of dies in one socket\n"
    "                clusters= number of clusters in one die\n"
    "                cores= number of cores in one cluster\n"
    "                threads= number of threads in one core\n"
    "Note: Different machines may have different subsets of the CPU topology\n"
    "      parameters supported, so the actual meaning of the supported parameters\n"
    "      will vary accordingly. For example, for a machine type that supports a\n"
    "      three-level CPU hierarchy of sockets/cores/threads, the parameters will\n"
    "      sequentially mean as below:\n"
    "                sockets means the number of sockets on the machine board\n"
    "                cores means the number of cores in one socket\n"
    "                threads means the number of threads in one core\n"
    "      For a particular machine type board, an expected CPU topology hierarchy\n"
    "      can be defined through the supported sub-option. Unsupported parameters\n"
    "      can also be provided in addition to the sub-option, but their values\n"
    "      must be set as 1 in the purpose of correct parsing.\n",
    QEMU_ARCH_ALL)
SRST
``-smp [[cpus=]n][,maxcpus=maxcpus][,sockets=sockets][,dies=dies][,clusters=clusters][,cores=cores][,threads=threads]``
    Simulate a SMP system with '\ ``n``\ ' CPUs initially present on
    the machine type board. On boards supporting CPU hotplug, the optional
    '\ ``maxcpus``\ ' parameter can be set to enable further CPUs to be
    added at runtime. When both parameters are omitted, the maximum number
    of CPUs will be calculated from the provided topology members and the
    initial CPU count will match the maximum number. When only one of them
    is given then the omitted one will be set to its counterpart's value.
    Both parameters may be specified, but the maximum number of CPUs must
    be equal to or greater than the initial CPU count. Product of the
    CPU topology hierarchy must be equal to the maximum number of CPUs.
    Both parameters are subject to an upper limit that is determined by
    the specific machine type chosen.

    To control reporting of CPU topology information, values of the topology
    parameters can be specified. Machines may only support a subset of the
    parameters and different machines may have different subsets supported
    which vary depending on capacity of the corresponding CPU targets. So
    for a particular machine type board, an expected topology hierarchy can
    be defined through the supported sub-option. Unsupported parameters can
    also be provided in addition to the sub-option, but their values must be
    set as 1 in the purpose of correct parsing.

    Either the initial CPU count, or at least one of the topology parameters
    must be specified. The specified parameters must be greater than zero,
    explicit configuration like "cpus=0" is not allowed. Values for any
    omitted parameters will be computed from those which are given.

    For example, the following sub-option defines a CPU topology hierarchy
    (2 sockets totally on the machine, 2 cores per socket, 2 threads per
    core) for a machine that only supports sockets/cores/threads.
    Some members of the option can be omitted but their values will be
    automatically computed:

    ::

        -smp 8,sockets=2,cores=2,threads=2,maxcpus=8

    The following sub-option defines a CPU topology hierarchy (2 sockets
    totally on the machine, 2 dies per socket, 2 cores per die, 2 threads
    per core) for PC machines which support sockets/dies/cores/threads.
    Some members of the option can be omitted but their values will be
    automatically computed:

    ::

        -smp 16,sockets=2,dies=2,cores=2,threads=2,maxcpus=16

    The following sub-option defines a CPU topology hierarchy (2 sockets
    totally on the machine, 2 clusters per socket, 2 cores per cluster,
    2 threads per core) for ARM virt machines which support sockets/clusters
    /cores/threads. Some members of the option can be omitted but their values
    will be automatically computed:

    ::

        -smp 16,sockets=2,clusters=2,cores=2,threads=2,maxcpus=16

    Historically preference was given to the coarsest topology parameters
    when computing missing values (ie sockets preferred over cores, which
    were preferred over threads), however, this behaviour is considered
    liable to change. Prior to 6.2 the preference was sockets over cores
    over threads. Since 6.2 the preference is cores over sockets over threads.

    For example, the following option defines a machine board with 2 sockets
    of 1 core before 6.2 and 1 socket of 2 cores after 6.2:

    ::

        -smp 2
ERST

DEF("numa", HAS_ARG, QEMU_OPTION_numa,
    "-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
    "-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=node]\n"
    "-numa dist,src=source,dst=destination,val=distance\n"
    "-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]\n"
    "-numa hmat-lb,initiator=node,target=node,hierarchy=memory|first-level|second-level|third-level,data-type=access-latency|read-latency|write-latency[,latency=lat][,bandwidth=bw]\n"
    "-numa hmat-cache,node-id=node,size=size,level=level[,associativity=none|direct|complex][,policy=none|write-back|write-through][,line=size]\n",
    QEMU_ARCH_ALL)
SRST
``-numa node[,mem=size][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=initiator]``
  \ 
``-numa node[,memdev=id][,cpus=firstcpu[-lastcpu]][,nodeid=node][,initiator=initiator]``
  \
``-numa dist,src=source,dst=destination,val=distance``
  \ 
``-numa cpu,node-id=node[,socket-id=x][,core-id=y][,thread-id=z]``
  \ 
``-numa hmat-lb,initiator=node,target=node,hierarchy=hierarchy,data-type=type[,latency=lat][,bandwidth=bw]``
  \ 
``-numa hmat-cache,node-id=node,size=size,level=level[,associativity=str][,policy=str][,line=size]``
    Define a NUMA node and assign RAM and VCPUs to it. Set the NUMA
    distance from a source node to a destination node. Set the ACPI
    Heterogeneous Memory Attributes for the given nodes.

    Legacy VCPU assignment uses '\ ``cpus``\ ' option where firstcpu and
    lastcpu are CPU indexes. Each '\ ``cpus``\ ' option represent a
    contiguous range of CPU indexes (or a single VCPU if lastcpu is
    omitted). A non-contiguous set of VCPUs can be represented by
    providing multiple '\ ``cpus``\ ' options. If '\ ``cpus``\ ' is
    omitted on all nodes, VCPUs are automatically split between them.

    For example, the following option assigns VCPUs 0, 1, 2 and 5 to a
    NUMA node:

    ::

        -numa node,cpus=0-2,cpus=5

    '\ ``cpu``\ ' option is a new alternative to '\ ``cpus``\ ' option
    which uses '\ ``socket-id|core-id|thread-id``\ ' properties to
    assign CPU objects to a node using topology layout properties of
    CPU. The set of properties is machine specific, and depends on used
    machine type/'\ ``smp``\ ' options. It could be queried with
    '\ ``hotpluggable-cpus``\ ' monitor command. '\ ``node-id``\ '
    property specifies node to which CPU object will be assigned, it's
    required for node to be declared with '\ ``node``\ ' option before
    it's used with '\ ``cpu``\ ' option.

    For example:

    ::

        -M pc \
        -smp 1,sockets=2,maxcpus=2 \
        -numa node,nodeid=0 -numa node,nodeid=1 \
        -numa cpu,node-id=0,socket-id=0 -numa cpu,node-id=1,socket-id=1

    Legacy '\ ``mem``\ ' assigns a given RAM amount to a node (not supported
    for 5.1 and newer machine types). '\ ``memdev``\ ' assigns RAM from
    a given memory backend device to a node. If '\ ``mem``\ ' and
    '\ ``memdev``\ ' are omitted in all nodes, RAM is split equally between them.


    '\ ``mem``\ ' and '\ ``memdev``\ ' are mutually exclusive.
    Furthermore, if one node uses '\ ``memdev``\ ', all of them have to
    use it.

    '\ ``initiator``\ ' is an additional option that points to an
    initiator NUMA node that has best performance (the lowest latency or
    largest bandwidth) to this NUMA node. Note that this option can be
    set only when the machine property 'hmat' is set to 'on'.

    Following example creates a machine with 2 NUMA nodes, node 0 has
    CPU. node 1 has only memory, and its initiator is node 0. Note that
    because node 0 has CPU, by default the initiator of node 0 is itself
    and must be itself.

    ::

        -machine hmat=on \
        -m 2G,slots=2,maxmem=4G \
        -object memory-backend-ram,size=1G,id=m0 \
        -object memory-backend-ram,size=1G,id=m1 \
        -numa node,nodeid=0,memdev=m0 \
        -numa node,nodeid=1,memdev=m1,initiator=0 \
        -smp 2,sockets=2,maxcpus=2  \
        -numa cpu,node-id=0,socket-id=0 \
        -numa cpu,node-id=0,socket-id=1

    source and destination are NUMA node IDs. distance is the NUMA
    distance from source to destination. The distance from a node to
    itself is always 10. If any pair of nodes is given a distance, then
    all pairs must be given distances. Although, when distances are only
    given in one direction for each pair of nodes, then the distances in
    the opposite directions are assumed to be the same. If, however, an
    asymmetrical pair of distances is given for even one node pair, then
    all node pairs must be provided distance values for both directions,
    even when they are symmetrical. When a node is unreachable from
    another node, set the pair's distance to 255.

    Note that the -``numa`` option doesn't allocate any of the specified
    resources, it just assigns existing resources to NUMA nodes. This
    means that one still has to use the ``-m``, ``-smp`` options to
    allocate RAM and VCPUs respectively.

    Use '\ ``hmat-lb``\ ' to set System Locality Latency and Bandwidth
    Information between initiator and target NUMA nodes in ACPI
    Heterogeneous Attribute Memory Table (HMAT). Initiator NUMA node can
    create memory requests, usually it has one or more processors.
    Target NUMA node contains addressable memory.

    In '\ ``hmat-lb``\ ' option, node are NUMA node IDs. hierarchy is
    the memory hierarchy of the target NUMA node: if hierarchy is
    'memory', the structure represents the memory performance; if
    hierarchy is 'first-level\|second-level\|third-level', this
    structure represents aggregated performance of memory side caches
    for each domain. type of 'data-type' is type of data represented by
    this structure instance: if 'hierarchy' is 'memory', 'data-type' is
    'access\|read\|write' latency or 'access\|read\|write' bandwidth of
    the target memory; if 'hierarchy' is
    'first-level\|second-level\|third-level', 'data-type' is
    'access\|read\|write' hit latency or 'access\|read\|write' hit
    bandwidth of the target memory side cache.

    lat is latency value in nanoseconds. bw is bandwidth value, the
    possible value and units are NUM[M\|G\|T], mean that the bandwidth
    value are NUM byte per second (or MB/s, GB/s or TB/s depending on
    used suffix). Note that if latency or bandwidth value is 0, means
    the corresponding latency or bandwidth information is not provided.

    In '\ ``hmat-cache``\ ' option, node-id is the NUMA-id of the memory
    belongs. size is the size of memory side cache in bytes. level is
    the cache level described in this structure, note that the cache
    level 0 should not be used with '\ ``hmat-cache``\ ' option.
    associativity is the cache associativity, the possible value is
    'none/direct(direct-mapped)/complex(complex cache indexing)'. policy
    is the write policy. line is the cache Line size in bytes.

    For example, the following options describe 2 NUMA nodes. Node 0 has
    2 cpus and a ram, node 1 has only a ram. The processors in node 0
    access memory in node 0 with access-latency 5 nanoseconds,
    access-bandwidth is 200 MB/s; The processors in NUMA node 0 access
    memory in NUMA node 1 with access-latency 10 nanoseconds,
    access-bandwidth is 100 MB/s. And for memory side cache information,
    NUMA node 0 and 1 both have 1 level memory cache, size is 10KB,
    policy is write-back, the cache Line size is 8 bytes:

    ::

        -machine hmat=on \
        -m 2G \
        -object memory-backend-ram,size=1G,id=m0 \
        -object memory-backend-ram,size=1G,id=m1 \
        -smp 2,sockets=2,maxcpus=2 \
        -numa node,nodeid=0,memdev=m0 \
        -numa node,nodeid=1,memdev=m1,initiator=0 \
        -numa cpu,node-id=0,socket-id=0 \
        -numa cpu,node-id=0,socket-id=1 \
        -numa hmat-lb,initiator=0,target=0,hierarchy=memory,data-type=access-latency,latency=5 \
        -numa hmat-lb,initiator=0,target=0,hierarchy=memory,data-type=access-bandwidth,bandwidth=200M \
        -numa hmat-lb,initiator=0,target=1,hierarchy=memory,data-type=access-latency,latency=10 \
        -numa hmat-lb,initiator=0,target=1,hierarchy=memory,data-type=access-bandwidth,bandwidth=100M \
        -numa hmat-cache,node-id=0,size=10K,level=1,associativity=direct,policy=write-back,line=8 \
        -numa hmat-cache,node-id=1,size=10K,level=1,associativity=direct,policy=write-back,line=8
ERST

DEF("add-fd", HAS_ARG, QEMU_OPTION_add_fd,
    "-add-fd fd=fd,set=set[,opaque=opaque]\n"
    "                Add 'fd' to fd 'set'\n", QEMU_ARCH_ALL)
SRST
``-add-fd fd=fd,set=set[,opaque=opaque]``
    Add a file descriptor to an fd set. Valid options are:

    ``fd=fd``
        This option defines the file descriptor of which a duplicate is
        added to fd set. The file descriptor cannot be stdin, stdout, or
        stderr.

    ``set=set``
        This option defines the ID of the fd set to add the file
        descriptor to.

    ``opaque=opaque``
        This option defines a free-form string that can be used to
        describe fd.

    You can open an image using pre-opened file descriptors from an fd
    set:

    .. parsed-literal::

        |qemu_system| \\
         -add-fd fd=3,set=2,opaque="rdwr:/path/to/file" \\
         -add-fd fd=4,set=2,opaque="rdonly:/path/to/file" \\
         -drive file=/dev/fdset/2,index=0,media=disk
ERST

DEF("set", HAS_ARG, QEMU_OPTION_set,
    "-set group.id.arg=value\n"
    "                set <arg> parameter for item <id> of type <group>\n"
    "                i.e. -set drive.$id.file=/path/to/image\n", QEMU_ARCH_ALL)
SRST
``-set group.id.arg=value``
    Set parameter arg for item id of type group
ERST

DEF("global", HAS_ARG, QEMU_OPTION_global,
    "-global driver.property=value\n"
    "-global driver=driver,property=property,value=value\n"
    "                set a global default for a driver property\n",
    QEMU_ARCH_ALL)
SRST
``-global driver.prop=value``
  \ 
``-global driver=driver,property=property,value=value``
    Set default value of driver's property prop to value, e.g.:

    .. parsed-literal::

        |qemu_system_x86| -global ide-hd.physical_block_size=4096 disk-image.img

    In particular, you can use this to set driver properties for devices
    which are created automatically by the machine model. To create a
    device which is not created automatically and set properties on it,
    use -``device``.

    -global driver.prop=value is shorthand for -global
    driver=driver,property=prop,value=value. The longhand syntax works
    even when driver contains a dot.
ERST

DEF("boot", HAS_ARG, QEMU_OPTION_boot,
    "-boot [order=drives][,once=drives][,menu=on|off]\n"
    "      [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]\n"
    "                'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)\n"
    "                'sp_name': the file's name that would be passed to bios as logo picture, if menu=on\n"
    "                'sp_time': the period that splash picture last if menu=on, unit is ms\n"
    "                'rb_timeout': the timeout before guest reboot when boot failed, unit is ms\n",
    QEMU_ARCH_ALL)
SRST
``-boot [order=drives][,once=drives][,menu=on|off][,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_timeout][,strict=on|off]``
    Specify boot order drives as a string of drive letters. Valid drive
    letters depend on the target architecture. The x86 PC uses: a, b
    (floppy 1 and 2), c (first hard disk), d (first CD-ROM), n-p
    (Etherboot from network adapter 1-4), hard disk boot is the default.
    To apply a particular boot order only on the first startup, specify
    it via ``once``. Note that the ``order`` or ``once`` parameter
    should not be used together with the ``bootindex`` property of
    devices, since the firmware implementations normally do not support
    both at the same time.

    Interactive boot menus/prompts can be enabled via ``menu=on`` as far
    as firmware/BIOS supports them. The default is non-interactive boot.

    A splash picture could be passed to bios, enabling user to show it
    as logo, when option splash=sp\_name is given and menu=on, If
    firmware/BIOS supports them. Currently Seabios for X86 system
    support it. limitation: The splash file could be a jpeg file or a
    BMP file in 24 BPP format(true color). The resolution should be
    supported by the SVGA mode, so the recommended is 320x240, 640x480,
    800x640.

    A timeout could be passed to bios, guest will pause for rb\_timeout
    ms when boot failed, then reboot. If rb\_timeout is '-1', guest will
    not reboot, qemu passes '-1' to bios by default. Currently Seabios
    for X86 system support it.

    Do strict boot via ``strict=on`` as far as firmware/BIOS supports
    it. This only effects when boot priority is changed by bootindex
    options. The default is non-strict boot.

    .. parsed-literal::

        # try to boot from network first, then from hard disk
        |qemu_system_x86| -boot order=nc
        # boot from CD-ROM first, switch back to default order after reboot
        |qemu_system_x86| -boot once=d
        # boot with a splash picture for 5 seconds.
        |qemu_system_x86| -boot menu=on,splash=/root/boot.bmp,splash-time=5000

    Note: The legacy format '-boot drives' is still supported but its
    use is discouraged as it may be removed from future versions.
ERST

DEF("m", HAS_ARG, QEMU_OPTION_m,
    "-m [size=]megs[,slots=n,maxmem=size]\n"
    "                configure guest RAM\n"
    "                size: initial amount of guest memory\n"
    "                slots: number of hotplug slots (default: none)\n"
    "                maxmem: maximum amount of guest memory (default: none)\n"
    "NOTE: Some architectures might enforce a specific granularity\n",
    QEMU_ARCH_ALL)
SRST
``-m [size=]megs[,slots=n,maxmem=size]``
    Sets guest startup RAM size to megs megabytes. Default is 128 MiB.
    Optionally, a suffix of "M" or "G" can be used to signify a value in
    megabytes or gigabytes respectively. Optional pair slots, maxmem
    could be used to set amount of hotpluggable memory slots and maximum
    amount of memory. Note that maxmem must be aligned to the page size.

    For example, the following command-line sets the guest startup RAM
    size to 1GB, creates 3 slots to hotplug additional memory and sets
    the maximum memory the guest can reach to 4GB:

    .. parsed-literal::

        |qemu_system| -m 1G,slots=3,maxmem=4G

    If slots and maxmem are not specified, memory hotplug won't be
    enabled and the guest startup RAM will never increase.
ERST

DEF("mem-path", HAS_ARG, QEMU_OPTION_mempath,
    "-mem-path FILE  provide backing storage for guest RAM\n", QEMU_ARCH_ALL)
SRST
``-mem-path path``
    Allocate guest RAM from a temporarily created file in path.
ERST

DEF("mem-prealloc", 0, QEMU_OPTION_mem_prealloc,
    "-mem-prealloc   preallocate guest memory (use with -mem-path)\n",
    QEMU_ARCH_ALL)
SRST
``-mem-prealloc``
    Preallocate memory when using -mem-path.
ERST

DEF("k", HAS_ARG, QEMU_OPTION_k,
    "-k language     use keyboard layout (for example 'fr' for French)\n",
    QEMU_ARCH_ALL)
SRST
``-k language``
    Use keyboard layout language (for example ``fr`` for French). This
    option is only needed where it is not easy to get raw PC keycodes
    (e.g. on Macs, with some X11 servers or with a VNC or curses
    display). You don't normally need to use it on PC/Linux or
    PC/Windows hosts.

    The available layouts are:

    ::

        ar  de-ch  es  fo     fr-ca  hu  ja  mk     no  pt-br  sv
        da  en-gb  et  fr     fr-ch  is  lt  nl     pl  ru     th
        de  en-us  fi  fr-be  hr     it  lv  nl-be  pt  sl     tr

    The default is ``en-us``.
ERST


HXCOMM Deprecated by -audiodev
DEF("audio-help", 0, QEMU_OPTION_audio_help,
    "-audio-help     show -audiodev equivalent of the currently specified audio settings\n",
    QEMU_ARCH_ALL)
SRST
``-audio-help``
    Will show the -audiodev equivalent of the currently specified
    (deprecated) environment variables.
ERST

DEF("audio", HAS_ARG, QEMU_OPTION_audio,
    "-audio [driver=]driver,model=value[,prop[=value][,...]]\n"
    "                specifies the audio backend and device to use;\n"
    "                apart from 'model', options are the same as for -audiodev.\n"
    "                use '-audio model=help' to show possible devices.\n",
    QEMU_ARCH_ALL)
SRST
``-audio [driver=]driver,model=value[,prop[=value][,...]]``
    This option is a shortcut for configuring both the guest audio
    hardware and the host audio backend in one go.
    The driver option is the same as with the corresponding ``-audiodev`` option below.
    The guest hardware model can be set with ``model=modelname``.

    Use ``driver=help`` to list the available drivers,
    and ``model=help`` to list the available device types.

    The following two example do exactly the same, to show how ``-audio``
    can be used to shorten the command line length:

    .. parsed-literal::

        |qemu_system| -audiodev pa,id=pa -device sb16,audiodev=pa
        |qemu_system| -audio pa,model=sb16
ERST

DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev,
    "-audiodev [driver=]driver,id=id[,prop[=value][,...]]\n"
    "                specifies the audio backend to use\n"
    "                Use ``-audiodev help`` to list the available drivers\n"
    "                id= identifier of the backend\n"
    "                timer-period= timer period in microseconds\n"
    "                in|out.mixing-engine= use mixing engine to mix streams inside QEMU\n"
    "                in|out.fixed-settings= use fixed settings for host audio\n"
    "                in|out.frequency= frequency to use with fixed settings\n"
    "                in|out.channels= number of channels to use with fixed settings\n"
    "                in|out.format= sample format to use with fixed settings\n"
    "                valid values: s8, s16, s32, u8, u16, u32, f32\n"
    "                in|out.voices= number of voices to use\n"
    "                in|out.buffer-length= length of buffer in microseconds\n"
    "-audiodev none,id=id,[,prop[=value][,...]]\n"
    "                dummy driver that discards all output\n"
#ifdef CONFIG_AUDIO_ALSA
    "-audiodev alsa,id=id[,prop[=value][,...]]\n"
    "                in|out.dev= name of the audio device to use\n"
    "                in|out.period-length= length of period in microseconds\n"
    "                in|out.try-poll= attempt to use poll mode\n"
    "                threshold= threshold (in microseconds) when playback starts\n"
#endif
#ifdef CONFIG_AUDIO_COREAUDIO
    "-audiodev coreaudio,id=id[,prop[=value][,...]]\n"
    "                in|out.buffer-count= number of buffers\n"
#endif
#ifdef CONFIG_AUDIO_DSOUND
    "-audiodev dsound,id=id[,prop[=value][,...]]\n"
    "                latency= add extra latency to playback in microseconds\n"
#endif
#ifdef CONFIG_AUDIO_OSS
    "-audiodev oss,id=id[,prop[=value][,...]]\n"
    "                in|out.dev= path of the audio device to use\n"
    "                in|out.buffer-count= number of buffers\n"
    "                in|out.try-poll= attempt to use poll mode\n"
    "                try-mmap= try using memory mapped access\n"
    "                exclusive= open device in exclusive mode\n"
    "                dsp-policy= set timing policy (0..10), -1 to use fragment mode\n"
#endif
#ifdef CONFIG_AUDIO_PA
    "-audiodev pa,id=id[,prop[=value][,...]]\n"
    "                server= PulseAudio server address\n"
    "                in|out.name= source/sink device name\n"
    "                in|out.latency= desired latency in microseconds\n"
#endif
#ifdef CONFIG_AUDIO_SDL
    "-audiodev sdl,id=id[,prop[=value][,...]]\n"
    "                in|out.buffer-count= number of buffers\n"
#endif
#ifdef CONFIG_AUDIO_SNDIO
    "-audiodev sndio,id=id[,prop[=value][,...]]\n"
#endif
#ifdef CONFIG_SPICE
    "-audiodev spice,id=id[,prop[=value][,...]]\n"
#endif
#ifdef CONFIG_DBUS_DISPLAY
    "-audiodev dbus,id=id[,prop[=value][,...]]\n"
#endif
    "-audiodev wav,id=id[,prop[=value][,...]]\n"
    "                path= path of wav file to record\n",
    QEMU_ARCH_ALL)
SRST
``-audiodev [driver=]driver,id=id[,prop[=value][,...]]``
    Adds a new audio backend driver identified by id. There are global
    and driver specific properties. Some values can be set differently
    for input and output, they're marked with ``in|out.``. You can set
    the input's property with ``in.prop`` and the output's property with
    ``out.prop``. For example:

    ::

        -audiodev alsa,id=example,in.frequency=44110,out.frequency=8000
        -audiodev alsa,id=example,out.channels=1 # leaves in.channels unspecified

    NOTE: parameter validation is known to be incomplete, in many cases
    specifying an invalid option causes QEMU to print an error message
    and continue emulation without sound.

    Valid global options are:

    ``id=identifier``
        Identifies the audio backend.

    ``timer-period=period``
        Sets the timer period used by the audio subsystem in
        microseconds. Default is 10000 (10 ms).

    ``in|out.mixing-engine=on|off``
        Use QEMU's mixing engine to mix all streams inside QEMU and
        convert audio formats when not supported by the backend. When
        off, fixed-settings must be off too. Note that disabling this
        option means that the selected backend must support multiple
        streams and the audio formats used by the virtual cards,
        otherwise you'll get no sound. It's not recommended to disable
        this option unless you want to use 5.1 or 7.1 audio, as mixing
        engine only supports mono and stereo audio. Default is on.

    ``in|out.fixed-settings=on|off``
        Use fixed settings for host audio. When off, it will change
        based on how the guest opens the sound card. In this case you
        must not specify frequency, channels or format. Default is on.

    ``in|out.frequency=frequency``
        Specify the frequency to use when using fixed-settings. Default
        is 44100Hz.

    ``in|out.channels=channels``
        Specify the number of channels to use when using fixed-settings.
        Default is 2 (stereo).

    ``in|out.format=format``
        Specify the sample format to use when using fixed-settings.
        Valid values are: ``s8``, ``s16``, ``s32``, ``u8``, ``u16``,
        ``u32``, ``f32``. Default is ``s16``.

    ``in|out.voices=voices``
        Specify the number of voices to use. Default is 1.

    ``in|out.buffer-length=usecs``
        Sets the size of the buffer in microseconds.

``-audiodev none,id=id[,prop[=value][,...]]``
    Creates a dummy backend that discards all outputs. This backend has
    no backend specific properties.

``-audiodev alsa,id=id[,prop[=value][,...]]``
    Creates backend using the ALSA. This backend is only available on
    Linux.

    ALSA specific options are:

    ``in|out.dev=device``
        Specify the ALSA device to use for input and/or output. Default
        is ``default``.

    ``in|out.period-length=usecs``
        Sets the period length in microseconds.

    ``in|out.try-poll=on|off``
        Attempt to use poll mode with the device. Default is on.

    ``threshold=threshold``
        Threshold (in microseconds) when playback starts. Default is 0.

``-audiodev coreaudio,id=id[,prop[=value][,...]]``
    Creates a backend using Apple's Core Audio. This backend is only
    available on Mac OS and only supports playback.

    Core Audio specific options are:

    ``in|out.buffer-count=count``
        Sets the count of the buffers.

``-audiodev dsound,id=id[,prop[=value][,...]]``
    Creates a backend using Microsoft's DirectSound. This backend is
    only available on Windows and only supports playback.

    DirectSound specific options are:

    ``latency=usecs``
        Add extra usecs microseconds latency to playback. Default is
        10000 (10 ms).

``-audiodev oss,id=id[,prop[=value][,...]]``
    Creates a backend using OSS. This backend is available on most
    Unix-like systems.

    OSS specific options are:

    ``in|out.dev=device``
        Specify the file name of the OSS device to use. Default is
        ``/dev/dsp``.

    ``in|out.buffer-count=count``
        Sets the count of the buffers.

    ``in|out.try-poll=on|of``
        Attempt to use poll mode with the device. Default is on.

    ``try-mmap=on|off``
        Try using memory mapped device access. Default is off.

    ``exclusive=on|off``
        Open the device in exclusive mode (vmix won't work in this
        case). Default is off.

    ``dsp-policy=policy``
        Sets the timing policy (between 0 and 10, where smaller number
        means smaller latency but higher CPU usage). Use -1 to use
        buffer sizes specified by ``buffer`` and ``buffer-count``. This
        option is ignored if you do not have OSS 4. Default is 5.

``-audiodev pa,id=id[,prop[=value][,...]]``
    Creates a backend using PulseAudio. This backend is available on
    most systems.

    PulseAudio specific options are:

    ``server=server``
        Sets the PulseAudio server to connect to.

    ``in|out.name=sink``
        Use the specified source/sink for recording/playback.

    ``in|out.latency=usecs``
        Desired latency in microseconds. The PulseAudio server will try
        to honor this value but actual latencies may be lower or higher.

``-audiodev sdl,id=id[,prop[=value][,...]]``
    Creates a backend using SDL. This backend is available on most
    systems, but you should use your platform's native backend if
    possible.

    SDL specific options are:

    ``in|out.buffer-count=count``
        Sets the count of the buffers.

``-audiodev sndio,id=id[,prop[=value][,...]]``
    Creates a backend using SNDIO. This backend is available on
    OpenBSD and most other Unix-like systems.

    Sndio specific options are:

    ``in|out.dev=device``
        Specify the sndio device to use for input and/or output. Default
        is ``default``.

    ``in|out.latency=usecs``
        Sets the desired period length in microseconds.

``-audiodev spice,id=id[,prop[=value][,...]]``
    Creates a backend that sends audio through SPICE. This backend
    requires ``-spice`` and automatically selected in that case, so
    usually you can ignore this option. This backend has no backend
    specific properties.

``-audiodev wav,id=id[,prop[=value][,...]]``
    Creates a backend that writes audio to a WAV file.

    Backend specific options are:

    ``path=path``
        Write recorded audio into the specified file. Default is
        ``qemu.wav``.
ERST

DEF("device", HAS_ARG, QEMU_OPTION_device,
    "-device driver[,prop[=value][,...]]\n"
    "                add device (based on driver)\n"
    "                prop=value,... sets driver properties\n"
    "                use '-device help' to print all possible drivers\n"
    "                use '-device driver,help' to print all possible properties\n",
    QEMU_ARCH_ALL)
SRST
``-device driver[,prop[=value][,...]]``
    Add device driver. prop=value sets driver properties. Valid
    properties depend on the driver. To get help on possible drivers and
    properties, use ``-device help`` and ``-device driver,help``.

    Some drivers are:

``-device ipmi-bmc-sim,id=id[,prop[=value][,...]]``
    Add an IPMI BMC. This is a simulation of a hardware management
    interface processor that normally sits on a system. It provides a
    watchdog and the ability to reset and power control the system. You
    need to connect this to an IPMI interface to make it useful

    The IPMI slave address to use for the BMC. The default is 0x20. This
    address is the BMC's address on the I2C network of management
    controllers. If you don't know what this means, it is safe to ignore
    it.

    ``id=id``
        The BMC id for interfaces to use this device.

    ``slave_addr=val``
        Define slave address to use for the BMC. The default is 0x20.

    ``sdrfile=file``
        file containing raw Sensor Data Records (SDR) data. The default
        is none.

    ``fruareasize=val``
        size of a Field Replaceable Unit (FRU) area. The default is
        1024.

    ``frudatafile=file``
        file containing raw Field Replaceable Unit (FRU) inventory data.
        The default is none.

    ``guid=uuid``
        value for the GUID for the BMC, in standard UUID format. If this
        is set, get "Get GUID" command to the BMC will return it.
        Otherwise "Get GUID" will return an error.

``-device ipmi-bmc-extern,id=id,chardev=id[,slave_addr=val]``
    Add a connection to an external IPMI BMC simulator. Instead of
    locally emulating the BMC like the above item, instead connect to an
    external entity that provides the IPMI services.

    A connection is made to an external BMC simulator. If you do this,
    it is strongly recommended that you use the "reconnect=" chardev
    option to reconnect to the simulator if the connection is lost. Note
    that if this is not used carefully, it can be a security issue, as
    the interface has the ability to send resets, NMIs, and power off
    the VM. It's best if QEMU makes a connection to an external
    simulator running on a secure port on localhost, so neither the
    simulator nor QEMU is exposed to any outside network.

    See the "lanserv/README.vm" file in the OpenIPMI library for more
    details on the external interface.

``-device isa-ipmi-kcs,bmc=id[,ioport=val][,irq=val]``
    Add a KCS IPMI interface on the ISA bus. This also adds a
    corresponding ACPI and SMBIOS entries, if appropriate.

    ``bmc=id``
        The BMC to connect to, one of ipmi-bmc-sim or ipmi-bmc-extern
        above.

    ``ioport=val``
        Define the I/O address of the interface. The default is 0xca0
        for KCS.

    ``irq=val``
        Define the interrupt to use. The default is 5. To disable
        interrupts, set this to 0.

``-device isa-ipmi-bt,bmc=id[,ioport=val][,irq=val]``
    Like the KCS interface, but defines a BT interface. The default port
    is 0xe4 and the default interrupt is 5.

``-device pci-ipmi-kcs,bmc=id``
    Add a KCS IPMI interface on the PCI bus.

    ``bmc=id``
        The BMC to connect to, one of ipmi-bmc-sim or ipmi-bmc-extern above.

``-device pci-ipmi-bt,bmc=id``
    Like the KCS interface, but defines a BT interface on the PCI bus.

``-device intel-iommu[,option=...]``
    This is only supported by ``-machine q35``, which will enable Intel VT-d
    emulation within the guest.  It supports below options:

    ``intremap=on|off`` (default: auto)
        This enables interrupt remapping feature.  It's required to enable
        complete x2apic.  Currently it only supports kvm kernel-irqchip modes
        ``off`` or ``split``, while full kernel-irqchip is not yet supported.
        The default value is "auto", which will be decided by the mode of
        kernel-irqchip.

    ``caching-mode=on|off`` (default: off)
        This enables caching mode for the VT-d emulated device.  When
        caching-mode is enabled, each guest DMA buffer mapping will generate an
        IOTLB invalidation from the guest IOMMU driver to the vIOMMU device in
        a synchronous way.  It is required for ``-device vfio-pci`` to work
        with the VT-d device, because host assigned devices requires to setup
        the DMA mapping on the host before guest DMA starts.

    ``device-iotlb=on|off`` (default: off)
        This enables device-iotlb capability for the emulated VT-d device.  So
        far virtio/vhost should be the only real user for this parameter,
        paired with ats=on configured for the device.

    ``aw-bits=39|48`` (default: 39)
        This decides the address width of IOVA address space.  The address
        space has 39 bits width for 3-level IOMMU page tables, and 48 bits for
        4-level IOMMU page tables.

    Please also refer to the wiki page for general scenarios of VT-d
    emulation in QEMU: https://wiki.qemu.org/Features/VT-d.

ERST

DEF("name", HAS_ARG, QEMU_OPTION_name,
    "-name string1[,process=string2][,debug-threads=on|off]\n"
    "                set the name of the guest\n"
    "                string1 sets the window title and string2 the process name\n"
    "                When debug-threads is enabled, individual threads are given a separate name\n"
    "                NOTE: The thread names are for debugging and not a stable API.\n",
    QEMU_ARCH_ALL)
SRST
``-name name``
    Sets the name of the guest. This name will be displayed in the SDL
    window caption. The name will also be used for the VNC server. Also
    optionally set the top visible process name in Linux. Naming of
    individual threads can also be enabled on Linux to aid debugging.
ERST

DEF("uuid", HAS_ARG, QEMU_OPTION_uuid,
    "-uuid %08x-%04x-%04x-%04x-%012x\n"
    "                specify machine UUID\n", QEMU_ARCH_ALL)
SRST
``-uuid uuid``
    Set system UUID.
ERST

DEFHEADING()

DEFHEADING(Block device options:)

SRST
The QEMU block device handling options have a long history and
have gone through several iterations as the feature set and complexity
of the block layer have grown. Many online guides to QEMU often
reference older and deprecated options, which can lead to confusion.

The recommended modern way to describe disks is to use a combination of
``-device`` to specify the hardware device and ``-blockdev`` to
describe the backend. The device defines what the guest sees and the
backend describes how QEMU handles the data.

ERST

DEF("fda", HAS_ARG, QEMU_OPTION_fda,
    "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n", QEMU_ARCH_ALL)
DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "", QEMU_ARCH_ALL)
SRST
``-fda file``
  \
``-fdb file``
    Use file as floppy disk 0/1 image (see the :ref:`disk images` chapter in
    the System Emulation Users Guide).
ERST

DEF("hda", HAS_ARG, QEMU_OPTION_hda,
    "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n", QEMU_ARCH_ALL)
DEF("hdb", HAS_ARG, QEMU_OPTION_hdb, "", QEMU_ARCH_ALL)
DEF("hdc", HAS_ARG, QEMU_OPTION_hdc,
    "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n", QEMU_ARCH_ALL)
DEF("hdd", HAS_ARG, QEMU_OPTION_hdd, "", QEMU_ARCH_ALL)
SRST
``-hda file``
  \
``-hdb file``
  \ 
``-hdc file``
  \ 
``-hdd file``
    Use file as hard disk 0, 1, 2 or 3 image (see the :ref:`disk images`
    chapter in the System Emulation Users Guide).
ERST

DEF("cdrom", HAS_ARG, QEMU_OPTION_cdrom,
    "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n",
    QEMU_ARCH_ALL)
SRST
``-cdrom file``
    Use file as CD-ROM image (you cannot use ``-hdc`` and ``-cdrom`` at
    the same time). You can use the host CD-ROM by using ``/dev/cdrom``
    as filename.
ERST

DEF("blockdev", HAS_ARG, QEMU_OPTION_blockdev,
    "-blockdev [driver=]driver[,node-name=N][,discard=ignore|unmap]\n"
    "          [,cache.direct=on|off][,cache.no-flush=on|off]\n"
    "          [,read-only=on|off][,auto-read-only=on|off]\n"
    "          [,force-share=on|off][,detect-zeroes=on|off|unmap]\n"
    "          [,driver specific parameters...]\n"
    "                configure a block backend\n", QEMU_ARCH_ALL)
SRST
``-blockdev option[,option[,option[,...]]]``
    Define a new block driver node. Some of the options apply to all
    block drivers, other options are only accepted for a specific block
    driver. See below for a list of generic options and options for the
    most common block drivers.

    Options that expect a reference to another node (e.g. ``file``) can
    be given in two ways. Either you specify the node name of an already
    existing node (file=node-name), or you define a new node inline,
    adding options for the referenced node after a dot
    (file.filename=path,file.aio=native).

    A block driver node created with ``-blockdev`` can be used for a
    guest device by specifying its node name for the ``drive`` property
    in a ``-device`` argument that defines a block device.

    ``Valid options for any block driver node:``
        ``driver``
            Specifies the block driver to use for the given node.

        ``node-name``
            This defines the name of the block driver node by which it
            will be referenced later. The name must be unique, i.e. it
            must not match the name of a different block driver node, or
            (if you use ``-drive`` as well) the ID of a drive.

            If no node name is specified, it is automatically generated.
            The generated node name is not intended to be predictable
            and changes between QEMU invocations. For the top level, an
            explicit node name must be specified.

        ``read-only``
            Open the node read-only. Guest write attempts will fail.

            Note that some block drivers support only read-only access,
            either generally or in certain configurations. In this case,
            the default value ``read-only=off`` does not work and the
            option must be specified explicitly.

        ``auto-read-only``
            If ``auto-read-only=on`` is set, QEMU may fall back to
            read-only usage even when ``read-only=off`` is requested, or
            even switch between modes as needed, e.g. depending on
            whether the image file is writable or whether a writing user
            is attached to the node.

        ``force-share``
            Override the image locking system of QEMU by forcing the
            node to utilize weaker shared access for permissions where
            it would normally request exclusive access. When there is
            the potential for multiple instances to have the same file
            open (whether this invocation of QEMU is the first or the
            second instance), both instances must permit shared access
            for the second instance to succeed at opening the file.

            Enabling ``force-share=on`` requires ``read-only=on``.

        ``cache.direct``
            The host page cache can be avoided with ``cache.direct=on``.
            This will attempt to do disk IO directly to the guest's
            memory. QEMU may still perform an internal copy of the data.

        ``cache.no-flush``
            In case you don't care about data integrity over host
            failures, you can use ``cache.no-flush=on``. This option
            tells QEMU that it never needs to write any data to the disk
            but can instead keep things in cache. If anything goes
            wrong, like your host losing power, the disk storage getting
            disconnected accidentally, etc. your image will most
            probably be rendered unusable.

        ``discard=discard``
            discard is one of "ignore" (or "off") or "unmap" (or "on")
            and controls whether ``discard`` (also known as ``trim`` or
            ``unmap``) requests are ignored or passed to the filesystem.
            Some machine types may not support discard requests.

        ``detect-zeroes=detect-zeroes``
            detect-zeroes is "off", "on" or "unmap" and enables the
            automatic conversion of plain zero writes by the OS to
            driver specific optimized zero write commands. You may even
            choose "unmap" if discard is set to "unmap" to allow a zero
            write to be converted to an ``unmap`` operation.

    ``Driver-specific options for file``
        This is the protocol-level block driver for accessing regular
        files.

        ``filename``
            The path to the image file in the local filesystem

        ``aio``
            Specifies the AIO backend (threads/native/io_uring,
            default: threads)

        ``locking``
            Specifies whether the image file is protected with Linux OFD
            / POSIX locks. The default is to use the Linux Open File
            Descriptor API if available, otherwise no lock is applied.
            (auto/on/off, default: auto)

        Example:

        ::

            -blockdev driver=file,node-name=disk,filename=disk.img

    ``Driver-specific options for raw``
        This is the image format block driver for raw images. It is
        usually stacked on top of a protocol level block driver such as
        ``file``.

        ``file``
            Reference to or definition of the data source block driver
            node (e.g. a ``file`` driver node)

        Example 1:

        ::

            -blockdev driver=file,node-name=disk_file,filename=disk.img
            -blockdev driver=raw,node-name=disk,file=disk_file

        Example 2:

        ::

            -blockdev driver=raw,node-name=disk,file.driver=file,file.filename=disk.img

    ``Driver-specific options for qcow2``
        This is the image format block driver for qcow2 images. It is
        usually stacked on top of a protocol level block driver such as
        ``file``.

        ``file``
            Reference to or definition of the data source block driver
            node (e.g. a ``file`` driver node)

        ``backing``
            Reference to or definition of the backing file block device
            (default is taken from the image file). It is allowed to
            pass ``null`` here in order to disable the default backing
            file.

        ``lazy-refcounts``
            Whether to enable the lazy refcounts feature (on/off;
            default is taken from the image file)

        ``cache-size``
            The maximum total size of the L2 table and refcount block
            caches in bytes (default: the sum of l2-cache-size and
            refcount-cache-size)

        ``l2-cache-size``
            The maximum size of the L2 table cache in bytes (default: if
            cache-size is not specified - 32M on Linux platforms, and 8M
            on non-Linux platforms; otherwise, as large as possible
            within the cache-size, while permitting the requested or the
            minimal refcount cache size)

        ``refcount-cache-size``
            The maximum size of the refcount block cache in bytes
            (default: 4 times the cluster size; or if cache-size is
            specified, the part of it which is not used for the L2
            cache)

        ``cache-clean-interval``
            Clean unused entries in the L2 and refcount caches. The
            interval is in seconds. The default value is 600 on
            supporting platforms, and 0 on other platforms. Setting it
            to 0 disables this feature.

        ``pass-discard-request``
            Whether discard requests to the qcow2 device should be
            forwarded to the data source (on/off; default: on if
            discard=unmap is specified, off otherwise)

        ``pass-discard-snapshot``
            Whether discard requests for the data source should be
            issued when a snapshot operation (e.g. deleting a snapshot)
            frees clusters in the qcow2 file (on/off; default: on)

        ``pass-discard-other``
            Whether discard requests for the data source should be
            issued on other occasions where a cluster gets freed
            (on/off; default: off)

        ``overlap-check``
            Which overlap checks to perform for writes to the image
            (none/constant/cached/all; default: cached). For details or
            finer granularity control refer to the QAPI documentation of
            ``blockdev-add``.

        Example 1:

        ::

            -blockdev driver=file,node-name=my_file,filename=/tmp/disk.qcow2
            -blockdev driver=qcow2,node-name=hda,file=my_file,overlap-check=none,cache-size=16777216

        Example 2:

        ::

            -blockdev driver=qcow2,node-name=disk,file.driver=http,file.filename=http://example.com/image.qcow2

    ``Driver-specific options for other drivers``
        Please refer to the QAPI documentation of the ``blockdev-add``
        QMP command.
ERST

DEF("drive", HAS_ARG, QEMU_OPTION_drive,
    "-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]\n"
    "       [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n"
    "       [,snapshot=on|off][,rerror=ignore|stop|report]\n"
    "       [,werror=ignore|stop|report|enospc][,id=name]\n"
    "       [,aio=threads|native|io_uring]\n"
    "       [,readonly=on|off][,copy-on-read=on|off]\n"
    "       [,discard=ignore|unmap][,detect-zeroes=on|off|unmap]\n"
    "       [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]]\n"
    "       [[,iops=i]|[[,iops_rd=r][,iops_wr=w]]]\n"
    "       [[,bps_max=bm]|[[,bps_rd_max=rm][,bps_wr_max=wm]]]\n"
    "       [[,iops_max=im]|[[,iops_rd_max=irm][,iops_wr_max=iwm]]]\n"
    "       [[,iops_size=is]]\n"
    "       [[,group=g]]\n"
    "                use 'file' as a drive image\n", QEMU_ARCH_ALL)
SRST
``-drive option[,option[,option[,...]]]``
    Define a new drive. This includes creating a block driver node (the
    backend) as well as a guest device, and is mostly a shortcut for
    defining the corresponding ``-blockdev`` and ``-device`` options.

    ``-drive`` accepts all options that are accepted by ``-blockdev``.
    In addition, it knows the following options:

    ``file=file``
        This option defines which disk image (see the :ref:`disk images`
        chapter in the System Emulation Users Guide) to use with this drive.
        If the filename contains comma, you must double it (for instance,
        "file=my,,file" to use file "my,file").

        Special files such as iSCSI devices can be specified using
        protocol specific URLs. See the section for "Device URL Syntax"
        for more information.

    ``if=interface``
        This option defines on which type on interface the drive is
        connected. Available types are: ide, scsi, sd, mtd, floppy,
        pflash, virtio, none.

    ``bus=bus,unit=unit``
        These options define where is connected the drive by defining
        the bus number and the unit id.

    ``index=index``
        This option defines where the drive is connected by using an
        index in the list of available connectors of a given interface
        type.

    ``media=media``
        This option defines the type of the media: disk or cdrom.

    ``snapshot=snapshot``
        snapshot is "on" or "off" and controls snapshot mode for the
        given drive (see ``-snapshot``).

    ``cache=cache``
        cache is "none", "writeback", "unsafe", "directsync" or
        "writethrough" and controls how the host cache is used to access
        block data. This is a shortcut that sets the ``cache.direct``
        and ``cache.no-flush`` options (as in ``-blockdev``), and
        additionally ``cache.writeback``, which provides a default for
        the ``write-cache`` option of block guest devices (as in
        ``-device``). The modes correspond to the following settings:

        =============  ===============   ============   ==============
        \              cache.writeback   cache.direct   cache.no-flush
        =============  ===============   ============   ==============
        writeback      on                off            off
        none           on                on             off
        writethrough   off               off            off
        directsync     off               on             off
        unsafe         on                off            on
        =============  ===============   ============   ==============

        The default mode is ``cache=writeback``.

    ``aio=aio``
        aio is "threads", "native", or "io_uring" and selects between pthread
        based disk I/O, native Linux AIO, or Linux io_uring API.

    ``format=format``
        Specify which disk format will be used rather than detecting the
        format. Can be used to specify format=raw to avoid interpreting
        an untrusted format header.

    ``werror=action,rerror=action``
        Specify which action to take on write and read errors. Valid
        actions are: "ignore" (ignore the error and try to continue),
        "stop" (pause QEMU), "report" (report the error to the guest),
        "enospc" (pause QEMU only if the host disk is full; report the
        error to the guest otherwise). The default setting is
        ``werror=enospc`` and ``rerror=report``.

    ``copy-on-read=copy-on-read``
        copy-on-read is "on" or "off" and enables whether to copy read
        backing file sectors into the image file.

    ``bps=b,bps_rd=r,bps_wr=w``
        Specify bandwidth throttling limits in bytes per second, either
        for all request types or for reads or writes only. Small values
        can lead to timeouts or hangs inside the guest. A safe minimum
        for disks is 2 MB/s.

    ``bps_max=bm,bps_rd_max=rm,bps_wr_max=wm``
        Specify bursts in bytes per second, either for all request types
        or for reads or writes only. Bursts allow the guest I/O to spike
        above the limit temporarily.

    ``iops=i,iops_rd=r,iops_wr=w``
        Specify request rate limits in requests per second, either for
        all request types or for reads or writes only.

    ``iops_max=bm,iops_rd_max=rm,iops_wr_max=wm``
        Specify bursts in requests per second, either for all request
        types or for reads or writes only. Bursts allow the guest I/O to
        spike above the limit temporarily.

    ``iops_size=is``
        Let every is bytes of a request count as a new request for iops
        throttling purposes. Use this option to prevent guests from
        circumventing iops limits by sending fewer but larger requests.

    ``group=g``
        Join a throttling quota group with given name g. All drives that
        are members of the same group are accounted for together. Use
        this option to prevent guests from circumventing throttling
        limits by using many small disks instead of a single larger
        disk.

    By default, the ``cache.writeback=on`` mode is used. It will report
    data writes as completed as soon as the data is present in the host
    page cache. This is safe as long as your guest OS makes sure to
    correctly flush disk caches where needed. If your guest OS does not
    handle volatile disk write caches correctly and your host crashes or
    loses power, then the guest may experience data corruption.

    For such guests, you should consider using ``cache.writeback=off``.
    This means that the host page cache will be used to read and write
    data, but write notification will be sent to the guest only after
    QEMU has made sure to flush each write to the disk. Be aware that
    this has a major impact on performance.

    When using the ``-snapshot`` option, unsafe caching is always used.

    Copy-on-read avoids accessing the same backing file sectors
    repeatedly and is useful when the backing file is over a slow
    network. By default copy-on-read is off.

    Instead of ``-cdrom`` you can use:

    .. parsed-literal::

        |qemu_system| -drive file=file,index=2,media=cdrom

    Instead of ``-hda``, ``-hdb``, ``-hdc``, ``-hdd``, you can use:

    .. parsed-literal::

        |qemu_system| -drive file=file,index=0,media=disk
        |qemu_system| -drive file=file,index=1,media=disk
        |qemu_system| -drive file=file,index=2,media=disk
        |qemu_system| -drive file=file,index=3,media=disk

    You can open an image using pre-opened file descriptors from an fd
    set:

    .. parsed-literal::

        |qemu_system| \\
         -add-fd fd=3,set=2,opaque="rdwr:/path/to/file" \\
         -add-fd fd=4,set=2,opaque="rdonly:/path/to/file" \\
         -drive file=/dev/fdset/2,index=0,media=disk

    You can connect a CDROM to the slave of ide0:

    .. parsed-literal::

        |qemu_system_x86| -drive file=file,if=ide,index=1,media=cdrom

    If you don't specify the "file=" argument, you define an empty
    drive:

    .. parsed-literal::

        |qemu_system_x86| -drive if=ide,index=1,media=cdrom

    Instead of ``-fda``, ``-fdb``, you can use:

    .. parsed-literal::

        |qemu_system_x86| -drive file=file,index=0,if=floppy
        |qemu_system_x86| -drive file=file,index=1,if=floppy

    By default, interface is "ide" and index is automatically
    incremented:

    .. parsed-literal::

        |qemu_system_x86| -drive file=a -drive file=b"

    is interpreted like:

    .. parsed-literal::

        |qemu_system_x86| -hda a -hdb b
ERST

DEF("mtdblock", HAS_ARG, QEMU_OPTION_mtdblock,
    "-mtdblock file  use 'file' as on-board Flash memory image\n",
    QEMU_ARCH_ALL)
SRST
``-mtdblock file``
    Use file as on-board Flash memory image.
ERST

DEF("sd", HAS_ARG, QEMU_OPTION_sd,
    "-sd file        use 'file' as SecureDigital card image\n", QEMU_ARCH_ALL)
SRST
``-sd file``
    Use file as SecureDigital card image.
ERST

DEF("snapshot", 0, QEMU_OPTION_snapshot,
    "-snapshot       write to temporary files instead of disk image files\n",
    QEMU_ARCH_ALL)
SRST
``-snapshot``
    Write to temporary files instead of disk image files. In this case,
    the raw disk image you use is not written back. You can however
    force the write back by pressing C-a s (see the :ref:`disk images`
    chapter in the System Emulation Users Guide).
ERST

DEF("fsdev", HAS_ARG, QEMU_OPTION_fsdev,
    "-fsdev local,id=id,path=path,security_model=mapped-xattr|mapped-file|passthrough|none\n"
    " [,writeout=immediate][,readonly=on][,fmode=fmode][,dmode=dmode]\n"
    " [[,throttling.bps-total=b]|[[,throttling.bps-read=r][,throttling.bps-write=w]]]\n"
    " [[,throttling.iops-total=i]|[[,throttling.iops-read=r][,throttling.iops-write=w]]]\n"
    " [[,throttling.bps-total-max=bm]|[[,throttling.bps-read-max=rm][,throttling.bps-write-max=wm]]]\n"
    " [[,throttling.iops-total-max=im]|[[,throttling.iops-read-max=irm][,throttling.iops-write-max=iwm]]]\n"
    " [[,throttling.iops-size=is]]\n"
    "-fsdev proxy,id=id,socket=socket[,writeout=immediate][,readonly=on]\n"
    "-fsdev proxy,id=id,sock_fd=sock_fd[,writeout=immediate][,readonly=on]\n"
    "-fsdev synth,id=id\n",
    QEMU_ARCH_ALL)

SRST
``-fsdev local,id=id,path=path,security_model=security_model [,writeout=writeout][,readonly=on][,fmode=fmode][,dmode=dmode] [,throttling.option=value[,throttling.option=value[,...]]]``
  \ 
``-fsdev proxy,id=id,socket=socket[,writeout=writeout][,readonly=on]``
  \
``-fsdev proxy,id=id,sock_fd=sock_fd[,writeout=writeout][,readonly=on]``
  \
``-fsdev synth,id=id[,readonly=on]``
    Define a new file system device. Valid options are:

    ``local``
        Accesses to the filesystem are done by QEMU.

    ``proxy``
        Accesses to the filesystem are done by virtfs-proxy-helper(1).

    ``synth``
        Synthetic filesystem, only used by QTests.

    ``id=id``
        Specifies identifier for this device.

    ``path=path``
        Specifies the export path for the file system device. Files
        under this path will be available to the 9p client on the guest.

    ``security_model=security_model``
        Specifies the security model to be used for this export path.
        Supported security models are "passthrough", "mapped-xattr",
        "mapped-file" and "none". In "passthrough" security model, files
        are stored using the same credentials as they are created on the
        guest. This requires QEMU to run as root. In "mapped-xattr"
        security model, some of the file attributes like uid, gid, mode
        bits and link target are stored as file attributes. For
        "mapped-file" these attributes are stored in the hidden
        .virtfs\_metadata directory. Directories exported by this
        security model cannot interact with other unix tools. "none"
        security model is same as passthrough except the sever won't
        report failures if it fails to set file attributes like
        ownership. Security model is mandatory only for local fsdriver.
        Other fsdrivers (like proxy) don't take security model as a
        parameter.

    ``writeout=writeout``
        This is an optional argument. The only supported value is
        "immediate". This means that host page cache will be used to
        read and write data but write notification will be sent to the
        guest only when the data has been reported as written by the
        storage subsystem.

    ``readonly=on``
        Enables exporting 9p share as a readonly mount for guests. By
        default read-write access is given.

    ``socket=socket``
        Enables proxy filesystem driver to use passed socket file for
        communicating with virtfs-proxy-helper(1).

    ``sock_fd=sock_fd``
        Enables proxy filesystem driver to use passed socket descriptor
        for communicating with virtfs-proxy-helper(1). Usually a helper
        like libvirt will create socketpair and pass one of the fds as
        sock\_fd.

    ``fmode=fmode``
        Specifies the default mode for newly created files on the host.
        Works only with security models "mapped-xattr" and
        "mapped-file".

    ``dmode=dmode``
        Specifies the default mode for newly created directories on the
        host. Works only with security models "mapped-xattr" and
        "mapped-file".

    ``throttling.bps-total=b,throttling.bps-read=r,throttling.bps-write=w``
        Specify bandwidth throttling limits in bytes per second, either
        for all request types or for reads or writes only.

    ``throttling.bps-total-max=bm,bps-read-max=rm,bps-write-max=wm``
        Specify bursts in bytes per second, either for all request types
        or for reads or writes only. Bursts allow the guest I/O to spike
        above the limit temporarily.

    ``throttling.iops-total=i,throttling.iops-read=r, throttling.iops-write=w``
        Specify request rate limits in requests per second, either for
        all request types or for reads or writes only.

    ``throttling.iops-total-max=im,throttling.iops-read-max=irm, throttling.iops-write-max=iwm``
        Specify bursts in requests per second, either for all request
        types or for reads or writes only. Bursts allow the guest I/O to
        spike above the limit temporarily.

    ``throttling.iops-size=is``
        Let every is bytes of a request count as a new request for iops
        throttling purposes.

    -fsdev option is used along with -device driver "virtio-9p-...".

``-device virtio-9p-type,fsdev=id,mount_tag=mount_tag``
    Options for virtio-9p-... driver are:

    ``type``
        Specifies the variant to be used. Supported values are "pci",
        "ccw" or "device", depending on the machine type.

    ``fsdev=id``
        Specifies the id value specified along with -fsdev option.

    ``mount_tag=mount_tag``
        Specifies the tag name to be used by the guest to mount this
        export point.
ERST

DEF("virtfs", HAS_ARG, QEMU_OPTION_virtfs,
    "-virtfs local,path=path,mount_tag=tag,security_model=mapped-xattr|mapped-file|passthrough|none\n"
    "        [,id=id][,writeout=immediate][,readonly=on][,fmode=fmode][,dmode=dmode][,multidevs=remap|forbid|warn]\n"
    "-virtfs proxy,mount_tag=tag,socket=socket[,id=id][,writeout=immediate][,readonly=on]\n"
    "-virtfs proxy,mount_tag=tag,sock_fd=sock_fd[,id=id][,writeout=immediate][,readonly=on]\n"
    "-virtfs synth,mount_tag=tag[,id=id][,readonly=on]\n",
    QEMU_ARCH_ALL)

SRST
``-virtfs local,path=path,mount_tag=mount_tag ,security_model=security_model[,writeout=writeout][,readonly=on] [,fmode=fmode][,dmode=dmode][,multidevs=multidevs]``
  \ 
``-virtfs proxy,socket=socket,mount_tag=mount_tag [,writeout=writeout][,readonly=on]``
  \ 
``-virtfs proxy,sock_fd=sock_fd,mount_tag=mount_tag [,writeout=writeout][,readonly=on]``
  \
``-virtfs synth,mount_tag=mount_tag``
    Define a new virtual filesystem device and expose it to the guest using
    a virtio-9p-device (a.k.a. 9pfs), which essentially means that a certain
    directory on host is made directly accessible by guest as a pass-through
    file system by using the 9P network protocol for communication between
    host and guests, if desired even accessible, shared by several guests
    simultaneously.

    Note that ``-virtfs`` is actually just a convenience shortcut for its
    generalized form ``-fsdev -device virtio-9p-pci``.

    The general form of pass-through file system options are:

    ``local``
        Accesses to the filesystem are done by QEMU.

    ``proxy``
        Accesses to the filesystem are done by virtfs-proxy-helper(1).

    ``synth``
        Synthetic filesystem, only used by QTests.

    ``id=id``
        Specifies identifier for the filesystem device

    ``path=path``
        Specifies the export path for the file system device. Files
        under this path will be available to the 9p client on the guest.

    ``security_model=security_model``
        Specifies the security model to be used for this export path.
        Supported security models are "passthrough", "mapped-xattr",
        "mapped-file" and "none". In "passthrough" security model, files
        are stored using the same credentials as they are created on the
        guest. This requires QEMU to run as root. In "mapped-xattr"
        security model, some of the file attributes like uid, gid, mode
        bits and link target are stored as file attributes. For
        "mapped-file" these attributes are stored in the hidden
        .virtfs\_metadata directory. Directories exported by this
        security model cannot interact with other unix tools. "none"
        security model is same as passthrough except the sever won't
        report failures if it fails to set file attributes like
        ownership. Security model is mandatory only for local fsdriver.
        Other fsdrivers (like proxy) don't take security model as a
        parameter.

    ``writeout=writeout``
        This is an optional argument. The only supported value is
        "immediate". This means that host page cache will be used to
        read and write data but write notification will be sent to the
        guest only when the data has been reported as written by the
        storage subsystem.

    ``readonly=on``
        Enables exporting 9p share as a readonly mount for guests. By
        default read-write access is given.

    ``socket=socket``
        Enables proxy filesystem driver to use passed socket file for
        communicating with virtfs-proxy-helper(1). Usually a helper like
        libvirt will create socketpair and pass one of the fds as
        sock\_fd.

    ``sock_fd``
        Enables proxy filesystem driver to use passed 'sock\_fd' as the
        socket descriptor for interfacing with virtfs-proxy-helper(1).

    ``fmode=fmode``
        Specifies the default mode for newly created files on the host.
        Works only with security models "mapped-xattr" and
        "mapped-file".

    ``dmode=dmode``
        Specifies the default mode for newly created directories on the
        host. Works only with security models "mapped-xattr" and
        "mapped-file".

    ``mount_tag=mount_tag``
        Specifies the tag name to be used by the guest to mount this
        export point.

    ``multidevs=multidevs``
        Specifies how to deal with multiple devices being shared with a
        9p export. Supported behaviours are either "remap", "forbid" or
        "warn". The latter is the default behaviour on which virtfs 9p
        expects only one device to be shared with the same export, and
        if more than one device is shared and accessed via the same 9p
        export then only a warning message is logged (once) by qemu on
        host side. In order to avoid file ID collisions on guest you
        should either create a separate virtfs export for each device to
        be shared with guests (recommended way) or you might use "remap"
        instead which allows you to share multiple devices with only one
        export instead, which is achieved by remapping the original
        inode numbers from host to guest in a way that would prevent
        such collisions. Remapping inodes in such use cases is required
        because the original device IDs from host are never passed and
        exposed on guest. Instead all files of an export shared with
        virtfs always share the same device id on guest. So two files
        with identical inode numbers but from actually different devices
        on host would otherwise cause a file ID collision and hence
        potential misbehaviours on guest. "forbid" on the other hand
        assumes like "warn" that only one device is shared by the same
        export, however it will not only log a warning message but also
        deny access to additional devices on guest. Note though that
        "forbid" does currently not block all possible file access
        operations (e.g. readdir() would still return entries from other
        devices).
ERST

DEF("iscsi", HAS_ARG, QEMU_OPTION_iscsi,
    "-iscsi [user=user][,password=password]\n"
    "       [,header-digest=CRC32C|CR32C-NONE|NONE-CRC32C|NONE\n"
    "       [,initiator-name=initiator-iqn][,id=target-iqn]\n"
    "       [,timeout=timeout]\n"
    "                iSCSI session parameters\n", QEMU_ARCH_ALL)

SRST
``-iscsi``
    Configure iSCSI session parameters.
ERST

DEFHEADING()

DEFHEADING(USB convenience options:)

DEF("usb", 0, QEMU_OPTION_usb,
    "-usb            enable on-board USB host controller (if not enabled by default)\n",
    QEMU_ARCH_ALL)
SRST
``-usb``
    Enable USB emulation on machine types with an on-board USB host
    controller (if not enabled by default). Note that on-board USB host
    controllers may not support USB 3.0. In this case
    ``-device qemu-xhci`` can be used instead on machines with PCI.
ERST

DEF("usbdevice", HAS_ARG, QEMU_OPTION_usbdevice,
    "-usbdevice name add the host or guest USB device 'name'\n",
    QEMU_ARCH_ALL)
SRST
``-usbdevice devname``
    Add the USB device devname, and enable an on-board USB controller
    if possible and necessary (just like it can be done via
    ``-machine usb=on``). Note that this option is mainly intended for
    the user's convenience only. More fine-grained control can be
    achieved by selecting a USB host controller (if necessary) and the
    desired USB device via the ``-device`` option instead. For example,
    instead of using ``-usbdevice mouse`` it is possible to use
    ``-device qemu-xhci -device usb-mouse`` to connect the USB mouse
    to a USB 3.0 controller instead (at least on machines that support
    PCI and do not have an USB controller enabled by default yet).
    For more details, see the chapter about
    :ref:`Connecting USB devices` in the System Emulation Users Guide.
    Possible devices for devname are:

    ``braille``
        Braille device. This will use BrlAPI to display the braille
        output on a real or fake device (i.e. it also creates a
        corresponding ``braille`` chardev automatically beside the
        ``usb-braille`` USB device).

    ``keyboard``
        Standard USB keyboard. Will override the PS/2 keyboard (if present).

    ``mouse``
        Virtual Mouse. This will override the PS/2 mouse emulation when
        activated.

    ``tablet``
        Pointer device that uses absolute coordinates (like a
        touchscreen). This means QEMU is able to report the mouse
        position without having to grab the mouse. Also overrides the
        PS/2 mouse emulation when activated.

    ``wacom-tablet``
        Wacom PenPartner USB tablet.


ERST

DEFHEADING()

DEFHEADING(Display options:)

DEF("display", HAS_ARG, QEMU_OPTION_display,
#if defined(CONFIG_SPICE)
    "-display spice-app[,gl=on|off]\n"
#endif
#if defined(CONFIG_SDL)
    "-display sdl[,gl=on|core|es|off][,grab-mod=<mod>][,show-cursor=on|off]\n"
    "            [,window-close=on|off]\n"
#endif
#if defined(CONFIG_GTK)
    "-display gtk[,full-screen=on|off][,gl=on|off][,grab-on-hover=on|off]\n"
    "            [,show-tabs=on|off][,show-cursor=on|off][,window-close=on|off]\n"
    "            [,show-menubar=on|off]\n"
#endif
#if defined(CONFIG_VNC)
    "-display vnc=<display>[,<optargs>]\n"
#endif
#if defined(CONFIG_CURSES)
    "-display curses[,charset=<encoding>]\n"
#endif
#if defined(CONFIG_COCOA)
    "-display cocoa[,full-grab=on|off][,swap-opt-cmd=on|off]\n"
#endif
#if defined(CONFIG_OPENGL)
    "-display egl-headless[,rendernode=<file>]\n"
#endif
#if defined(CONFIG_DBUS_DISPLAY)
    "-display dbus[,addr=<dbusaddr>]\n"
    "             [,gl=on|core|es|off][,rendernode=<file>]\n"
#endif
#if defined(CONFIG_COCOA)
    "-display cocoa[,show-cursor=on|off][,left-command-key=on|off]\n"
#endif
    "-display none\n"
    "                select display backend type\n"
    "                The default display is equivalent to\n                "
#if defined(CONFIG_GTK)
            "\"-display gtk\"\n"
#elif defined(CONFIG_SDL)
            "\"-display sdl\"\n"
#elif defined(CONFIG_COCOA)
            "\"-display cocoa\"\n"
#elif defined(CONFIG_VNC)
            "\"-vnc localhost:0,to=99,id=default\"\n"
#else
            "\"-display none\"\n"
#endif
    , QEMU_ARCH_ALL)
SRST
``-display type``
    Select type of display to use. Use ``-display help`` to list the available
    display types. Valid values for type are

    ``spice-app[,gl=on|off]``
        Start QEMU as a Spice server and launch the default Spice client
        application. The Spice server will redirect the serial consoles
        and QEMU monitors. (Since 4.0)

    ``dbus``
        Export the display over D-Bus interfaces. (Since 7.0)

        The connection is registered with the "org.qemu" name (and queued when
        already owned).

        ``addr=<dbusaddr>`` : D-Bus bus address to connect to.

        ``p2p=yes|no`` : Use peer-to-peer connection, accepted via QMP ``add_client``.

        ``gl=on|off|core|es`` : Use OpenGL for rendering (the D-Bus interface
        will share framebuffers with DMABUF file descriptors).

    ``sdl``
        Display video output via SDL (usually in a separate graphics
        window; see the SDL documentation for other possibilities).
        Valid parameters are:

        ``grab-mod=<mods>`` : Used to select the modifier keys for toggling
        the mouse grabbing in conjunction with the "g" key. ``<mods>`` can be
        either ``lshift-lctrl-lalt`` or ``rctrl``.

        ``gl=on|off|core|es`` : Use OpenGL for displaying

        ``show-cursor=on|off`` :  Force showing the mouse cursor

        ``window-close=on|off`` : Allow to quit qemu with window close button

    ``gtk``
        Display video output in a GTK window. This interface provides
        drop-down menus and other UI elements to configure and control
        the VM during runtime. Valid parameters are:

        ``full-screen=on|off`` : Start in fullscreen mode

        ``gl=on|off`` : Use OpenGL for displaying

        ``grab-on-hover=on|off`` : Grab keyboard input on mouse hover

        ``show-tabs=on|off`` : Display the tab bar for switching between the
                               various graphical interfaces (e.g. VGA and
                               virtual console character devices) by default.

        ``show-cursor=on|off`` :  Force showing the mouse cursor

        ``window-close=on|off`` : Allow to quit qemu with window close button

        ``show-menubar=on|off`` : Display the main window menubar, defaults to "on"

    ``curses[,charset=<encoding>]``
        Display video output via curses. For graphics device models
        which support a text mode, QEMU can display this output using a
        curses/ncurses interface. Nothing is displayed when the graphics
        device is in graphical mode or if the graphics device does not
        support a text mode. Generally only the VGA device models
        support text mode. The font charset used by the guest can be
        specified with the ``charset`` option, for example
        ``charset=CP850`` for IBM CP850 encoding. The default is
        ``CP437``.

    ``cocoa``
        Display video output in a Cocoa window. Mac only. This interface
        provides drop-down menus and other UI elements to configure and
        control the VM during runtime. Valid parameters are:

        ``show-cursor=on|off`` :  Force showing the mouse cursor

        ``left-command-key=on|off`` : Disable forwarding left command key to host

    ``egl-headless[,rendernode=<file>]``
        Offload all OpenGL operations to a local DRI device. For any
        graphical display, this display needs to be paired with either
        VNC or SPICE displays.

    ``vnc=<display>``
        Start a VNC server on display <display>

    ``none``
        Do not display video output. The guest will still see an
        emulated graphics card, but its output will not be displayed to
        the QEMU user. This option differs from the -nographic option in
        that it only affects what is done with video output; -nographic
        also changes the destination of the serial and parallel port
        data.
ERST

DEF("nographic", 0, QEMU_OPTION_nographic,
    "-nographic      disable graphical output and redirect serial I/Os to console\n",
    QEMU_ARCH_ALL)
SRST
``-nographic``
    Normally, if QEMU is compiled with graphical window support, it
    displays output such as guest graphics, guest console, and the QEMU
    monitor in a window. With this option, you can totally disable
    graphical output so that QEMU is a simple command line application.
    The emulated serial port is redirected on the console and muxed with
    the monitor (unless redirected elsewhere explicitly). Therefore, you
    can still use QEMU to debug a Linux kernel with a serial console.
    Use C-a h for help on switching between the console and monitor.
ERST

#ifdef CONFIG_SPICE
DEF("spice", HAS_ARG, QEMU_OPTION_spice,
    "-spice [port=port][,tls-port=secured-port][,x509-dir=<dir>]\n"
    "       [,x509-key-file=<file>][,x509-key-password=<file>]\n"
    "       [,x509-cert-file=<file>][,x509-cacert-file=<file>]\n"
    "       [,x509-dh-key-file=<file>][,addr=addr]\n"
    "       [,ipv4=on|off][,ipv6=on|off][,unix=on|off]\n"
    "       [,tls-ciphers=<list>]\n"
    "       [,tls-channel=[main|display|cursor|inputs|record|playback]]\n"
    "       [,plaintext-channel=[main|display|cursor|inputs|record|playback]]\n"
    "       [,sasl=on|off][,disable-ticketing=on|off]\n"
    "       [,password=<string>][,password-secret=<secret-id>]\n"
    "       [,image-compression=[auto_glz|auto_lz|quic|glz|lz|off]]\n"
    "       [,jpeg-wan-compression=[auto|never|always]]\n"
    "       [,zlib-glz-wan-compression=[auto|never|always]]\n"
    "       [,streaming-video=[off|all|filter]][,disable-copy-paste=on|off]\n"
    "       [,disable-agent-file-xfer=on|off][,agent-mouse=[on|off]]\n"
    "       [,playback-compression=[on|off]][,seamless-migration=[on|off]]\n"
    "       [,gl=[on|off]][,rendernode=<file>]\n"
    "   enable spice\n"
    "   at least one of {port, tls-port} is mandatory\n",
    QEMU_ARCH_ALL)
#endif
SRST
``-spice option[,option[,...]]``
    Enable the spice remote desktop protocol. Valid options are

    ``port=<nr>``
        Set the TCP port spice is listening on for plaintext channels.

    ``addr=<addr>``
        Set the IP address spice is listening on. Default is any
        address.

    ``ipv4=on|off``; \ ``ipv6=on|off``; \ ``unix=on|off``
        Force using the specified IP version.

    ``password=<string>``
        Set the password you need to authenticate.

        This option is deprecated and insecure because it leaves the
        password visible in the process listing. Use ``password-secret``
        instead.

    ``password-secret=<secret-id>``
        Set the ID of the ``secret`` object containing the password
        you need to authenticate.

    ``sasl=on|off``
        Require that the client use SASL to authenticate with the spice.
        The exact choice of authentication method used is controlled
        from the system / user's SASL configuration file for the 'qemu'
        service. This is typically found in /etc/sasl2/qemu.conf. If
        running QEMU as an unprivileged user, an environment variable
        SASL\_CONF\_PATH can be used to make it search alternate
        locations for the service config. While some SASL auth methods
        can also provide data encryption (eg GSSAPI), it is recommended
        that SASL always be combined with the 'tls' and 'x509' settings
        to enable use of SSL and server certificates. This ensures a
        data encryption preventing compromise of authentication
        credentials.

    ``disable-ticketing=on|off``
        Allow client connects without authentication.

    ``disable-copy-paste=on|off``
        Disable copy paste between the client and the guest.

    ``disable-agent-file-xfer=on|off``
        Disable spice-vdagent based file-xfer between the client and the
        guest.

    ``tls-port=<nr>``
        Set the TCP port spice is listening on for encrypted channels.

    ``x509-dir=<dir>``
        Set the x509 file directory. Expects same filenames as -vnc
        $display,x509=$dir

    ``x509-key-file=<file>``; \ ``x509-key-password=<file>``; \ ``x509-cert-file=<file>``; \ ``x509-cacert-file=<file>``; \ ``x509-dh-key-file=<file>``
        The x509 file names can also be configured individually.

    ``tls-ciphers=<list>``
        Specify which ciphers to use.

    ``tls-channel=[main|display|cursor|inputs|record|playback]``; \ ``plaintext-channel=[main|display|cursor|inputs|record|playback]``
        Force specific channel to be used with or without TLS
        encryption. The options can be specified multiple times to
        configure multiple channels. The special name "default" can be
        used to set the default mode. For channels which are not
        explicitly forced into one mode the spice client is allowed to
        pick tls/plaintext as he pleases.

    ``image-compression=[auto_glz|auto_lz|quic|glz|lz|off]``
        Configure image compression (lossless). Default is auto\_glz.

    ``jpeg-wan-compression=[auto|never|always]``; \ ``zlib-glz-wan-compression=[auto|never|always]``
        Configure wan image compression (lossy for slow links). Default
        is auto.

    ``streaming-video=[off|all|filter]``
        Configure video stream detection. Default is off.

    ``agent-mouse=[on|off]``
        Enable/disable passing mouse events via vdagent. Default is on.

    ``playback-compression=[on|off]``
        Enable/disable audio stream compression (using celt 0.5.1).
        Default is on.

    ``seamless-migration=[on|off]``
        Enable/disable spice seamless migration. Default is off.

    ``gl=[on|off]``
        Enable/disable OpenGL context. Default is off.

    ``rendernode=<file>``
        DRM render node for OpenGL rendering. If not specified, it will
        pick the first available. (Since 2.9)
ERST

DEF("portrait", 0, QEMU_OPTION_portrait,
    "-portrait       rotate graphical output 90 deg left (only PXA LCD)\n",
    QEMU_ARCH_ALL)
SRST
``-portrait``
    Rotate graphical output 90 deg left (only PXA LCD).
ERST

DEF("rotate", HAS_ARG, QEMU_OPTION_rotate,
    "-rotate <deg>   rotate graphical output some deg left (only PXA LCD)\n",
    QEMU_ARCH_ALL)
SRST
``-rotate deg``
    Rotate graphical output some deg left (only PXA LCD).
ERST

DEF("vga", HAS_ARG, QEMU_OPTION_vga,
    "-vga [std|cirrus|vmware|qxl|xenfb|tcx|cg3|virtio|none]\n"
    "                select video card type\n", QEMU_ARCH_ALL)
SRST
``-vga type``
    Select type of VGA card to emulate. Valid values for type are

    ``cirrus``
        Cirrus Logic GD5446 Video card. All Windows versions starting
        from Windows 95 should recognize and use this graphic card. For
        optimal performances, use 16 bit color depth in the guest and
        the host OS. (This card was the default before QEMU 2.2)

    ``std``
        Standard VGA card with Bochs VBE extensions. If your guest OS
        supports the VESA 2.0 VBE extensions (e.g. Windows XP) and if
        you want to use high resolution modes (>= 1280x1024x16) then you
        should use this option. (This card is the default since QEMU
        2.2)

    ``vmware``
        VMWare SVGA-II compatible adapter. Use it if you have
        sufficiently recent XFree86/XOrg server or Windows guest with a
        driver for this card.

    ``qxl``
        QXL paravirtual graphic card. It is VGA compatible (including
        VESA 2.0 VBE support). Works best with qxl guest drivers
        installed though. Recommended choice when using the spice
        protocol.

    ``tcx``
        (sun4m only) Sun TCX framebuffer. This is the default
        framebuffer for sun4m machines and offers both 8-bit and 24-bit
        colour depths at a fixed resolution of 1024x768.

    ``cg3``
        (sun4m only) Sun cgthree framebuffer. This is a simple 8-bit
        framebuffer for sun4m machines available in both 1024x768
        (OpenBIOS) and 1152x900 (OBP) resolutions aimed at people
        wishing to run older Solaris versions.

    ``virtio``
        Virtio VGA card.

    ``none``
        Disable VGA card.
ERST

DEF("full-screen", 0, QEMU_OPTION_full_screen,
    "-full-screen    start in full screen\n", QEMU_ARCH_ALL)
SRST
``-full-screen``
    Start in full screen.
ERST

DEF("g", HAS_ARG, QEMU_OPTION_g ,
    "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n",
    QEMU_ARCH_PPC | QEMU_ARCH_SPARC | QEMU_ARCH_M68K)
SRST
``-g`` *width*\ ``x``\ *height*\ ``[x``\ *depth*\ ``]``
    Set the initial graphical resolution and depth (PPC, SPARC only).

    For PPC the default is 800x600x32.

    For SPARC with the TCX graphics device, the default is 1024x768x8
    with the option of 1024x768x24. For cgthree, the default is
    1024x768x8 with the option of 1152x900x8 for people who wish to use
    OBP.
ERST

DEF("vnc", HAS_ARG, QEMU_OPTION_vnc ,
    "-vnc <display>  shorthand for -display vnc=<display>\n", QEMU_ARCH_ALL)
SRST
``-vnc display[,option[,option[,...]]]``
    Normally, if QEMU is compiled with graphical window support, it
    displays output such as guest graphics, guest console, and the QEMU
    monitor in a window. With this option, you can have QEMU listen on
    VNC display display and redirect the VGA display over the VNC
    session. It is very useful to enable the usb tablet device when
    using this option (option ``-device usb-tablet``). When using the
    VNC display, you must use the ``-k`` parameter to set the keyboard
    layout if you are not using en-us. Valid syntax for the display is

    ``to=L``
        With this option, QEMU will try next available VNC displays,
        until the number L, if the origianlly defined "-vnc display" is
        not available, e.g. port 5900+display is already used by another
        application. By default, to=0.

    ``host:d``
        TCP connections will only be allowed from host on display d. By
        convention the TCP port is 5900+d. Optionally, host can be
        omitted in which case the server will accept connections from
        any host.

    ``unix:path``
        Connections will be allowed over UNIX domain sockets where path
        is the location of a unix socket to listen for connections on.

    ``none``
        VNC is initialized but not started. The monitor ``change``
        command can be used to later start the VNC server.

    Following the display value there may be one or more option flags
    separated by commas. Valid options are

    ``reverse=on|off``
        Connect to a listening VNC client via a "reverse" connection.
        The client is specified by the display. For reverse network
        connections (host:d,``reverse``), the d argument is a TCP port
        number, not a display number.

    ``websocket=on|off``
        Opens an additional TCP listening port dedicated to VNC
        Websocket connections. If a bare websocket option is given, the
        Websocket port is 5700+display. An alternative port can be
        specified with the syntax ``websocket``\ =port.

        If host is specified connections will only be allowed from this
        host. It is possible to control the websocket listen address
        independently, using the syntax ``websocket``\ =host:port.

        If no TLS credentials are provided, the websocket connection
        runs in unencrypted mode. If TLS credentials are provided, the
        websocket connection requires encrypted client connections.

    ``password=on|off``
        Require that password based authentication is used for client
        connections.

        The password must be set separately using the ``set_password``
        command in the :ref:`QEMU monitor`. The
        syntax to change your password is:
        ``set_password <protocol> <password>`` where <protocol> could be
        either "vnc" or "spice".

        If you would like to change <protocol> password expiration, you
        should use ``expire_password <protocol> <expiration-time>``
        where expiration time could be one of the following options:
        now, never, +seconds or UNIX time of expiration, e.g. +60 to
        make password expire in 60 seconds, or 1335196800 to make
        password expire on "Mon Apr 23 12:00:00 EDT 2012" (UNIX time for
        this date and time).

        You can also use keywords "now" or "never" for the expiration
        time to allow <protocol> password to expire immediately or never
        expire.

    ``password-secret=<secret-id>``
        Require that password based authentication is used for client
        connections, using the password provided by the ``secret``
        object identified by ``secret-id``.

    ``tls-creds=ID``
        Provides the ID of a set of TLS credentials to use to secure the
        VNC server. They will apply to both the normal VNC server socket
        and the websocket socket (if enabled). Setting TLS credentials
        will cause the VNC server socket to enable the VeNCrypt auth
        mechanism. The credentials should have been previously created
        using the ``-object tls-creds`` argument.

    ``tls-authz=ID``
        Provides the ID of the QAuthZ authorization object against which
        the client's x509 distinguished name will validated. This object
        is only resolved at time of use, so can be deleted and recreated
        on the fly while the VNC server is active. If missing, it will
        default to denying access.

    ``sasl=on|off``
        Require that the client use SASL to authenticate with the VNC
        server. The exact choice of authentication method used is
        controlled from the system / user's SASL configuration file for
        the 'qemu' service. This is typically found in
        /etc/sasl2/qemu.conf. If running QEMU as an unprivileged user,
        an environment variable SASL\_CONF\_PATH can be used to make it
        search alternate locations for the service config. While some
        SASL auth methods can also provide data encryption (eg GSSAPI),
        it is recommended that SASL always be combined with the 'tls'
        and 'x509' settings to enable use of SSL and server
        certificates. This ensures a data encryption preventing
        compromise of authentication credentials. See the
        :ref:`VNC security` section in the System Emulation Users Guide
        for details on using SASL authentication.

    ``sasl-authz=ID``
        Provides the ID of the QAuthZ authorization object against which
        the client's SASL username will validated. This object is only
        resolved at time of use, so can be deleted and recreated on the
        fly while the VNC server is active. If missing, it will default
        to denying access.

    ``acl=on|off``
        Legacy method for enabling authorization of clients against the
        x509 distinguished name and SASL username. It results in the
        creation of two ``authz-list`` objects with IDs of
        ``vnc.username`` and ``vnc.x509dname``. The rules for these
        objects must be configured with the HMP ACL commands.

        This option is deprecated and should no longer be used. The new
        ``sasl-authz`` and ``tls-authz`` options are a replacement.

    ``lossy=on|off``
        Enable lossy compression methods (gradient, JPEG, ...). If this
        option is set, VNC client may receive lossy framebuffer updates
        depending on its encoding settings. Enabling this option can
        save a lot of bandwidth at the expense of quality.

    ``non-adaptive=on|off``
        Disable adaptive encodings. Adaptive encodings are enabled by
        default. An adaptive encoding will try to detect frequently
        updated screen regions, and send updates in these regions using
        a lossy encoding (like JPEG). This can be really helpful to save
        bandwidth when playing videos. Disabling adaptive encodings
        restores the original static behavior of encodings like Tight.

    ``share=[allow-exclusive|force-shared|ignore]``
        Set display sharing policy. 'allow-exclusive' allows clients to
        ask for exclusive access. As suggested by the rfb spec this is
        implemented by dropping other connections. Connecting multiple
        clients in parallel requires all clients asking for a shared
        session (vncviewer: -shared switch). This is the default.
        'force-shared' disables exclusive client access. Useful for
        shared desktop sessions, where you don't want someone forgetting
        specify -shared disconnect everybody else. 'ignore' completely
        ignores the shared flag and allows everybody connect
        unconditionally. Doesn't conform to the rfb spec but is
        traditional QEMU behavior.

    ``key-delay-ms``
        Set keyboard delay, for key down and key up events, in
        milliseconds. Default is 10. Keyboards are low-bandwidth
        devices, so this slowdown can help the device and guest to keep
        up and not lose events in case events are arriving in bulk.
        Possible causes for the latter are flaky network connections, or
        scripts for automated testing.

    ``audiodev=audiodev``
        Use the specified audiodev when the VNC client requests audio
        transmission. When not using an -audiodev argument, this option
        must be omitted, otherwise is must be present and specify a
        valid audiodev.

    ``power-control=on|off``
        Permit the remote client to issue shutdown, reboot or reset power
        control requests.
ERST

ARCHHEADING(, QEMU_ARCH_I386)

ARCHHEADING(i386 target only:, QEMU_ARCH_I386)

DEF("win2k-hack", 0, QEMU_OPTION_win2k_hack,
    "-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug\n",
    QEMU_ARCH_I386)
SRST
``-win2k-hack``
    Use it when installing Windows 2000 to avoid a disk full bug. After
    Windows 2000 is installed, you no longer need this option (this
    option slows down the IDE transfers).
ERST

DEF("no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk,
    "-no-fd-bootchk  disable boot signature checking for floppy disks\n",
    QEMU_ARCH_I386)
SRST
``-no-fd-bootchk``
    Disable boot signature checking for floppy disks in BIOS. May be
    needed to boot from old floppy disks.
ERST

DEF("no-acpi", 0, QEMU_OPTION_no_acpi,
           "-no-acpi        disable ACPI\n", QEMU_ARCH_I386 | QEMU_ARCH_ARM)
SRST
``-no-acpi``
    Disable ACPI (Advanced Configuration and Power Interface) support.
    Use it if your guest OS complains about ACPI problems (PC target
    machine only).
ERST

DEF("no-hpet", 0, QEMU_OPTION_no_hpet,
    "-no-hpet        disable HPET\n", QEMU_ARCH_I386)
SRST
``-no-hpet``
    Disable HPET support.
ERST

DEF("acpitable", HAS_ARG, QEMU_OPTION_acpitable,
    "-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,{data|file}=file1[:file2]...]\n"
    "                ACPI table description\n", QEMU_ARCH_I386)
SRST
``-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n] [,asl_compiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]...]``
    Add ACPI table with specified header fields and context from
    specified files. For file=, take whole ACPI table from the specified
    files, including all ACPI headers (possible overridden by other
    options). For data=, only data portion of the table is used, all
    header information is specified in the command line. If a SLIC table
    is supplied to QEMU, then the SLIC's oem\_id and oem\_table\_id
    fields will override the same in the RSDT and the FADT (a.k.a.
    FACP), in order to ensure the field matches required by the
    Microsoft SLIC spec and the ACPI spec.
ERST

DEF("smbios", HAS_ARG, QEMU_OPTION_smbios,
    "-smbios file=binary\n"
    "                load SMBIOS entry from binary file\n"
    "-smbios type=0[,vendor=str][,version=str][,date=str][,release=%d.%d]\n"
    "              [,uefi=on|off]\n"
    "                specify SMBIOS type 0 fields\n"
    "-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str]\n"
    "              [,uuid=uuid][,sku=str][,family=str]\n"
    "                specify SMBIOS type 1 fields\n"
    "-smbios type=2[,manufacturer=str][,product=str][,version=str][,serial=str]\n"
    "              [,asset=str][,location=str]\n"
    "                specify SMBIOS type 2 fields\n"
    "-smbios type=3[,manufacturer=str][,version=str][,serial=str][,asset=str]\n"
    "              [,sku=str]\n"
    "                specify SMBIOS type 3 fields\n"
    "-smbios type=4[,sock_pfx=str][,manufacturer=str][,version=str][,serial=str]\n"
    "              [,asset=str][,part=str][,max-speed=%d][,current-speed=%d]\n"
    "              [,processor-id=%d]\n"
    "                specify SMBIOS type 4 fields\n"
    "-smbios type=8[,external_reference=str][,internal_reference=str][,connector_type=%d][,port_type=%d]\n"
    "                specify SMBIOS type 8 fields\n"
    "-smbios type=11[,value=str][,path=filename]\n"
    "                specify SMBIOS type 11 fields\n"
    "-smbios type=17[,loc_pfx=str][,bank=str][,manufacturer=str][,serial=str]\n"
    "               [,asset=str][,part=str][,speed=%d]\n"
    "                specify SMBIOS type 17 fields\n"
    "-smbios type=41[,designation=str][,kind=str][,instance=%d][,pcidev=str]\n"
    "                specify SMBIOS type 41 fields\n",
    QEMU_ARCH_I386 | QEMU_ARCH_ARM)
SRST
``-smbios file=binary``
    Load SMBIOS entry from binary file.

``-smbios type=0[,vendor=str][,version=str][,date=str][,release=%d.%d][,uefi=on|off]``
    Specify SMBIOS type 0 fields

``-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str][,uuid=uuid][,sku=str][,family=str]``
    Specify SMBIOS type 1 fields

``-smbios type=2[,manufacturer=str][,product=str][,version=str][,serial=str][,asset=str][,location=str]``
    Specify SMBIOS type 2 fields

``-smbios type=3[,manufacturer=str][,version=str][,serial=str][,asset=str][,sku=str]``
    Specify SMBIOS type 3 fields

``-smbios type=4[,sock_pfx=str][,manufacturer=str][,version=str][,serial=str][,asset=str][,part=str][,processor-id=%d]``
    Specify SMBIOS type 4 fields

``-smbios type=11[,value=str][,path=filename]``
    Specify SMBIOS type 11 fields

    This argument can be repeated multiple times, and values are added in the order they are parsed.
    Applications intending to use OEM strings data are encouraged to use their application name as
    a prefix for the value string. This facilitates passing information for multiple applications
    concurrently.

    The ``value=str`` syntax provides the string data inline, while the ``path=filename`` syntax
    loads data from a file on disk. Note that the file is not permitted to contain any NUL bytes.

    Both the ``value`` and ``path`` options can be repeated multiple times and will be added to
    the SMBIOS table in the order in which they appear.

    Note that on the x86 architecture, the total size of all SMBIOS tables is limited to 65535
    bytes. Thus the OEM strings data is not suitable for passing large amounts of data into the
    guest. Instead it should be used as a indicator to inform the guest where to locate the real
    data set, for example, by specifying the serial ID of a block device.

    An example passing three strings is

    .. parsed-literal::

        -smbios type=11,value=cloud-init:ds=nocloud-net;s=http://10.10.0.1:8000/,\\
                        value=anaconda:method=http://dl.fedoraproject.org/pub/fedora/linux/releases/25/x86_64/os,\\
                        path=/some/file/with/oemstringsdata.txt

    In the guest OS this is visible with the ``dmidecode`` command

     .. parsed-literal::

         $ dmidecode -t 11
         Handle 0x0E00, DMI type 11, 5 bytes
         OEM Strings
              String 1: cloud-init:ds=nocloud-net;s=http://10.10.0.1:8000/
              String 2: anaconda:method=http://dl.fedoraproject.org/pub/fedora/linux/releases/25/x86_64/os
              String 3: myapp:some extra data


``-smbios type=17[,loc_pfx=str][,bank=str][,manufacturer=str][,serial=str][,asset=str][,part=str][,speed=%d]``
    Specify SMBIOS type 17 fields

``-smbios type=41[,designation=str][,kind=str][,instance=%d][,pcidev=str]``
    Specify SMBIOS type 41 fields

    This argument can be repeated multiple times.  Its main use is to allow network interfaces be created
    as ``enoX`` on Linux, with X being the instance number, instead of the name depending on the interface
    position on the PCI bus.

    Here is an example of use:

    .. parsed-literal::

        -netdev user,id=internet \\
        -device virtio-net-pci,mac=50:54:00:00:00:42,netdev=internet,id=internet-dev \\
        -smbios type=41,designation='Onboard LAN',instance=1,kind=ethernet,pcidev=internet-dev

    In the guest OS, the device should then appear as ``eno1``:

    ..parsed-literal::

         $ ip -brief l
         lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
         eno1             UP             50:54:00:00:00:42 <BROADCAST,MULTICAST,UP,LOWER_UP>

    Currently, the PCI device has to be attached to the root bus.

ERST

DEFHEADING()

DEFHEADING(Network options:)

DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
#ifdef CONFIG_SLIRP
    "-netdev user,id=str[,ipv4=on|off][,net=addr[/mask]][,host=addr]\n"
    "         [,ipv6=on|off][,ipv6-net=addr[/int]][,ipv6-host=addr]\n"
    "         [,restrict=on|off][,hostname=host][,dhcpstart=addr]\n"
    "         [,dns=addr][,ipv6-dns=addr][,dnssearch=domain][,domainname=domain]\n"
    "         [,tftp=dir][,tftp-server-name=name][,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
#ifndef _WIN32
                                             "[,smb=dir[,smbserver=addr]]\n"
#endif
    "                configure a user mode network backend with ID 'str',\n"
    "                its DHCP server and optional services\n"
#endif
#ifdef _WIN32
    "-netdev tap,id=str,ifname=name\n"
    "                configure a host TAP network backend with ID 'str'\n"
#else
    "-netdev tap,id=str[,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]\n"
    "         [,br=bridge][,helper=helper][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off]\n"
    "         [,vhostfd=h][,vhostfds=x:y:...:z][,vhostforce=on|off][,queues=n]\n"
    "         [,poll-us=n]\n"
    "                configure a host TAP network backend with ID 'str'\n"
    "                connected to a bridge (default=" DEFAULT_BRIDGE_INTERFACE ")\n"
    "                use network scripts 'file' (default=" DEFAULT_NETWORK_SCRIPT ")\n"
    "                to configure it and 'dfile' (default=" DEFAULT_NETWORK_DOWN_SCRIPT ")\n"
    "                to deconfigure it\n"
    "                use '[down]script=no' to disable script execution\n"
    "                use network helper 'helper' (default=" DEFAULT_BRIDGE_HELPER ") to\n"
    "                configure it\n"
    "                use 'fd=h' to connect to an already opened TAP interface\n"
    "                use 'fds=x:y:...:z' to connect to already opened multiqueue capable TAP interfaces\n"
    "                use 'sndbuf=nbytes' to limit the size of the send buffer (the\n"
    "                default is disabled 'sndbuf=0' to enable flow control set 'sndbuf=1048576')\n"
    "                use vnet_hdr=off to avoid enabling the IFF_VNET_HDR tap flag\n"
    "                use vnet_hdr=on to make the lack of IFF_VNET_HDR support an error condition\n"
    "                use vhost=on to enable experimental in kernel accelerator\n"
    "                    (only has effect for virtio guests which use MSIX)\n"
    "                use vhostforce=on to force vhost on for non-MSIX virtio guests\n"
    "                use 'vhostfd=h' to connect to an already opened vhost net device\n"
    "                use 'vhostfds=x:y:...:z to connect to multiple already opened vhost net devices\n"
    "                use 'queues=n' to specify the number of queues to be created for multiqueue TAP\n"
    "                use 'poll-us=n' to specify the maximum number of microseconds that could be\n"
    "                spent on busy polling for vhost net\n"
    "-netdev bridge,id=str[,br=bridge][,helper=helper]\n"
    "                configure a host TAP network backend with ID 'str' that is\n"
    "                connected to a bridge (default=" DEFAULT_BRIDGE_INTERFACE ")\n"
    "                using the program 'helper (default=" DEFAULT_BRIDGE_HELPER ")\n"
#endif
#ifdef __linux__
    "-netdev l2tpv3,id=str,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport]\n"
    "         [,rxsession=rxsession],txsession=txsession[,ipv6=on|off][,udp=on|off]\n"
    "         [,cookie64=on|off][,counter][,pincounter][,txcookie=txcookie]\n"
    "         [,rxcookie=rxcookie][,offset=offset]\n"
    "                configure a network backend with ID 'str' connected to\n"
    "                an Ethernet over L2TPv3 pseudowire.\n"
    "                Linux kernel 3.3+ as well as most routers can talk\n"
    "                L2TPv3. This transport allows connecting a VM to a VM,\n"
    "                VM to a router and even VM to Host. It is a nearly-universal\n"
    "                standard (RFC3931). Note - this implementation uses static\n"
    "                pre-configured tunnels (same as the Linux kernel).\n"
    "                use 'src=' to specify source address\n"
    "                use 'dst=' to specify destination address\n"
    "                use 'udp=on' to specify udp encapsulation\n"
    "                use 'srcport=' to specify source udp port\n"
    "                use 'dstport=' to specify destination udp port\n"
    "                use 'ipv6=on' to force v6\n"
    "                L2TPv3 uses cookies to prevent misconfiguration as\n"
    "                well as a weak security measure\n"
    "                use 'rxcookie=0x012345678' to specify a rxcookie\n"
    "                use 'txcookie=0x012345678' to specify a txcookie\n"
    "                use 'cookie64=on' to set cookie size to 64 bit, otherwise 32\n"
    "                use 'counter=off' to force a 'cut-down' L2TPv3 with no counter\n"
    "                use 'pincounter=on' to work around broken counter handling in peer\n"
    "                use 'offset=X' to add an extra offset between header and data\n"
#endif
    "-netdev socket,id=str[,fd=h][,listen=[host]:port][,connect=host:port]\n"
    "                configure a network backend to connect to another network\n"
    "                using a socket connection\n"
    "-netdev socket,id=str[,fd=h][,mcast=maddr:port[,localaddr=addr]]\n"
    "                configure a network backend to connect to a multicast maddr and port\n"
    "                use 'localaddr=addr' to specify the host address to send packets from\n"
    "-netdev socket,id=str[,fd=h][,udp=host:port][,localaddr=host:port]\n"
    "                configure a network backend to connect to another network\n"
    "                using an UDP tunnel\n"
    "-netdev stream,id=str[,server=on|off],addr.type=inet,addr.host=host,addr.port=port[,to=maxport][,numeric=on|off][,keep-alive=on|off][,mptcp=on|off][,addr.ipv4=on|off][,addr.ipv6=on|off]\n"
    "-netdev stream,id=str[,server=on|off],addr.type=unix,addr.path=path[,abstract=on|off][,tight=on|off]\n"
    "-netdev stream,id=str[,server=on|off],addr.type=fd,addr.str=file-descriptor\n"
    "                configure a network backend to connect to another network\n"
    "                using a socket connection in stream mode.\n"
    "-netdev dgram,id=str,remote.type=inet,remote.host=maddr,remote.port=port[,local.type=inet,local.host=addr]\n"
    "-netdev dgram,id=str,remote.type=inet,remote.host=maddr,remote.port=port[,local.type=fd,local.str=file-descriptor]\n"
    "                configure a network backend to connect to a multicast maddr and port\n"
    "                use ``local.host=addr`` to specify the host address to send packets from\n"
    "-netdev dgram,id=str,local.type=inet,local.host=addr,local.port=port[,remote.type=inet,remote.host=addr,remote.port=port]\n"
    "-netdev dgram,id=str,local.type=unix,local.path=path[,remote.type=unix,remote.path=path]\n"
    "-netdev dgram,id=str,local.type=fd,local.str=file-descriptor\n"
    "                configure a network backend to connect to another network\n"
    "                using an UDP tunnel\n"
#ifdef CONFIG_VDE
    "-netdev vde,id=str[,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
    "                configure a network backend to connect to port 'n' of a vde switch\n"
    "                running on host and listening for incoming connections on 'socketpath'.\n"
    "                Use group 'groupname' and mode 'octalmode' to change default\n"
    "                ownership and permissions for communication port.\n"
#endif
#ifdef CONFIG_NETMAP
    "-netdev netmap,id=str,ifname=name[,devname=nmname]\n"
    "                attach to the existing netmap-enabled network interface 'name', or to a\n"
    "                VALE port (created on the fly) called 'name' ('nmname' is name of the \n"
    "                netmap device, defaults to '/dev/netmap')\n"
#endif
#ifdef CONFIG_POSIX
    "-netdev vhost-user,id=str,chardev=dev[,vhostforce=on|off]\n"
    "                configure a vhost-user network, backed by a chardev 'dev'\n"
#endif
#ifdef __linux__
    "-netdev vhost-vdpa,id=str[,vhostdev=/path/to/dev][,vhostfd=h]\n"
    "                configure a vhost-vdpa network,Establish a vhost-vdpa netdev\n"
    "                use 'vhostdev=/path/to/dev' to open a vhost vdpa device\n"
    "                use 'vhostfd=h' to connect to an already opened vhost vdpa device\n"
#endif
#ifdef CONFIG_VMNET
    "-netdev vmnet-host,id=str[,isolated=on|off][,net-uuid=uuid]\n"
    "         [,start-address=addr,end-address=addr,subnet-mask=mask]\n"
    "                configure a vmnet network backend in host mode with ID 'str',\n"
    "                isolate this interface from others with 'isolated',\n"
    "                configure the address range and choose a subnet mask,\n"
    "                specify network UUID 'uuid' to disable DHCP and interact with\n"
    "                vmnet-host interfaces within this isolated network\n"
    "-netdev vmnet-shared,id=str[,isolated=on|off][,nat66-prefix=addr]\n"
    "         [,start-address=addr,end-address=addr,subnet-mask=mask]\n"
    "                configure a vmnet network backend in shared mode with ID 'str',\n"
    "                configure the address range and choose a subnet mask,\n"
    "                set IPv6 ULA prefix (of length 64) to use for internal network,\n"
    "                isolate this interface from others with 'isolated'\n"
    "-netdev vmnet-bridged,id=str,ifname=name[,isolated=on|off]\n"
    "                configure a vmnet network backend in bridged mode with ID 'str',\n"
    "                use 'ifname=name' to select a physical network interface to be bridged,\n"
    "                isolate this interface from others with 'isolated'\n"
#endif
    "-netdev hubport,id=str,hubid=n[,netdev=nd]\n"
    "                configure a hub port on the hub with ID 'n'\n", QEMU_ARCH_ALL)
DEF("nic", HAS_ARG, QEMU_OPTION_nic,
    "-nic [tap|bridge|"
#ifdef CONFIG_SLIRP
    "user|"
#endif
#ifdef __linux__
    "l2tpv3|"
#endif
#ifdef CONFIG_VDE
    "vde|"
#endif
#ifdef CONFIG_NETMAP
    "netmap|"
#endif
#ifdef CONFIG_POSIX
    "vhost-user|"
#endif
#ifdef CONFIG_VMNET
    "vmnet-host|vmnet-shared|vmnet-bridged|"
#endif
    "socket][,option][,...][mac=macaddr]\n"
    "                initialize an on-board / default host NIC (using MAC address\n"
    "                macaddr) and connect it to the given host network backend\n"
    "-nic none       use it alone to have zero network devices (the default is to\n"
    "                provided a 'user' network connection)\n",
    QEMU_ARCH_ALL)
DEF("net", HAS_ARG, QEMU_OPTION_net,
    "-net nic[,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]\n"
    "                configure or create an on-board (or machine default) NIC and\n"
    "                connect it to hub 0 (please use -nic unless you need a hub)\n"
    "-net ["
#ifdef CONFIG_SLIRP
    "user|"
#endif
    "tap|"
    "bridge|"
#ifdef CONFIG_VDE
    "vde|"
#endif
#ifdef CONFIG_NETMAP
    "netmap|"
#endif
#ifdef CONFIG_VMNET
    "vmnet-host|vmnet-shared|vmnet-bridged|"
#endif
    "socket][,option][,option][,...]\n"
    "                old way to initialize a host network interface\n"
    "                (use the -netdev option if possible instead)\n", QEMU_ARCH_ALL)
SRST
``-nic [tap|bridge|user|l2tpv3|vde|netmap|vhost-user|socket][,...][,mac=macaddr][,model=mn]``
    This option is a shortcut for configuring both the on-board
    (default) guest NIC hardware and the host network backend in one go.
    The host backend options are the same as with the corresponding
    ``-netdev`` options below. The guest NIC model can be set with
    ``model=modelname``. Use ``model=help`` to list the available device
    types. The hardware MAC address can be set with ``mac=macaddr``.

    The following two example do exactly the same, to show how ``-nic``
    can be used to shorten the command line length:

    .. parsed-literal::

        |qemu_system| -netdev user,id=n1,ipv6=off -device e1000,netdev=n1,mac=52:54:98:76:54:32
        |qemu_system| -nic user,ipv6=off,model=e1000,mac=52:54:98:76:54:32

``-nic none``
    Indicate that no network devices should be configured. It is used to
    override the default configuration (default NIC with "user" host
    network backend) which is activated if no other networking options
    are provided.

``-netdev user,id=id[,option][,option][,...]``
    Configure user mode host network backend which requires no
    administrator privilege to run. Valid options are:

    ``id=id``
        Assign symbolic name for use in monitor commands.

    ``ipv4=on|off and ipv6=on|off``
        Specify that either IPv4 or IPv6 must be enabled. If neither is
        specified both protocols are enabled.

    ``net=addr[/mask]``
        Set IP network address the guest will see. Optionally specify
        the netmask, either in the form a.b.c.d or as number of valid
        top-most bits. Default is 10.0.2.0/24.

    ``host=addr``
        Specify the guest-visible address of the host. Default is the
        2nd IP in the guest network, i.e. x.x.x.2.

    ``ipv6-net=addr[/int]``
        Set IPv6 network address the guest will see (default is
        fec0::/64). The network prefix is given in the usual hexadecimal
        IPv6 address notation. The prefix size is optional, and is given
        as the number of valid top-most bits (default is 64).

    ``ipv6-host=addr``
        Specify the guest-visible IPv6 address of the host. Default is
        the 2nd IPv6 in the guest network, i.e. xxxx::2.

    ``restrict=on|off``
        If this option is enabled, the guest will be isolated, i.e. it
        will not be able to contact the host and no guest IP packets
        will be routed over the host to the outside. This option does
        not affect any explicitly set forwarding rules.

    ``hostname=name``
        Specifies the client hostname reported by the built-in DHCP
        server.

    ``dhcpstart=addr``
        Specify the first of the 16 IPs the built-in DHCP server can
        assign. Default is the 15th to 31st IP in the guest network,
        i.e. x.x.x.15 to x.x.x.31.

    ``dns=addr``
        Specify the guest-visible address of the virtual nameserver. The
        address must be different from the host address. Default is the
        3rd IP in the guest network, i.e. x.x.x.3.

    ``ipv6-dns=addr``
        Specify the guest-visible address of the IPv6 virtual
        nameserver. The address must be different from the host address.
        Default is the 3rd IP in the guest network, i.e. xxxx::3.

    ``dnssearch=domain``
        Provides an entry for the domain-search list sent by the
        built-in DHCP server. More than one domain suffix can be
        transmitted by specifying this option multiple times. If
        supported, this will cause the guest to automatically try to
        append the given domain suffix(es) in case a domain name can not
        be resolved.

        Example:

        .. parsed-literal::

            |qemu_system| -nic user,dnssearch=mgmt.example.org,dnssearch=example.org

    ``domainname=domain``
        Specifies the client domain name reported by the built-in DHCP
        server.

    ``tftp=dir``
        When using the user mode network stack, activate a built-in TFTP
        server. The files in dir will be exposed as the root of a TFTP
        server. The TFTP client on the guest must be configured in
        binary mode (use the command ``bin`` of the Unix TFTP client).

    ``tftp-server-name=name``
        In BOOTP reply, broadcast name as the "TFTP server name"
        (RFC2132 option 66). This can be used to advise the guest to
        load boot files or configurations from a different server than
        the host address.

    ``bootfile=file``
        When using the user mode network stack, broadcast file as the
        BOOTP filename. In conjunction with ``tftp``, this can be used
        to network boot a guest from a local directory.

        Example (using pxelinux):

        .. parsed-literal::

            |qemu_system| -hda linux.img -boot n -device e1000,netdev=n1 \\
                -netdev user,id=n1,tftp=/path/to/tftp/files,bootfile=/pxelinux.0

    ``smb=dir[,smbserver=addr]``
        When using the user mode network stack, activate a built-in SMB
        server so that Windows OSes can access to the host files in
        ``dir`` transparently. The IP address of the SMB server can be
        set to addr. By default the 4th IP in the guest network is used,
        i.e. x.x.x.4.

        In the guest Windows OS, the line:

        ::

            10.0.2.4 smbserver

        must be added in the file ``C:\WINDOWS\LMHOSTS`` (for windows
        9x/Me) or ``C:\WINNT\SYSTEM32\DRIVERS\ETC\LMHOSTS`` (Windows
        NT/2000).

        Then ``dir`` can be accessed in ``\\smbserver\qemu``.

        Note that a SAMBA server must be installed on the host OS.

    ``hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport``
        Redirect incoming TCP or UDP connections to the host port
        hostport to the guest IP address guestaddr on guest port
        guestport. If guestaddr is not specified, its value is x.x.x.15
        (default first address given by the built-in DHCP server). By
        specifying hostaddr, the rule can be bound to a specific host
        interface. If no connection type is set, TCP is used. This
        option can be given multiple times.

        For example, to redirect host X11 connection from screen 1 to
        guest screen 0, use the following:

        .. parsed-literal::

            # on the host
            |qemu_system| -nic user,hostfwd=tcp:127.0.0.1:6001-:6000
            # this host xterm should open in the guest X11 server
            xterm -display :1

        To redirect telnet connections from host port 5555 to telnet
        port on the guest, use the following:

        .. parsed-literal::

            # on the host
            |qemu_system| -nic user,hostfwd=tcp::5555-:23
            telnet localhost 5555

        Then when you use on the host ``telnet localhost 5555``, you
        connect to the guest telnet server.

    ``guestfwd=[tcp]:server:port-dev``; \ ``guestfwd=[tcp]:server:port-cmd:command``
        Forward guest TCP connections to the IP address server on port
        port to the character device dev or to a program executed by
        cmd:command which gets spawned for each connection. This option
        can be given multiple times.

        You can either use a chardev directly and have that one used
        throughout QEMU's lifetime, like in the following example:

        .. parsed-literal::

            # open 10.10.1.1:4321 on bootup, connect 10.0.2.100:1234 to it whenever
            # the guest accesses it
            |qemu_system| -nic user,guestfwd=tcp:10.0.2.100:1234-tcp:10.10.1.1:4321

        Or you can execute a command on every TCP connection established
        by the guest, so that QEMU behaves similar to an inetd process
        for that virtual server:

        .. parsed-literal::

            # call "netcat 10.10.1.1 4321" on every TCP connection to 10.0.2.100:1234
            # and connect the TCP stream to its stdin/stdout
            |qemu_system| -nic  'user,id=n1,guestfwd=tcp:10.0.2.100:1234-cmd:netcat 10.10.1.1 4321'

``-netdev tap,id=id[,fd=h][,ifname=name][,script=file][,downscript=dfile][,br=bridge][,helper=helper]``
    Configure a host TAP network backend with ID id.

    Use the network script file to configure it and the network script
    dfile to deconfigure it. If name is not provided, the OS
    automatically provides one. The default network configure script is
    ``/etc/qemu-ifup`` and the default network deconfigure script is
    ``/etc/qemu-ifdown``. Use ``script=no`` or ``downscript=no`` to
    disable script execution.

    If running QEMU as an unprivileged user, use the network helper
    to configure the TAP interface and attach it to the bridge.
    The default network helper executable is
    ``/path/to/qemu-bridge-helper`` and the default bridge device is
    ``br0``.

    ``fd``\ =h can be used to specify the handle of an already opened
    host TAP interface.

    Examples:

    .. parsed-literal::

        #launch a QEMU instance with the default network script
        |qemu_system| linux.img -nic tap

    .. parsed-literal::

        #launch a QEMU instance with two NICs, each one connected
        #to a TAP device
        |qemu_system| linux.img \\
                -netdev tap,id=nd0,ifname=tap0 -device e1000,netdev=nd0 \\
                -netdev tap,id=nd1,ifname=tap1 -device rtl8139,netdev=nd1

    .. parsed-literal::

        #launch a QEMU instance with the default network helper to
        #connect a TAP device to bridge br0
        |qemu_system| linux.img -device virtio-net-pci,netdev=n1 \\
                -netdev tap,id=n1,"helper=/path/to/qemu-bridge-helper"

``-netdev bridge,id=id[,br=bridge][,helper=helper]``
    Connect a host TAP network interface to a host bridge device.

    Use the network helper helper to configure the TAP interface and
    attach it to the bridge. The default network helper executable is
    ``/path/to/qemu-bridge-helper`` and the default bridge device is
    ``br0``.

    Examples:

    .. parsed-literal::

        #launch a QEMU instance with the default network helper to
        #connect a TAP device to bridge br0
        |qemu_system| linux.img -netdev bridge,id=n1 -device virtio-net,netdev=n1

    .. parsed-literal::

        #launch a QEMU instance with the default network helper to
        #connect a TAP device to bridge qemubr0
        |qemu_system| linux.img -netdev bridge,br=qemubr0,id=n1 -device virtio-net,netdev=n1

``-netdev socket,id=id[,fd=h][,listen=[host]:port][,connect=host:port]``
    This host network backend can be used to connect the guest's network
    to another QEMU virtual machine using a TCP socket connection. If
    ``listen`` is specified, QEMU waits for incoming connections on port
    (host is optional). ``connect`` is used to connect to another QEMU
    instance using the ``listen`` option. ``fd``\ =h specifies an
    already opened TCP socket.

    Example:

    .. parsed-literal::

        # launch a first QEMU instance
        |qemu_system| linux.img \\
                         -device e1000,netdev=n1,mac=52:54:00:12:34:56 \\
                         -netdev socket,id=n1,listen=:1234
        # connect the network of this instance to the network of the first instance
        |qemu_system| linux.img \\
                         -device e1000,netdev=n2,mac=52:54:00:12:34:57 \\
                         -netdev socket,id=n2,connect=127.0.0.1:1234

``-netdev socket,id=id[,fd=h][,mcast=maddr:port[,localaddr=addr]]``
    Configure a socket host network backend to share the guest's network
    traffic with another QEMU virtual machines using a UDP multicast
    socket, effectively making a bus for every QEMU with same multicast
    address maddr and port. NOTES:

    1. Several QEMU can be running on different hosts and share same bus
       (assuming correct multicast setup for these hosts).

    2. mcast support is compatible with User Mode Linux (argument
       ``ethN=mcast``), see http://user-mode-linux.sf.net.

    3. Use ``fd=h`` to specify an already opened UDP multicast socket.

    Example:

    .. parsed-literal::

        # launch one QEMU instance
        |qemu_system| linux.img \\
                         -device e1000,netdev=n1,mac=52:54:00:12:34:56 \\
                         -netdev socket,id=n1,mcast=230.0.0.1:1234
        # launch another QEMU instance on same "bus"
        |qemu_system| linux.img \\
                         -device e1000,netdev=n2,mac=52:54:00:12:34:57 \\
                         -netdev socket,id=n2,mcast=230.0.0.1:1234
        # launch yet another QEMU instance on same "bus"
        |qemu_system| linux.img \\
                         -device e1000,netdev=n3,mac=52:54:00:12:34:58 \\
                         -netdev socket,id=n3,mcast=230.0.0.1:1234

    Example (User Mode Linux compat.):

    .. parsed-literal::

        # launch QEMU instance (note mcast address selected is UML's default)
        |qemu_system| linux.img \\
                         -device e1000,netdev=n1,mac=52:54:00:12:34:56 \\
                         -netdev socket,id=n1,mcast=239.192.168.1:1102
        # launch UML
        /path/to/linux ubd0=/path/to/root_fs eth0=mcast

    Example (send packets from host's 1.2.3.4):

    .. parsed-literal::

        |qemu_system| linux.img \\
                         -device e1000,netdev=n1,mac=52:54:00:12:34:56 \\
                         -netdev socket,id=n1,mcast=239.192.168.1:1102,localaddr=1.2.3.4

``-netdev l2tpv3,id=id,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport],txsession=txsession[,rxsession=rxsession][,ipv6=on|off][,udp=on|off][,cookie64][,counter][,pincounter][,txcookie=txcookie][,rxcookie=rxcookie][,offset=offset]``
    Configure a L2TPv3 pseudowire host network backend. L2TPv3 (RFC3931)
    is a popular protocol to transport Ethernet (and other Layer 2) data
    frames between two systems. It is present in routers, firewalls and
    the Linux kernel (from version 3.3 onwards).

    This transport allows a VM to communicate to another VM, router or
    firewall directly.

    ``src=srcaddr``
        source address (mandatory)

    ``dst=dstaddr``
        destination address (mandatory)

    ``udp``
        select udp encapsulation (default is ip).

    ``srcport=srcport``
        source udp port.

    ``dstport=dstport``
        destination udp port.

    ``ipv6``
        force v6, otherwise defaults to v4.

    ``rxcookie=rxcookie``; \ ``txcookie=txcookie``
        Cookies are a weak form of security in the l2tpv3 specification.
        Their function is mostly to prevent misconfiguration. By default
        they are 32 bit.

    ``cookie64``
        Set cookie size to 64 bit instead of the default 32

    ``counter=off``
        Force a 'cut-down' L2TPv3 with no counter as in
        draft-mkonstan-l2tpext-keyed-ipv6-tunnel-00

    ``pincounter=on``
        Work around broken counter handling in peer. This may also help
        on networks which have packet reorder.

    ``offset=offset``
        Add an extra offset between header and data

    For example, to attach a VM running on host 4.3.2.1 via L2TPv3 to
    the bridge br-lan on the remote Linux host 1.2.3.4:

    .. parsed-literal::

        # Setup tunnel on linux host using raw ip as encapsulation
        # on 1.2.3.4
        ip l2tp add tunnel remote 4.3.2.1 local 1.2.3.4 tunnel_id 1 peer_tunnel_id 1 \\
            encap udp udp_sport 16384 udp_dport 16384
        ip l2tp add session tunnel_id 1 name vmtunnel0 session_id \\
            0xFFFFFFFF peer_session_id 0xFFFFFFFF
        ifconfig vmtunnel0 mtu 1500
        ifconfig vmtunnel0 up
        brctl addif br-lan vmtunnel0


        # on 4.3.2.1
        # launch QEMU instance - if your network has reorder or is very lossy add ,pincounter

        |qemu_system| linux.img -device e1000,netdev=n1 \\
            -netdev l2tpv3,id=n1,src=4.2.3.1,dst=1.2.3.4,udp,srcport=16384,dstport=16384,rxsession=0xffffffff,txsession=0xffffffff,counter

``-netdev vde,id=id[,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]``
    Configure VDE backend to connect to PORT n of a vde switch running
    on host and listening for incoming connections on socketpath. Use
    GROUP groupname and MODE octalmode to change default ownership and
    permissions for communication port. This option is only available if
    QEMU has been compiled with vde support enabled.

    Example:

    .. parsed-literal::

        # launch vde switch
        vde_switch -F -sock /tmp/myswitch
        # launch QEMU instance
        |qemu_system| linux.img -nic vde,sock=/tmp/myswitch

``-netdev vhost-user,chardev=id[,vhostforce=on|off][,queues=n]``
    Establish a vhost-user netdev, backed by a chardev id. The chardev
    should be a unix domain socket backed one. The vhost-user uses a
    specifically defined protocol to pass vhost ioctl replacement
    messages to an application on the other end of the socket. On
    non-MSIX guests, the feature can be forced with vhostforce. Use
    'queues=n' to specify the number of queues to be created for
    multiqueue vhost-user.

    Example:

    ::

        qemu -m 512 -object memory-backend-file,id=mem,size=512M,mem-path=/hugetlbfs,share=on \
             -numa node,memdev=mem \
             -chardev socket,id=chr0,path=/path/to/socket \
             -netdev type=vhost-user,id=net0,chardev=chr0 \
             -device virtio-net-pci,netdev=net0

``-netdev vhost-vdpa[,vhostdev=/path/to/dev][,vhostfd=h]``
    Establish a vhost-vdpa netdev.

    vDPA device is a device that uses a datapath which complies with
    the virtio specifications with a vendor specific control path.
    vDPA devices can be both physically located on the hardware or
    emulated by software.

``-netdev hubport,id=id,hubid=hubid[,netdev=nd]``
    Create a hub port on the emulated hub with ID hubid.

    The hubport netdev lets you connect a NIC to a QEMU emulated hub
    instead of a single netdev. Alternatively, you can also connect the
    hubport to another netdev with ID nd by using the ``netdev=nd``
    option.

``-net nic[,netdev=nd][,macaddr=mac][,model=type] [,name=name][,addr=addr][,vectors=v]``
    Legacy option to configure or create an on-board (or machine
    default) Network Interface Card(NIC) and connect it either to the
    emulated hub with ID 0 (i.e. the default hub), or to the netdev nd.
    If model is omitted, then the default NIC model associated with the
    machine type is used. Note that the default NIC model may change in
    future QEMU releases, so it is highly recommended to always specify
    a model. Optionally, the MAC address can be changed to mac, the
    device address set to addr (PCI cards only), and a name can be
    assigned for use in monitor commands. Optionally, for PCI cards, you
    can specify the number v of MSI-X vectors that the card should have;
    this option currently only affects virtio cards; set v = 0 to
    disable MSI-X. If no ``-net`` option is specified, a single NIC is
    created. QEMU can emulate several different models of network card.
    Use ``-net nic,model=help`` for a list of available devices for your
    target.

``-net user|tap|bridge|socket|l2tpv3|vde[,...][,name=name]``
    Configure a host network backend (with the options corresponding to
    the same ``-netdev`` option) and connect it to the emulated hub 0
    (the default hub). Use name to specify the name of the hub port.
ERST

DEFHEADING()

DEFHEADING(Character device options:)

DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
    "-chardev help\n"
    "-chardev null,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev socket,id=id[,host=host],port=port[,to=to][,ipv4=on|off][,ipv6=on|off][,nodelay=on|off]\n"
    "         [,server=on|off][,wait=on|off][,telnet=on|off][,websocket=on|off][,reconnect=seconds][,mux=on|off]\n"
    "         [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] (tcp)\n"
    "-chardev socket,id=id,path=path[,server=on|off][,wait=on|off][,telnet=on|off][,websocket=on|off][,reconnect=seconds]\n"
    "         [,mux=on|off][,logfile=PATH][,logappend=on|off][,abstract=on|off][,tight=on|off] (unix)\n"
    "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
    "         [,localport=localport][,ipv4=on|off][,ipv6=on|off][,mux=on|off]\n"
    "         [,logfile=PATH][,logappend=on|off]\n"
    "-chardev msmouse,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]\n"
    "         [,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev ringbuf,id=id[,size=size][,logfile=PATH][,logappend=on|off]\n"
    "-chardev file,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev pipe,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
#ifdef _WIN32
    "-chardev console,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev serial,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
#else
    "-chardev pty,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev stdio,id=id[,mux=on|off][,signal=on|off][,logfile=PATH][,logappend=on|off]\n"
#endif
#ifdef CONFIG_BRLAPI
    "-chardev braille,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
#endif
#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
        || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
    "-chardev serial,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev tty,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
#endif
#if defined(__linux__) || defined(__FreeBSD__) || defined(__DragonFly__)
    "-chardev parallel,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
    "-chardev parport,id=id,path=path[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
#endif
#if defined(CONFIG_SPICE)
    "-chardev spicevmc,id=id,name=name[,debug=debug][,logfile=PATH][,logappend=on|off]\n"
    "-chardev spiceport,id=id,name=name[,debug=debug][,logfile=PATH][,logappend=on|off]\n"
#endif
    , QEMU_ARCH_ALL
)

SRST
The general form of a character device option is:

``-chardev backend,id=id[,mux=on|off][,options]``
    Backend is one of: ``null``, ``socket``, ``udp``, ``msmouse``,
    ``vc``, ``ringbuf``, ``file``, ``pipe``, ``console``, ``serial``,
    ``pty``, ``stdio``, ``braille``, ``tty``, ``parallel``, ``parport``,
    ``spicevmc``, ``spiceport``. The specific backend will determine the
    applicable options.

    Use ``-chardev help`` to print all available chardev backend types.

    All devices must have an id, which can be any string up to 127
    characters long. It is used to uniquely identify this device in
    other command line directives.

    A character device may be used in multiplexing mode by multiple
    front-ends. Specify ``mux=on`` to enable this mode. A multiplexer is
    a "1:N" device, and here the "1" end is your specified chardev
    backend, and the "N" end is the various parts of QEMU that can talk
    to a chardev. If you create a chardev with ``id=myid`` and
    ``mux=on``, QEMU will create a multiplexer with your specified ID,
    and you can then configure multiple front ends to use that chardev
    ID for their input/output. Up to four different front ends can be
    connected to a single multiplexed chardev. (Without multiplexing
    enabled, a chardev can only be used by a single front end.) For
    instance you could use this to allow a single stdio chardev to be
    used by two serial ports and the QEMU monitor:

    ::

        -chardev stdio,mux=on,id=char0 \
        -mon chardev=char0,mode=readline \
        -serial chardev:char0 \
        -serial chardev:char0

    You can have more than one multiplexer in a system configuration;
    for instance you could have a TCP port multiplexed between UART 0
    and UART 1, and stdio multiplexed between the QEMU monitor and a
    parallel port:

    ::

        -chardev stdio,mux=on,id=char0 \
        -mon chardev=char0,mode=readline \
        -parallel chardev:char0 \
        -chardev tcp,...,mux=on,id=char1 \
        -serial chardev:char1 \
        -serial chardev:char1

    When you're using a multiplexed character device, some escape
    sequences are interpreted in the input. See the chapter about
    :ref:`keys in the character backend multiplexer` in the
    System Emulation Users Guide for more details.

    Note that some other command line options may implicitly create
    multiplexed character backends; for instance ``-serial mon:stdio``
    creates a multiplexed stdio backend connected to the serial port and
    the QEMU monitor, and ``-nographic`` also multiplexes the console
    and the monitor to stdio.

    There is currently no support for multiplexing in the other
    direction (where a single QEMU front end takes input and output from
    multiple chardevs).

    Every backend supports the ``logfile`` option, which supplies the
    path to a file to record all data transmitted via the backend. The
    ``logappend`` option controls whether the log file will be truncated
    or appended to when opened.

The available backends are:

``-chardev null,id=id``
    A void device. This device will not emit any data, and will drop any
    data it receives. The null backend does not take any options.

``-chardev socket,id=id[,TCP options or unix options][,server=on|off][,wait=on|off][,telnet=on|off][,websocket=on|off][,reconnect=seconds][,tls-creds=id][,tls-authz=id]``
    Create a two-way stream socket, which can be either a TCP or a unix
    socket. A unix socket will be created if ``path`` is specified.
    Behaviour is undefined if TCP options are specified for a unix
    socket.

    ``server=on|off`` specifies that the socket shall be a listening socket.

    ``wait=on|off`` specifies that QEMU should not block waiting for a client
    to connect to a listening socket.

    ``telnet=on|off`` specifies that traffic on the socket should interpret
    telnet escape sequences.

    ``websocket=on|off`` specifies that the socket uses WebSocket protocol for
    communication.

    ``reconnect`` sets the timeout for reconnecting on non-server
    sockets when the remote end goes away. qemu will delay this many
    seconds and then attempt to reconnect. Zero disables reconnecting,
    and is the default.

    ``tls-creds`` requests enablement of the TLS protocol for
    encryption, and specifies the id of the TLS credentials to use for
    the handshake. The credentials must be previously created with the
    ``-object tls-creds`` argument.

    ``tls-auth`` provides the ID of the QAuthZ authorization object
    against which the client's x509 distinguished name will be
    validated. This object is only resolved at time of use, so can be
    deleted and recreated on the fly while the chardev server is active.
    If missing, it will default to denying access.

    TCP and unix socket options are given below:

    ``TCP options: port=port[,host=host][,to=to][,ipv4=on|off][,ipv6=on|off][,nodelay=on|off]``
        ``host`` for a listening socket specifies the local address to
        be bound. For a connecting socket species the remote host to
        connect to. ``host`` is optional for listening sockets. If not
        specified it defaults to ``0.0.0.0``.

        ``port`` for a listening socket specifies the local port to be
        bound. For a connecting socket specifies the port on the remote
        host to connect to. ``port`` can be given as either a port
        number or a service name. ``port`` is required.

        ``to`` is only relevant to listening sockets. If it is
        specified, and ``port`` cannot be bound, QEMU will attempt to
        bind to subsequent ports up to and including ``to`` until it
        succeeds. ``to`` must be specified as a port number.

        ``ipv4=on|off`` and ``ipv6=on|off`` specify that either IPv4
        or IPv6 must be used. If neither is specified the socket may
        use either protocol.

        ``nodelay=on|off`` disables the Nagle algorithm.

    ``unix options: path=path[,abstract=on|off][,tight=on|off]``
        ``path`` specifies the local path of the unix socket. ``path``
        is required.
        ``abstract=on|off`` specifies the use of the abstract socket namespace,
        rather than the filesystem.  Optional, defaults to false.
        ``tight=on|off`` sets the socket length of abstract sockets to their minimum,
        rather than the full sun_path length.  Optional, defaults to true.

``-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4=on|off][,ipv6=on|off]``
    Sends all traffic from the guest to a remote host over UDP.

    ``host`` specifies the remote host to connect to. If not specified
    it defaults to ``localhost``.

    ``port`` specifies the port on the remote host to connect to.
    ``port`` is required.

    ``localaddr`` specifies the local address to bind to. If not
    specified it defaults to ``0.0.0.0``.

    ``localport`` specifies the local port to bind to. If not specified
    any available local port will be used.

    ``ipv4=on|off`` and ``ipv6=on|off`` specify that either IPv4 or IPv6 must be used.
    If neither is specified the device may use either protocol.

``-chardev msmouse,id=id``
    Forward QEMU's emulated msmouse events to the guest. ``msmouse``
    does not take any options.

``-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]``
    Connect to a QEMU text console. ``vc`` may optionally be given a
    specific size.

    ``width`` and ``height`` specify the width and height respectively
    of the console, in pixels.

    ``cols`` and ``rows`` specify that the console be sized to fit a
    text console with the given dimensions.

``-chardev ringbuf,id=id[,size=size]``
    Create a ring buffer with fixed size ``size``. size must be a power
    of two and defaults to ``64K``.

``-chardev file,id=id,path=path``
    Log all traffic received from the guest to a file.

    ``path`` specifies the path of the file to be opened. This file will
    be created if it does not already exist, and overwritten if it does.
    ``path`` is required.

``-chardev pipe,id=id,path=path``
    Create a two-way connection to the guest. The behaviour differs
    slightly between Windows hosts and other hosts:

    On Windows, a single duplex pipe will be created at
    ``\\.pipe\path``.

    On other hosts, 2 pipes will be created called ``path.in`` and
    ``path.out``. Data written to ``path.in`` will be received by the
    guest. Data written by the guest can be read from ``path.out``. QEMU
    will not create these fifos, and requires them to be present.

    ``path`` forms part of the pipe path as described above. ``path`` is
    required.

``-chardev console,id=id``
    Send traffic from the guest to QEMU's standard output. ``console``
    does not take any options.

    ``console`` is only available on Windows hosts.

``-chardev serial,id=id,path=path``
    Send traffic from the guest to a serial device on the host.

    On Unix hosts serial will actually accept any tty device, not only
    serial lines.

    ``path`` specifies the name of the serial device to open.

``-chardev pty,id=id``
    Create a new pseudo-terminal on the host and connect to it. ``pty``
    does not take any options.

    ``pty`` is not available on Windows hosts.

``-chardev stdio,id=id[,signal=on|off]``
    Connect to standard input and standard output of the QEMU process.

    ``signal`` controls if signals are enabled on the terminal, that
    includes exiting QEMU with the key sequence Control-c. This option
    is enabled by default, use ``signal=off`` to disable it.

``-chardev braille,id=id``
    Connect to a local BrlAPI server. ``braille`` does not take any
    options.

``-chardev tty,id=id,path=path``
    ``tty`` is only available on Linux, Sun, FreeBSD, NetBSD, OpenBSD
    and DragonFlyBSD hosts. It is an alias for ``serial``.

    ``path`` specifies the path to the tty. ``path`` is required.

``-chardev parallel,id=id,path=path``
  \
``-chardev parport,id=id,path=path``
    ``parallel`` is only available on Linux, FreeBSD and DragonFlyBSD
    hosts.

    Connect to a local parallel port.

    ``path`` specifies the path to the parallel port device. ``path`` is
    required.

``-chardev spicevmc,id=id,debug=debug,name=name``
    ``spicevmc`` is only available when spice support is built in.

    ``debug`` debug level for spicevmc

    ``name`` name of spice channel to connect to

    Connect to a spice virtual machine channel, such as vdiport.

``-chardev spiceport,id=id,debug=debug,name=name``
    ``spiceport`` is only available when spice support is built in.

    ``debug`` debug level for spicevmc

    ``name`` name of spice port to connect to

    Connect to a spice port, allowing a Spice client to handle the
    traffic identified by a name (preferably a fqdn).
ERST

DEFHEADING()

#ifdef CONFIG_TPM
DEFHEADING(TPM device options:)

DEF("tpmdev", HAS_ARG, QEMU_OPTION_tpmdev, \
    "-tpmdev passthrough,id=id[,path=path][,cancel-path=path]\n"
    "                use path to provide path to a character device; default is /dev/tpm0\n"
    "                use cancel-path to provide path to TPM's cancel sysfs entry; if\n"
    "                not provided it will be searched for in /sys/class/misc/tpm?/device\n"
    "-tpmdev emulator,id=id,chardev=dev\n"
    "                configure the TPM device using chardev backend\n",
    QEMU_ARCH_ALL)
SRST
The general form of a TPM device option is:

``-tpmdev backend,id=id[,options]``
    The specific backend type will determine the applicable options. The
    ``-tpmdev`` option creates the TPM backend and requires a
    ``-device`` option that specifies the TPM frontend interface model.

    Use ``-tpmdev help`` to print all available TPM backend types.

The available backends are:

``-tpmdev passthrough,id=id,path=path,cancel-path=cancel-path``
    (Linux-host only) Enable access to the host's TPM using the
    passthrough driver.

    ``path`` specifies the path to the host's TPM device, i.e., on a
    Linux host this would be ``/dev/tpm0``. ``path`` is optional and by
    default ``/dev/tpm0`` is used.

    ``cancel-path`` specifies the path to the host TPM device's sysfs
    entry allowing for cancellation of an ongoing TPM command.
    ``cancel-path`` is optional and by default QEMU will search for the
    sysfs entry to use.

    Some notes about using the host's TPM with the passthrough driver:

    The TPM device accessed by the passthrough driver must not be used
    by any other application on the host.

    Since the host's firmware (BIOS/UEFI) has already initialized the
    TPM, the VM's firmware (BIOS/UEFI) will not be able to initialize
    the TPM again and may therefore not show a TPM-specific menu that
    would otherwise allow the user to configure the TPM, e.g., allow the
    user to enable/disable or activate/deactivate the TPM. Further, if
    TPM ownership is released from within a VM then the host's TPM will
    get disabled and deactivated. To enable and activate the TPM again
    afterwards, the host has to be rebooted and the user is required to
    enter the firmware's menu to enable and activate the TPM. If the TPM
    is left disabled and/or deactivated most TPM commands will fail.

    To create a passthrough TPM use the following two options:

    ::

        -tpmdev passthrough,id=tpm0 -device tpm-tis,tpmdev=tpm0

    Note that the ``-tpmdev`` id is ``tpm0`` and is referenced by
    ``tpmdev=tpm0`` in the device option.

``-tpmdev emulator,id=id,chardev=dev``
    (Linux-host only) Enable access to a TPM emulator using Unix domain
    socket based chardev backend.

    ``chardev`` specifies the unique ID of a character device backend
    that provides connection to the software TPM server.

    To create a TPM emulator backend device with chardev socket backend:

    ::

        -chardev socket,id=chrtpm,path=/tmp/swtpm-sock -tpmdev emulator,id=tpm0,chardev=chrtpm -device tpm-tis,tpmdev=tpm0
ERST

DEFHEADING()

#endif

DEFHEADING(Boot Image or Kernel specific:)
SRST
There are broadly 4 ways you can boot a system with QEMU.

 - specify a firmware and let it control finding a kernel
 - specify a firmware and pass a hint to the kernel to boot
 - direct kernel image boot
 - manually load files into the guest's address space

The third method is useful for quickly testing kernels but as there is
no firmware to pass configuration information to the kernel the
hardware must either be probeable, the kernel built for the exact
configuration or passed some configuration data (e.g. a DTB blob)
which tells the kernel what drivers it needs. This exact details are
often hardware specific.

The final method is the most generic way of loading images into the
guest address space and used mostly for ``bare metal`` type
development where the reset vectors of the processor are taken into
account.

ERST

SRST

For x86 machines and some other architectures ``-bios`` will generally
do the right thing with whatever it is given. For other machines the
more strict ``-pflash`` option needs an image that is sized for the
flash device for the given machine type.

Please see the :ref:`system-targets-ref` section of the manual for
more detailed documentation.

ERST

DEF("bios", HAS_ARG, QEMU_OPTION_bios, \
    "-bios file      set the filename for the BIOS\n", QEMU_ARCH_ALL)
SRST
``-bios file``
    Set the filename for the BIOS.
ERST

DEF("pflash", HAS_ARG, QEMU_OPTION_pflash,
    "-pflash file    use 'file' as a parallel flash image\n", QEMU_ARCH_ALL)
SRST
``-pflash file``
    Use file as a parallel flash image.
ERST

SRST

The kernel options were designed to work with Linux kernels although
other things (like hypervisors) can be packaged up as a kernel
executable image. The exact format of a executable image is usually
architecture specific.

The way in which the kernel is started (what address it is loaded at,
what if any information is passed to it via CPU registers, the state
of the hardware when it is started, and so on) is also architecture
specific. Typically it follows the specification laid down by the
Linux kernel for how kernels for that architecture must be started.

ERST

DEF("kernel", HAS_ARG, QEMU_OPTION_kernel, \
    "-kernel bzImage use 'bzImage' as kernel image\n", QEMU_ARCH_ALL)
SRST
``-kernel bzImage``
    Use bzImage as kernel image. The kernel can be either a Linux kernel
    or in multiboot format.
ERST

DEF("append", HAS_ARG, QEMU_OPTION_append, \
    "-append cmdline use 'cmdline' as kernel command line\n", QEMU_ARCH_ALL)
SRST
``-append cmdline``
    Use cmdline as kernel command line
ERST

DEF("initrd", HAS_ARG, QEMU_OPTION_initrd, \
           "-initrd file    use 'file' as initial ram disk\n", QEMU_ARCH_ALL)
SRST
``-initrd file``
    Use file as initial ram disk.

``-initrd "file1 arg=foo,file2"``
    This syntax is only available with multiboot.

    Use file1 and file2 as modules and pass arg=foo as parameter to the
    first module.
ERST

DEF("dtb", HAS_ARG, QEMU_OPTION_dtb, \
    "-dtb    file    use 'file' as device tree image\n", QEMU_ARCH_ALL)
SRST
``-dtb file``
    Use file as a device tree binary (dtb) image and pass it to the
    kernel on boot.
ERST

SRST

Finally you can also manually load images directly into the address
space of the guest. This is most useful for developers who already
know the layout of their guest and take care to ensure something sane
will happen when the reset vector executes.

The generic loader can be invoked by using the loader device:

``-device loader,addr=<addr>,data=<data>,data-len=<data-len>[,data-be=<data-be>][,cpu-num=<cpu-num>]``

there is also the guest loader which operates in a similar way but
tweaks the DTB so a hypervisor loaded via ``-kernel`` can find where
the guest image is:

``-device guest-loader,addr=<addr>[,kernel=<path>,[bootargs=<arguments>]][,initrd=<path>]``

ERST

DEFHEADING()

DEFHEADING(Debug/Expert options:)

DEF("compat", HAS_ARG, QEMU_OPTION_compat,
    "-compat [deprecated-input=accept|reject|crash][,deprecated-output=accept|hide]\n"
    "                Policy for handling deprecated management interfaces\n"
    "-compat [unstable-input=accept|reject|crash][,unstable-output=accept|hide]\n"
    "                Policy for handling unstable management interfaces\n",
    QEMU_ARCH_ALL)
SRST
``-compat [deprecated-input=@var{input-policy}][,deprecated-output=@var{output-policy}]``
    Set policy for handling deprecated management interfaces (experimental):

    ``deprecated-input=accept`` (default)
        Accept deprecated commands and arguments
    ``deprecated-input=reject``
        Reject deprecated commands and arguments
    ``deprecated-input=crash``
        Crash on deprecated commands and arguments
    ``deprecated-output=accept`` (default)
        Emit deprecated command results and events
    ``deprecated-output=hide``
        Suppress deprecated command results and events

    Limitation: covers only syntactic aspects of QMP.

``-compat [unstable-input=@var{input-policy}][,unstable-output=@var{output-policy}]``
    Set policy for handling unstable management interfaces (experimental):

    ``unstable-input=accept`` (default)
        Accept unstable commands and arguments
    ``unstable-input=reject``
        Reject unstable commands and arguments
    ``unstable-input=crash``
        Crash on unstable commands and arguments
    ``unstable-output=accept`` (default)
        Emit unstable command results and events
    ``unstable-output=hide``
        Suppress unstable command results and events

    Limitation: covers only syntactic aspects of QMP.
ERST

DEF("fw_cfg", HAS_ARG, QEMU_OPTION_fwcfg,
    "-fw_cfg [name=]<name>,file=<file>\n"
    "                add named fw_cfg entry with contents from file\n"
    "-fw_cfg [name=]<name>,string=<str>\n"
    "                add named fw_cfg entry with contents from string\n",
    QEMU_ARCH_ALL)
SRST
``-fw_cfg [name=]name,file=file``
    Add named fw\_cfg entry with contents from file file.

``-fw_cfg [name=]name,string=str``
    Add named fw\_cfg entry with contents from string str.

    The terminating NUL character of the contents of str will not be
    included as part of the fw\_cfg item data. To insert contents with
    embedded NUL characters, you have to use the file parameter.

    The fw\_cfg entries are passed by QEMU through to the guest.

    Example:

    ::

            -fw_cfg name=opt/com.mycompany/blob,file=./my_blob.bin

    creates an fw\_cfg entry named opt/com.mycompany/blob with contents
    from ./my\_blob.bin.
ERST

DEF("serial", HAS_ARG, QEMU_OPTION_serial, \
    "-serial dev     redirect the serial port to char device 'dev'\n",
    QEMU_ARCH_ALL)
SRST
``-serial dev``
    Redirect the virtual serial port to host character device dev. The
    default device is ``vc`` in graphical mode and ``stdio`` in non
    graphical mode.

    This option can be used several times to simulate up to 4 serial
    ports.

    Use ``-serial none`` to disable all serial ports.

    Available character devices are:

    ``vc[:WxH]``
        Virtual console. Optionally, a width and height can be given in
        pixel with

        ::

            vc:800x600

        It is also possible to specify width or height in characters:

        ::

            vc:80Cx24C

    ``pty``
        [Linux only] Pseudo TTY (a new PTY is automatically allocated)

    ``none``
        No device is allocated.

    ``null``
        void device

    ``chardev:id``
        Use a named character device defined with the ``-chardev``
        option.

    ``/dev/XXX``
        [Linux only] Use host tty, e.g. ``/dev/ttyS0``. The host serial
        port parameters are set according to the emulated ones.

    ``/dev/parportN``
        [Linux only, parallel port only] Use host parallel port N.
        Currently SPP and EPP parallel port features can be used.

    ``file:filename``
        Write output to filename. No character can be read.

    ``stdio``
        [Unix only] standard input/output

    ``pipe:filename``
        name pipe filename

    ``COMn``
        [Windows only] Use host serial port n

    ``udp:[remote_host]:remote_port[@[src_ip]:src_port]``
        This implements UDP Net Console. When remote\_host or src\_ip
        are not specified they default to ``0.0.0.0``. When not using a
        specified src\_port a random port is automatically chosen.

        If you just want a simple readonly console you can use
        ``netcat`` or ``nc``, by starting QEMU with:
        ``-serial udp::4555`` and nc as: ``nc -u -l -p 4555``. Any time
        QEMU writes something to that port it will appear in the
        netconsole session.

        If you plan to send characters back via netconsole or you want
        to stop and start QEMU a lot of times, you should have QEMU use
        the same source port each time by using something like ``-serial
        udp::4555@:4556`` to QEMU. Another approach is to use a patched
        version of netcat which can listen to a TCP port and send and
        receive characters via udp. If you have a patched version of
        netcat which activates telnet remote echo and single char
        transfer, then you can use the following options to set up a
        netcat redirector to allow telnet on port 5555 to access the
        QEMU port.

        ``QEMU Options:``
            -serial udp::4555@:4556

        ``netcat options:``
            -u -P 4555 -L 0.0.0.0:4556 -t -p 5555 -I -T

        ``telnet options:``
            localhost 5555

    ``tcp:[host]:port[,server=on|off][,wait=on|off][,nodelay=on|off][,reconnect=seconds]``
        The TCP Net Console has two modes of operation. It can send the
        serial I/O to a location or wait for a connection from a
        location. By default the TCP Net Console is sent to host at the
        port. If you use the ``server=on`` option QEMU will wait for a client
        socket application to connect to the port before continuing,
        unless the ``wait=on|off`` option was specified. The ``nodelay=on|off``
        option disables the Nagle buffering algorithm. The ``reconnect=on``
        option only applies if ``server=no`` is set, if the connection goes
        down it will attempt to reconnect at the given interval. If host
        is omitted, 0.0.0.0 is assumed. Only one TCP connection at a
        time is accepted. You can use ``telnet=on`` to connect to the
        corresponding character device.

        ``Example to send tcp console to 192.168.0.2 port 4444``
            -serial tcp:192.168.0.2:4444

        ``Example to listen and wait on port 4444 for connection``
            -serial tcp::4444,server=on

        ``Example to not wait and listen on ip 192.168.0.100 port 4444``
            -serial tcp:192.168.0.100:4444,server=on,wait=off

    ``telnet:host:port[,server=on|off][,wait=on|off][,nodelay=on|off]``
        The telnet protocol is used instead of raw tcp sockets. The
        options work the same as if you had specified ``-serial tcp``.
        The difference is that the port acts like a telnet server or
        client using telnet option negotiation. This will also allow you
        to send the MAGIC\_SYSRQ sequence if you use a telnet that
        supports sending the break sequence. Typically in unix telnet
        you do it with Control-] and then type "send break" followed by
        pressing the enter key.

    ``websocket:host:port,server=on[,wait=on|off][,nodelay=on|off]``
        The WebSocket protocol is used instead of raw tcp socket. The
        port acts as a WebSocket server. Client mode is not supported.

    ``unix:path[,server=on|off][,wait=on|off][,reconnect=seconds]``
        A unix domain socket is used instead of a tcp socket. The option
        works the same as if you had specified ``-serial tcp`` except
        the unix domain socket path is used for connections.

    ``mon:dev_string``
        This is a special option to allow the monitor to be multiplexed
        onto another serial port. The monitor is accessed with key
        sequence of Control-a and then pressing c. dev\_string should be
        any one of the serial devices specified above. An example to
        multiplex the monitor onto a telnet server listening on port
        4444 would be:

        ``-serial mon:telnet::4444,server=on,wait=off``

        When the monitor is multiplexed to stdio in this way, Ctrl+C
        will not terminate QEMU any more but will be passed to the guest
        instead.

    ``braille``
        Braille device. This will use BrlAPI to display the braille
        output on a real or fake device.

    ``msmouse``
        Three button serial mouse. Configure the guest to use Microsoft
        protocol.
ERST

DEF("parallel", HAS_ARG, QEMU_OPTION_parallel, \
    "-parallel dev   redirect the parallel port to char device 'dev'\n",
    QEMU_ARCH_ALL)
SRST
``-parallel dev``
    Redirect the virtual parallel port to host device dev (same devices
    as the serial port). On Linux hosts, ``/dev/parportN`` can be used
    to use hardware devices connected on the corresponding host parallel
    port.

    This option can be used several times to simulate up to 3 parallel
    ports.

    Use ``-parallel none`` to disable all parallel ports.
ERST

DEF("monitor", HAS_ARG, QEMU_OPTION_monitor, \
    "-monitor dev    redirect the monitor to char device 'dev'\n",
    QEMU_ARCH_ALL)
SRST
``-monitor dev``
    Redirect the monitor to host device dev (same devices as the serial
    port). The default device is ``vc`` in graphical mode and ``stdio``
    in non graphical mode. Use ``-monitor none`` to disable the default
    monitor.
ERST
DEF("qmp", HAS_ARG, QEMU_OPTION_qmp, \
    "-qmp dev        like -monitor but opens in 'control' mode\n",
    QEMU_ARCH_ALL)
SRST
``-qmp dev``
    Like -monitor but opens in 'control' mode.
ERST
DEF("qmp-pretty", HAS_ARG, QEMU_OPTION_qmp_pretty, \
    "-qmp-pretty dev like -qmp but uses pretty JSON formatting\n",
    QEMU_ARCH_ALL)
SRST
``-qmp-pretty dev``
    Like -qmp but uses pretty JSON formatting.
ERST

DEF("mon", HAS_ARG, QEMU_OPTION_mon, \
    "-mon [chardev=]name[,mode=readline|control][,pretty[=on|off]]\n", QEMU_ARCH_ALL)
SRST
``-mon [chardev=]name[,mode=readline|control][,pretty[=on|off]]``
    Setup monitor on chardev name. ``mode=control`` configures 
    a QMP monitor (a JSON RPC-style protocol) and it is not the
    same as HMP, the human monitor that has a "(qemu)" prompt.
    ``pretty`` is only valid when ``mode=control``, 
    turning on JSON pretty printing to ease
    human reading and debugging.
ERST

DEF("debugcon", HAS_ARG, QEMU_OPTION_debugcon, \
    "-debugcon dev   redirect the debug console to char device 'dev'\n",
    QEMU_ARCH_ALL)
SRST
``-debugcon dev``
    Redirect the debug console to host device dev (same devices as the
    serial port). The debug console is an I/O port which is typically
    port 0xe9; writing to that I/O port sends output to this device. The
    default device is ``vc`` in graphical mode and ``stdio`` in non
    graphical mode.
ERST

DEF("pidfile", HAS_ARG, QEMU_OPTION_pidfile, \
    "-pidfile file   write PID to 'file'\n", QEMU_ARCH_ALL)
SRST
``-pidfile file``
    Store the QEMU process PID in file. It is useful if you launch QEMU
    from a script.
ERST

DEF("singlestep", 0, QEMU_OPTION_singlestep, \
    "-singlestep     always run in singlestep mode\n", QEMU_ARCH_ALL)
SRST
``-singlestep``
    Run the emulation in single step mode.
ERST

DEF("preconfig", 0, QEMU_OPTION_preconfig, \
    "--preconfig     pause QEMU before machine is initialized (experimental)\n",
    QEMU_ARCH_ALL)
SRST
``--preconfig``
    Pause QEMU for interactive configuration before the machine is
    created, which allows querying and configuring properties that will
    affect machine initialization. Use QMP command 'x-exit-preconfig' to
    exit the preconfig state and move to the next state (i.e. run guest
    if -S isn't used or pause the second time if -S is used). This
    option is experimental.
ERST

DEF("S", 0, QEMU_OPTION_S, \
    "-S              freeze CPU at startup (use 'c' to start execution)\n",
    QEMU_ARCH_ALL)
SRST
``-S``
    Do not start CPU at startup (you must type 'c' in the monitor).
ERST

DEF("overcommit", HAS_ARG, QEMU_OPTION_overcommit,
    "-overcommit [mem-lock=on|off][cpu-pm=on|off]\n"
    "                run qemu with overcommit hints\n"
    "                mem-lock=on|off controls memory lock support (default: off)\n"
    "                cpu-pm=on|off controls cpu power management (default: off)\n",
    QEMU_ARCH_ALL)
SRST
``-overcommit mem-lock=on|off``
  \ 
``-overcommit cpu-pm=on|off``
    Run qemu with hints about host resource overcommit. The default is
    to assume that host overcommits all resources.

    Locking qemu and guest memory can be enabled via ``mem-lock=on``
    (disabled by default). This works when host memory is not
    overcommitted and reduces the worst-case latency for guest.

    Guest ability to manage power state of host cpus (increasing latency
    for other processes on the same host cpu, but decreasing latency for
    guest) can be enabled via ``cpu-pm=on`` (disabled by default). This
    works best when host CPU is not overcommitted. When used, host
    estimates of CPU cycle and power utilization will be incorrect, not
    taking into account guest idle time.
ERST

DEF("gdb", HAS_ARG, QEMU_OPTION_gdb, \
    "-gdb dev        accept gdb connection on 'dev'. (QEMU defaults to starting\n"
    "                the guest without waiting for gdb to connect; use -S too\n"
    "                if you want it to not start execution.)\n",
    QEMU_ARCH_ALL)
SRST
``-gdb dev``
    Accept a gdb connection on device dev (see the :ref:`GDB usage` chapter
    in the System Emulation Users Guide). Note that this option does not pause QEMU
    execution -- if you want QEMU to not start the guest until you
    connect with gdb and issue a ``continue`` command, you will need to
    also pass the ``-S`` option to QEMU.

    The most usual configuration is to listen on a local TCP socket::

        -gdb tcp::3117

    but you can specify other backends; UDP, pseudo TTY, or even stdio
    are all reasonable use cases. For example, a stdio connection
    allows you to start QEMU from within gdb and establish the
    connection via a pipe:

    .. parsed-literal::

        (gdb) target remote | exec |qemu_system| -gdb stdio ...
ERST

DEF("s", 0, QEMU_OPTION_s, \
    "-s              shorthand for -gdb tcp::" DEFAULT_GDBSTUB_PORT "\n",
    QEMU_ARCH_ALL)
SRST
``-s``
    Shorthand for -gdb tcp::1234, i.e. open a gdbserver on TCP port 1234
    (see the :ref:`GDB usage` chapter in the System Emulation Users Guide).
ERST

DEF("d", HAS_ARG, QEMU_OPTION_d, \
    "-d item1,...    enable logging of specified items (use '-d help' for a list of log items)\n",
    QEMU_ARCH_ALL)
SRST
``-d item1[,...]``
    Enable logging of specified items. Use '-d help' for a list of log
    items.
ERST

DEF("D", HAS_ARG, QEMU_OPTION_D, \
    "-D logfile      output log to logfile (default stderr)\n",
    QEMU_ARCH_ALL)
SRST
``-D logfile``
    Output log in logfile instead of to stderr
ERST

DEF("dfilter", HAS_ARG, QEMU_OPTION_DFILTER, \
    "-dfilter range,..  filter debug output to range of addresses (useful for -d cpu,exec,etc..)\n",
    QEMU_ARCH_ALL)
SRST
``-dfilter range1[,...]``
    Filter debug output to that relevant to a range of target addresses.
    The filter spec can be either start+size, start-size or start..end
    where start end and size are the addresses and sizes required. For
    example:

    ::

            -dfilter 0x8000..0x8fff,0xffffffc000080000+0x200,0xffffffc000060000-0x1000

    Will dump output for any code in the 0x1000 sized block starting at
    0x8000 and the 0x200 sized block starting at 0xffffffc000080000 and
    another 0x1000 sized block starting at 0xffffffc00005f000.
ERST

DEF("seed", HAS_ARG, QEMU_OPTION_seed, \
    "-seed number       seed the pseudo-random number generator\n",
    QEMU_ARCH_ALL)
SRST
``-seed number``
    Force the guest to use a deterministic pseudo-random number
    generator, seeded with number. This does not affect crypto routines
    within the host.
ERST

DEF("L", HAS_ARG, QEMU_OPTION_L, \
    "-L path         set the directory for the BIOS, VGA BIOS and keymaps\n",
    QEMU_ARCH_ALL)
SRST
``-L  path``
    Set the directory for the BIOS, VGA BIOS and keymaps.

    To list all the data directories, use ``-L help``.
ERST

DEF("enable-kvm", 0, QEMU_OPTION_enable_kvm, \
    "-enable-kvm     enable KVM full virtualization support\n",
    QEMU_ARCH_ARM | QEMU_ARCH_I386 | QEMU_ARCH_MIPS | QEMU_ARCH_PPC |
    QEMU_ARCH_RISCV | QEMU_ARCH_S390X)
SRST
``-enable-kvm``
    Enable KVM full virtualization support. This option is only
    available if KVM support is enabled when compiling.
ERST

DEF("xen-domid", HAS_ARG, QEMU_OPTION_xen_domid,
    "-xen-domid id   specify xen guest domain id\n",
    QEMU_ARCH_ARM | QEMU_ARCH_I386)
DEF("xen-attach", 0, QEMU_OPTION_xen_attach,
    "-xen-attach     attach to existing xen domain\n"
    "                libxl will use this when starting QEMU\n",
    QEMU_ARCH_ARM | QEMU_ARCH_I386)
DEF("xen-domid-restrict", 0, QEMU_OPTION_xen_domid_restrict,
    "-xen-domid-restrict     restrict set of available xen operations\n"
    "                        to specified domain id. (Does not affect\n"
    "                        xenpv machine type).\n",
    QEMU_ARCH_ARM | QEMU_ARCH_I386)
SRST
``-xen-domid id``
    Specify xen guest domain id (XEN only).

``-xen-attach``
    Attach to existing xen domain. libxl will use this when starting
    QEMU (XEN only). Restrict set of available xen operations to
    specified domain id (XEN only).
ERST

DEF("no-reboot", 0, QEMU_OPTION_no_reboot, \
    "-no-reboot      exit instead of rebooting\n", QEMU_ARCH_ALL)
SRST
``-no-reboot``
    Exit instead of rebooting.
ERST

DEF("no-shutdown", 0, QEMU_OPTION_no_shutdown, \
    "-no-shutdown    stop before shutdown\n", QEMU_ARCH_ALL)
SRST
``-no-shutdown``
    Don't exit QEMU on guest shutdown, but instead only stop the
    emulation. This allows for instance switching to monitor to commit
    changes to the disk image.
ERST

DEF("action", HAS_ARG, QEMU_OPTION_action,
    "-action reboot=reset|shutdown\n"
    "                   action when guest reboots [default=reset]\n"
    "-action shutdown=poweroff|pause\n"
    "                   action when guest shuts down [default=poweroff]\n"
    "-action panic=pause|shutdown|exit-failure|none\n"
    "                   action when guest panics [default=shutdown]\n"
    "-action watchdog=reset|shutdown|poweroff|inject-nmi|pause|debug|none\n"
    "                   action when watchdog fires [default=reset]\n",
    QEMU_ARCH_ALL)
SRST
``-action event=action``
    The action parameter serves to modify QEMU's default behavior when
    certain guest events occur. It provides a generic method for specifying the
    same behaviors that are modified by the ``-no-reboot`` and ``-no-shutdown``
    parameters.

    Examples:

    ``-action panic=none``
    ``-action reboot=shutdown,shutdown=pause``
    ``-device i6300esb -action watchdog=pause``

ERST

DEF("loadvm", HAS_ARG, QEMU_OPTION_loadvm, \
    "-loadvm [tag|id]\n" \
    "                start right away with a saved state (loadvm in monitor)\n",
    QEMU_ARCH_ALL)
SRST
``-loadvm file``
    Start right away with a saved state (``loadvm`` in monitor)
ERST

#ifndef _WIN32
DEF("daemonize", 0, QEMU_OPTION_daemonize, \
    "-daemonize      daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
#endif
SRST
``-daemonize``
    Daemonize the QEMU process after initialization. QEMU will not
    detach from standard IO until it is ready to receive connections on
    any of its devices. This option is a useful way for external
    programs to launch QEMU without having to cope with initialization
    race conditions.
ERST

DEF("option-rom", HAS_ARG, QEMU_OPTION_option_rom, \
    "-option-rom rom load a file, rom, into the option ROM space\n",
    QEMU_ARCH_ALL)
SRST
``-option-rom file``
    Load the contents of file as an option ROM. This option is useful to
    load things like EtherBoot.
ERST

DEF("rtc", HAS_ARG, QEMU_OPTION_rtc, \
    "-rtc [base=utc|localtime|<datetime>][,clock=host|rt|vm][,driftfix=none|slew]\n" \
    "                set the RTC base and clock, enable drift fix for clock ticks (x86 only)\n",
    QEMU_ARCH_ALL)

SRST
``-rtc [base=utc|localtime|datetime][,clock=host|rt|vm][,driftfix=none|slew]``
    Specify ``base`` as ``utc`` or ``localtime`` to let the RTC start at
    the current UTC or local time, respectively. ``localtime`` is
    required for correct date in MS-DOS or Windows. To start at a
    specific point in time, provide datetime in the format
    ``2006-06-17T16:01:21`` or ``2006-06-17``. The default base is UTC.

    By default the RTC is driven by the host system time. This allows
    using of the RTC as accurate reference clock inside the guest,
    specifically if the host time is smoothly following an accurate
    external reference clock, e.g. via NTP. If you want to isolate the
    guest time from the host, you can set ``clock`` to ``rt`` instead,
    which provides a host monotonic clock if host support it. To even
    prevent the RTC from progressing during suspension, you can set
    ``clock`` to ``vm`` (virtual clock). '\ ``clock=vm``\ ' is
    recommended especially in icount mode in order to preserve
    determinism; however, note that in icount mode the speed of the
    virtual clock is variable and can in general differ from the host
    clock.

    Enable ``driftfix`` (i386 targets only) if you experience time drift
    problems, specifically with Windows' ACPI HAL. This option will try
    to figure out how many timer interrupts were not processed by the
    Windows guest and will re-inject them.
ERST

DEF("icount", HAS_ARG, QEMU_OPTION_icount, \
    "-icount [shift=N|auto][,align=on|off][,sleep=on|off][,rr=record|replay,rrfile=<filename>[,rrsnapshot=<snapshot>]]\n" \
    "                enable virtual instruction counter with 2^N clock ticks per\n" \
    "                instruction, enable aligning the host and virtual clocks\n" \
    "                or disable real time cpu sleeping, and optionally enable\n" \
    "                record-and-replay mode\n", QEMU_ARCH_ALL)
SRST
``-icount [shift=N|auto][,align=on|off][,sleep=on|off][,rr=record|replay,rrfile=filename[,rrsnapshot=snapshot]]``
    Enable virtual instruction counter. The virtual cpu will execute one
    instruction every 2^N ns of virtual time. If ``auto`` is specified
    then the virtual cpu speed will be automatically adjusted to keep
    virtual time within a few seconds of real time.

    Note that while this option can give deterministic behavior, it does
    not provide cycle accurate emulation. Modern CPUs contain
    superscalar out of order cores with complex cache hierarchies. The
    number of instructions executed often has little or no correlation
    with actual performance.

    When the virtual cpu is sleeping, the virtual time will advance at
    default speed unless ``sleep=on`` is specified. With
    ``sleep=on``, the virtual time will jump to the next timer
    deadline instantly whenever the virtual cpu goes to sleep mode and
    will not advance if no timer is enabled. This behavior gives
    deterministic execution times from the guest point of view.
    The default if icount is enabled is ``sleep=off``.
    ``sleep=on`` cannot be used together with either ``shift=auto``
    or ``align=on``.

    ``align=on`` will activate the delay algorithm which will try to
    synchronise the host clock and the virtual clock. The goal is to
    have a guest running at the real frequency imposed by the shift
    option. Whenever the guest clock is behind the host clock and if
    ``align=on`` is specified then we print a message to the user to
    inform about the delay. Currently this option does not work when
    ``shift`` is ``auto``. Note: The sync algorithm will work for those
    shift values for which the guest clock runs ahead of the host clock.
    Typically this happens when the shift value is high (how high
    depends on the host machine). The default if icount is enabled
    is ``align=off``.

    When the ``rr`` option is specified deterministic record/replay is
    enabled. The ``rrfile=`` option must also be provided to
    specify the path to the replay log. In record mode data is written
    to this file, and in replay mode it is read back.
    If the ``rrsnapshot`` option is given then it specifies a VM snapshot
    name. In record mode, a new VM snapshot with the given name is created
    at the start of execution recording. In replay mode this option
    specifies the snapshot name used to load the initial VM state.
ERST

DEF("watchdog-action", HAS_ARG, QEMU_OPTION_watchdog_action, \
    "-watchdog-action reset|shutdown|poweroff|inject-nmi|pause|debug|none\n" \
    "                action when watchdog fires [default=reset]\n",
    QEMU_ARCH_ALL)
SRST
``-watchdog-action action``
    The action controls what QEMU will do when the watchdog timer
    expires. The default is ``reset`` (forcefully reset the guest).
    Other possible actions are: ``shutdown`` (attempt to gracefully
    shutdown the guest), ``poweroff`` (forcefully poweroff the guest),
    ``inject-nmi`` (inject a NMI into the guest), ``pause`` (pause the
    guest), ``debug`` (print a debug message and continue), or ``none``
    (do nothing).

    Note that the ``shutdown`` action requires that the guest responds
    to ACPI signals, which it may not be able to do in the sort of
    situations where the watchdog would have expired, and thus
    ``-watchdog-action shutdown`` is not recommended for production use.

    Examples:

    ``-device i6300esb -watchdog-action pause``

ERST

DEF("echr", HAS_ARG, QEMU_OPTION_echr, \
    "-echr chr       set terminal escape character instead of ctrl-a\n",
    QEMU_ARCH_ALL)
SRST
``-echr numeric_ascii_value``
    Change the escape character used for switching to the monitor when
    using monitor and serial sharing. The default is ``0x01`` when using
    the ``-nographic`` option. ``0x01`` is equal to pressing
    ``Control-a``. You can select a different character from the ascii
    control keys where 1 through 26 map to Control-a through Control-z.
    For instance you could use the either of the following to change the
    escape character to Control-t.

    ``-echr 0x14``; \ ``-echr 20``

ERST

DEF("incoming", HAS_ARG, QEMU_OPTION_incoming, \
    "-incoming tcp:[host]:port[,to=maxport][,ipv4=on|off][,ipv6=on|off]\n" \
    "-incoming rdma:host:port[,ipv4=on|off][,ipv6=on|off]\n" \
    "-incoming unix:socketpath\n" \
    "                prepare for incoming migration, listen on\n" \
    "                specified protocol and socket address\n" \
    "-incoming fd:fd\n" \
    "-incoming exec:cmdline\n" \
    "                accept incoming migration on given file descriptor\n" \
    "                or from given external command\n" \
    "-incoming defer\n" \
    "                wait for the URI to be specified via migrate_incoming\n",
    QEMU_ARCH_ALL)
SRST
``-incoming tcp:[host]:port[,to=maxport][,ipv4=on|off][,ipv6=on|off]``
  \ 
``-incoming rdma:host:port[,ipv4=on|off][,ipv6=on|off]``
    Prepare for incoming migration, listen on a given tcp port.

``-incoming unix:socketpath``
    Prepare for incoming migration, listen on a given unix socket.

``-incoming fd:fd``
    Accept incoming migration from a given filedescriptor.

``-incoming exec:cmdline``
    Accept incoming migration as an output from specified external
    command.

``-incoming defer``
    Wait for the URI to be specified via migrate\_incoming. The monitor
    can be used to change settings (such as migration parameters) prior
    to issuing the migrate\_incoming to allow the migration to begin.
ERST

DEF("only-migratable", 0, QEMU_OPTION_only_migratable, \
    "-only-migratable     allow only migratable devices\n", QEMU_ARCH_ALL)
SRST
``-only-migratable``
    Only allow migratable devices. Devices will not be allowed to enter
    an unmigratable state.
ERST

DEF("nodefaults", 0, QEMU_OPTION_nodefaults, \
    "-nodefaults     don't create default devices\n", QEMU_ARCH_ALL)
SRST
``-nodefaults``
    Don't create default devices. Normally, QEMU sets the default
    devices like serial port, parallel port, virtual console, monitor
    device, VGA adapter, floppy and CD-ROM drive and others. The
    ``-nodefaults`` option will disable all those default devices.
ERST

#ifndef _WIN32
DEF("chroot", HAS_ARG, QEMU_OPTION_chroot, \
    "-chroot dir     chroot to dir just before starting the VM\n",
    QEMU_ARCH_ALL)
#endif
SRST
``-chroot dir``
    Immediately before starting guest execution, chroot to the specified
    directory. Especially useful in combination with -runas.
ERST

#ifndef _WIN32
DEF("runas", HAS_ARG, QEMU_OPTION_runas, \
    "-runas user     change to user id user just before starting the VM\n" \
    "                user can be numeric uid:gid instead\n",
    QEMU_ARCH_ALL)
#endif
SRST
``-runas user``
    Immediately before starting guest execution, drop root privileges,
    switching to the specified user.
ERST

DEF("prom-env", HAS_ARG, QEMU_OPTION_prom_env,
    "-prom-env variable=value\n"
    "                set OpenBIOS nvram variables\n",
    QEMU_ARCH_PPC | QEMU_ARCH_SPARC)
SRST
``-prom-env variable=value``
    Set OpenBIOS nvram variable to given value (PPC, SPARC only).

    ::

        qemu-system-sparc -prom-env 'auto-boot?=false' \
         -prom-env 'boot-device=sd(0,2,0):d' -prom-env 'boot-args=linux single'

    ::

        qemu-system-ppc -prom-env 'auto-boot?=false' \
         -prom-env 'boot-device=hd:2,\yaboot' \
         -prom-env 'boot-args=conf=hd:2,\yaboot.conf'
ERST
DEF("semihosting", 0, QEMU_OPTION_semihosting,
    "-semihosting    semihosting mode\n",
    QEMU_ARCH_ARM | QEMU_ARCH_M68K | QEMU_ARCH_XTENSA |
    QEMU_ARCH_MIPS | QEMU_ARCH_NIOS2 | QEMU_ARCH_RISCV)
SRST
``-semihosting``
    Enable semihosting mode (ARM, M68K, Xtensa, MIPS, Nios II, RISC-V only).

    Note that this allows guest direct access to the host filesystem, so
    should only be used with a trusted guest OS.

    See the -semihosting-config option documentation for further
    information about the facilities this enables.
ERST
DEF("semihosting-config", HAS_ARG, QEMU_OPTION_semihosting_config,
    "-semihosting-config [enable=on|off][,target=native|gdb|auto][,chardev=id][,userspace=on|off][,arg=str[,...]]\n" \
    "                semihosting configuration\n",
QEMU_ARCH_ARM | QEMU_ARCH_M68K | QEMU_ARCH_XTENSA |
QEMU_ARCH_MIPS | QEMU_ARCH_NIOS2 | QEMU_ARCH_RISCV)
SRST
``-semihosting-config [enable=on|off][,target=native|gdb|auto][,chardev=id][,userspace=on|off][,arg=str[,...]]``
    Enable and configure semihosting (ARM, M68K, Xtensa, MIPS, Nios II, RISC-V
    only).

    Note that this allows guest direct access to the host filesystem, so
    should only be used with a trusted guest OS.

    On Arm this implements the standard semihosting API, version 2.0.

    On M68K this implements the "ColdFire GDB" interface used by
    libgloss.

    Xtensa semihosting provides basic file IO calls, such as
    open/read/write/seek/select. Tensilica baremetal libc for ISS and
    linux platform "sim" use this interface.

    On RISC-V this implements the standard semihosting API, version 0.2.

    ``target=native|gdb|auto``
        Defines where the semihosting calls will be addressed, to QEMU
        (``native``) or to GDB (``gdb``). The default is ``auto``, which
        means ``gdb`` during debug sessions and ``native`` otherwise.

    ``chardev=str1``
        Send the output to a chardev backend output for native or auto
        output when not in gdb

    ``userspace=on|off``
        Allows code running in guest userspace to access the semihosting
        interface. The default is that only privileged guest code can
        make semihosting calls. Note that setting ``userspace=on`` should
        only be used if all guest code is trusted (for example, in
        bare-metal test case code).

    ``arg=str1,arg=str2,...``
        Allows the user to pass input arguments, and can be used
        multiple times to build up a list. The old-style
        ``-kernel``/``-append`` method of passing a command line is
        still supported for backward compatibility. If both the
        ``--semihosting-config arg`` and the ``-kernel``/``-append`` are
        specified, the former is passed to semihosting as it always
        takes precedence.
ERST
DEF("old-param", 0, QEMU_OPTION_old_param,
    "-old-param      old param mode\n", QEMU_ARCH_ARM)
SRST
``-old-param``
    Old param mode (ARM only).
ERST

DEF("sandbox", HAS_ARG, QEMU_OPTION_sandbox, \
    "-sandbox on[,obsolete=allow|deny][,elevateprivileges=allow|deny|children]\n" \
    "          [,spawn=allow|deny][,resourcecontrol=allow|deny]\n" \
    "                Enable seccomp mode 2 system call filter (default 'off').\n" \
    "                use 'obsolete' to allow obsolete system calls that are provided\n" \
    "                    by the kernel, but typically no longer used by modern\n" \
    "                    C library implementations.\n" \
    "                use 'elevateprivileges' to allow or deny the QEMU process ability\n" \
    "                    to elevate privileges using set*uid|gid system calls.\n" \
    "                    The value 'children' will deny set*uid|gid system calls for\n" \
    "                    main QEMU process but will allow forks and execves to run unprivileged\n" \
    "                use 'spawn' to avoid QEMU to spawn new threads or processes by\n" \
    "                     blocking *fork and execve\n" \
    "                use 'resourcecontrol' to disable process affinity and schedular priority\n",
    QEMU_ARCH_ALL)
SRST
``-sandbox arg[,obsolete=string][,elevateprivileges=string][,spawn=string][,resourcecontrol=string]``
    Enable Seccomp mode 2 system call filter. 'on' will enable syscall
    filtering and 'off' will disable it. The default is 'off'.

    ``obsolete=string``
        Enable Obsolete system calls

    ``elevateprivileges=string``
        Disable set\*uid\|gid system calls

    ``spawn=string``
        Disable \*fork and execve

    ``resourcecontrol=string``
        Disable process affinity and schedular priority
ERST

DEF("readconfig", HAS_ARG, QEMU_OPTION_readconfig,
    "-readconfig <file>\n"
    "                read config file\n", QEMU_ARCH_ALL)
SRST
``-readconfig file``
    Read device configuration from file. This approach is useful when
    you want to spawn QEMU process with many command line options but
    you don't want to exceed the command line character limit.
ERST

DEF("no-user-config", 0, QEMU_OPTION_nouserconfig,
    "-no-user-config\n"
    "                do not load default user-provided config files at startup\n",
    QEMU_ARCH_ALL)
SRST
``-no-user-config``
    The ``-no-user-config`` option makes QEMU not load any of the
    user-provided config files on sysconfdir.
ERST

DEF("trace", HAS_ARG, QEMU_OPTION_trace,
    "-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
    "                specify tracing options\n",
    QEMU_ARCH_ALL)
SRST
``-trace [[enable=]pattern][,events=file][,file=file]``
  .. include:: ../qemu-option-trace.rst.inc

ERST
DEF("plugin", HAS_ARG, QEMU_OPTION_plugin,
    "-plugin [file=]<file>[,<argname>=<argvalue>]\n"
    "                load a plugin\n",
    QEMU_ARCH_ALL)
SRST
``-plugin file=file[,argname=argvalue]``
    Load a plugin.

    ``file=file``
        Load the given plugin from a shared library file.

    ``argname=argvalue``
        Argument passed to the plugin. (Can be given multiple times.)
ERST

HXCOMM Internal use
DEF("qtest", HAS_ARG, QEMU_OPTION_qtest, "", QEMU_ARCH_ALL)
DEF("qtest-log", HAS_ARG, QEMU_OPTION_qtest_log, "", QEMU_ARCH_ALL)

#ifdef __linux__
DEF("async-teardown", 0, QEMU_OPTION_asyncteardown,
    "-async-teardown enable asynchronous teardown\n",
    QEMU_ARCH_ALL)
#endif
SRST
``-async-teardown``
    Enable asynchronous teardown. A new process called "cleanup/<QEMU_PID>"
    will be created at startup sharing the address space with the main qemu
    process, using clone. It will wait for the main qemu process to
    terminate completely, and then exit.
    This allows qemu to terminate very quickly even if the guest was
    huge, leaving the teardown of the address space to the cleanup
    process. Since the cleanup process shares the same cgroups as the
    main qemu process, accounting is performed correctly. This only
    works if the cleanup process is not forcefully killed with SIGKILL
    before the main qemu process has terminated completely.
ERST

DEF("msg", HAS_ARG, QEMU_OPTION_msg,
    "-msg [timestamp[=on|off]][,guest-name=[on|off]]\n"
    "                control error message format\n"
    "                timestamp=on enables timestamps (default: off)\n"
    "                guest-name=on enables guest name prefix but only if\n"
    "                              -name guest option is set (default: off)\n",
    QEMU_ARCH_ALL)
SRST
``-msg [timestamp[=on|off]][,guest-name[=on|off]]``
    Control error message format.

    ``timestamp=on|off``
        Prefix messages with a timestamp. Default is off.

    ``guest-name=on|off``
        Prefix messages with guest name but only if -name guest option is set
        otherwise the option is ignored. Default is off.
ERST

DEF("dump-vmstate", HAS_ARG, QEMU_OPTION_dump_vmstate,
    "-dump-vmstate <file>\n"
    "                Output vmstate information in JSON format to file.\n"
    "                Use the scripts/vmstate-static-checker.py file to\n"
    "                check for possible regressions in migration code\n"
    "                by comparing two such vmstate dumps.\n",
    QEMU_ARCH_ALL)
SRST
``-dump-vmstate file``
    Dump json-encoded vmstate information for current machine type to
    file in file
ERST

DEF("enable-sync-profile", 0, QEMU_OPTION_enable_sync_profile,
    "-enable-sync-profile\n"
    "                enable synchronization profiling\n",
    QEMU_ARCH_ALL)
SRST
``-enable-sync-profile``
    Enable synchronization profiling.
ERST

DEFHEADING()

DEFHEADING(Generic object creation:)

DEF("object", HAS_ARG, QEMU_OPTION_object,
    "-object TYPENAME[,PROP1=VALUE1,...]\n"
    "                create a new object of type TYPENAME setting properties\n"
    "                in the order they are specified.  Note that the 'id'\n"
    "                property must be set.  These objects are placed in the\n"
    "                '/objects' path.\n",
    QEMU_ARCH_ALL)
SRST
``-object typename[,prop1=value1,...]``
    Create a new object of type typename setting properties in the order
    they are specified. Note that the 'id' property must be set. These
    objects are placed in the '/objects' path.

    ``-object memory-backend-file,id=id,size=size,mem-path=dir,share=on|off,discard-data=on|off,merge=on|off,dump=on|off,prealloc=on|off,host-nodes=host-nodes,policy=default|preferred|bind|interleave,align=align,readonly=on|off``
        Creates a memory file backend object, which can be used to back
        the guest RAM with huge pages.

        The ``id`` parameter is a unique ID that will be used to
        reference this memory region in other parameters, e.g. ``-numa``,
        ``-device nvdimm``, etc.

        The ``size`` option provides the size of the memory region, and
        accepts common suffixes, e.g. ``500M``.

        The ``mem-path`` provides the path to either a shared memory or
        huge page filesystem mount.

        The ``share`` boolean option determines whether the memory
        region is marked as private to QEMU, or shared. The latter
        allows a co-operating external process to access the QEMU memory
        region.

        The ``share`` is also required for pvrdma devices due to
        limitations in the RDMA API provided by Linux.

        Setting share=on might affect the ability to configure NUMA
        bindings for the memory backend under some circumstances, see
        Documentation/vm/numa\_memory\_policy.txt on the Linux kernel
        source tree for additional details.

        Setting the ``discard-data`` boolean option to on indicates that
        file contents can be destroyed when QEMU exits, to avoid
        unnecessarily flushing data to the backing file. Note that
        ``discard-data`` is only an optimization, and QEMU might not
        discard file contents if it aborts unexpectedly or is terminated
        using SIGKILL.

        The ``merge`` boolean option enables memory merge, also known as
        MADV\_MERGEABLE, so that Kernel Samepage Merging will consider
        the pages for memory deduplication.

        Setting the ``dump`` boolean option to off excludes the memory
        from core dumps. This feature is also known as MADV\_DONTDUMP.

        The ``prealloc`` boolean option enables memory preallocation.

        The ``host-nodes`` option binds the memory range to a list of
        NUMA host nodes.

        The ``policy`` option sets the NUMA policy to one of the
        following values:

        ``default``
            default host policy

        ``preferred``
            prefer the given host node list for allocation

        ``bind``
            restrict memory allocation to the given host node list

        ``interleave``
            interleave memory allocations across the given host node
            list

        The ``align`` option specifies the base address alignment when
        QEMU mmap(2) ``mem-path``, and accepts common suffixes, eg
        ``2M``. Some backend store specified by ``mem-path`` requires an
        alignment different than the default one used by QEMU, eg the
        device DAX /dev/dax0.0 requires 2M alignment rather than 4K. In
        such cases, users can specify the required alignment via this
        option.

        The ``pmem`` option specifies whether the backing file specified
        by ``mem-path`` is in host persistent memory that can be
        accessed using the SNIA NVM programming model (e.g. Intel
        NVDIMM). If ``pmem`` is set to 'on', QEMU will take necessary
        operations to guarantee the persistence of its own writes to
        ``mem-path`` (e.g. in vNVDIMM label emulation and live
        migration). Also, we will map the backend-file with MAP\_SYNC
        flag, which ensures the file metadata is in sync for
        ``mem-path`` in case of host crash or a power failure. MAP\_SYNC
        requires support from both the host kernel (since Linux kernel
        4.15) and the filesystem of ``mem-path`` mounted with DAX
        option.

        The ``readonly`` option specifies whether the backing file is opened
        read-only or read-write (default).

    ``-object memory-backend-ram,id=id,merge=on|off,dump=on|off,share=on|off,prealloc=on|off,size=size,host-nodes=host-nodes,policy=default|preferred|bind|interleave``
        Creates a memory backend object, which can be used to back the
        guest RAM. Memory backend objects offer more control than the
        ``-m`` option that is traditionally used to define guest RAM.
        Please refer to ``memory-backend-file`` for a description of the
        options.

    ``-object memory-backend-memfd,id=id,merge=on|off,dump=on|off,share=on|off,prealloc=on|off,size=size,host-nodes=host-nodes,policy=default|preferred|bind|interleave,seal=on|off,hugetlb=on|off,hugetlbsize=size``
        Creates an anonymous memory file backend object, which allows
        QEMU to share the memory with an external process (e.g. when
        using vhost-user). The memory is allocated with memfd and
        optional sealing. (Linux only)

        The ``seal`` option creates a sealed-file, that will block
        further resizing the memory ('on' by default).

        The ``hugetlb`` option specify the file to be created resides in
        the hugetlbfs filesystem (since Linux 4.14). Used in conjunction
        with the ``hugetlb`` option, the ``hugetlbsize`` option specify
        the hugetlb page size on systems that support multiple hugetlb
        page sizes (it must be a power of 2 value supported by the
        system).

        In some versions of Linux, the ``hugetlb`` option is
        incompatible with the ``seal`` option (requires at least Linux
        4.16).

        Please refer to ``memory-backend-file`` for a description of the
        other options.

        The ``share`` boolean option is on by default with memfd.

    ``-object rng-builtin,id=id``
        Creates a random number generator backend which obtains entropy
        from QEMU builtin functions. The ``id`` parameter is a unique ID
        that will be used to reference this entropy backend from the
        ``virtio-rng`` device. By default, the ``virtio-rng`` device
        uses this RNG backend.

    ``-object rng-random,id=id,filename=/dev/random``
        Creates a random number generator backend which obtains entropy
        from a device on the host. The ``id`` parameter is a unique ID
        that will be used to reference this entropy backend from the
        ``virtio-rng`` device. The ``filename`` parameter specifies
        which file to obtain entropy from and if omitted defaults to
        ``/dev/urandom``.

    ``-object rng-egd,id=id,chardev=chardevid``
        Creates a random number generator backend which obtains entropy
        from an external daemon running on the host. The ``id``
        parameter is a unique ID that will be used to reference this
        entropy backend from the ``virtio-rng`` device. The ``chardev``
        parameter is the unique ID of a character device backend that
        provides the connection to the RNG daemon.

    ``-object tls-creds-anon,id=id,endpoint=endpoint,dir=/path/to/cred/dir,verify-peer=on|off``
        Creates a TLS anonymous credentials object, which can be used to
        provide TLS support on network backends. The ``id`` parameter is
        a unique ID which network backends will use to access the
        credentials. The ``endpoint`` is either ``server`` or ``client``
        depending on whether the QEMU network backend that uses the
        credentials will be acting as a client or as a server. If
        ``verify-peer`` is enabled (the default) then once the handshake
        is completed, the peer credentials will be verified, though this
        is a no-op for anonymous credentials.

        The dir parameter tells QEMU where to find the credential files.
        For server endpoints, this directory may contain a file
        dh-params.pem providing diffie-hellman parameters to use for the
        TLS server. If the file is missing, QEMU will generate a set of
        DH parameters at startup. This is a computationally expensive
        operation that consumes random pool entropy, so it is
        recommended that a persistent set of parameters be generated
        upfront and saved.

    ``-object tls-creds-psk,id=id,endpoint=endpoint,dir=/path/to/keys/dir[,username=username]``
        Creates a TLS Pre-Shared Keys (PSK) credentials object, which
        can be used to provide TLS support on network backends. The
        ``id`` parameter is a unique ID which network backends will use
        to access the credentials. The ``endpoint`` is either ``server``
        or ``client`` depending on whether the QEMU network backend that
        uses the credentials will be acting as a client or as a server.
        For clients only, ``username`` is the username which will be
        sent to the server. If omitted it defaults to "qemu".

        The dir parameter tells QEMU where to find the keys file. It is
        called "dir/keys.psk" and contains "username:key" pairs. This
        file can most easily be created using the GnuTLS ``psktool``
        program.

        For server endpoints, dir may also contain a file dh-params.pem
        providing diffie-hellman parameters to use for the TLS server.
        If the file is missing, QEMU will generate a set of DH
        parameters at startup. This is a computationally expensive
        operation that consumes random pool entropy, so it is
        recommended that a persistent set of parameters be generated up
        front and saved.

    ``-object tls-creds-x509,id=id,endpoint=endpoint,dir=/path/to/cred/dir,priority=priority,verify-peer=on|off,passwordid=id``
        Creates a TLS anonymous credentials object, which can be used to
        provide TLS support on network backends. The ``id`` parameter is
        a unique ID which network backends will use to access the
        credentials. The ``endpoint`` is either ``server`` or ``client``
        depending on whether the QEMU network backend that uses the
        credentials will be acting as a client or as a server. If
        ``verify-peer`` is enabled (the default) then once the handshake
        is completed, the peer credentials will be verified. With x509
        certificates, this implies that the clients must be provided
        with valid client certificates too.

        The dir parameter tells QEMU where to find the credential files.
        For server endpoints, this directory may contain a file
        dh-params.pem providing diffie-hellman parameters to use for the
        TLS server. If the file is missing, QEMU will generate a set of
        DH parameters at startup. This is a computationally expensive
        operation that consumes random pool entropy, so it is
        recommended that a persistent set of parameters be generated
        upfront and saved.

        For x509 certificate credentials the directory will contain
        further files providing the x509 certificates. The certificates
        must be stored in PEM format, in filenames ca-cert.pem,
        ca-crl.pem (optional), server-cert.pem (only servers),
        server-key.pem (only servers), client-cert.pem (only clients),
        and client-key.pem (only clients).

        For the server-key.pem and client-key.pem files which contain
        sensitive private keys, it is possible to use an encrypted
        version by providing the passwordid parameter. This provides the
        ID of a previously created ``secret`` object containing the
        password for decryption.

        The priority parameter allows to override the global default
        priority used by gnutls. This can be useful if the system
        administrator needs to use a weaker set of crypto priorities for
        QEMU without potentially forcing the weakness onto all
        applications. Or conversely if one wants wants a stronger
        default for QEMU than for all other applications, they can do
        this through this parameter. Its format is a gnutls priority
        string as described at
        https://gnutls.org/manual/html_node/Priority-Strings.html.

    ``-object tls-cipher-suites,id=id,priority=priority``
        Creates a TLS cipher suites object, which can be used to control
        the TLS cipher/protocol algorithms that applications are permitted
        to use.

        The ``id`` parameter is a unique ID which frontends will use to
        access the ordered list of permitted TLS cipher suites from the
        host.

        The ``priority`` parameter allows to override the global default
        priority used by gnutls. This can be useful if the system
        administrator needs to use a weaker set of crypto priorities for
        QEMU without potentially forcing the weakness onto all
        applications. Or conversely if one wants wants a stronger
        default for QEMU than for all other applications, they can do
        this through this parameter. Its format is a gnutls priority
        string as described at
        https://gnutls.org/manual/html_node/Priority-Strings.html.

        An example of use of this object is to control UEFI HTTPS Boot.
        The tls-cipher-suites object exposes the ordered list of permitted
        TLS cipher suites from the host side to the guest firmware, via
        fw_cfg. The list is represented as an array of IANA_TLS_CIPHER
        objects. The firmware uses the IANA_TLS_CIPHER array for configuring
        guest-side TLS.

        In the following example, the priority at which the host-side policy
        is retrieved is given by the ``priority`` property.
        Given that QEMU uses GNUTLS, ``priority=@SYSTEM`` may be used to
        refer to /etc/crypto-policies/back-ends/gnutls.config.

        .. parsed-literal::

             # |qemu_system| \\
                 -object tls-cipher-suites,id=mysuite0,priority=@SYSTEM \\
                 -fw_cfg name=etc/edk2/https/ciphers,gen_id=mysuite0

    ``-object filter-buffer,id=id,netdev=netdevid,interval=t[,queue=all|rx|tx][,status=on|off][,position=head|tail|id=<id>][,insert=behind|before]``
        Interval t can't be 0, this filter batches the packet delivery:
        all packets arriving in a given interval on netdev netdevid are
        delayed until the end of the interval. Interval is in
        microseconds. ``status`` is optional that indicate whether the
        netfilter is on (enabled) or off (disabled), the default status
        for netfilter will be 'on'.

        queue all\|rx\|tx is an option that can be applied to any
        netfilter.

        ``all``: the filter is attached both to the receive and the
        transmit queue of the netdev (default).

        ``rx``: the filter is attached to the receive queue of the
        netdev, where it will receive packets sent to the netdev.

        ``tx``: the filter is attached to the transmit queue of the
        netdev, where it will receive packets sent by the netdev.

        position head\|tail\|id=<id> is an option to specify where the
        filter should be inserted in the filter list. It can be applied
        to any netfilter.

        ``head``: the filter is inserted at the head of the filter list,
        before any existing filters.

        ``tail``: the filter is inserted at the tail of the filter list,
        behind any existing filters (default).

        ``id=<id>``: the filter is inserted before or behind the filter
        specified by <id>, see the insert option below.

        insert behind\|before is an option to specify where to insert
        the new filter relative to the one specified with
        position=id=<id>. It can be applied to any netfilter.

        ``before``: insert before the specified filter.

        ``behind``: insert behind the specified filter (default).

    ``-object filter-mirror,id=id,netdev=netdevid,outdev=chardevid,queue=all|rx|tx[,vnet_hdr_support][,position=head|tail|id=<id>][,insert=behind|before]``
        filter-mirror on netdev netdevid,mirror net packet to
        chardevchardevid, if it has the vnet\_hdr\_support flag,
        filter-mirror will mirror packet with vnet\_hdr\_len.

    ``-object filter-redirector,id=id,netdev=netdevid,indev=chardevid,outdev=chardevid,queue=all|rx|tx[,vnet_hdr_support][,position=head|tail|id=<id>][,insert=behind|before]``
        filter-redirector on netdev netdevid,redirect filter's net
        packet to chardev chardevid,and redirect indev's packet to
        filter.if it has the vnet\_hdr\_support flag, filter-redirector
        will redirect packet with vnet\_hdr\_len. Create a
        filter-redirector we need to differ outdev id from indev id, id
        can not be the same. we can just use indev or outdev, but at
        least one of indev or outdev need to be specified.

    ``-object filter-rewriter,id=id,netdev=netdevid,queue=all|rx|tx,[vnet_hdr_support][,position=head|tail|id=<id>][,insert=behind|before]``
        Filter-rewriter is a part of COLO project.It will rewrite tcp
        packet to secondary from primary to keep secondary tcp
        connection,and rewrite tcp packet to primary from secondary make
        tcp packet can be handled by client.if it has the
        vnet\_hdr\_support flag, we can parse packet with vnet header.

        usage: colo secondary: -object
        filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0 -object
        filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1 -object
        filter-rewriter,id=rew0,netdev=hn0,queue=all

    ``-object filter-dump,id=id,netdev=dev[,file=filename][,maxlen=len][,position=head|tail|id=<id>][,insert=behind|before]``
        Dump the network traffic on netdev dev to the file specified by
        filename. At most len bytes (64k by default) per packet are
        stored. The file format is libpcap, so it can be analyzed with
        tools such as tcpdump or Wireshark.

    ``-object colo-compare,id=id,primary_in=chardevid,secondary_in=chardevid,outdev=chardevid,iothread=id[,vnet_hdr_support][,notify_dev=id][,compare_timeout=@var{ms}][,expired_scan_cycle=@var{ms}][,max_queue_size=@var{size}]``
        Colo-compare gets packet from primary\_in chardevid and
        secondary\_in, then compare whether the payload of primary packet
        and secondary packet are the same. If same, it will output
        primary packet to out\_dev, else it will notify COLO-framework to do
        checkpoint and send primary packet to out\_dev. In order to
        improve efficiency, we need to put the task of comparison in
        another iothread. If it has the vnet\_hdr\_support flag,
        colo compare will send/recv packet with vnet\_hdr\_len.
        The compare\_timeout=@var{ms} determines the maximum time of the
        colo-compare hold the packet. The expired\_scan\_cycle=@var{ms}
        is to set the period of scanning expired primary node network packets.
        The max\_queue\_size=@var{size} is to set the max compare queue
        size depend on user environment.
        If user want to use Xen COLO, need to add the notify\_dev to
        notify Xen colo-frame to do checkpoint.

        COLO-compare must be used with the help of filter-mirror,
        filter-redirector and filter-rewriter.

        ::

            KVM COLO

            primary:
            -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
            -device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66
            -chardev socket,id=mirror0,host=3.3.3.3,port=9003,server=on,wait=off
            -chardev socket,id=compare1,host=3.3.3.3,port=9004,server=on,wait=off
            -chardev socket,id=compare0,host=3.3.3.3,port=9001,server=on,wait=off
            -chardev socket,id=compare0-0,host=3.3.3.3,port=9001
            -chardev socket,id=compare_out,host=3.3.3.3,port=9005,server=on,wait=off
            -chardev socket,id=compare_out0,host=3.3.3.3,port=9005
            -object iothread,id=iothread1
            -object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0
            -object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out
            -object filter-redirector,netdev=hn0,id=redire1,queue=rx,outdev=compare0
            -object colo-compare,id=comp0,primary_in=compare0-0,secondary_in=compare1,outdev=compare_out0,iothread=iothread1

            secondary:
            -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,down script=/etc/qemu-ifdown
            -device e1000,netdev=hn0,mac=52:a4:00:12:78:66
            -chardev socket,id=red0,host=3.3.3.3,port=9003
            -chardev socket,id=red1,host=3.3.3.3,port=9004
            -object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0
            -object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1


            Xen COLO

            primary:
            -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
            -device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66
            -chardev socket,id=mirror0,host=3.3.3.3,port=9003,server=on,wait=off
            -chardev socket,id=compare1,host=3.3.3.3,port=9004,server=on,wait=off
            -chardev socket,id=compare0,host=3.3.3.3,port=9001,server=on,wait=off
            -chardev socket,id=compare0-0,host=3.3.3.3,port=9001
            -chardev socket,id=compare_out,host=3.3.3.3,port=9005,server=on,wait=off
            -chardev socket,id=compare_out0,host=3.3.3.3,port=9005
            -chardev socket,id=notify_way,host=3.3.3.3,port=9009,server=on,wait=off
            -object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0
            -object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out
            -object filter-redirector,netdev=hn0,id=redire1,queue=rx,outdev=compare0
            -object iothread,id=iothread1
            -object colo-compare,id=comp0,primary_in=compare0-0,secondary_in=compare1,outdev=compare_out0,notify_dev=nofity_way,iothread=iothread1

            secondary:
            -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,down script=/etc/qemu-ifdown
            -device e1000,netdev=hn0,mac=52:a4:00:12:78:66
            -chardev socket,id=red0,host=3.3.3.3,port=9003
            -chardev socket,id=red1,host=3.3.3.3,port=9004
            -object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0
            -object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1

        If you want to know the detail of above command line, you can
        read the colo-compare git log.

    ``-object cryptodev-backend-builtin,id=id[,queues=queues]``
        Creates a cryptodev backend which executes crypto operations from
        the QEMU cipher APIs. The id parameter is a unique ID that will
        be used to reference this cryptodev backend from the
        ``virtio-crypto`` device. The queues parameter is optional,
        which specify the queue number of cryptodev backend, the default
        of queues is 1.

        .. parsed-literal::

             # |qemu_system| \\
               [...] \\
                   -object cryptodev-backend-builtin,id=cryptodev0 \\
                   -device virtio-crypto-pci,id=crypto0,cryptodev=cryptodev0 \\
               [...]

    ``-object cryptodev-vhost-user,id=id,chardev=chardevid[,queues=queues]``
        Creates a vhost-user cryptodev backend, backed by a chardev
        chardevid. The id parameter is a unique ID that will be used to
        reference this cryptodev backend from the ``virtio-crypto``
        device. The chardev should be a unix domain socket backed one.
        The vhost-user uses a specifically defined protocol to pass
        vhost ioctl replacement messages to an application on the other
        end of the socket. The queues parameter is optional, which
        specify the queue number of cryptodev backend for multiqueue
        vhost-user, the default of queues is 1.

        .. parsed-literal::

             # |qemu_system| \\
               [...] \\
                   -chardev socket,id=chardev0,path=/path/to/socket \\
                   -object cryptodev-vhost-user,id=cryptodev0,chardev=chardev0 \\
                   -device virtio-crypto-pci,id=crypto0,cryptodev=cryptodev0 \\
               [...]

    ``-object secret,id=id,data=string,format=raw|base64[,keyid=secretid,iv=string]``
      \ 
    ``-object secret,id=id,file=filename,format=raw|base64[,keyid=secretid,iv=string]``
        Defines a secret to store a password, encryption key, or some
        other sensitive data. The sensitive data can either be passed
        directly via the data parameter, or indirectly via the file
        parameter. Using the data parameter is insecure unless the
        sensitive data is encrypted.

        The sensitive data can be provided in raw format (the default),
        or base64. When encoded as JSON, the raw format only supports
        valid UTF-8 characters, so base64 is recommended for sending
        binary data. QEMU will convert from which ever format is
        provided to the format it needs internally. eg, an RBD password
        can be provided in raw format, even though it will be base64
        encoded when passed onto the RBD sever.

        For added protection, it is possible to encrypt the data
        associated with a secret using the AES-256-CBC cipher. Use of
        encryption is indicated by providing the keyid and iv
        parameters. The keyid parameter provides the ID of a previously
        defined secret that contains the AES-256 decryption key. This
        key should be 32-bytes long and be base64 encoded. The iv
        parameter provides the random initialization vector used for
        encryption of this particular secret and should be a base64
        encrypted string of the 16-byte IV.

        The simplest (insecure) usage is to provide the secret inline

        .. parsed-literal::

             # |qemu_system| -object secret,id=sec0,data=letmein,format=raw

        The simplest secure usage is to provide the secret via a file

        # printf "letmein" > mypasswd.txt # QEMU\_SYSTEM\_MACRO -object
        secret,id=sec0,file=mypasswd.txt,format=raw

        For greater security, AES-256-CBC should be used. To illustrate
        usage, consider the openssl command line tool which can encrypt
        the data. Note that when encrypting, the plaintext must be
        padded to the cipher block size (32 bytes) using the standard
        PKCS#5/6 compatible padding algorithm.

        First a master key needs to be created in base64 encoding:

        ::

             # openssl rand -base64 32 > key.b64
             # KEY=$(base64 -d key.b64 | hexdump  -v -e '/1 "%02X"')

        Each secret to be encrypted needs to have a random
        initialization vector generated. These do not need to be kept
        secret

        ::

             # openssl rand -base64 16 > iv.b64
             # IV=$(base64 -d iv.b64 | hexdump  -v -e '/1 "%02X"')

        The secret to be defined can now be encrypted, in this case
        we're telling openssl to base64 encode the result, but it could
        be left as raw bytes if desired.

        ::

             # SECRET=$(printf "letmein" |
                        openssl enc -aes-256-cbc -a -K $KEY -iv $IV)

        When launching QEMU, create a master secret pointing to
        ``key.b64`` and specify that to be used to decrypt the user
        password. Pass the contents of ``iv.b64`` to the second secret

        .. parsed-literal::

             # |qemu_system| \\
                 -object secret,id=secmaster0,format=base64,file=key.b64 \\
                 -object secret,id=sec0,keyid=secmaster0,format=base64,\\
                     data=$SECRET,iv=$(<iv.b64)

    ``-object sev-guest,id=id,cbitpos=cbitpos,reduced-phys-bits=val,[sev-device=string,policy=policy,handle=handle,dh-cert-file=file,session-file=file,kernel-hashes=on|off]``
        Create a Secure Encrypted Virtualization (SEV) guest object,
        which can be used to provide the guest memory encryption support
        on AMD processors.

        When memory encryption is enabled, one of the physical address
        bit (aka the C-bit) is utilized to mark if a memory page is
        protected. The ``cbitpos`` is used to provide the C-bit
        position. The C-bit position is Host family dependent hence user
        must provide this value. On EPYC, the value should be 47.

        When memory encryption is enabled, we loose certain bits in
        physical address space. The ``reduced-phys-bits`` is used to
        provide the number of bits we loose in physical address space.
        Similar to C-bit, the value is Host family dependent. On EPYC,
        the value should be 5.

        The ``sev-device`` provides the device file to use for
        communicating with the SEV firmware running inside AMD Secure
        Processor. The default device is '/dev/sev'. If hardware
        supports memory encryption then /dev/sev devices are created by
        CCP driver.

        The ``policy`` provides the guest policy to be enforced by the
        SEV firmware and restrict what configuration and operational
        commands can be performed on this guest by the hypervisor. The
        policy should be provided by the guest owner and is bound to the
        guest and cannot be changed throughout the lifetime of the
        guest. The default is 0.

        If guest ``policy`` allows sharing the key with another SEV
        guest then ``handle`` can be use to provide handle of the guest
        from which to share the key.

        The ``dh-cert-file`` and ``session-file`` provides the guest
        owner's Public Diffie-Hillman key defined in SEV spec. The PDH
        and session parameters are used for establishing a cryptographic
        session with the guest owner to negotiate keys used for
        attestation. The file must be encoded in base64.

        The ``kernel-hashes`` adds the hashes of given kernel/initrd/
        cmdline to a designated guest firmware page for measured Linux
        boot with -kernel. The default is off. (Since 6.2)

        e.g to launch a SEV guest

        .. parsed-literal::

             # |qemu_system_x86| \\
                 ...... \\
                 -object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=5 \\
                 -machine ...,memory-encryption=sev0 \\
                 .....

    ``-object authz-simple,id=id,identity=string``
        Create an authorization object that will control access to
        network services.

        The ``identity`` parameter is identifies the user and its format
        depends on the network service that authorization object is
        associated with. For authorizing based on TLS x509 certificates,
        the identity must be the x509 distinguished name. Note that care
        must be taken to escape any commas in the distinguished name.

        An example authorization object to validate a x509 distinguished
        name would look like:

        .. parsed-literal::

             # |qemu_system| \\
                 ... \\
                 -object 'authz-simple,id=auth0,identity=CN=laptop.example.com,,O=Example Org,,L=London,,ST=London,,C=GB' \\
                 ...

        Note the use of quotes due to the x509 distinguished name
        containing whitespace, and escaping of ','.

    ``-object authz-listfile,id=id,filename=path,refresh=on|off``
        Create an authorization object that will control access to
        network services.

        The ``filename`` parameter is the fully qualified path to a file
        containing the access control list rules in JSON format.

        An example set of rules that match against SASL usernames might
        look like:

        ::

              {
                "rules": [
                   { "match": "fred", "policy": "allow", "format": "exact" },
                   { "match": "bob", "policy": "allow", "format": "exact" },
                   { "match": "danb", "policy": "deny", "format": "glob" },
                   { "match": "dan*", "policy": "allow", "format": "exact" },
                ],
                "policy": "deny"
              }

        When checking access the object will iterate over all the rules
        and the first rule to match will have its ``policy`` value
        returned as the result. If no rules match, then the default
        ``policy`` value is returned.

        The rules can either be an exact string match, or they can use
        the simple UNIX glob pattern matching to allow wildcards to be
        used.

        If ``refresh`` is set to true the file will be monitored and
        automatically reloaded whenever its content changes.

        As with the ``authz-simple`` object, the format of the identity
        strings being matched depends on the network service, but is
        usually a TLS x509 distinguished name, or a SASL username.

        An example authorization object to validate a SASL username
        would look like:

        .. parsed-literal::

             # |qemu_system| \\
                 ... \\
                 -object authz-simple,id=auth0,filename=/etc/qemu/vnc-sasl.acl,refresh=on \\
                 ...

    ``-object authz-pam,id=id,service=string``
        Create an authorization object that will control access to
        network services.

        The ``service`` parameter provides the name of a PAM service to
        use for authorization. It requires that a file
        ``/etc/pam.d/service`` exist to provide the configuration for
        the ``account`` subsystem.

        An example authorization object to validate a TLS x509
        distinguished name would look like:

        .. parsed-literal::

             # |qemu_system| \\
                 ... \\
                 -object authz-pam,id=auth0,service=qemu-vnc \\
                 ...

        There would then be a corresponding config file for PAM at
        ``/etc/pam.d/qemu-vnc`` that contains:

        ::

            account requisite  pam_listfile.so item=user sense=allow \
                       file=/etc/qemu/vnc.allow

        Finally the ``/etc/qemu/vnc.allow`` file would contain the list
        of x509 distinguished names that are permitted access

        ::

            CN=laptop.example.com,O=Example Home,L=London,ST=London,C=GB

    ``-object iothread,id=id,poll-max-ns=poll-max-ns,poll-grow=poll-grow,poll-shrink=poll-shrink,aio-max-batch=aio-max-batch``
        Creates a dedicated event loop thread that devices can be
        assigned to. This is known as an IOThread. By default device
        emulation happens in vCPU threads or the main event loop thread.
        This can become a scalability bottleneck. IOThreads allow device
        emulation and I/O to run on other host CPUs.

        The ``id`` parameter is a unique ID that will be used to
        reference this IOThread from ``-device ...,iothread=id``.
        Multiple devices can be assigned to an IOThread. Note that not
        all devices support an ``iothread`` parameter.

        The ``query-iothreads`` QMP command lists IOThreads and reports
        their thread IDs so that the user can configure host CPU
        pinning/affinity.

        IOThreads use an adaptive polling algorithm to reduce event loop
        latency. Instead of entering a blocking system call to monitor
        file descriptors and then pay the cost of being woken up when an
        event occurs, the polling algorithm spins waiting for events for
        a short time. The algorithm's default parameters are suitable
        for many cases but can be adjusted based on knowledge of the
        workload and/or host device latency.

        The ``poll-max-ns`` parameter is the maximum number of
        nanoseconds to busy wait for events. Polling can be disabled by
        setting this value to 0.

        The ``poll-grow`` parameter is the multiplier used to increase
        the polling time when the algorithm detects it is missing events
        due to not polling long enough.

        The ``poll-shrink`` parameter is the divisor used to decrease
        the polling time when the algorithm detects it is spending too
        long polling without encountering events.

        The ``aio-max-batch`` parameter is the maximum number of requests
        in a batch for the AIO engine, 0 means that the engine will use
        its default.

        The IOThread parameters can be modified at run-time using the
        ``qom-set`` command (where ``iothread1`` is the IOThread's
        ``id``):

        ::

            (qemu) qom-set /objects/iothread1 poll-max-ns 100000
ERST


HXCOMM This is the last statement. Insert new options before this line!

#undef DEF
#undef DEFHEADING
#undef ARCHHEADING
