* [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).