mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
* KVM page size fix for PPC * Support for Linux 4.4's new Hyper-V features * Eliminate g_slice from areas I maintain * checkpatch fix * Peter's cpu_reload_memory_map() cleanups * More changes to MAINTAINERS * Require Python 2.6 * chardev creation fixes * PCI requester id for ARM KVM * cleanups and doc fixes * Allow customization of the Hyper-V vendor id # gpg: Signature made Mon 19 Oct 2015 09:13:10 BST using RSA key ID 78C7AE83 # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" * remotes/bonzini/tags/for-upstream: (49 commits) kvm: Allow the Hyper-V vendor ID to be specified kvm: Move x86-specific functions into target-i386/kvm.c kvm: Pass PCI device pointer to MSI routing functions hw/pci: Introduce pci_requester_id() kvm: Make KVM_CAP_SIGNAL_MSI globally available doc/rcu: fix g_free_rcu() usage example qemu-char: cleanup after completed conversion to cd->create qemu-char: convert ringbuf backend to data-driven creation qemu-char: convert vc backend to data-driven creation qemu-char: convert spice backend to data-driven creation qemu-char: convert console backend to data-driven creation qemu-char: convert stdio backend to data-driven creation qemu-char: convert testdev backend to data-driven creation qemu-char: convert braille backend to data-driven creation qemu-char: convert msmouse backend to data-driven creation qemu-char: convert mux backend to data-driven creation qemu-char: convert null backend to data-driven creation qemu-char: convert pty backend to data-driven creation qemu-char: convert UDP backend to data-driven creation qemu-char: convert socket backend to data-driven creation ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+45
-6
@@ -255,6 +255,12 @@ L: xen-devel@lists.xensource.com
|
||||
S: Supported
|
||||
F: xen-*
|
||||
F: */xen*
|
||||
F: hw/char/xen_console.c
|
||||
F: hw/display/xenfb.c
|
||||
F: hw/net/xen_nic.c
|
||||
F: hw/xen/
|
||||
F: hw/xenpv/
|
||||
F: include/hw/xen/
|
||||
|
||||
Hosts:
|
||||
------
|
||||
@@ -286,6 +292,36 @@ F: hw/*/allwinner*
|
||||
F: include/hw/*/allwinner*
|
||||
F: hw/arm/cubieboard.c
|
||||
|
||||
ARM PrimeCell
|
||||
M: Peter Maydell <peter.maydell@linaro.org>
|
||||
S: Maintained
|
||||
F: hw/char/pl011.c
|
||||
F: hw/display/pl110*
|
||||
F: hw/dma/pl080.c
|
||||
F: hw/dma/pl330.c
|
||||
F: hw/gpio/pl061.c
|
||||
F: hw/input/pl050.c
|
||||
F: hw/intc/pl190.c
|
||||
F: hw/sd/pl181.c
|
||||
F: hw/timer/pl031.c
|
||||
F: include/hw/arm/primecell.h
|
||||
|
||||
ARM cores
|
||||
M: Peter Maydell <peter.maydell@linaro.org>
|
||||
S: Maintained
|
||||
F: hw/intc/arm*
|
||||
F: hw/intc/gic_internal.h
|
||||
F: hw/misc/a9scu.c
|
||||
F: hw/misc/arm11scu.c
|
||||
F: hw/timer/a9gtimer*
|
||||
F: hw/timer/arm_*
|
||||
F: include/hw/arm/arm.h
|
||||
F: include/hw/intc/arm*
|
||||
F: include/hw/misc/a9scu.h
|
||||
F: include/hw/misc/arm11scu.h
|
||||
F: include/hw/timer/a9gtimer.h
|
||||
F: include/hw/timer/arm_mptimer.h
|
||||
|
||||
Exynos
|
||||
M: Evgeny Voevodin <e.voevodin@samsung.com>
|
||||
M: Maksim Kozlov <m.kozlov@samsung.com>
|
||||
@@ -322,11 +358,6 @@ M: Peter Maydell <peter.maydell@linaro.org>
|
||||
S: Maintained
|
||||
F: hw/arm/integratorcp.c
|
||||
|
||||
Mainstone
|
||||
L: qemu-devel@nongnu.org
|
||||
S: Orphan
|
||||
F: hw/arm/mainstone.c
|
||||
|
||||
Musicpal
|
||||
M: Jan Kiszka <jan.kiszka@web.de>
|
||||
S: Maintained
|
||||
@@ -346,11 +377,17 @@ Real View
|
||||
M: Peter Maydell <peter.maydell@linaro.org>
|
||||
S: Maintained
|
||||
F: hw/arm/realview*
|
||||
F: hw/intc/realview_gic.c
|
||||
F: include/hw/intc/realview_gic.h
|
||||
|
||||
Spitz
|
||||
PXA2XX
|
||||
M: Andrzej Zaborowski <balrogg@gmail.com>
|
||||
S: Maintained
|
||||
F: hw/arm/mainstone.c
|
||||
F: hw/arm/spitz.c
|
||||
F: hw/arm/tosa.c
|
||||
F: hw/arm/z2.c
|
||||
F: hw/*/pxa2xx*
|
||||
|
||||
Stellaris
|
||||
M: Peter Maydell <peter.maydell@linaro.org>
|
||||
@@ -726,6 +763,8 @@ M: Scott Wood <scottwood@freescale.com>
|
||||
L: qemu-ppc@nongnu.org
|
||||
S: Supported
|
||||
F: hw/ppc/e500*
|
||||
F: hw/pci-host/ppce500.c
|
||||
F: hw/net/fsl_etsec/
|
||||
|
||||
Character devices
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
|
||||
@@ -1,3 +1,107 @@
|
||||
Read the documentation in qemu-doc.html or on http://wiki.qemu-project.org
|
||||
QEMU README
|
||||
===========
|
||||
|
||||
- QEMU team
|
||||
QEMU is a generic and open source machine & userspace emulator and
|
||||
virtualizer.
|
||||
|
||||
QEMU is capable of emulating a complete machine in software without any
|
||||
need for hardware virtualization support. By using dynamic translation,
|
||||
it achieves very good performance. QEMU can also integrate with the Xen
|
||||
and KVM hypervisors to provide emulated hardware while allowing the
|
||||
hypervisor to manage the CPU. With hypervisor support, QEMU can achieve
|
||||
near native performance for CPUs. When QEMU emulates CPUs directly it is
|
||||
capable of running operating systems made for one machine (e.g. an ARMv7
|
||||
board) on a different machine (e.g. an x86_64 PC board).
|
||||
|
||||
QEMU is also capable of providing userspace API virtualization for Linux
|
||||
and BSD kernel interfaces. This allows binaries compiled against one
|
||||
architecture ABI (e.g. the Linux PPC64 ABI) to be run on a host using a
|
||||
different architecture ABI (e.g. the Linux x86_64 ABI). This does not
|
||||
involve any hardware emulation, simply CPU and syscall emulation.
|
||||
|
||||
QEMU aims to fit into a variety of use cases. It can be invoked directly
|
||||
by users wishing to have full control over its behaviour and settings.
|
||||
It also aims to facilitate integration into higher level management
|
||||
layers, by providing a stable command line interface and monitor API.
|
||||
It is commonly invoked indirectly via the libvirt library when using
|
||||
open source applications such as oVirt, OpenStack and virt-manager.
|
||||
|
||||
QEMU as a whole is released under the GNU General Public License,
|
||||
version 2. For full licensing details, consult the LICENSE file.
|
||||
|
||||
|
||||
Building
|
||||
========
|
||||
|
||||
QEMU is multi-platform software intended to be buildable on all modern
|
||||
Linux platforms, OS-X, Win32 (via the Mingw64 toolchain) and a variety
|
||||
of other UNIX targets. The simple steps to build QEMU are:
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
../configure
|
||||
make
|
||||
|
||||
Complete details of the process for building and configuring QEMU for
|
||||
all supported host platforms can be found in the qemu-tech.html file.
|
||||
Additional information can also be found online via the QEMU website:
|
||||
|
||||
http://qemu-project.org/Hosts/Linux
|
||||
http://qemu-project.org/Hosts/W32
|
||||
|
||||
|
||||
Submitting patches
|
||||
==================
|
||||
|
||||
The QEMU source code is maintained under the GIT version control system.
|
||||
|
||||
git clone git://git.qemu-project.org/qemu.git
|
||||
|
||||
When submitting patches, the preferred approach is to use 'git
|
||||
format-patch' and/or 'git send-email' to format & send the mail to the
|
||||
qemu-devel@nongnu.org mailing list. All patches submitted must contain
|
||||
a 'Signed-off-by' line from the author. Patches should follow the
|
||||
guidelines set out in the HACKING and CODING_STYLE files.
|
||||
|
||||
Additional information on submitting patches can be found online via
|
||||
the QEMU website
|
||||
|
||||
http://qemu-project.org/Contribute/SubmitAPatch
|
||||
http://qemu-project.org/Contribute/TrivialPatches
|
||||
|
||||
|
||||
Bug reporting
|
||||
=============
|
||||
|
||||
The QEMU project uses Launchpad as its primary upstream bug tracker. Bugs
|
||||
found when running code built from QEMU git or upstream released sources
|
||||
should be reported via:
|
||||
|
||||
https://bugs.launchpad.net/qemu/
|
||||
|
||||
If using QEMU via an operating system vendor pre-built binary package, it
|
||||
is preferable to report bugs to the vendor's own bug tracker first. If
|
||||
the bug is also known to affect latest upstream code, it can also be
|
||||
reported via launchpad.
|
||||
|
||||
For additional information on bug reporting consult:
|
||||
|
||||
http://qemu-project.org/Contribute/ReportABug
|
||||
|
||||
|
||||
Contact
|
||||
=======
|
||||
|
||||
The QEMU community can be contacted in a number of ways, with the two
|
||||
main methods being email and IRC
|
||||
|
||||
- qemu-devel@nongnu.org
|
||||
http://lists.nongnu.org/mailman/listinfo/qemu-devel
|
||||
- #qemu on irc.oftc.net
|
||||
|
||||
Information on additional methods of contacting the community can be
|
||||
found online via the QEMU website:
|
||||
|
||||
http://qemu-project.org/Contribute/StartHere
|
||||
|
||||
-- End
|
||||
|
||||
+12
-5
@@ -561,7 +561,10 @@ static void baum_close(struct CharDriverState *chr)
|
||||
g_free(baum);
|
||||
}
|
||||
|
||||
CharDriverState *chr_baum_init(void)
|
||||
static CharDriverState *chr_baum_init(const char *id,
|
||||
ChardevBackend *backend,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
BaumDriverState *baum;
|
||||
CharDriverState *chr;
|
||||
@@ -586,14 +589,16 @@ CharDriverState *chr_baum_init(void)
|
||||
|
||||
baum->brlapi_fd = brlapi__openConnection(handle, NULL, NULL);
|
||||
if (baum->brlapi_fd == -1) {
|
||||
brlapi_perror("baum_init: brlapi_openConnection");
|
||||
error_setg(errp, "brlapi__openConnection: %s",
|
||||
brlapi_strerror(brlapi_error_location()));
|
||||
goto fail_handle;
|
||||
}
|
||||
|
||||
baum->cellCount_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, baum_cellCount_timer_cb, baum);
|
||||
|
||||
if (brlapi__getDisplaySize(handle, &baum->x, &baum->y) == -1) {
|
||||
brlapi_perror("baum_init: brlapi_getDisplaySize");
|
||||
error_setg(errp, "brlapi__getDisplaySize: %s",
|
||||
brlapi_strerror(brlapi_error_location()));
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -609,7 +614,8 @@ CharDriverState *chr_baum_init(void)
|
||||
tty = BRLAPI_TTY_DEFAULT;
|
||||
|
||||
if (brlapi__enterTtyMode(handle, tty, NULL) == -1) {
|
||||
brlapi_perror("baum_init: brlapi_enterTtyMode");
|
||||
error_setg(errp, "brlapi__enterTtyMode: %s",
|
||||
brlapi_strerror(brlapi_error_location()));
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -629,7 +635,8 @@ fail_handle:
|
||||
|
||||
static void register_types(void)
|
||||
{
|
||||
register_char_driver("braille", CHARDEV_BACKEND_KIND_BRAILLE, NULL);
|
||||
register_char_driver("braille", CHARDEV_BACKEND_KIND_BRAILLE, NULL,
|
||||
chr_baum_init);
|
||||
}
|
||||
|
||||
type_init(register_types);
|
||||
|
||||
+6
-2
@@ -63,7 +63,10 @@ static void msmouse_chr_close (struct CharDriverState *chr)
|
||||
g_free (chr);
|
||||
}
|
||||
|
||||
CharDriverState *qemu_chr_open_msmouse(void)
|
||||
static CharDriverState *qemu_chr_open_msmouse(const char *id,
|
||||
ChardevBackend *backend,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
CharDriverState *chr;
|
||||
|
||||
@@ -79,7 +82,8 @@ CharDriverState *qemu_chr_open_msmouse(void)
|
||||
|
||||
static void register_types(void)
|
||||
{
|
||||
register_char_driver("msmouse", CHARDEV_BACKEND_KIND_MSMOUSE, NULL);
|
||||
register_char_driver("msmouse", CHARDEV_BACKEND_KIND_MSMOUSE, NULL,
|
||||
qemu_chr_open_msmouse);
|
||||
}
|
||||
|
||||
type_init(register_types);
|
||||
|
||||
+6
-2
@@ -108,7 +108,10 @@ static void testdev_close(struct CharDriverState *chr)
|
||||
g_free(testdev);
|
||||
}
|
||||
|
||||
CharDriverState *chr_testdev_init(void)
|
||||
static CharDriverState *chr_testdev_init(const char *id,
|
||||
ChardevBackend *backend,
|
||||
ChardevReturn *ret,
|
||||
Error **errp)
|
||||
{
|
||||
TestdevCharState *testdev;
|
||||
CharDriverState *chr;
|
||||
@@ -125,7 +128,8 @@ CharDriverState *chr_testdev_init(void)
|
||||
|
||||
static void register_types(void)
|
||||
{
|
||||
register_char_driver("testdev", CHARDEV_BACKEND_KIND_TESTDEV, NULL);
|
||||
register_char_driver("testdev", CHARDEV_BACKEND_KIND_TESTDEV, NULL,
|
||||
chr_testdev_init);
|
||||
}
|
||||
|
||||
type_init(register_types);
|
||||
|
||||
@@ -1166,18 +1166,14 @@ fi
|
||||
|
||||
# Note that if the Python conditional here evaluates True we will exit
|
||||
# with status 1 which is a shell 'false' value.
|
||||
if ! $python -c 'import sys; sys.exit(sys.version_info < (2,4) or sys.version_info >= (3,))'; then
|
||||
error_exit "Cannot use '$python', Python 2.4 or later is required." \
|
||||
if ! $python -c 'import sys; sys.exit(sys.version_info < (2,6) or sys.version_info >= (3,))'; then
|
||||
error_exit "Cannot use '$python', Python 2.6 or later is required." \
|
||||
"Note that Python 3 or later is not yet supported." \
|
||||
"Use --python=/path/to/python to specify a supported Python."
|
||||
fi
|
||||
|
||||
# The -B switch was added in Python 2.6.
|
||||
# If it is supplied, compiled files are not written.
|
||||
# Use it for Python versions which support it.
|
||||
if $python -B -c 'import sys; sys.exit(0)' 2>/dev/null; then
|
||||
python="$python -B"
|
||||
fi
|
||||
# Suppress writing compiled files
|
||||
python="$python -B"
|
||||
|
||||
case "$cpu" in
|
||||
ppc)
|
||||
|
||||
+17
-16
@@ -37,31 +37,32 @@ void cpu_resume_from_signal(CPUState *cpu, void *puc)
|
||||
siglongjmp(cpu->jmp_env, 1);
|
||||
}
|
||||
|
||||
void cpu_reload_memory_map(CPUState *cpu)
|
||||
void cpu_reloading_memory_map(void)
|
||||
{
|
||||
AddressSpaceDispatch *d;
|
||||
|
||||
if (qemu_in_vcpu_thread()) {
|
||||
/* Do not let the guest prolong the critical section as much as it
|
||||
* as it desires.
|
||||
/* The guest can in theory prolong the RCU critical section as long
|
||||
* as it feels like. The major problem with this is that because it
|
||||
* can do multiple reconfigurations of the memory map within the
|
||||
* critical section, we could potentially accumulate an unbounded
|
||||
* collection of memory data structures awaiting reclamation.
|
||||
*
|
||||
* Currently, this is prevented by the I/O thread's periodinc kicking
|
||||
* of the VCPU thread (iothread_requesting_mutex, qemu_cpu_kick_thread)
|
||||
* but this will go away once TCG's execution moves out of the global
|
||||
* mutex.
|
||||
* Because the only thing we're currently protecting with RCU is the
|
||||
* memory data structures, it's sufficient to break the critical section
|
||||
* in this callback, which we know will get called every time the
|
||||
* memory map is rearranged.
|
||||
*
|
||||
* (If we add anything else in the system that uses RCU to protect
|
||||
* its data structures, we will need to implement some other mechanism
|
||||
* to force TCG CPUs to exit the critical section, at which point this
|
||||
* part of this callback might become unnecessary.)
|
||||
*
|
||||
* This pair matches cpu_exec's rcu_read_lock()/rcu_read_unlock(), which
|
||||
* only protects cpu->as->dispatch. Since we reload it below, we can
|
||||
* split the critical section.
|
||||
* only protects cpu->as->dispatch. Since we know our caller is about
|
||||
* to reload it, it's safe to split the critical section.
|
||||
*/
|
||||
rcu_read_unlock();
|
||||
rcu_read_lock();
|
||||
}
|
||||
|
||||
/* The CPU and TLB are protected by the iothread lock. */
|
||||
d = atomic_rcu_read(&cpu->as->dispatch);
|
||||
cpu->memory_dispatch = d;
|
||||
tlb_flush(cpu, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+1
-1
@@ -128,7 +128,7 @@ The core RCU API is small:
|
||||
the callback function is g_free, in particular, g_free_rcu can be
|
||||
used. In the above case, one could have written simply:
|
||||
|
||||
g_free_rcu(foo_reclaim, rcu);
|
||||
g_free_rcu(&foo, rcu);
|
||||
|
||||
typeof(*p) atomic_rcu_read(p);
|
||||
|
||||
|
||||
@@ -161,6 +161,21 @@ static void memory_map_init(void);
|
||||
static void tcg_commit(MemoryListener *listener);
|
||||
|
||||
static MemoryRegion io_mem_watch;
|
||||
|
||||
/**
|
||||
* CPUAddressSpace: all the information a CPU needs about an AddressSpace
|
||||
* @cpu: the CPU whose AddressSpace this is
|
||||
* @as: the AddressSpace itself
|
||||
* @memory_dispatch: its dispatch pointer (cached, RCU protected)
|
||||
* @tcg_as_listener: listener for tracking changes to the AddressSpace
|
||||
*/
|
||||
struct CPUAddressSpace {
|
||||
CPUState *cpu;
|
||||
AddressSpace *as;
|
||||
struct AddressSpaceDispatch *memory_dispatch;
|
||||
MemoryListener tcg_as_listener;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
@@ -431,7 +446,7 @@ address_space_translate_for_iotlb(CPUState *cpu, hwaddr addr,
|
||||
hwaddr *xlat, hwaddr *plen)
|
||||
{
|
||||
MemoryRegionSection *section;
|
||||
section = address_space_translate_internal(cpu->memory_dispatch,
|
||||
section = address_space_translate_internal(cpu->cpu_ases[0].memory_dispatch,
|
||||
addr, xlat, plen, false);
|
||||
|
||||
assert(!section->mr->iommu_ops);
|
||||
@@ -537,13 +552,16 @@ void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as)
|
||||
/* We only support one address space per cpu at the moment. */
|
||||
assert(cpu->as == as);
|
||||
|
||||
if (cpu->tcg_as_listener) {
|
||||
memory_listener_unregister(cpu->tcg_as_listener);
|
||||
} else {
|
||||
cpu->tcg_as_listener = g_new0(MemoryListener, 1);
|
||||
if (cpu->cpu_ases) {
|
||||
/* We've already registered the listener for our only AS */
|
||||
return;
|
||||
}
|
||||
cpu->tcg_as_listener->commit = tcg_commit;
|
||||
memory_listener_register(cpu->tcg_as_listener, as);
|
||||
|
||||
cpu->cpu_ases = g_new0(CPUAddressSpace, 1);
|
||||
cpu->cpu_ases[0].cpu = cpu;
|
||||
cpu->cpu_ases[0].as = as;
|
||||
cpu->cpu_ases[0].tcg_as_listener.commit = tcg_commit;
|
||||
memory_listener_register(&cpu->cpu_ases[0].tcg_as_listener, as);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -601,7 +619,6 @@ void cpu_exec_init(CPUState *cpu, Error **errp)
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
cpu->as = &address_space_memory;
|
||||
cpu->thread_id = qemu_get_thread_id();
|
||||
cpu_reload_memory_map(cpu);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
@@ -2219,7 +2236,8 @@ static uint16_t dummy_section(PhysPageMap *map, AddressSpace *as,
|
||||
|
||||
MemoryRegion *iotlb_to_region(CPUState *cpu, hwaddr index)
|
||||
{
|
||||
AddressSpaceDispatch *d = atomic_rcu_read(&cpu->memory_dispatch);
|
||||
CPUAddressSpace *cpuas = &cpu->cpu_ases[0];
|
||||
AddressSpaceDispatch *d = atomic_rcu_read(&cpuas->memory_dispatch);
|
||||
MemoryRegionSection *sections = d->map.sections;
|
||||
|
||||
return sections[index & ~TARGET_PAGE_MASK].mr;
|
||||
@@ -2278,19 +2296,20 @@ static void mem_commit(MemoryListener *listener)
|
||||
|
||||
static void tcg_commit(MemoryListener *listener)
|
||||
{
|
||||
CPUState *cpu;
|
||||
CPUAddressSpace *cpuas;
|
||||
AddressSpaceDispatch *d;
|
||||
|
||||
/* since each CPU stores ram addresses in its TLB cache, we must
|
||||
reset the modified entries */
|
||||
/* XXX: slow ! */
|
||||
CPU_FOREACH(cpu) {
|
||||
/* FIXME: Disentangle the cpu.h circular files deps so we can
|
||||
directly get the right CPU from listener. */
|
||||
if (cpu->tcg_as_listener != listener) {
|
||||
continue;
|
||||
}
|
||||
cpu_reload_memory_map(cpu);
|
||||
}
|
||||
cpuas = container_of(listener, CPUAddressSpace, tcg_as_listener);
|
||||
cpu_reloading_memory_map();
|
||||
/* The CPU and TLB are protected by the iothread lock.
|
||||
* We reload the dispatch pointer now because cpu_reloading_memory_map()
|
||||
* may have split the RCU critical section.
|
||||
*/
|
||||
d = atomic_rcu_read(&cpuas->as->dispatch);
|
||||
cpuas->memory_dispatch = d;
|
||||
tlb_flush(cpuas->cpu, 1);
|
||||
}
|
||||
|
||||
void address_space_init_dispatch(AddressSpace *as)
|
||||
|
||||
@@ -979,7 +979,7 @@ static void assigned_dev_update_msi(PCIDevice *pci_dev)
|
||||
MSIMessage msg = msi_get_message(pci_dev, 0);
|
||||
int virq;
|
||||
|
||||
virq = kvm_irqchip_add_msi_route(kvm_state, msg);
|
||||
virq = kvm_irqchip_add_msi_route(kvm_state, msg, pci_dev);
|
||||
if (virq < 0) {
|
||||
perror("assigned_dev_update_msi: kvm_irqchip_add_msi_route");
|
||||
return;
|
||||
@@ -1017,7 +1017,7 @@ static void assigned_dev_update_msi_msg(PCIDevice *pci_dev)
|
||||
}
|
||||
|
||||
kvm_irqchip_update_msi_route(kvm_state, assigned_dev->msi_virq[0],
|
||||
msi_get_message(pci_dev, 0));
|
||||
msi_get_message(pci_dev, 0), pci_dev);
|
||||
}
|
||||
|
||||
static bool assigned_dev_msix_masked(MSIXTableEntry *entry)
|
||||
@@ -1083,7 +1083,7 @@ static int assigned_dev_update_msix_mmio(PCIDevice *pci_dev)
|
||||
|
||||
msg.address = entry->addr_lo | ((uint64_t)entry->addr_hi << 32);
|
||||
msg.data = entry->data;
|
||||
r = kvm_irqchip_add_msi_route(kvm_state, msg);
|
||||
r = kvm_irqchip_add_msi_route(kvm_state, msg, pci_dev);
|
||||
if (r < 0) {
|
||||
return r;
|
||||
}
|
||||
@@ -1483,7 +1483,7 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev, Error **errp)
|
||||
* error bits, leave the rest. */
|
||||
status = pci_get_long(pci_dev->config + pos + PCI_X_STATUS);
|
||||
status &= ~(PCI_X_STATUS_BUS | PCI_X_STATUS_DEVFN);
|
||||
status |= (pci_bus_num(pci_dev->bus) << 8) | pci_dev->devfn;
|
||||
status |= pci_requester_id(pci_dev);
|
||||
status &= ~(PCI_X_STATUS_SPL_DISC | PCI_X_STATUS_UNX_SPL |
|
||||
PCI_X_STATUS_SPL_ERR);
|
||||
pci_set_long(pci_dev->config + pos + PCI_X_STATUS, status);
|
||||
@@ -1602,7 +1602,8 @@ static void assigned_dev_msix_mmio_write(void *opaque, hwaddr addr,
|
||||
msg.data = entry->data;
|
||||
|
||||
ret = kvm_irqchip_update_msi_route(kvm_state,
|
||||
adev->msi_virq[i], msg);
|
||||
adev->msi_virq[i], msg,
|
||||
pdev);
|
||||
if (ret) {
|
||||
error_report("Error updating irq routing entry (%d)", ret);
|
||||
}
|
||||
|
||||
+1
-1
@@ -294,7 +294,7 @@ void msi_send_message(PCIDevice *dev, MSIMessage msg)
|
||||
{
|
||||
MemTxAttrs attrs = {};
|
||||
|
||||
attrs.stream_id = (pci_bus_num(dev->bus) << 8) | dev->devfn;
|
||||
attrs.requester_id = pci_requester_id(dev);
|
||||
address_space_stl_le(&dev->bus_master_as, msg.address, msg.data,
|
||||
attrs, NULL);
|
||||
}
|
||||
|
||||
+1
-1
@@ -979,7 +979,7 @@ static int do_pcie_aer_inject_error(Monitor *mon,
|
||||
}
|
||||
}
|
||||
err.status = error_status;
|
||||
err.source_id = (pci_bus_num(dev->bus) << 8) | dev->devfn;
|
||||
err.source_id = pci_requester_id(dev);
|
||||
|
||||
err.flags = 0;
|
||||
if (correctable) {
|
||||
|
||||
+1
-1
@@ -431,7 +431,7 @@ static uint64_t megasas_fw_time(void)
|
||||
static uint64_t megasas_get_sata_addr(uint16_t id)
|
||||
{
|
||||
uint64_t addr = (0x1221ULL << 48);
|
||||
return addr & (id << 24);
|
||||
return addr | ((uint64_t)id << 24);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+2
-2
@@ -558,7 +558,7 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
|
||||
const int memset_off = offsetof(SCSIRequest, sense)
|
||||
+ sizeof(req->sense);
|
||||
|
||||
req = g_slice_alloc(reqops->size);
|
||||
req = g_malloc(reqops->size);
|
||||
memset((uint8_t *)req + memset_off, 0, reqops->size - memset_off);
|
||||
req->refcount = 1;
|
||||
req->bus = bus;
|
||||
@@ -1622,7 +1622,7 @@ void scsi_req_unref(SCSIRequest *req)
|
||||
}
|
||||
object_unref(OBJECT(req->dev));
|
||||
object_unref(OBJECT(qbus->parent));
|
||||
g_slice_free1(req->ops->size, req);
|
||||
g_free(req);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
r = g_slice_new(VirtIOSCSIVring);
|
||||
r = g_new(VirtIOSCSIVring, 1);
|
||||
r->host_notifier = *virtio_queue_get_host_notifier(vq);
|
||||
r->guest_notifier = *virtio_queue_get_guest_notifier(vq);
|
||||
aio_set_event_notifier(s->ctx, &r->host_notifier, handler);
|
||||
@@ -73,7 +73,7 @@ static VirtIOSCSIVring *virtio_scsi_vring_init(VirtIOSCSI *s,
|
||||
fail_vring:
|
||||
aio_set_event_notifier(s->ctx, &r->host_notifier, NULL);
|
||||
k->set_host_notifier(qbus->parent, n, false);
|
||||
g_slice_free(VirtIOSCSIVring, r);
|
||||
g_free(r);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -182,18 +182,18 @@ static void virtio_scsi_vring_teardown(VirtIOSCSI *s)
|
||||
|
||||
if (s->ctrl_vring) {
|
||||
vring_teardown(&s->ctrl_vring->vring, vdev, 0);
|
||||
g_slice_free(VirtIOSCSIVring, s->ctrl_vring);
|
||||
g_free(s->ctrl_vring);
|
||||
s->ctrl_vring = NULL;
|
||||
}
|
||||
if (s->event_vring) {
|
||||
vring_teardown(&s->event_vring->vring, vdev, 1);
|
||||
g_slice_free(VirtIOSCSIVring, s->event_vring);
|
||||
g_free(s->event_vring);
|
||||
s->event_vring = NULL;
|
||||
}
|
||||
if (s->cmd_vrings) {
|
||||
for (i = 0; i < vs->conf.num_queues && s->cmd_vrings[i]; i++) {
|
||||
vring_teardown(&s->cmd_vrings[i]->vring, vdev, 2 + i);
|
||||
g_slice_free(VirtIOSCSIVring, s->cmd_vrings[i]);
|
||||
g_free(s->cmd_vrings[i]);
|
||||
s->cmd_vrings[i] = NULL;
|
||||
}
|
||||
free(s->cmd_vrings);
|
||||
|
||||
@@ -47,7 +47,7 @@ VirtIOSCSIReq *virtio_scsi_init_req(VirtIOSCSI *s, VirtQueue *vq)
|
||||
const size_t zero_skip = offsetof(VirtIOSCSIReq, elem)
|
||||
+ sizeof(VirtQueueElement);
|
||||
|
||||
req = g_slice_alloc(sizeof(*req) + vs->cdb_size);
|
||||
req = g_malloc(sizeof(*req) + vs->cdb_size);
|
||||
req->vq = vq;
|
||||
req->dev = s;
|
||||
qemu_sglist_init(&req->qsgl, DEVICE(s), 8, &address_space_memory);
|
||||
@@ -58,11 +58,9 @@ VirtIOSCSIReq *virtio_scsi_init_req(VirtIOSCSI *s, VirtQueue *vq)
|
||||
|
||||
void virtio_scsi_free_req(VirtIOSCSIReq *req)
|
||||
{
|
||||
VirtIOSCSICommon *vs = (VirtIOSCSICommon *)req->dev;
|
||||
|
||||
qemu_iovec_destroy(&req->resp_iov);
|
||||
qemu_sglist_destroy(&req->qsgl);
|
||||
g_slice_free1(sizeof(*req) + vs->cdb_size, req);
|
||||
g_free(req);
|
||||
}
|
||||
|
||||
static void virtio_scsi_complete_req(VirtIOSCSIReq *req)
|
||||
@@ -250,7 +248,7 @@ static void virtio_scsi_cancel_notify(Notifier *notifier, void *data)
|
||||
if (--n->tmf_req->remaining == 0) {
|
||||
virtio_scsi_complete_req(n->tmf_req);
|
||||
}
|
||||
g_slice_free(VirtIOSCSICancelNotifier, n);
|
||||
g_free(n);
|
||||
}
|
||||
|
||||
/* Return 0 if the request is ready to be completed and return to guest;
|
||||
@@ -301,7 +299,7 @@ static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
|
||||
VirtIOSCSICancelNotifier *notifier;
|
||||
|
||||
req->remaining = 1;
|
||||
notifier = g_slice_new(VirtIOSCSICancelNotifier);
|
||||
notifier = g_new(VirtIOSCSICancelNotifier, 1);
|
||||
notifier->tmf_req = req;
|
||||
notifier->notifier.notify = virtio_scsi_cancel_notify;
|
||||
scsi_req_cancel_async(r, ¬ifier->notifier);
|
||||
@@ -350,7 +348,7 @@ static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
|
||||
VirtIOSCSICancelNotifier *notifier;
|
||||
|
||||
req->remaining++;
|
||||
notifier = g_slice_new(VirtIOSCSICancelNotifier);
|
||||
notifier = g_new(VirtIOSCSICancelNotifier, 1);
|
||||
notifier->notifier.notify = virtio_scsi_cancel_notify;
|
||||
notifier->tmf_req = req;
|
||||
scsi_req_cancel_async(r, ¬ifier->notifier);
|
||||
|
||||
+6
-5
@@ -424,7 +424,7 @@ static void vfio_add_kvm_msi_virq(VFIOPCIDevice *vdev, VFIOMSIVector *vector,
|
||||
return;
|
||||
}
|
||||
|
||||
virq = kvm_irqchip_add_msi_route(kvm_state, *msg);
|
||||
virq = kvm_irqchip_add_msi_route(kvm_state, *msg, &vdev->pdev);
|
||||
if (virq < 0) {
|
||||
event_notifier_cleanup(&vector->kvm_interrupt);
|
||||
return;
|
||||
@@ -449,9 +449,10 @@ static void vfio_remove_kvm_msi_virq(VFIOMSIVector *vector)
|
||||
event_notifier_cleanup(&vector->kvm_interrupt);
|
||||
}
|
||||
|
||||
static void vfio_update_kvm_msi_virq(VFIOMSIVector *vector, MSIMessage msg)
|
||||
static void vfio_update_kvm_msi_virq(VFIOMSIVector *vector, MSIMessage msg,
|
||||
PCIDevice *pdev)
|
||||
{
|
||||
kvm_irqchip_update_msi_route(kvm_state, vector->virq, msg);
|
||||
kvm_irqchip_update_msi_route(kvm_state, vector->virq, msg, pdev);
|
||||
}
|
||||
|
||||
static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,
|
||||
@@ -486,7 +487,7 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, unsigned int nr,
|
||||
if (!msg) {
|
||||
vfio_remove_kvm_msi_virq(vector);
|
||||
} else {
|
||||
vfio_update_kvm_msi_virq(vector, *msg);
|
||||
vfio_update_kvm_msi_virq(vector, *msg, pdev);
|
||||
}
|
||||
} else {
|
||||
vfio_add_kvm_msi_virq(vdev, vector, msg, true);
|
||||
@@ -760,7 +761,7 @@ static void vfio_update_msi(VFIOPCIDevice *vdev)
|
||||
}
|
||||
|
||||
msg = msi_get_message(&vdev->pdev, i);
|
||||
vfio_update_kvm_msi_virq(vector, msg);
|
||||
vfio_update_kvm_msi_virq(vector, msg, &vdev->pdev);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -590,7 +590,7 @@ static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy,
|
||||
int ret;
|
||||
|
||||
if (irqfd->users == 0) {
|
||||
ret = kvm_irqchip_add_msi_route(kvm_state, msg);
|
||||
ret = kvm_irqchip_add_msi_route(kvm_state, msg, &proxy->pci_dev);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@@ -726,7 +726,8 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy,
|
||||
if (proxy->vector_irqfd) {
|
||||
irqfd = &proxy->vector_irqfd[vector];
|
||||
if (irqfd->msg.data != msg.data || irqfd->msg.address != msg.address) {
|
||||
ret = kvm_irqchip_update_msi_route(kvm_state, irqfd->virq, msg);
|
||||
ret = kvm_irqchip_update_msi_route(kvm_state, irqfd->virq, msg,
|
||||
&proxy->pci_dev);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -84,8 +84,7 @@ void QEMU_NORETURN cpu_loop_exit(CPUState *cpu);
|
||||
void QEMU_NORETURN cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc);
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
bool qemu_in_vcpu_thread(void);
|
||||
void cpu_reload_memory_map(CPUState *cpu);
|
||||
void cpu_reloading_memory_map(void);
|
||||
void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as);
|
||||
/* cputlb.c */
|
||||
/**
|
||||
@@ -357,8 +356,6 @@ extern uintptr_t tci_tb_ptr;
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
|
||||
void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align));
|
||||
|
||||
struct MemoryRegion *iotlb_to_region(CPUState *cpu,
|
||||
hwaddr index);
|
||||
|
||||
@@ -408,7 +405,4 @@ extern int singlestep;
|
||||
extern CPUState *tcg_current_cpu;
|
||||
extern bool exit_request;
|
||||
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
void migration_bitmap_extend(ram_addr_t old, ram_addr_t new);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -35,8 +35,8 @@ typedef struct MemTxAttrs {
|
||||
unsigned int secure:1;
|
||||
/* Memory access is usermode (unprivileged) */
|
||||
unsigned int user:1;
|
||||
/* Stream ID (for MSI for example) */
|
||||
unsigned int stream_id:16;
|
||||
/* Requester ID (for MSI for example) */
|
||||
unsigned int requester_id:16;
|
||||
} MemTxAttrs;
|
||||
|
||||
/* Bus masters which don't specify any attributes will get this,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user