qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
@ 2014-02-27 13:52 ` Michael S. Tsirkin
  2014-02-27 14:57   ` Gabriel L. Somlo
  2014-02-27 13:52 ` [Qemu-devel] [PULL 2/8] acpi-test-data: update expected files Michael S. Tsirkin
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Gabriel L. Somlo, Anthony Liguori

As reported in
http://article.gmane.org/gmane.comp.emulators.qemu/253987
Mac OSX actually requires describing all occupied slots
in ACPI - even if hotplug isn't enabled.

I didn't expect this so I dropped description of all
non hotpluggable slots from ACPI.
As a result: before
commit 99fd437dee468609de8218f0eb3b16621fb6a9c9 (enable
hotplug for pci bridges), PCI cards show up in the "device tree" of OS X
(System Information). E.g., on MountainLion users have:

Hardware -> PCI Cards:

  Card          Type                 Driver Installed  Slot
 *ethernet      Ethernet Controller  Yes               PCI Slot 2
  pci8086,2934  USB UHC              Yes               PCI Slot 29

  ethernet:
    Type:                 Ethernet Controller
    Driver Installed:     Yes
    MSI:                  No
    Bus:                  PCI
    Slot                  PCI Slot 2
    Vendor ID:            0x8086
    Device ID:            0x100e
    Subsystem Vendor ID:  0x1af4
    Subsystem ID:         0x1100
    Revision ID:          0x0003

Hardware -> Ethernet Cards

  ethernet:
    Type:                 Ethernet Controller
    Bus:                  PCI
    Slot                  PCI Slot 2
    Vendor ID:            0x8086
    Device ID:            0x100e
    Subsystem Vendor ID:  0x1af4
    Subsystem ID:         0x1100
    Revision ID:          0x0003
    BSD name:             en0
    Kext name:            AppleIntel8254XEthernet.kext
    Location:             /System/Library/Extensions/...
    Version:              3.1.1b1

After commit 99fd437dee468609de8218f0eb3b16621fb6a9c9, users get:

Hardware -> PCI Cards:

  This computer doesn't contain any PCI cards. If you installed PCI
  cards, make sure they're properly installed.

Hardware -> Ethernet Cards

  ethernet:
    Type:                 Ethernet Controller
    Bus:                  PCI
    Vendor ID:            0x8086
    Device ID:            0x100e
    Subsystem Vendor ID:  0x1af4
    Subsystem ID:         0x1100
    Revision ID:          0x0003
    BSD name:             en0
    Kext name:            AppleIntel8254XEthernet.kext
    Location:             /System/Library/Extensions/...
    Version:              3.1.1b1

Ethernet still works, but it's not showing up on the PCI bus, and it
no longer thinks it's plugged in to slot #2, as it used to before the
change.

To fix, append description for all occupied non hotpluggable PCI slots.

One need to be careful when doing this: VGA devices
are now described in SSDT, so we need to drop description from DSDT.
And ISA devices are used in DSDT so drop them from SSDT.

Reported-by: Gabriel L. Somlo <gsomlo@gmail.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/i386/acpi-build.c      | 143 ++++++++++++++++++++++++++++++++++++++--------
 tests/acpi-test.c         |   2 +-
 hw/i386/acpi-dsdt.dsl     |  33 ++---------
 hw/i386/q35-acpi-dsdt.dsl |  25 +-------
 hw/i386/ssdt-pcihp.dsl    |  50 ++++++++++++++++
 5 files changed, 178 insertions(+), 75 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index b1a7ebb..b667d31 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -643,6 +643,21 @@ static inline char acpi_get_hex(uint32_t val)
 #define ACPI_PCIHP_SIZEOF (*ssdt_pcihp_end - *ssdt_pcihp_start)
 #define ACPI_PCIHP_AML (ssdp_pcihp_aml + *ssdt_pcihp_start)
 
+#define ACPI_PCINOHP_OFFSET_HEX (*ssdt_pcinohp_name - *ssdt_pcinohp_start + 1)
+#define ACPI_PCINOHP_OFFSET_ADR (*ssdt_pcinohp_adr - *ssdt_pcinohp_start)
+#define ACPI_PCINOHP_SIZEOF (*ssdt_pcinohp_end - *ssdt_pcinohp_start)
+#define ACPI_PCINOHP_AML (ssdp_pcihp_aml + *ssdt_pcinohp_start)
+
+#define ACPI_PCIVGA_OFFSET_HEX (*ssdt_pcivga_name - *ssdt_pcivga_start + 1)
+#define ACPI_PCIVGA_OFFSET_ADR (*ssdt_pcivga_adr - *ssdt_pcivga_start)
+#define ACPI_PCIVGA_SIZEOF (*ssdt_pcivga_end - *ssdt_pcivga_start)
+#define ACPI_PCIVGA_AML (ssdp_pcihp_aml + *ssdt_pcivga_start)
+
+#define ACPI_PCIQXL_OFFSET_HEX (*ssdt_pciqxl_name - *ssdt_pciqxl_start + 1)
+#define ACPI_PCIQXL_OFFSET_ADR (*ssdt_pciqxl_adr - *ssdt_pciqxl_start)
+#define ACPI_PCIQXL_SIZEOF (*ssdt_pciqxl_end - *ssdt_pciqxl_start)
+#define ACPI_PCIQXL_AML (ssdp_pcihp_aml + *ssdt_pciqxl_start)
+
 #define ACPI_SSDT_SIGNATURE 0x54445353 /* SSDT */
 #define ACPI_SSDT_HEADER_LENGTH 36
 
@@ -677,6 +692,33 @@ static void patch_pcihp(int slot, uint8_t *ssdt_ptr)
     ssdt_ptr[ACPI_PCIHP_OFFSET_ADR + 2] = slot;
 }
 
+static void patch_pcinohp(int slot, uint8_t *ssdt_ptr)
+{
+    unsigned devfn = PCI_DEVFN(slot, 0);
+
+    ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
+    ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX + 1] = acpi_get_hex(devfn);
+    ssdt_ptr[ACPI_PCINOHP_OFFSET_ADR + 2] = slot;
+}
+
+static void patch_pcivga(int slot, uint8_t *ssdt_ptr)
+{
+    unsigned devfn = PCI_DEVFN(slot, 0);
+
+    ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
+    ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX + 1] = acpi_get_hex(devfn);
+    ssdt_ptr[ACPI_PCIVGA_OFFSET_ADR + 2] = slot;
+}
+
+static void patch_pciqxl(int slot, uint8_t *ssdt_ptr)
+{
+    unsigned devfn = PCI_DEVFN(slot, 0);
+
+    ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
+    ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX + 1] = acpi_get_hex(devfn);
+    ssdt_ptr[ACPI_PCIQXL_OFFSET_ADR + 2] = slot;
+}
+
 /* Assign BSEL property to all buses.  In the future, this can be changed
  * to only assign to buses that support hotplug.
  */
@@ -737,6 +779,10 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
     AcpiBuildPciBusHotplugState *parent = child->parent;
     GArray *bus_table = build_alloc_array();
     DECLARE_BITMAP(slot_hotplug_enable, PCI_SLOT_MAX);
+    DECLARE_BITMAP(slot_device_present, PCI_SLOT_MAX);
+    DECLARE_BITMAP(slot_device_system, PCI_SLOT_MAX);
+    DECLARE_BITMAP(slot_device_vga, PCI_SLOT_MAX);
+    DECLARE_BITMAP(slot_device_qxl, PCI_SLOT_MAX);
     uint8_t op;
     int i;
     QObject *bsel;
@@ -764,40 +810,82 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
         build_append_byte(bus_table, 0x08); /* NameOp */
         build_append_nameseg(bus_table, "BSEL");
         build_append_int(bus_table, qint_get_int(qobject_to_qint(bsel)));
-
         memset(slot_hotplug_enable, 0xff, sizeof slot_hotplug_enable);
+    } else {
+        /* No bsel - no slots are hot-pluggable */
+        memset(slot_hotplug_enable, 0x00, sizeof slot_hotplug_enable);
+    }
 
-        for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
-            DeviceClass *dc;
-            PCIDeviceClass *pc;
-            PCIDevice *pdev = bus->devices[i];
+    memset(slot_device_present, 0x00, sizeof slot_device_present);
+    memset(slot_device_system, 0x00, sizeof slot_device_present);
+    memset(slot_device_vga, 0x00, sizeof slot_device_vga);
+    memset(slot_device_qxl, 0x00, sizeof slot_device_qxl);
 
-            if (!pdev) {
-                continue;
-            }
+    for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) {
+        DeviceClass *dc;
+        PCIDeviceClass *pc;
+        PCIDevice *pdev = bus->devices[i];
+        int slot = PCI_SLOT(i);
 
-            pc = PCI_DEVICE_GET_CLASS(pdev);
-            dc = DEVICE_GET_CLASS(pdev);
+        if (!pdev) {
+            continue;
+        }
 
-            if (!dc->hotpluggable || pc->is_bridge) {
-                int slot = PCI_SLOT(i);
+        set_bit(slot, slot_device_present);
+        pc = PCI_DEVICE_GET_CLASS(pdev);
+        dc = DEVICE_GET_CLASS(pdev);
 
-                clear_bit(slot, slot_hotplug_enable);
-            }
+        if (pc->class_id == PCI_CLASS_BRIDGE_ISA) {
+            set_bit(slot, slot_device_system);
         }
 
-        /* Append Device object for each slot which supports eject */
-        for (i = 0; i < PCI_SLOT_MAX; i++) {
-            bool can_eject = test_bit(i, slot_hotplug_enable);
-            if (can_eject) {
-                void *pcihp = acpi_data_push(bus_table,
-                                             ACPI_PCIHP_SIZEOF);
-                memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
-                patch_pcihp(i, pcihp);
-                bus_hotplug_support = true;
+        if (pc->class_id == PCI_CLASS_DISPLAY_VGA) {
+            set_bit(slot, slot_device_vga);
+
+            if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) {
+                set_bit(slot, slot_device_qxl);
             }
         }
 
+        if (!dc->hotpluggable || pc->is_bridge) {
+            clear_bit(slot, slot_hotplug_enable);
+        }
+    }
+
+    /* Append Device object for each slot */
+    for (i = 0; i < PCI_SLOT_MAX; i++) {
+        bool can_eject = test_bit(i, slot_hotplug_enable);
+        bool present = test_bit(i, slot_device_present);
+        bool vga = test_bit(i, slot_device_vga);
+        bool qxl = test_bit(i, slot_device_qxl);
+        bool system = test_bit(i, slot_device_system);
+        if (can_eject) {
+            void *pcihp = acpi_data_push(bus_table,
+                                         ACPI_PCIHP_SIZEOF);
+            memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
+            patch_pcihp(i, pcihp);
+            bus_hotplug_support = true;
+        } else if (qxl) {
+            void *pcihp = acpi_data_push(bus_table,
+                                         ACPI_PCIQXL_SIZEOF);
+            memcpy(pcihp, ACPI_PCIQXL_AML, ACPI_PCIQXL_SIZEOF);
+            patch_pciqxl(i, pcihp);
+        } else if (vga) {
+            void *pcihp = acpi_data_push(bus_table,
+                                         ACPI_PCIVGA_SIZEOF);
+            memcpy(pcihp, ACPI_PCIVGA_AML, ACPI_PCIVGA_SIZEOF);
+            patch_pcivga(i, pcihp);
+        } else if (system) {
+            /* Nothing to do: system devices are in DSDT. */
+        } else if (present) {
+            void *pcihp = acpi_data_push(bus_table,
+                                         ACPI_PCINOHP_SIZEOF);
+            memcpy(pcihp, ACPI_PCINOHP_AML, ACPI_PCINOHP_SIZEOF);
+            patch_pcinohp(i, pcihp);
+        }
+    }
+
+    if (bsel) {
         method = build_alloc_method("DVNT", 2);
 
         for (i = 0; i < PCI_SLOT_MAX; i++) {
@@ -976,7 +1064,14 @@ build_ssdt(GArray *table_data, GArray *linker,
 
         {
             AcpiBuildPciBusHotplugState hotplug_state;
-            PCIBus *bus = find_i440fx(); /* TODO: Q35 support */
+            Object *pci_host;
+            PCIBus *bus = NULL;
+            bool ambiguous;
+
+            pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous);
+            if (!ambiguous && pci_host) {
+                bus = PCI_HOST_BRIDGE(pci_host)->bus;
+            }
 
             build_pci_bus_state_init(&hotplug_state, NULL);
 
diff --git a/tests/acpi-test.c b/tests/acpi-test.c
index 31f5359..613dda8 100644
--- a/tests/acpi-test.c
+++ b/tests/acpi-test.c
@@ -153,7 +153,7 @@ static void free_test_data(test_data *data)
             g_free(temp->aml);
         }
         if (temp->aml_file) {
-            if (g_strstr_len(temp->aml_file, -1, "aml-")) {
+            if (!temp->asl_file_retain && g_strstr_len(temp->aml_file, -1, "aml-")) {
                 unlink(temp->aml_file);
             }
             g_free(temp->aml_file);
diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl
index b23d5e0..0a1e252 100644
--- a/hw/i386/acpi-dsdt.dsl
+++ b/hw/i386/acpi-dsdt.dsl
@@ -80,6 +80,8 @@ DefinitionBlock (
             Name(_HID, EisaId("PNP0A03"))
             Name(_ADR, 0x00)
             Name(_UID, 1)
+//#define PX13 S0B_
+//            External(PX13, DeviceObj)
         }
     }
 
@@ -88,34 +90,6 @@ DefinitionBlock (
 
 
 /****************************************************************
- * VGA
- ****************************************************************/
-
-    Scope(\_SB.PCI0) {
-        Device(VGA) {
-            Name(_ADR, 0x00020000)
-            OperationRegion(PCIC, PCI_Config, Zero, 0x4)
-            Field(PCIC, DWordAcc, NoLock, Preserve) {
-                VEND, 32
-            }
-            Method(_S1D, 0, NotSerialized) {
-                Return (0x00)
-            }
-            Method(_S2D, 0, NotSerialized) {
-                Return (0x00)
-            }
-            Method(_S3D, 0, NotSerialized) {
-                If (LEqual(VEND, 0x1001b36)) {
-                    Return (0x03)           // QXL
-                } Else {
-                    Return (0x00)
-                }
-            }
-        }
-    }
-
-
-/****************************************************************
  * PIIX4 PM
  ****************************************************************/
 
@@ -132,6 +106,9 @@ DefinitionBlock (
  ****************************************************************/
 
     Scope(\_SB.PCI0) {
+
+        External(ISA, DeviceObj)
+
         Device(ISA) {
             Name(_ADR, 0x00010000)
 
diff --git a/hw/i386/q35-acpi-dsdt.dsl b/hw/i386/q35-acpi-dsdt.dsl
index d618e9e..f4d2a2d 100644
--- a/hw/i386/q35-acpi-dsdt.dsl
+++ b/hw/i386/q35-acpi-dsdt.dsl
@@ -72,6 +72,8 @@ DefinitionBlock (
             Name(_ADR, 0x00)
             Name(_UID, 1)
 
+            External(ISA, DeviceObj)
+
             // _OSC: based on sample of ACPI3.0b spec
             Name(SUPP, 0) // PCI _OSC Support Field value
             Name(CTRL, 0) // PCI _OSC Control Field value
@@ -134,34 +136,13 @@ DefinitionBlock (
 
 
 /****************************************************************
- * VGA
- ****************************************************************/
-
-    Scope(\_SB.PCI0) {
-        Device(VGA) {
-            Name(_ADR, 0x00010000)
-            Method(_S1D, 0, NotSerialized) {
-                Return (0x00)
-            }
-            Method(_S2D, 0, NotSerialized) {
-                Return (0x00)
-            }
-            Method(_S3D, 0, NotSerialized) {
-                Return (0x00)
-            }
-        }
-    }
-
-
-/****************************************************************
  * LPC ISA bridge
  ****************************************************************/
 
     Scope(\_SB.PCI0) {
         /* PCI D31:f0 LPC ISA bridge */
         Device(ISA) {
-            /* PCI D31:f0 */
-            Name(_ADR, 0x001f0000)
+            Name (_ADR, 0x001F0000)  // _ADR: Address
 
             /* ICH9 PCI to ISA irq remapping */
             OperationRegion(PIRQ, PCI_Config, 0x60, 0x0C)
diff --git a/hw/i386/ssdt-pcihp.dsl b/hw/i386/ssdt-pcihp.dsl
index cc245c3..ac91c05 100644
--- a/hw/i386/ssdt-pcihp.dsl
+++ b/hw/i386/ssdt-pcihp.dsl
@@ -46,5 +46,55 @@ DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01, "BXPC", "BXSSDTPCIHP", 0x1)
             }
         }
 
+        ACPI_EXTRACT_DEVICE_START ssdt_pcinohp_start
+        ACPI_EXTRACT_DEVICE_END ssdt_pcinohp_end
+        ACPI_EXTRACT_DEVICE_STRING ssdt_pcinohp_name
+
+        // Extract the offsets of the device name, address dword and the slot
+        // name byte - we fill them in for each device.
+        Device(SBB) {
+            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcinohp_adr
+            Name(_ADR, 0xAA0000)
+        }
+
+        ACPI_EXTRACT_DEVICE_START ssdt_pcivga_start
+        ACPI_EXTRACT_DEVICE_END ssdt_pcivga_end
+        ACPI_EXTRACT_DEVICE_STRING ssdt_pcivga_name
+
+        // Extract the offsets of the device name, address dword and the slot
+        // name byte - we fill them in for each device.
+        Device(SCC) {
+            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcivga_adr
+            Name(_ADR, 0xAA0000)
+            Method(_S1D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S2D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S3D, 0, NotSerialized) {
+                Return (0x00)
+            }
+        }
+
+        ACPI_EXTRACT_DEVICE_START ssdt_pciqxl_start
+        ACPI_EXTRACT_DEVICE_END ssdt_pciqxl_end
+        ACPI_EXTRACT_DEVICE_STRING ssdt_pciqxl_name
+
+        // Extract the offsets of the device name, address dword and the slot
+        // name byte - we fill them in for each device.
+        Device(SDD) {
+            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pciqxl_adr
+            Name(_ADR, 0xAA0000)
+            Method(_S1D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S2D, 0, NotSerialized) {
+                Return (0x00)
+            }
+            Method(_S3D, 0, NotSerialized) {
+                Return (0x03)           // QXL
+            }
+        }
     }
 }
-- 
MST

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 2/8] acpi-test-data: update expected files
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug Michael S. Tsirkin
@ 2014-02-27 13:52 ` Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 3/8] virtio-net: remove function calls from assert Michael S. Tsirkin
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 tests/acpi-test-data/pc/DSDT  | Bin 4582 -> 4485 bytes
 tests/acpi-test-data/pc/SSDT  | Bin 2200 -> 2275 bytes
 tests/acpi-test-data/q35/DSDT | Bin 7438 -> 7383 bytes
 tests/acpi-test-data/q35/SSDT | Bin 475 -> 564 bytes
 4 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/tests/acpi-test-data/pc/DSDT b/tests/acpi-test-data/pc/DSDT
index fbf1c3e6e8f791f8e7bae95ad43ea11d0be64c72..8b14a5f6f2012dc9bfd01f13931100f002e99391 100644
GIT binary patch
delta 24
fcmaE++^Wpw66_MvD#*aV_;w@LQl`xU%-8q;UnmEA

delta 120
zcmZowex}Uj66_N4Opt+rapOj=rA+Y-Y<ls*PVoWGo(9oP&a7eXj`1AvjxIqw3=B*R
z(G5UxXC?+Nmgq)q5R*B~)z3vigd;xK(1l?M1BhV+W=O^d8@n(p;F}Cmz+)!Oz_^5q
Oc_H(X&1;!%@BsixULI%w

diff --git a/tests/acpi-test-data/pc/SSDT b/tests/acpi-test-data/pc/SSDT
index a51c68e21b7f1556009331966c56eb7a563dd51e..c1a4589db0db12289a4f367d2e1f377c9cb8aa2f 100644
GIT binary patch
delta 118
zcmbOs_*jrDIM^lRF$V(!<I0U(k&H|Y6_ZmL%fs9Y0-QY!IGloAeHfyf#DWbB;yL1j
wL;biIIN}{$f_NB!AiBvg*bpYp1QTas5CN(*bYWNmW*EU3#z4mA=ZqWK00Q6~*8l(j

delta 43
zcmaDXI75&tIM^j*1_uKJqs2z9NJggC;>oFu<=j5m0nVNV98STmKAVl0HnIT#21yIp

diff --git a/tests/acpi-test-data/q35/DSDT b/tests/acpi-test-data/q35/DSDT
index 5086b839a6e11ee819af91e72f71efb3e8d97fe2..a76ea9a418bea57c2d685b3a1b0221defd02b447 100644
GIT binary patch
delta 24
fcmeCPx^Btk66_LkU50^yap6WTALh-y%#D%&V=o7e

delta 78
zcmca^*=NP&66_MfC(FRV=)aN6huPFjFFx2QKET=2Ai7B_%-u1bBi_*^hzBUoAi@zJ
VZ0N$U1k5mkF^qwX%^}Rqk^tzc5_|vv

diff --git a/tests/acpi-test-data/q35/SSDT b/tests/acpi-test-data/q35/SSDT
index 9c6cad8b0b7e009d88232166112ed8877cfe11c0..9915dbe5b1cb7708d439ce30396936d78f9ec827 100644
GIT binary patch
delta 116
zcmcc3yoH4;IM^k`go%NH(QzYJBqLKJ@8nd*vPc0B)&OTugXku)U;~4Aj`-kEKQ0E2
tct@8Y9tI$YZZZruuz-p)!o(RFM1U#{T^N>t8AdRMF_^&?;OrN|008;^7{vep

delta 26
hcmdnOa+{eeIM^lRHX{QA<Lr%Gk&H|o?2}U&%K&K>2W$WU

-- 
MST

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 3/8] virtio-net: remove function calls from assert
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 2/8] acpi-test-data: update expected files Michael S. Tsirkin
@ 2014-02-27 13:52 ` Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 4/8] memory_region_present: return false if address is not found in child MemoryRegion Michael S. Tsirkin
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Joel Stanley, Anthony Liguori

From: Joel Stanley <joel@jms.id.au>

peer_{de,at}tach were called from inside assert().
We don't support building without NDEBUG but it's not tidy.
Rearrange to attach peer outside assert calls.

Signed-off-by: Joel Stanley <joel@jms.id.au>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/net/virtio-net.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 3626608..535948d 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -401,12 +401,15 @@ static int peer_detach(VirtIONet *n, int index)
 static void virtio_net_set_queues(VirtIONet *n)
 {
     int i;
+    int r;
 
     for (i = 0; i < n->max_queues; i++) {
         if (i < n->curr_queues) {
-            assert(!peer_attach(n, i));
+            r = peer_attach(n, i);
+            assert(!r);
         } else {
-            assert(!peer_detach(n, i));
+            r = peer_detach(n, i);
+            assert(!r);
         }
     }
 }
-- 
MST

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 4/8] memory_region_present: return false if address is not found in child MemoryRegion
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
                   ` (2 preceding siblings ...)
  2014-02-27 13:52 ` [Qemu-devel] [PULL 3/8] virtio-net: remove function calls from assert Michael S. Tsirkin
@ 2014-02-27 13:52 ` Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 5/8] PCIE: fix regression with coldplugged multifunction device Michael S. Tsirkin
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Jan Kiszka, Anthony Liguori, Igor Mammedov

From: Igor Mammedov <imammedo@redhat.com>

Windows XP shows COM2 port as non functional in
"Device Manager" although no COM2 port backing device
is present in QEMU.

This regression is really due to
3bb28b7208b349e7a1b326e3c6ef9efac1d462bf?
    memory: Provide separate handling of unassigned io ports accesses

That is caused by the fact that QEMU reports to
OSPM that device is present by setting 5th bit in
PII4XPM.pci_conf[0x67] register when COM2 doesn't
exist.

It happens due to memory_region_present(io_as, 0x2f8)
returning false positive since 0x2f8 address eventually
translates into catchall io_as address space.

Fix memory_region_present(parent, addr) by returning
true only if addr maps into a MemoryRegion within
parent (excluding parent itself), to match its
doc comment.

While at it fix copy/paste error in
memory_region_present() doc comment.

Note: this is a temporary hack: we really need better handling for
unassigned regions, we should avoid fallback regions since they are bad
for performance (breaking radix tree assumption that the data structure
is sparsely populated); for memory we need to fix this to implement PCI
master abort properly, anyway.

Cc: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/exec/memory.h | 6 +++---
 memory.c              | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/exec/memory.h b/include/exec/memory.h
index 296d6ab..a5eb4c8 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -838,13 +838,13 @@ void memory_region_set_alias_offset(MemoryRegion *mr,
                                     hwaddr offset);
 
 /**
- * memory_region_present: translate an address/size relative to a
- * MemoryRegion into a #MemoryRegionSection.
+ * memory_region_present: checks if an address relative to a @parent
+ * translates into #MemoryRegion within @parent
  *
  * Answer whether a #MemoryRegion within @parent covers the address
  * @addr.
  *
- * @parent: a MemoryRegion within which @addr is a relative address
+ * @parent: a #MemoryRegion within which @addr is a relative address
  * @addr: the area within @parent to be searched
  */
 bool memory_region_present(MemoryRegion *parent, hwaddr addr);
diff --git a/memory.c b/memory.c
index 59ecc28..3f1df23 100644
--- a/memory.c
+++ b/memory.c
@@ -1562,7 +1562,7 @@ static FlatRange *flatview_lookup(FlatView *view, AddrRange addr)
 bool memory_region_present(MemoryRegion *parent, hwaddr addr)
 {
     MemoryRegion *mr = memory_region_find(parent, addr, 1).mr;
-    if (!mr) {
+    if (!mr || (mr == parent)) {
         return false;
     }
     memory_region_unref(mr);
-- 
MST

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 5/8] PCIE: fix regression with coldplugged multifunction device
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
                   ` (3 preceding siblings ...)
  2014-02-27 13:52 ` [Qemu-devel] [PULL 4/8] memory_region_present: return false if address is not found in child MemoryRegion Michael S. Tsirkin
@ 2014-02-27 13:52 ` Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 6/8] Rework --name to use QemuOpts Michael S. Tsirkin
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: Nigel Kukard, Peter Maydell, Anthony Liguori, Igor Mammedov

From: Igor Mammedov <imammedo@redhat.com>

PCIE is causing asserts each time a multifunction device is added
on command line (coldplug).

This is caused by
commit a66e657e18cd9b70e9f57ae5512c07faf2bc508f
    pci/pcie: convert PCIE hotplug to use hotplug-handler API
QEMU abort is caused by misplaced assertion, which should
be checked only when device is hotplugged.

Reference to regression report:
 http://www.mail-archive.com/qemu-devel@nongnu.org/msg216226.html

Fixes: a66e657e18cd9b70e9f57ae5512c07faf2bc508f

Reported-By: Nigel Kukard <nkukard+qemu@lbsd.net>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/pci/pcie.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 8ecd11e..02cde6f 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -221,29 +221,23 @@ static void pcie_cap_slot_hotplug_common(PCIDevice *hotplug_dev,
                                          DeviceState *dev,
                                          uint8_t **exp_cap, Error **errp)
 {
-    PCIDevice *pci_dev = PCI_DEVICE(dev);
     *exp_cap = hotplug_dev->config + hotplug_dev->exp.exp_cap;
     uint16_t sltsta = pci_get_word(*exp_cap + PCI_EXP_SLTSTA);
 
-    PCIE_DEV_PRINTF(pci_dev, "hotplug state: %d\n", state);
+    PCIE_DEV_PRINTF(PCI_DEVICE(dev), "hotplug state: %d\n", state);
     if (sltsta & PCI_EXP_SLTSTA_EIS) {
         /* the slot is electromechanically locked.
          * This error is propagated up to qdev and then to HMP/QMP.
          */
         error_setg_errno(errp, -EBUSY, "slot is electromechanically locked");
     }
-
-    /* TODO: multifunction hot-plug.
-     * Right now, only a device of function = 0 is allowed to be
-     * hot plugged/unplugged.
-     */
-    assert(PCI_FUNC(pci_dev->devfn) == 0);
 }
 
 void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
                               Error **errp)
 {
     uint8_t *exp_cap;
+    PCIDevice *pci_dev = PCI_DEVICE(dev);
 
     pcie_cap_slot_hotplug_common(PCI_DEVICE(hotplug_dev), dev, &exp_cap, errp);
 
@@ -256,6 +250,12 @@ void pcie_cap_slot_hotplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
         return;
     }
 
+    /* TODO: multifunction hot-plug.
+     * Right now, only a device of function = 0 is allowed to be
+     * hot plugged/unplugged.
+     */
+    assert(PCI_FUNC(pci_dev->devfn) == 0);
+
     pci_word_test_and_set_mask(exp_cap + PCI_EXP_SLTSTA,
                                PCI_EXP_SLTSTA_PDS);
     pcie_cap_slot_event(PCI_DEVICE(hotplug_dev), PCI_EXP_HP_EV_PDC);
-- 
MST

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 6/8] Rework --name to use QemuOpts
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
                   ` (4 preceding siblings ...)
  2014-02-27 13:52 ` [Qemu-devel] [PULL 5/8] PCIE: fix regression with coldplugged multifunction device Michael S. Tsirkin
@ 2014-02-27 13:52 ` Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 7/8] Add 'debug-threads' suboption to --name Michael S. Tsirkin
  2014-02-27 13:53 ` [Qemu-devel] [PULL 8/8] Add a 'name' parameter to qemu_thread_create Michael S. Tsirkin
  7 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, =?UTF-8?q?Alex=20Benn=C3=A9e?=,
	Dr. David Alan Gilbert, Anthony Liguori, Laszlo Ersek

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
---
 vl.c | 52 +++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 13 deletions(-)

diff --git a/vl.c b/vl.c
index a7b00cd..5026e7a 100644
--- a/vl.c
+++ b/vl.c
@@ -532,6 +532,27 @@ static QemuOptsList qemu_msg_opts = {
     },
 };
 
+static QemuOptsList qemu_name_opts = {
+    .name = "name",
+    .implied_opt_name = "guest",
+    .merge_lists = true,
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_name_opts.head),
+    .desc = {
+        {
+            .name = "guest",
+            .type = QEMU_OPT_STRING,
+            .help = "Sets the name of the guest.\n"
+                    "This name will be displayed in the SDL window caption.\n"
+                    "The name will also be used for the VNC server",
+        }, {
+            .name = "process",
+            .type = QEMU_OPT_STRING,
+            .help = "Sets the name of the QEMU process, as shown in top etc",
+        },
+        { /* End of list */ }
+    },
+};
+
 /**
  * Get machine options
  *
@@ -982,6 +1003,18 @@ static int parse_sandbox(QemuOpts *opts, void *opaque)
     return 0;
 }
 
+static void parse_name(QemuOpts *opts)
+{
+    const char *proc_name;
+
+    qemu_name = qemu_opt_get(opts, "guest");
+
+    proc_name = qemu_opt_get(opts, "process");
+    if (proc_name) {
+        os_set_proc_name(proc_name);
+    }
+}
+
 bool usb_enabled(bool default_usb)
 {
     return qemu_opt_get_bool(qemu_get_machine_opts(), "usb", default_usb);
@@ -2915,6 +2948,7 @@ int main(int argc, char **argv, char **envp)
     qemu_add_opts(&qemu_tpmdev_opts);
     qemu_add_opts(&qemu_realtime_opts);
     qemu_add_opts(&qemu_msg_opts);
+    qemu_add_opts(&qemu_name_opts);
 
     runstate_init();
 
@@ -3650,19 +3684,11 @@ int main(int argc, char **argv, char **envp)
                                 "is no longer supported.\n");
                 break;
             case QEMU_OPTION_name:
-                qemu_name = g_strdup(optarg);
-		 {
-		     char *p = strchr(qemu_name, ',');
-		     if (p != NULL) {
-		        *p++ = 0;
-			if (strncmp(p, "process=", 8)) {
-			    fprintf(stderr, "Unknown subargument %s to -name\n", p);
-			    exit(1);
-			}
-			p += 8;
-			os_set_proc_name(p);
-		     }
-		 }
+                opts = qemu_opts_parse(qemu_find_opts("name"), optarg, 1);
+                if (!opts) {
+                    exit(1);
+                }
+                parse_name(opts);
                 break;
             case QEMU_OPTION_prom_env:
                 if (nb_prom_envs >= MAX_PROM_ENVS) {
-- 
MST

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 7/8] Add 'debug-threads' suboption to --name
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
                   ` (5 preceding siblings ...)
  2014-02-27 13:52 ` [Qemu-devel] [PULL 6/8] Rework --name to use QemuOpts Michael S. Tsirkin
@ 2014-02-27 13:52 ` Michael S. Tsirkin
  2014-02-27 13:53 ` [Qemu-devel] [PULL 8/8] Add a 'name' parameter to qemu_thread_create Michael S. Tsirkin
  7 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:52 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Laszlo Ersek, Dr. David Alan Gilbert,
	Anthony Liguori

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

Add flag storage to qemu-thread-* to store the namethreads flag

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
---
 include/qemu/thread.h    | 1 +
 util/qemu-thread-posix.c | 7 +++++++
 util/qemu-thread-win32.c | 8 ++++++++
 vl.c                     | 9 +++++++++
 qemu-options.hx          | 7 +++++--
 5 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/include/qemu/thread.h b/include/qemu/thread.h
index 3e32c65..bf1e110 100644
--- a/include/qemu/thread.h
+++ b/include/qemu/thread.h
@@ -59,5 +59,6 @@ void *qemu_thread_join(QemuThread *thread);
 void qemu_thread_get_self(QemuThread *thread);
 bool qemu_thread_is_self(QemuThread *thread);
 void qemu_thread_exit(void *retval);
+void qemu_thread_naming(bool enable);
 
 #endif
diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
index 37dd298..0fa6c81 100644
--- a/util/qemu-thread-posix.c
+++ b/util/qemu-thread-posix.c
@@ -27,6 +27,13 @@
 #include "qemu/thread.h"
 #include "qemu/atomic.h"
 
+static bool name_threads;
+
+void qemu_thread_naming(bool enable)
+{
+    name_threads = enable;
+}
+
 static void error_exit(int err, const char *msg)
 {
     fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err));
diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c
index 27a5217..e42cb77 100644
--- a/util/qemu-thread-win32.c
+++ b/util/qemu-thread-win32.c
@@ -16,6 +16,14 @@
 #include <assert.h>
 #include <limits.h>
 
+static bool name_threads;
+
+void qemu_thread_naming(bool enable)
+{
+    /* But note we don't actually name them on Windows yet */
+    name_threads = enable;
+}
+
 static void error_exit(int err, const char *msg)
 {
     char *pstr;
diff --git a/vl.c b/vl.c
index 5026e7a..a9b05cc 100644
--- a/vl.c
+++ b/vl.c
@@ -548,6 +548,12 @@ static QemuOptsList qemu_name_opts = {
             .name = "process",
             .type = QEMU_OPT_STRING,
             .help = "Sets the name of the QEMU process, as shown in top etc",
+        }, {
+            .name = "debug-threads",
+            .type = QEMU_OPT_BOOL,
+            .help = "When enabled, name the individual threads; defaults off.\n"
+                    "NOTE: The thread names are for debugging and not a\n"
+                    "stable API.",
         },
         { /* End of list */ }
     },
@@ -1007,6 +1013,9 @@ static void parse_name(QemuOpts *opts)
 {
     const char *proc_name;
 
+    if (qemu_opt_get(opts, "debug-threads")) {
+        qemu_thread_naming(qemu_opt_get_bool(opts, "debug-threads", false));
+    }
     qemu_name = qemu_opt_get(opts, "guest");
 
     proc_name = qemu_opt_get(opts, "process");
diff --git a/qemu-options.hx b/qemu-options.hx
index 56e5fdf..068da2d 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -328,9 +328,11 @@ possible drivers and properties, use @code{-device help} and
 ETEXI
 
 DEF("name", HAS_ARG, QEMU_OPTION_name,
-    "-name string1[,process=string2]\n"
+    "-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 (on Linux)\n",
+    "                string1 sets the window title and string2 the process name (on Linux)\n"
+    "                When debug-threads is enabled, individual threads are given a separate name (on Linux)\n"
+    "                NOTE: The thread names are for debugging and not a stable API.\n",
     QEMU_ARCH_ALL)
 STEXI
 @item -name @var{name}
@@ -339,6 +341,7 @@ Sets the @var{name} of the guest.
 This name will be displayed in the SDL window caption.
 The @var{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.
 ETEXI
 
 DEF("uuid", HAS_ARG, QEMU_OPTION_uuid,
-- 
MST

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 8/8] Add a 'name' parameter to qemu_thread_create
  2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
                   ` (6 preceding siblings ...)
  2014-02-27 13:52 ` [Qemu-devel] [PULL 7/8] Add 'debug-threads' suboption to --name Michael S. Tsirkin
@ 2014-02-27 13:53 ` Michael S. Tsirkin
  7 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:53 UTC (permalink / raw)
  To: qemu-devel
  Cc: Kevin Wolf, Peter Maydell, Anthony Liguori,
	Dr. David Alan Gilbert, Gerd Hoffmann, Stefan Hajnoczi,
	Laszlo Ersek

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

If enabled, set the thread name at creation (on GNU systems with
  pthread_set_np)
Fix up all the callers with a thread name

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
---
 include/qemu/thread.h           |  2 +-
 cpus.c                          | 25 ++++++++++++++++++++-----
 hw/block/dataplane/virtio-blk.c |  2 +-
 hw/usb/ccid-card-emulated.c     |  8 ++++----
 libcacard/vscclient.c           |  2 +-
 migration.c                     |  2 +-
 thread-pool.c                   |  2 +-
 ui/vnc-jobs.c                   |  3 ++-
 util/compatfd.c                 |  3 ++-
 util/qemu-thread-posix.c        |  9 +++++++--
 util/qemu-thread-win32.c        |  2 +-
 11 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/include/qemu/thread.h b/include/qemu/thread.h
index bf1e110..f7e3b9b 100644
--- a/include/qemu/thread.h
+++ b/include/qemu/thread.h
@@ -52,7 +52,7 @@ void qemu_event_reset(QemuEvent *ev);
 void qemu_event_wait(QemuEvent *ev);
 void qemu_event_destroy(QemuEvent *ev);
 
-void qemu_thread_create(QemuThread *thread,
+void qemu_thread_create(QemuThread *thread, const char *name,
                         void *(*start_routine)(void *),
                         void *arg, int mode);
 void *qemu_thread_join(QemuThread *thread);
diff --git a/cpus.c b/cpus.c
index ca4c59f..9a4ce45 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1117,16 +1117,23 @@ void resume_all_vcpus(void)
     }
 }
 
+/* For temporary buffers for forming a name */
+#define VCPU_THREAD_NAME_SIZE 16
+
 static void qemu_tcg_init_vcpu(CPUState *cpu)
 {
+    char thread_name[VCPU_THREAD_NAME_SIZE];
+
     /* share a single thread for all cpus with TCG */
     if (!tcg_cpu_thread) {
         cpu->thread = g_malloc0(sizeof(QemuThread));
         cpu->halt_cond = g_malloc0(sizeof(QemuCond));
         qemu_cond_init(cpu->halt_cond);
         tcg_halt_cond = cpu->halt_cond;
-        qemu_thread_create(cpu->thread, qemu_tcg_cpu_thread_fn, cpu,
-                           QEMU_THREAD_JOINABLE);
+        snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/TCG",
+                 cpu->cpu_index);
+        qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn,
+                           cpu, QEMU_THREAD_JOINABLE);
 #ifdef _WIN32
         cpu->hThread = qemu_thread_get_handle(cpu->thread);
 #endif
@@ -1142,11 +1149,15 @@ static void qemu_tcg_init_vcpu(CPUState *cpu)
 
 static void qemu_kvm_start_vcpu(CPUState *cpu)
 {
+    char thread_name[VCPU_THREAD_NAME_SIZE];
+
     cpu->thread = g_malloc0(sizeof(QemuThread));
     cpu->halt_cond = g_malloc0(sizeof(QemuCond));
     qemu_cond_init(cpu->halt_cond);
-    qemu_thread_create(cpu->thread, qemu_kvm_cpu_thread_fn, cpu,
-                       QEMU_THREAD_JOINABLE);
+    snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/KVM",
+             cpu->cpu_index);
+    qemu_thread_create(cpu->thread, thread_name, qemu_kvm_cpu_thread_fn,
+                       cpu, QEMU_THREAD_JOINABLE);
     while (!cpu->created) {
         qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
     }
@@ -1154,10 +1165,14 @@ static void qemu_kvm_start_vcpu(CPUState *cpu)
 
 static void qemu_dummy_start_vcpu(CPUState *cpu)
 {
+    char thread_name[VCPU_THREAD_NAME_SIZE];
+
     cpu->thread = g_malloc0(sizeof(QemuThread));
     cpu->halt_cond = g_malloc0(sizeof(QemuCond));
     qemu_cond_init(cpu->halt_cond);
-    qemu_thread_create(cpu->thread, qemu_dummy_cpu_thread_fn, cpu,
+    snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/DUMMY",
+             cpu->cpu_index);
+    qemu_thread_create(cpu->thread, thread_name, qemu_dummy_cpu_thread_fn, cpu,
                        QEMU_THREAD_JOINABLE);
     while (!cpu->created) {
         qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c
index 456d437..980a684 100644
--- a/hw/block/dataplane/virtio-blk.c
+++ b/hw/block/dataplane/virtio-blk.c
@@ -358,7 +358,7 @@ static void start_data_plane_bh(void *opaque)
 
     qemu_bh_delete(s->start_bh);
     s->start_bh = NULL;
-    qemu_thread_create(&s->thread, data_plane_thread,
+    qemu_thread_create(&s->thread, "data_plane", data_plane_thread,
                        s, QEMU_THREAD_JOINABLE);
 }
 
diff --git a/hw/usb/ccid-card-emulated.c b/hw/usb/ccid-card-emulated.c
index aa913df..7213c89 100644
--- a/hw/usb/ccid-card-emulated.c
+++ b/hw/usb/ccid-card-emulated.c
@@ -546,10 +546,10 @@ static int emulated_initfn(CCIDCardState *base)
         printf("%s: failed to initialize vcard\n", EMULATED_DEV_NAME);
         return -1;
     }
-    qemu_thread_create(&card->event_thread_id, event_thread, card,
-                       QEMU_THREAD_JOINABLE);
-    qemu_thread_create(&card->apdu_thread_id, handle_apdu_thread, card,
-                       QEMU_THREAD_JOINABLE);
+    qemu_thread_create(&card->event_thread_id, "ccid/event", event_thread,
+                       card, QEMU_THREAD_JOINABLE);
+    qemu_thread_create(&card->apdu_thread_id, "ccid/apdu", handle_apdu_thread,
+                       card, QEMU_THREAD_JOINABLE);
     return 0;
 }
 
diff --git a/libcacard/vscclient.c b/libcacard/vscclient.c
index 24f7088..3477ab3 100644
--- a/libcacard/vscclient.c
+++ b/libcacard/vscclient.c
@@ -269,7 +269,7 @@ on_host_init(VSCMsgHeader *mhHeader, VSCMsgInit *incoming)
     send_msg(VSC_ReaderRemove, VSCARD_MINIMAL_READER_ID, NULL, 0);
     /* launch the event_thread. This will trigger reader adds for all the
      * existing readers */
-    qemu_thread_create(&thread_id, event_thread, NULL, 0);
+    qemu_thread_create(&thread_id, "vsc/event", event_thread, NULL, 0);
     return 0;
 }
 
diff --git a/migration.c b/migration.c
index 7235c23..bddec7e 100644
--- a/migration.c
+++ b/migration.c
@@ -679,6 +679,6 @@ void migrate_fd_connect(MigrationState *s)
     /* Notify before starting migration thread */
     notifier_list_notify(&migration_state_notifiers, s);
 
-    qemu_thread_create(&s->thread, migration_thread, s,
+    qemu_thread_create(&s->thread, "migration", migration_thread, s,
                        QEMU_THREAD_JOINABLE);
 }
diff --git a/thread-pool.c b/thread-pool.c
index 3735fd3..fbdd3ff 100644
--- a/thread-pool.c
+++ b/thread-pool.c
@@ -140,7 +140,7 @@ static void do_spawn_thread(ThreadPool *pool)
     pool->new_threads--;
     pool->pending_threads++;
 
-    qemu_thread_create(&t, worker_thread, pool, QEMU_THREAD_DETACHED);
+    qemu_thread_create(&t, "worker", worker_thread, pool, QEMU_THREAD_DETACHED);
 }
 
 static void spawn_thread_bh_fn(void *opaque)
diff --git a/ui/vnc-jobs.c b/ui/vnc-jobs.c
index 2d3fce8..3f3c47b 100644
--- a/ui/vnc-jobs.c
+++ b/ui/vnc-jobs.c
@@ -333,7 +333,8 @@ void vnc_start_worker_thread(void)
         return ;
 
     q = vnc_queue_init();
-    qemu_thread_create(&q->thread, vnc_worker_thread, q, QEMU_THREAD_DETACHED);
+    qemu_thread_create(&q->thread, "vnc_worker", vnc_worker_thread, q,
+                       QEMU_THREAD_DETACHED);
     queue = q; /* Set global queue */
 }
 
diff --git a/util/compatfd.c b/util/compatfd.c
index 430a41c..341ada6 100644
--- a/util/compatfd.c
+++ b/util/compatfd.c
@@ -88,7 +88,8 @@ static int qemu_signalfd_compat(const sigset_t *mask)
     memcpy(&info->mask, mask, sizeof(*mask));
     info->fd = fds[1];
 
-    qemu_thread_create(&thread, sigwait_compat, info, QEMU_THREAD_DETACHED);
+    qemu_thread_create(&thread, "signalfd_compat", sigwait_compat, info,
+                       QEMU_THREAD_DETACHED);
 
     return fds[0];
 }
diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c
index 0fa6c81..45113b4 100644
--- a/util/qemu-thread-posix.c
+++ b/util/qemu-thread-posix.c
@@ -394,8 +394,7 @@ void qemu_event_wait(QemuEvent *ev)
     }
 }
 
-
-void qemu_thread_create(QemuThread *thread,
+void qemu_thread_create(QemuThread *thread, const char *name,
                        void *(*start_routine)(void*),
                        void *arg, int mode)
 {
@@ -421,6 +420,12 @@ void qemu_thread_create(QemuThread *thread,
     if (err)
         error_exit(err, __func__);
 
+#ifdef _GNU_SOURCE
+    if (name_threads) {
+        pthread_setname_np(thread->thread, name);
+    }
+#endif
+
     pthread_sigmask(SIG_SETMASK, &oldset, NULL);
 
     pthread_attr_destroy(&attr);
diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c
index e42cb77..b9c957b 100644
--- a/util/qemu-thread-win32.c
+++ b/util/qemu-thread-win32.c
@@ -333,7 +333,7 @@ void *qemu_thread_join(QemuThread *thread)
     return ret;
 }
 
-void qemu_thread_create(QemuThread *thread,
+void qemu_thread_create(QemuThread *thread, const char *name,
                        void *(*start_routine)(void *),
                        void *arg, int mode)
 {
-- 
MST

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes
@ 2014-02-27 13:53 Michael S. Tsirkin
  2014-02-27 13:52 ` [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug Michael S. Tsirkin
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 13:53 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Anthony Liguori

Gabriel, could you please confirm this works fine for you now?
Thanks!

The following changes since commit 417c45ab2f847c0a47b1232f611aa886df6a97d5:

  ACPI: Remove commented-out code from HPET._CRS (2014-02-10 11:09:33 +0200)

are available in the git repository at:

  git://git.kernel.org/pub/scm/virt/kvm/mst/qemu.git tags/for_upstream

for you to fetch changes up to b367d01e7e5829c773aac252da2c9219e2677dac:

  Add a 'name' parameter to qemu_thread_create (2014-02-26 16:50:21 +0200)

----------------------------------------------------------------
acpi,pc,pci,virtio,memory bug fixes

This collects several small fixes from all over the place.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>

----------------------------------------------------------------
Dr. David Alan Gilbert (3):
      Rework --name to use QemuOpts
      Add 'debug-threads' suboption to --name
      Add a 'name' parameter to qemu_thread_create

Igor Mammedov (2):
      memory_region_present: return false if address is not found in child MemoryRegion
      PCIE: fix regression with coldplugged multifunction device

Joel Stanley (1):
      virtio-net: remove function calls from assert

Michael S. Tsirkin (2):
      acpi-build: append description for non-hotplug
      acpi-test-data: update expected files

 include/exec/memory.h           |   6 +-
 include/qemu/thread.h           |   3 +-
 cpus.c                          |  25 +++++--
 hw/block/dataplane/virtio-blk.c |   2 +-
 hw/i386/acpi-build.c            | 143 +++++++++++++++++++++++++++++++++-------
 hw/net/virtio-net.c             |   7 +-
 hw/pci/pcie.c                   |  16 ++---
 hw/usb/ccid-card-emulated.c     |   8 +--
 libcacard/vscclient.c           |   2 +-
 memory.c                        |   2 +-
 migration.c                     |   2 +-
 tests/acpi-test.c               |   2 +-
 thread-pool.c                   |   2 +-
 ui/vnc-jobs.c                   |   3 +-
 util/compatfd.c                 |   3 +-
 util/qemu-thread-posix.c        |  16 ++++-
 util/qemu-thread-win32.c        |  10 ++-
 vl.c                            |  61 +++++++++++++----
 hw/i386/acpi-dsdt.dsl           |  33 ++--------
 hw/i386/q35-acpi-dsdt.dsl       |  25 +------
 hw/i386/ssdt-pcihp.dsl          |  50 ++++++++++++++
 qemu-options.hx                 |   7 +-
 tests/acpi-test-data/pc/DSDT    | Bin 4582 -> 4485 bytes
 tests/acpi-test-data/pc/SSDT    | Bin 2200 -> 2275 bytes
 tests/acpi-test-data/q35/DSDT   | Bin 7438 -> 7383 bytes
 tests/acpi-test-data/q35/SSDT   | Bin 475 -> 564 bytes
 26 files changed, 305 insertions(+), 123 deletions(-)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug
  2014-02-27 13:52 ` [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug Michael S. Tsirkin
@ 2014-02-27 14:57   ` Gabriel L. Somlo
  2014-02-27 15:17     ` Michael S. Tsirkin
  0 siblings, 1 reply; 11+ messages in thread
From: Gabriel L. Somlo @ 2014-02-27 14:57 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Peter Maydell, qemu-devel, Anthony Liguori

Michael,

This seems to work great, on top of current master
(git://git.qemu-project.org/qemu.git).

Did you want me to test how this interacts with any other stuff (i.e.
pull from your own git tree), or is this confirmation good enough ?

Thanks again,
--Gabriel

On Thu, Feb 27, 2014 at 03:52:35PM +0200, Michael S. Tsirkin wrote:
> As reported in
> http://article.gmane.org/gmane.comp.emulators.qemu/253987
> Mac OSX actually requires describing all occupied slots
> in ACPI - even if hotplug isn't enabled.
> 
> I didn't expect this so I dropped description of all
> non hotpluggable slots from ACPI.
> As a result: before
> commit 99fd437dee468609de8218f0eb3b16621fb6a9c9 (enable
> hotplug for pci bridges), PCI cards show up in the "device tree" of OS X
> (System Information). E.g., on MountainLion users have:
> 
> Hardware -> PCI Cards:
> 
>   Card          Type                 Driver Installed  Slot
>  *ethernet      Ethernet Controller  Yes               PCI Slot 2
>   pci8086,2934  USB UHC              Yes               PCI Slot 29
> 
>   ethernet:
>     Type:                 Ethernet Controller
>     Driver Installed:     Yes
>     MSI:                  No
>     Bus:                  PCI
>     Slot                  PCI Slot 2
>     Vendor ID:            0x8086
>     Device ID:            0x100e
>     Subsystem Vendor ID:  0x1af4
>     Subsystem ID:         0x1100
>     Revision ID:          0x0003
> 
> Hardware -> Ethernet Cards
> 
>   ethernet:
>     Type:                 Ethernet Controller
>     Bus:                  PCI
>     Slot                  PCI Slot 2
>     Vendor ID:            0x8086
>     Device ID:            0x100e
>     Subsystem Vendor ID:  0x1af4
>     Subsystem ID:         0x1100
>     Revision ID:          0x0003
>     BSD name:             en0
>     Kext name:            AppleIntel8254XEthernet.kext
>     Location:             /System/Library/Extensions/...
>     Version:              3.1.1b1
> 
> After commit 99fd437dee468609de8218f0eb3b16621fb6a9c9, users get:
> 
> Hardware -> PCI Cards:
> 
>   This computer doesn't contain any PCI cards. If you installed PCI
>   cards, make sure they're properly installed.
> 
> Hardware -> Ethernet Cards
> 
>   ethernet:
>     Type:                 Ethernet Controller
>     Bus:                  PCI
>     Vendor ID:            0x8086
>     Device ID:            0x100e
>     Subsystem Vendor ID:  0x1af4
>     Subsystem ID:         0x1100
>     Revision ID:          0x0003
>     BSD name:             en0
>     Kext name:            AppleIntel8254XEthernet.kext
>     Location:             /System/Library/Extensions/...
>     Version:              3.1.1b1
> 
> Ethernet still works, but it's not showing up on the PCI bus, and it
> no longer thinks it's plugged in to slot #2, as it used to before the
> change.
> 
> To fix, append description for all occupied non hotpluggable PCI slots.
> 
> One need to be careful when doing this: VGA devices
> are now described in SSDT, so we need to drop description from DSDT.
> And ISA devices are used in DSDT so drop them from SSDT.
> 
> Reported-by: Gabriel L. Somlo <gsomlo@gmail.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>  hw/i386/acpi-build.c      | 143 ++++++++++++++++++++++++++++++++++++++--------
>  tests/acpi-test.c         |   2 +-
>  hw/i386/acpi-dsdt.dsl     |  33 ++---------
>  hw/i386/q35-acpi-dsdt.dsl |  25 +-------
>  hw/i386/ssdt-pcihp.dsl    |  50 ++++++++++++++++
>  5 files changed, 178 insertions(+), 75 deletions(-)
> 
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index b1a7ebb..b667d31 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -643,6 +643,21 @@ static inline char acpi_get_hex(uint32_t val)
>  #define ACPI_PCIHP_SIZEOF (*ssdt_pcihp_end - *ssdt_pcihp_start)
>  #define ACPI_PCIHP_AML (ssdp_pcihp_aml + *ssdt_pcihp_start)
>  
> +#define ACPI_PCINOHP_OFFSET_HEX (*ssdt_pcinohp_name - *ssdt_pcinohp_start + 1)
> +#define ACPI_PCINOHP_OFFSET_ADR (*ssdt_pcinohp_adr - *ssdt_pcinohp_start)
> +#define ACPI_PCINOHP_SIZEOF (*ssdt_pcinohp_end - *ssdt_pcinohp_start)
> +#define ACPI_PCINOHP_AML (ssdp_pcihp_aml + *ssdt_pcinohp_start)
> +
> +#define ACPI_PCIVGA_OFFSET_HEX (*ssdt_pcivga_name - *ssdt_pcivga_start + 1)
> +#define ACPI_PCIVGA_OFFSET_ADR (*ssdt_pcivga_adr - *ssdt_pcivga_start)
> +#define ACPI_PCIVGA_SIZEOF (*ssdt_pcivga_end - *ssdt_pcivga_start)
> +#define ACPI_PCIVGA_AML (ssdp_pcihp_aml + *ssdt_pcivga_start)
> +
> +#define ACPI_PCIQXL_OFFSET_HEX (*ssdt_pciqxl_name - *ssdt_pciqxl_start + 1)
> +#define ACPI_PCIQXL_OFFSET_ADR (*ssdt_pciqxl_adr - *ssdt_pciqxl_start)
> +#define ACPI_PCIQXL_SIZEOF (*ssdt_pciqxl_end - *ssdt_pciqxl_start)
> +#define ACPI_PCIQXL_AML (ssdp_pcihp_aml + *ssdt_pciqxl_start)
> +
>  #define ACPI_SSDT_SIGNATURE 0x54445353 /* SSDT */
>  #define ACPI_SSDT_HEADER_LENGTH 36
>  
> @@ -677,6 +692,33 @@ static void patch_pcihp(int slot, uint8_t *ssdt_ptr)
>      ssdt_ptr[ACPI_PCIHP_OFFSET_ADR + 2] = slot;
>  }
>  
> +static void patch_pcinohp(int slot, uint8_t *ssdt_ptr)
> +{
> +    unsigned devfn = PCI_DEVFN(slot, 0);
> +
> +    ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
> +    ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX + 1] = acpi_get_hex(devfn);
> +    ssdt_ptr[ACPI_PCINOHP_OFFSET_ADR + 2] = slot;
> +}
> +
> +static void patch_pcivga(int slot, uint8_t *ssdt_ptr)
> +{
> +    unsigned devfn = PCI_DEVFN(slot, 0);
> +
> +    ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
> +    ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX + 1] = acpi_get_hex(devfn);
> +    ssdt_ptr[ACPI_PCIVGA_OFFSET_ADR + 2] = slot;
> +}
> +
> +static void patch_pciqxl(int slot, uint8_t *ssdt_ptr)
> +{
> +    unsigned devfn = PCI_DEVFN(slot, 0);
> +
> +    ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
> +    ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX + 1] = acpi_get_hex(devfn);
> +    ssdt_ptr[ACPI_PCIQXL_OFFSET_ADR + 2] = slot;
> +}
> +
>  /* Assign BSEL property to all buses.  In the future, this can be changed
>   * to only assign to buses that support hotplug.
>   */
> @@ -737,6 +779,10 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
>      AcpiBuildPciBusHotplugState *parent = child->parent;
>      GArray *bus_table = build_alloc_array();
>      DECLARE_BITMAP(slot_hotplug_enable, PCI_SLOT_MAX);
> +    DECLARE_BITMAP(slot_device_present, PCI_SLOT_MAX);
> +    DECLARE_BITMAP(slot_device_system, PCI_SLOT_MAX);
> +    DECLARE_BITMAP(slot_device_vga, PCI_SLOT_MAX);
> +    DECLARE_BITMAP(slot_device_qxl, PCI_SLOT_MAX);
>      uint8_t op;
>      int i;
>      QObject *bsel;
> @@ -764,40 +810,82 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
>          build_append_byte(bus_table, 0x08); /* NameOp */
>          build_append_nameseg(bus_table, "BSEL");
>          build_append_int(bus_table, qint_get_int(qobject_to_qint(bsel)));
> -
>          memset(slot_hotplug_enable, 0xff, sizeof slot_hotplug_enable);
> +    } else {
> +        /* No bsel - no slots are hot-pluggable */
> +        memset(slot_hotplug_enable, 0x00, sizeof slot_hotplug_enable);
> +    }
>  
> -        for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
> -            DeviceClass *dc;
> -            PCIDeviceClass *pc;
> -            PCIDevice *pdev = bus->devices[i];
> +    memset(slot_device_present, 0x00, sizeof slot_device_present);
> +    memset(slot_device_system, 0x00, sizeof slot_device_present);
> +    memset(slot_device_vga, 0x00, sizeof slot_device_vga);
> +    memset(slot_device_qxl, 0x00, sizeof slot_device_qxl);
>  
> -            if (!pdev) {
> -                continue;
> -            }
> +    for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) {
> +        DeviceClass *dc;
> +        PCIDeviceClass *pc;
> +        PCIDevice *pdev = bus->devices[i];
> +        int slot = PCI_SLOT(i);
>  
> -            pc = PCI_DEVICE_GET_CLASS(pdev);
> -            dc = DEVICE_GET_CLASS(pdev);
> +        if (!pdev) {
> +            continue;
> +        }
>  
> -            if (!dc->hotpluggable || pc->is_bridge) {
> -                int slot = PCI_SLOT(i);
> +        set_bit(slot, slot_device_present);
> +        pc = PCI_DEVICE_GET_CLASS(pdev);
> +        dc = DEVICE_GET_CLASS(pdev);
>  
> -                clear_bit(slot, slot_hotplug_enable);
> -            }
> +        if (pc->class_id == PCI_CLASS_BRIDGE_ISA) {
> +            set_bit(slot, slot_device_system);
>          }
>  
> -        /* Append Device object for each slot which supports eject */
> -        for (i = 0; i < PCI_SLOT_MAX; i++) {
> -            bool can_eject = test_bit(i, slot_hotplug_enable);
> -            if (can_eject) {
> -                void *pcihp = acpi_data_push(bus_table,
> -                                             ACPI_PCIHP_SIZEOF);
> -                memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
> -                patch_pcihp(i, pcihp);
> -                bus_hotplug_support = true;
> +        if (pc->class_id == PCI_CLASS_DISPLAY_VGA) {
> +            set_bit(slot, slot_device_vga);
> +
> +            if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) {
> +                set_bit(slot, slot_device_qxl);
>              }
>          }
>  
> +        if (!dc->hotpluggable || pc->is_bridge) {
> +            clear_bit(slot, slot_hotplug_enable);
> +        }
> +    }
> +
> +    /* Append Device object for each slot */
> +    for (i = 0; i < PCI_SLOT_MAX; i++) {
> +        bool can_eject = test_bit(i, slot_hotplug_enable);
> +        bool present = test_bit(i, slot_device_present);
> +        bool vga = test_bit(i, slot_device_vga);
> +        bool qxl = test_bit(i, slot_device_qxl);
> +        bool system = test_bit(i, slot_device_system);
> +        if (can_eject) {
> +            void *pcihp = acpi_data_push(bus_table,
> +                                         ACPI_PCIHP_SIZEOF);
> +            memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
> +            patch_pcihp(i, pcihp);
> +            bus_hotplug_support = true;
> +        } else if (qxl) {
> +            void *pcihp = acpi_data_push(bus_table,
> +                                         ACPI_PCIQXL_SIZEOF);
> +            memcpy(pcihp, ACPI_PCIQXL_AML, ACPI_PCIQXL_SIZEOF);
> +            patch_pciqxl(i, pcihp);
> +        } else if (vga) {
> +            void *pcihp = acpi_data_push(bus_table,
> +                                         ACPI_PCIVGA_SIZEOF);
> +            memcpy(pcihp, ACPI_PCIVGA_AML, ACPI_PCIVGA_SIZEOF);
> +            patch_pcivga(i, pcihp);
> +        } else if (system) {
> +            /* Nothing to do: system devices are in DSDT. */
> +        } else if (present) {
> +            void *pcihp = acpi_data_push(bus_table,
> +                                         ACPI_PCINOHP_SIZEOF);
> +            memcpy(pcihp, ACPI_PCINOHP_AML, ACPI_PCINOHP_SIZEOF);
> +            patch_pcinohp(i, pcihp);
> +        }
> +    }
> +
> +    if (bsel) {
>          method = build_alloc_method("DVNT", 2);
>  
>          for (i = 0; i < PCI_SLOT_MAX; i++) {
> @@ -976,7 +1064,14 @@ build_ssdt(GArray *table_data, GArray *linker,
>  
>          {
>              AcpiBuildPciBusHotplugState hotplug_state;
> -            PCIBus *bus = find_i440fx(); /* TODO: Q35 support */
> +            Object *pci_host;
> +            PCIBus *bus = NULL;
> +            bool ambiguous;
> +
> +            pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous);
> +            if (!ambiguous && pci_host) {
> +                bus = PCI_HOST_BRIDGE(pci_host)->bus;
> +            }
>  
>              build_pci_bus_state_init(&hotplug_state, NULL);
>  
> diff --git a/tests/acpi-test.c b/tests/acpi-test.c
> index 31f5359..613dda8 100644
> --- a/tests/acpi-test.c
> +++ b/tests/acpi-test.c
> @@ -153,7 +153,7 @@ static void free_test_data(test_data *data)
>              g_free(temp->aml);
>          }
>          if (temp->aml_file) {
> -            if (g_strstr_len(temp->aml_file, -1, "aml-")) {
> +            if (!temp->asl_file_retain && g_strstr_len(temp->aml_file, -1, "aml-")) {
>                  unlink(temp->aml_file);
>              }
>              g_free(temp->aml_file);
> diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl
> index b23d5e0..0a1e252 100644
> --- a/hw/i386/acpi-dsdt.dsl
> +++ b/hw/i386/acpi-dsdt.dsl
> @@ -80,6 +80,8 @@ DefinitionBlock (
>              Name(_HID, EisaId("PNP0A03"))
>              Name(_ADR, 0x00)
>              Name(_UID, 1)
> +//#define PX13 S0B_
> +//            External(PX13, DeviceObj)
>          }
>      }
>  
> @@ -88,34 +90,6 @@ DefinitionBlock (
>  
>  
>  /****************************************************************
> - * VGA
> - ****************************************************************/
> -
> -    Scope(\_SB.PCI0) {
> -        Device(VGA) {
> -            Name(_ADR, 0x00020000)
> -            OperationRegion(PCIC, PCI_Config, Zero, 0x4)
> -            Field(PCIC, DWordAcc, NoLock, Preserve) {
> -                VEND, 32
> -            }
> -            Method(_S1D, 0, NotSerialized) {
> -                Return (0x00)
> -            }
> -            Method(_S2D, 0, NotSerialized) {
> -                Return (0x00)
> -            }
> -            Method(_S3D, 0, NotSerialized) {
> -                If (LEqual(VEND, 0x1001b36)) {
> -                    Return (0x03)           // QXL
> -                } Else {
> -                    Return (0x00)
> -                }
> -            }
> -        }
> -    }
> -
> -
> -/****************************************************************
>   * PIIX4 PM
>   ****************************************************************/
>  
> @@ -132,6 +106,9 @@ DefinitionBlock (
>   ****************************************************************/
>  
>      Scope(\_SB.PCI0) {
> +
> +        External(ISA, DeviceObj)
> +
>          Device(ISA) {
>              Name(_ADR, 0x00010000)
>  
> diff --git a/hw/i386/q35-acpi-dsdt.dsl b/hw/i386/q35-acpi-dsdt.dsl
> index d618e9e..f4d2a2d 100644
> --- a/hw/i386/q35-acpi-dsdt.dsl
> +++ b/hw/i386/q35-acpi-dsdt.dsl
> @@ -72,6 +72,8 @@ DefinitionBlock (
>              Name(_ADR, 0x00)
>              Name(_UID, 1)
>  
> +            External(ISA, DeviceObj)
> +
>              // _OSC: based on sample of ACPI3.0b spec
>              Name(SUPP, 0) // PCI _OSC Support Field value
>              Name(CTRL, 0) // PCI _OSC Control Field value
> @@ -134,34 +136,13 @@ DefinitionBlock (
>  
>  
>  /****************************************************************
> - * VGA
> - ****************************************************************/
> -
> -    Scope(\_SB.PCI0) {
> -        Device(VGA) {
> -            Name(_ADR, 0x00010000)
> -            Method(_S1D, 0, NotSerialized) {
> -                Return (0x00)
> -            }
> -            Method(_S2D, 0, NotSerialized) {
> -                Return (0x00)
> -            }
> -            Method(_S3D, 0, NotSerialized) {
> -                Return (0x00)
> -            }
> -        }
> -    }
> -
> -
> -/****************************************************************
>   * LPC ISA bridge
>   ****************************************************************/
>  
>      Scope(\_SB.PCI0) {
>          /* PCI D31:f0 LPC ISA bridge */
>          Device(ISA) {
> -            /* PCI D31:f0 */
> -            Name(_ADR, 0x001f0000)
> +            Name (_ADR, 0x001F0000)  // _ADR: Address
>  
>              /* ICH9 PCI to ISA irq remapping */
>              OperationRegion(PIRQ, PCI_Config, 0x60, 0x0C)
> diff --git a/hw/i386/ssdt-pcihp.dsl b/hw/i386/ssdt-pcihp.dsl
> index cc245c3..ac91c05 100644
> --- a/hw/i386/ssdt-pcihp.dsl
> +++ b/hw/i386/ssdt-pcihp.dsl
> @@ -46,5 +46,55 @@ DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01, "BXPC", "BXSSDTPCIHP", 0x1)
>              }
>          }
>  
> +        ACPI_EXTRACT_DEVICE_START ssdt_pcinohp_start
> +        ACPI_EXTRACT_DEVICE_END ssdt_pcinohp_end
> +        ACPI_EXTRACT_DEVICE_STRING ssdt_pcinohp_name
> +
> +        // Extract the offsets of the device name, address dword and the slot
> +        // name byte - we fill them in for each device.
> +        Device(SBB) {
> +            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcinohp_adr
> +            Name(_ADR, 0xAA0000)
> +        }
> +
> +        ACPI_EXTRACT_DEVICE_START ssdt_pcivga_start
> +        ACPI_EXTRACT_DEVICE_END ssdt_pcivga_end
> +        ACPI_EXTRACT_DEVICE_STRING ssdt_pcivga_name
> +
> +        // Extract the offsets of the device name, address dword and the slot
> +        // name byte - we fill them in for each device.
> +        Device(SCC) {
> +            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcivga_adr
> +            Name(_ADR, 0xAA0000)
> +            Method(_S1D, 0, NotSerialized) {
> +                Return (0x00)
> +            }
> +            Method(_S2D, 0, NotSerialized) {
> +                Return (0x00)
> +            }
> +            Method(_S3D, 0, NotSerialized) {
> +                Return (0x00)
> +            }
> +        }
> +
> +        ACPI_EXTRACT_DEVICE_START ssdt_pciqxl_start
> +        ACPI_EXTRACT_DEVICE_END ssdt_pciqxl_end
> +        ACPI_EXTRACT_DEVICE_STRING ssdt_pciqxl_name
> +
> +        // Extract the offsets of the device name, address dword and the slot
> +        // name byte - we fill them in for each device.
> +        Device(SDD) {
> +            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pciqxl_adr
> +            Name(_ADR, 0xAA0000)
> +            Method(_S1D, 0, NotSerialized) {
> +                Return (0x00)
> +            }
> +            Method(_S2D, 0, NotSerialized) {
> +                Return (0x00)
> +            }
> +            Method(_S3D, 0, NotSerialized) {
> +                Return (0x03)           // QXL
> +            }
> +        }
>      }
>  }
> -- 
> MST
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug
  2014-02-27 14:57   ` Gabriel L. Somlo
@ 2014-02-27 15:17     ` Michael S. Tsirkin
  0 siblings, 0 replies; 11+ messages in thread
From: Michael S. Tsirkin @ 2014-02-27 15:17 UTC (permalink / raw)
  To: Gabriel L. Somlo; +Cc: Peter Maydell, qemu-devel, Anthony Liguori

On Thu, Feb 27, 2014 at 09:57:10AM -0500, Gabriel L. Somlo wrote:
> Michael,
> 
> This seems to work great, on top of current master
> (git://git.qemu-project.org/qemu.git).
> 
> Did you want me to test how this interacts with any other stuff (i.e.
> pull from your own git tree), or is this confirmation good enough ?
> 
> Thanks again,
> --Gabriel

I think that's good enough, thanks a lot!



> On Thu, Feb 27, 2014 at 03:52:35PM +0200, Michael S. Tsirkin wrote:
> > As reported in
> > http://article.gmane.org/gmane.comp.emulators.qemu/253987
> > Mac OSX actually requires describing all occupied slots
> > in ACPI - even if hotplug isn't enabled.
> > 
> > I didn't expect this so I dropped description of all
> > non hotpluggable slots from ACPI.
> > As a result: before
> > commit 99fd437dee468609de8218f0eb3b16621fb6a9c9 (enable
> > hotplug for pci bridges), PCI cards show up in the "device tree" of OS X
> > (System Information). E.g., on MountainLion users have:
> > 
> > Hardware -> PCI Cards:
> > 
> >   Card          Type                 Driver Installed  Slot
> >  *ethernet      Ethernet Controller  Yes               PCI Slot 2
> >   pci8086,2934  USB UHC              Yes               PCI Slot 29
> > 
> >   ethernet:
> >     Type:                 Ethernet Controller
> >     Driver Installed:     Yes
> >     MSI:                  No
> >     Bus:                  PCI
> >     Slot                  PCI Slot 2
> >     Vendor ID:            0x8086
> >     Device ID:            0x100e
> >     Subsystem Vendor ID:  0x1af4
> >     Subsystem ID:         0x1100
> >     Revision ID:          0x0003
> > 
> > Hardware -> Ethernet Cards
> > 
> >   ethernet:
> >     Type:                 Ethernet Controller
> >     Bus:                  PCI
> >     Slot                  PCI Slot 2
> >     Vendor ID:            0x8086
> >     Device ID:            0x100e
> >     Subsystem Vendor ID:  0x1af4
> >     Subsystem ID:         0x1100
> >     Revision ID:          0x0003
> >     BSD name:             en0
> >     Kext name:            AppleIntel8254XEthernet.kext
> >     Location:             /System/Library/Extensions/...
> >     Version:              3.1.1b1
> > 
> > After commit 99fd437dee468609de8218f0eb3b16621fb6a9c9, users get:
> > 
> > Hardware -> PCI Cards:
> > 
> >   This computer doesn't contain any PCI cards. If you installed PCI
> >   cards, make sure they're properly installed.
> > 
> > Hardware -> Ethernet Cards
> > 
> >   ethernet:
> >     Type:                 Ethernet Controller
> >     Bus:                  PCI
> >     Vendor ID:            0x8086
> >     Device ID:            0x100e
> >     Subsystem Vendor ID:  0x1af4
> >     Subsystem ID:         0x1100
> >     Revision ID:          0x0003
> >     BSD name:             en0
> >     Kext name:            AppleIntel8254XEthernet.kext
> >     Location:             /System/Library/Extensions/...
> >     Version:              3.1.1b1
> > 
> > Ethernet still works, but it's not showing up on the PCI bus, and it
> > no longer thinks it's plugged in to slot #2, as it used to before the
> > change.
> > 
> > To fix, append description for all occupied non hotpluggable PCI slots.
> > 
> > One need to be careful when doing this: VGA devices
> > are now described in SSDT, so we need to drop description from DSDT.
> > And ISA devices are used in DSDT so drop them from SSDT.
> > 
> > Reported-by: Gabriel L. Somlo <gsomlo@gmail.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >  hw/i386/acpi-build.c      | 143 ++++++++++++++++++++++++++++++++++++++--------
> >  tests/acpi-test.c         |   2 +-
> >  hw/i386/acpi-dsdt.dsl     |  33 ++---------
> >  hw/i386/q35-acpi-dsdt.dsl |  25 +-------
> >  hw/i386/ssdt-pcihp.dsl    |  50 ++++++++++++++++
> >  5 files changed, 178 insertions(+), 75 deletions(-)
> > 
> > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > index b1a7ebb..b667d31 100644
> > --- a/hw/i386/acpi-build.c
> > +++ b/hw/i386/acpi-build.c
> > @@ -643,6 +643,21 @@ static inline char acpi_get_hex(uint32_t val)
> >  #define ACPI_PCIHP_SIZEOF (*ssdt_pcihp_end - *ssdt_pcihp_start)
> >  #define ACPI_PCIHP_AML (ssdp_pcihp_aml + *ssdt_pcihp_start)
> >  
> > +#define ACPI_PCINOHP_OFFSET_HEX (*ssdt_pcinohp_name - *ssdt_pcinohp_start + 1)
> > +#define ACPI_PCINOHP_OFFSET_ADR (*ssdt_pcinohp_adr - *ssdt_pcinohp_start)
> > +#define ACPI_PCINOHP_SIZEOF (*ssdt_pcinohp_end - *ssdt_pcinohp_start)
> > +#define ACPI_PCINOHP_AML (ssdp_pcihp_aml + *ssdt_pcinohp_start)
> > +
> > +#define ACPI_PCIVGA_OFFSET_HEX (*ssdt_pcivga_name - *ssdt_pcivga_start + 1)
> > +#define ACPI_PCIVGA_OFFSET_ADR (*ssdt_pcivga_adr - *ssdt_pcivga_start)
> > +#define ACPI_PCIVGA_SIZEOF (*ssdt_pcivga_end - *ssdt_pcivga_start)
> > +#define ACPI_PCIVGA_AML (ssdp_pcihp_aml + *ssdt_pcivga_start)
> > +
> > +#define ACPI_PCIQXL_OFFSET_HEX (*ssdt_pciqxl_name - *ssdt_pciqxl_start + 1)
> > +#define ACPI_PCIQXL_OFFSET_ADR (*ssdt_pciqxl_adr - *ssdt_pciqxl_start)
> > +#define ACPI_PCIQXL_SIZEOF (*ssdt_pciqxl_end - *ssdt_pciqxl_start)
> > +#define ACPI_PCIQXL_AML (ssdp_pcihp_aml + *ssdt_pciqxl_start)
> > +
> >  #define ACPI_SSDT_SIGNATURE 0x54445353 /* SSDT */
> >  #define ACPI_SSDT_HEADER_LENGTH 36
> >  
> > @@ -677,6 +692,33 @@ static void patch_pcihp(int slot, uint8_t *ssdt_ptr)
> >      ssdt_ptr[ACPI_PCIHP_OFFSET_ADR + 2] = slot;
> >  }
> >  
> > +static void patch_pcinohp(int slot, uint8_t *ssdt_ptr)
> > +{
> > +    unsigned devfn = PCI_DEVFN(slot, 0);
> > +
> > +    ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
> > +    ssdt_ptr[ACPI_PCINOHP_OFFSET_HEX + 1] = acpi_get_hex(devfn);
> > +    ssdt_ptr[ACPI_PCINOHP_OFFSET_ADR + 2] = slot;
> > +}
> > +
> > +static void patch_pcivga(int slot, uint8_t *ssdt_ptr)
> > +{
> > +    unsigned devfn = PCI_DEVFN(slot, 0);
> > +
> > +    ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
> > +    ssdt_ptr[ACPI_PCIVGA_OFFSET_HEX + 1] = acpi_get_hex(devfn);
> > +    ssdt_ptr[ACPI_PCIVGA_OFFSET_ADR + 2] = slot;
> > +}
> > +
> > +static void patch_pciqxl(int slot, uint8_t *ssdt_ptr)
> > +{
> > +    unsigned devfn = PCI_DEVFN(slot, 0);
> > +
> > +    ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX] = acpi_get_hex(devfn >> 4);
> > +    ssdt_ptr[ACPI_PCIQXL_OFFSET_HEX + 1] = acpi_get_hex(devfn);
> > +    ssdt_ptr[ACPI_PCIQXL_OFFSET_ADR + 2] = slot;
> > +}
> > +
> >  /* Assign BSEL property to all buses.  In the future, this can be changed
> >   * to only assign to buses that support hotplug.
> >   */
> > @@ -737,6 +779,10 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
> >      AcpiBuildPciBusHotplugState *parent = child->parent;
> >      GArray *bus_table = build_alloc_array();
> >      DECLARE_BITMAP(slot_hotplug_enable, PCI_SLOT_MAX);
> > +    DECLARE_BITMAP(slot_device_present, PCI_SLOT_MAX);
> > +    DECLARE_BITMAP(slot_device_system, PCI_SLOT_MAX);
> > +    DECLARE_BITMAP(slot_device_vga, PCI_SLOT_MAX);
> > +    DECLARE_BITMAP(slot_device_qxl, PCI_SLOT_MAX);
> >      uint8_t op;
> >      int i;
> >      QObject *bsel;
> > @@ -764,40 +810,82 @@ static void build_pci_bus_end(PCIBus *bus, void *bus_state)
> >          build_append_byte(bus_table, 0x08); /* NameOp */
> >          build_append_nameseg(bus_table, "BSEL");
> >          build_append_int(bus_table, qint_get_int(qobject_to_qint(bsel)));
> > -
> >          memset(slot_hotplug_enable, 0xff, sizeof slot_hotplug_enable);
> > +    } else {
> > +        /* No bsel - no slots are hot-pluggable */
> > +        memset(slot_hotplug_enable, 0x00, sizeof slot_hotplug_enable);
> > +    }
> >  
> > -        for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
> > -            DeviceClass *dc;
> > -            PCIDeviceClass *pc;
> > -            PCIDevice *pdev = bus->devices[i];
> > +    memset(slot_device_present, 0x00, sizeof slot_device_present);
> > +    memset(slot_device_system, 0x00, sizeof slot_device_present);
> > +    memset(slot_device_vga, 0x00, sizeof slot_device_vga);
> > +    memset(slot_device_qxl, 0x00, sizeof slot_device_qxl);
> >  
> > -            if (!pdev) {
> > -                continue;
> > -            }
> > +    for (i = 0; i < ARRAY_SIZE(bus->devices); i += PCI_FUNC_MAX) {
> > +        DeviceClass *dc;
> > +        PCIDeviceClass *pc;
> > +        PCIDevice *pdev = bus->devices[i];
> > +        int slot = PCI_SLOT(i);
> >  
> > -            pc = PCI_DEVICE_GET_CLASS(pdev);
> > -            dc = DEVICE_GET_CLASS(pdev);
> > +        if (!pdev) {
> > +            continue;
> > +        }
> >  
> > -            if (!dc->hotpluggable || pc->is_bridge) {
> > -                int slot = PCI_SLOT(i);
> > +        set_bit(slot, slot_device_present);
> > +        pc = PCI_DEVICE_GET_CLASS(pdev);
> > +        dc = DEVICE_GET_CLASS(pdev);
> >  
> > -                clear_bit(slot, slot_hotplug_enable);
> > -            }
> > +        if (pc->class_id == PCI_CLASS_BRIDGE_ISA) {
> > +            set_bit(slot, slot_device_system);
> >          }
> >  
> > -        /* Append Device object for each slot which supports eject */
> > -        for (i = 0; i < PCI_SLOT_MAX; i++) {
> > -            bool can_eject = test_bit(i, slot_hotplug_enable);
> > -            if (can_eject) {
> > -                void *pcihp = acpi_data_push(bus_table,
> > -                                             ACPI_PCIHP_SIZEOF);
> > -                memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
> > -                patch_pcihp(i, pcihp);
> > -                bus_hotplug_support = true;
> > +        if (pc->class_id == PCI_CLASS_DISPLAY_VGA) {
> > +            set_bit(slot, slot_device_vga);
> > +
> > +            if (object_dynamic_cast(OBJECT(pdev), "qxl-vga")) {
> > +                set_bit(slot, slot_device_qxl);
> >              }
> >          }
> >  
> > +        if (!dc->hotpluggable || pc->is_bridge) {
> > +            clear_bit(slot, slot_hotplug_enable);
> > +        }
> > +    }
> > +
> > +    /* Append Device object for each slot */
> > +    for (i = 0; i < PCI_SLOT_MAX; i++) {
> > +        bool can_eject = test_bit(i, slot_hotplug_enable);
> > +        bool present = test_bit(i, slot_device_present);
> > +        bool vga = test_bit(i, slot_device_vga);
> > +        bool qxl = test_bit(i, slot_device_qxl);
> > +        bool system = test_bit(i, slot_device_system);
> > +        if (can_eject) {
> > +            void *pcihp = acpi_data_push(bus_table,
> > +                                         ACPI_PCIHP_SIZEOF);
> > +            memcpy(pcihp, ACPI_PCIHP_AML, ACPI_PCIHP_SIZEOF);
> > +            patch_pcihp(i, pcihp);
> > +            bus_hotplug_support = true;
> > +        } else if (qxl) {
> > +            void *pcihp = acpi_data_push(bus_table,
> > +                                         ACPI_PCIQXL_SIZEOF);
> > +            memcpy(pcihp, ACPI_PCIQXL_AML, ACPI_PCIQXL_SIZEOF);
> > +            patch_pciqxl(i, pcihp);
> > +        } else if (vga) {
> > +            void *pcihp = acpi_data_push(bus_table,
> > +                                         ACPI_PCIVGA_SIZEOF);
> > +            memcpy(pcihp, ACPI_PCIVGA_AML, ACPI_PCIVGA_SIZEOF);
> > +            patch_pcivga(i, pcihp);
> > +        } else if (system) {
> > +            /* Nothing to do: system devices are in DSDT. */
> > +        } else if (present) {
> > +            void *pcihp = acpi_data_push(bus_table,
> > +                                         ACPI_PCINOHP_SIZEOF);
> > +            memcpy(pcihp, ACPI_PCINOHP_AML, ACPI_PCINOHP_SIZEOF);
> > +            patch_pcinohp(i, pcihp);
> > +        }
> > +    }
> > +
> > +    if (bsel) {
> >          method = build_alloc_method("DVNT", 2);
> >  
> >          for (i = 0; i < PCI_SLOT_MAX; i++) {
> > @@ -976,7 +1064,14 @@ build_ssdt(GArray *table_data, GArray *linker,
> >  
> >          {
> >              AcpiBuildPciBusHotplugState hotplug_state;
> > -            PCIBus *bus = find_i440fx(); /* TODO: Q35 support */
> > +            Object *pci_host;
> > +            PCIBus *bus = NULL;
> > +            bool ambiguous;
> > +
> > +            pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous);
> > +            if (!ambiguous && pci_host) {
> > +                bus = PCI_HOST_BRIDGE(pci_host)->bus;
> > +            }
> >  
> >              build_pci_bus_state_init(&hotplug_state, NULL);
> >  
> > diff --git a/tests/acpi-test.c b/tests/acpi-test.c
> > index 31f5359..613dda8 100644
> > --- a/tests/acpi-test.c
> > +++ b/tests/acpi-test.c
> > @@ -153,7 +153,7 @@ static void free_test_data(test_data *data)
> >              g_free(temp->aml);
> >          }
> >          if (temp->aml_file) {
> > -            if (g_strstr_len(temp->aml_file, -1, "aml-")) {
> > +            if (!temp->asl_file_retain && g_strstr_len(temp->aml_file, -1, "aml-")) {
> >                  unlink(temp->aml_file);
> >              }
> >              g_free(temp->aml_file);
> > diff --git a/hw/i386/acpi-dsdt.dsl b/hw/i386/acpi-dsdt.dsl
> > index b23d5e0..0a1e252 100644
> > --- a/hw/i386/acpi-dsdt.dsl
> > +++ b/hw/i386/acpi-dsdt.dsl
> > @@ -80,6 +80,8 @@ DefinitionBlock (
> >              Name(_HID, EisaId("PNP0A03"))
> >              Name(_ADR, 0x00)
> >              Name(_UID, 1)
> > +//#define PX13 S0B_
> > +//            External(PX13, DeviceObj)
> >          }
> >      }
> >  
> > @@ -88,34 +90,6 @@ DefinitionBlock (
> >  
> >  
> >  /****************************************************************
> > - * VGA
> > - ****************************************************************/
> > -
> > -    Scope(\_SB.PCI0) {
> > -        Device(VGA) {
> > -            Name(_ADR, 0x00020000)
> > -            OperationRegion(PCIC, PCI_Config, Zero, 0x4)
> > -            Field(PCIC, DWordAcc, NoLock, Preserve) {
> > -                VEND, 32
> > -            }
> > -            Method(_S1D, 0, NotSerialized) {
> > -                Return (0x00)
> > -            }
> > -            Method(_S2D, 0, NotSerialized) {
> > -                Return (0x00)
> > -            }
> > -            Method(_S3D, 0, NotSerialized) {
> > -                If (LEqual(VEND, 0x1001b36)) {
> > -                    Return (0x03)           // QXL
> > -                } Else {
> > -                    Return (0x00)
> > -                }
> > -            }
> > -        }
> > -    }
> > -
> > -
> > -/****************************************************************
> >   * PIIX4 PM
> >   ****************************************************************/
> >  
> > @@ -132,6 +106,9 @@ DefinitionBlock (
> >   ****************************************************************/
> >  
> >      Scope(\_SB.PCI0) {
> > +
> > +        External(ISA, DeviceObj)
> > +
> >          Device(ISA) {
> >              Name(_ADR, 0x00010000)
> >  
> > diff --git a/hw/i386/q35-acpi-dsdt.dsl b/hw/i386/q35-acpi-dsdt.dsl
> > index d618e9e..f4d2a2d 100644
> > --- a/hw/i386/q35-acpi-dsdt.dsl
> > +++ b/hw/i386/q35-acpi-dsdt.dsl
> > @@ -72,6 +72,8 @@ DefinitionBlock (
> >              Name(_ADR, 0x00)
> >              Name(_UID, 1)
> >  
> > +            External(ISA, DeviceObj)
> > +
> >              // _OSC: based on sample of ACPI3.0b spec
> >              Name(SUPP, 0) // PCI _OSC Support Field value
> >              Name(CTRL, 0) // PCI _OSC Control Field value
> > @@ -134,34 +136,13 @@ DefinitionBlock (
> >  
> >  
> >  /****************************************************************
> > - * VGA
> > - ****************************************************************/
> > -
> > -    Scope(\_SB.PCI0) {
> > -        Device(VGA) {
> > -            Name(_ADR, 0x00010000)
> > -            Method(_S1D, 0, NotSerialized) {
> > -                Return (0x00)
> > -            }
> > -            Method(_S2D, 0, NotSerialized) {
> > -                Return (0x00)
> > -            }
> > -            Method(_S3D, 0, NotSerialized) {
> > -                Return (0x00)
> > -            }
> > -        }
> > -    }
> > -
> > -
> > -/****************************************************************
> >   * LPC ISA bridge
> >   ****************************************************************/
> >  
> >      Scope(\_SB.PCI0) {
> >          /* PCI D31:f0 LPC ISA bridge */
> >          Device(ISA) {
> > -            /* PCI D31:f0 */
> > -            Name(_ADR, 0x001f0000)
> > +            Name (_ADR, 0x001F0000)  // _ADR: Address
> >  
> >              /* ICH9 PCI to ISA irq remapping */
> >              OperationRegion(PIRQ, PCI_Config, 0x60, 0x0C)
> > diff --git a/hw/i386/ssdt-pcihp.dsl b/hw/i386/ssdt-pcihp.dsl
> > index cc245c3..ac91c05 100644
> > --- a/hw/i386/ssdt-pcihp.dsl
> > +++ b/hw/i386/ssdt-pcihp.dsl
> > @@ -46,5 +46,55 @@ DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01, "BXPC", "BXSSDTPCIHP", 0x1)
> >              }
> >          }
> >  
> > +        ACPI_EXTRACT_DEVICE_START ssdt_pcinohp_start
> > +        ACPI_EXTRACT_DEVICE_END ssdt_pcinohp_end
> > +        ACPI_EXTRACT_DEVICE_STRING ssdt_pcinohp_name
> > +
> > +        // Extract the offsets of the device name, address dword and the slot
> > +        // name byte - we fill them in for each device.
> > +        Device(SBB) {
> > +            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcinohp_adr
> > +            Name(_ADR, 0xAA0000)
> > +        }
> > +
> > +        ACPI_EXTRACT_DEVICE_START ssdt_pcivga_start
> > +        ACPI_EXTRACT_DEVICE_END ssdt_pcivga_end
> > +        ACPI_EXTRACT_DEVICE_STRING ssdt_pcivga_name
> > +
> > +        // Extract the offsets of the device name, address dword and the slot
> > +        // name byte - we fill them in for each device.
> > +        Device(SCC) {
> > +            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pcivga_adr
> > +            Name(_ADR, 0xAA0000)
> > +            Method(_S1D, 0, NotSerialized) {
> > +                Return (0x00)
> > +            }
> > +            Method(_S2D, 0, NotSerialized) {
> > +                Return (0x00)
> > +            }
> > +            Method(_S3D, 0, NotSerialized) {
> > +                Return (0x00)
> > +            }
> > +        }
> > +
> > +        ACPI_EXTRACT_DEVICE_START ssdt_pciqxl_start
> > +        ACPI_EXTRACT_DEVICE_END ssdt_pciqxl_end
> > +        ACPI_EXTRACT_DEVICE_STRING ssdt_pciqxl_name
> > +
> > +        // Extract the offsets of the device name, address dword and the slot
> > +        // name byte - we fill them in for each device.
> > +        Device(SDD) {
> > +            ACPI_EXTRACT_NAME_DWORD_CONST ssdt_pciqxl_adr
> > +            Name(_ADR, 0xAA0000)
> > +            Method(_S1D, 0, NotSerialized) {
> > +                Return (0x00)
> > +            }
> > +            Method(_S2D, 0, NotSerialized) {
> > +                Return (0x00)
> > +            }
> > +            Method(_S3D, 0, NotSerialized) {
> > +                Return (0x03)           // QXL
> > +            }
> > +        }
> >      }
> >  }
> > -- 
> > MST
> > 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2014-02-27 15:11 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-27 13:53 [Qemu-devel] [PULL 0/8] acpi,pc,pci,virtio,memory bug fixes Michael S. Tsirkin
2014-02-27 13:52 ` [Qemu-devel] [PULL 1/8] acpi-build: append description for non-hotplug Michael S. Tsirkin
2014-02-27 14:57   ` Gabriel L. Somlo
2014-02-27 15:17     ` Michael S. Tsirkin
2014-02-27 13:52 ` [Qemu-devel] [PULL 2/8] acpi-test-data: update expected files Michael S. Tsirkin
2014-02-27 13:52 ` [Qemu-devel] [PULL 3/8] virtio-net: remove function calls from assert Michael S. Tsirkin
2014-02-27 13:52 ` [Qemu-devel] [PULL 4/8] memory_region_present: return false if address is not found in child MemoryRegion Michael S. Tsirkin
2014-02-27 13:52 ` [Qemu-devel] [PULL 5/8] PCIE: fix regression with coldplugged multifunction device Michael S. Tsirkin
2014-02-27 13:52 ` [Qemu-devel] [PULL 6/8] Rework --name to use QemuOpts Michael S. Tsirkin
2014-02-27 13:52 ` [Qemu-devel] [PULL 7/8] Add 'debug-threads' suboption to --name Michael S. Tsirkin
2014-02-27 13:53 ` [Qemu-devel] [PULL 8/8] Add a 'name' parameter to qemu_thread_create Michael S. Tsirkin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).