vbox: disable ioapic support by default

and add xml configuration option to switch it on if required. Avoids trouble
on Windows 7 guest where IRQ injected by VMMDev PCI device is not delivered.

If ioapic is required and Windows guest addition "hangs", look in file
DevPCI.cpp, function pciSetIrqInternal, variable fIsApicEnabled. If

config[0xde] == 0xbe
config[0xad] == 0xef

it works. "Deadbeaf" seems to/should be set in ACPI file vbox.dsl. Happens for
unknown reason not on Genode/Nova.

Fixes #1188
This commit is contained in:
Alexander Boettcher 2014-06-17 21:34:42 +02:00 committed by Norman Feske
parent f0c7eccdc7
commit 671e36bc45
4 changed files with 8 additions and 36 deletions

View File

@ -1 +1 @@
13aca05c49d35f7ce7a2cfd25d2751d9d6de9019
8c27e2319a0ff50a02d4555148eccc829f77b4fc

View File

@ -90,6 +90,7 @@ append config {
<resource name="RAM" quantum="1G"/>
<config>
<image type="iso" file="test.iso" />
<!-- <ioapic/> -->
<libc stdout="/dev/log" stderr="/dev/log">
<vfs>
<dir name="dev"> <log/> </dir>

View File

@ -1,34 +0,0 @@
+++ src/app/virtualbox/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
@@ -39,6 +39,12 @@
# define VBOXDD_HGCMCALL_COMPLETED_DONE(a,b,c,d) do { } while (0)
#endif
+#include <base/lock.h>
+
+
+static Genode::Lock w4c(Genode::Lock::LOCKED);
+
+
typedef enum _VBOXHGCMCMDTYPE
{
VBOXHGCMCMDTYPE_LOADSTATE = 0,
@@ -1147,6 +1153,9 @@ int vmmdevHGCMCall (VMMDevState *pVMMDevState, VMMDevHGCMCall *pHGCMCall, uint32
RTMemFree (pCmd);
}
+ /* wait for completion */
+ w4c.lock();
+
return rc;
}
@@ -2382,6 +2391,9 @@ DECLCALLBACK(void) hgcmCompleted (PPDMIHGCMPORT pInterface, int32_t result, PVBO
int rc = VMR3ReqCallVoidNoWait(PDMDevHlpGetVM(pVMMDevState->pDevIns), VMCPUID_ANY,
(PFNRT)hgcmCompletedWorker, 3, pInterface, result, pCmd);
AssertRC(rc);
+
+ /* signal completion */
+ w4c.unlock();
}
/* @thread EMT */

View File

@ -202,11 +202,16 @@ int main()
}
args.add(c_file);
args.add("-ioapic");
if (bOverlay)
args.add("-overlay");
/* ioapic support */
try {
Genode::Xml_node node = Genode::config()->xml_node().sub_node("ioapic");
args.add("-ioapic");
} catch (...) { }
/* shared folder setup */
unsigned shares = 0;
try {