From 6d391aae10f01245b64dd9eb557940ca36aec592 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 28 Nov 2014 17:14:54 +0100 Subject: [PATCH] vbox: support routing serial output to Genode Fixes #1308 --- repos/ports/ports/virtualbox.hash | 2 +- repos/ports/ports/virtualbox.port | 2 +- repos/ports/run/test.vbox | 2 +- repos/ports/run/virtualbox.run | 29 +++++++++++++++---- .../src/virtualbox/frontend/GenodeImpl.h | 2 +- .../src/virtualbox/frontend/dummy/rest.cc | 10 +++++-- repos/ports/src/virtualbox/libc.cc | 1 + .../ports/src/virtualbox/patches/serial.patch | 9 ++++++ 8 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 repos/ports/src/virtualbox/patches/serial.patch diff --git a/repos/ports/ports/virtualbox.hash b/repos/ports/ports/virtualbox.hash index c3cd2e976..866938f8b 100644 --- a/repos/ports/ports/virtualbox.hash +++ b/repos/ports/ports/virtualbox.hash @@ -1 +1 @@ -fd1a0bb3692bfb4448f3b3f8978fc1c5d037e2c4 +612b4fbfc6cea5442ce7dd96997789e15f987cb1 diff --git a/repos/ports/ports/virtualbox.port b/repos/ports/ports/virtualbox.port index 9bb9bfe44..6944f1a21 100644 --- a/repos/ports/ports/virtualbox.port +++ b/repos/ports/ports/virtualbox.port @@ -11,7 +11,7 @@ SHA(virtualbox) := e4c23b713e8715b8e0172fa066f2197756e901fe PATCHES_LIST := acpi_drv dev_e1000 eminternal fake_pci_vendor iconv mouse PATCHES_LIST += pdm_driver pdm_queue_irqs sharedfolder_pagelist timer PATCHES_LIST += time-log-deadlock vbetables-gen vbox_inc vbox_main network -PATCHES_LIST += vga_fb vga_vbva vmdk vmmdev avoid_yield +PATCHES_LIST += vga_fb vga_vbva vmdk vmmdev avoid_yield serial PATCHES := $(addsuffix .patch, $(PATCHES_LIST)) PATCHES := $(addprefix src/virtualbox/patches/, $(PATCHES)) diff --git a/repos/ports/run/test.vbox b/repos/ports/run/test.vbox index 3130b5166..73d0fff2c 100644 --- a/repos/ports/run/test.vbox +++ b/repos/ports/run/test.vbox @@ -123,7 +123,7 @@ - + diff --git a/repos/ports/run/virtualbox.run b/repos/ports/run/virtualbox.run index a1c24e3f7..415ec28bc 100644 --- a/repos/ports/run/virtualbox.run +++ b/repos/ports/run/virtualbox.run @@ -1,4 +1,5 @@ set use_net 0 +set use_serial 0 set build_components { core init virtualbox @@ -7,11 +8,12 @@ set build_components { drivers/timer } -lappend_if [have_spec acpi] build_components drivers/acpi -lappend_if [have_spec pci] build_components drivers/pci -lappend_if [have_spec x86] build_components drivers/rtc +lappend_if [expr $use_serial] build_components server/log_terminal +lappend_if [have_spec acpi] build_components drivers/acpi +lappend_if [have_spec pci] build_components drivers/pci +lappend_if [have_spec x86] build_components drivers/rtc -lappend_if [expr $use_net] build_components drivers/nic +lappend_if [expr $use_net] build_components drivers/nic build $build_components @@ -96,13 +98,27 @@ append_if [expr $use_net] config { } +append_if [expr $use_serial] config { + + + + + + +} + append config { - + } + +append_if [expr $use_serial] config { + } + +append config { @@ -136,7 +152,8 @@ append boot_modules { libc_terminal.lib.so libiconv.lib.so stdcxx.lib.so } -append_if [expr $use_net] boot_modules { nic_drv } +append_if [expr $use_net] boot_modules { nic_drv } +append_if [expr $use_serial] boot_modules { log_terminal } build_boot_image $boot_modules diff --git a/repos/ports/src/virtualbox/frontend/GenodeImpl.h b/repos/ports/src/virtualbox/frontend/GenodeImpl.h index da9ff15f0..f1045c413 100644 --- a/repos/ports/src/virtualbox/frontend/GenodeImpl.h +++ b/repos/ports/src/virtualbox/frontend/GenodeImpl.h @@ -201,7 +201,7 @@ class DummyClass { void fireHostNameResolutionConfigurationChangeEvent(const ComObjPtr&); void fireHostPCIDevicePlugEvent(ComPtr&, BSTR, bool, bool, ComObjPtr&, void *); void fireStateChangedEvent(const ComObjPtr&, MachineState_T); - void fireRuntimeErrorEvent(const ComObjPtr&, BOOL&, short unsigned int*&, short unsigned int*&); + void fireRuntimeErrorEvent(const ComObjPtr&, BOOL, IN_BSTR, IN_BSTR); }; #define ATL_NO_VTABLE diff --git a/repos/ports/src/virtualbox/frontend/dummy/rest.cc b/repos/ports/src/virtualbox/frontend/dummy/rest.cc index b8333b00c..dde5259e8 100644 --- a/repos/ports/src/virtualbox/frontend/dummy/rest.cc +++ b/repos/ports/src/virtualbox/frontend/dummy/rest.cc @@ -102,8 +102,14 @@ void DummyClass::fireStateChangedEvent(ComObjPtr const&, MachineState_T) TRACE() template<> void DummyClass::fireRuntimeErrorEvent(ComObjPtr const&, - bool&, unsigned short*&, - unsigned short*&) DUMMY() + bool aFatal, IN_BSTR aErrorID, + IN_BSTR aMessage) +{ + PERR("%s : %u %s %s", __func__, aFatal, + Utf8Str(aErrorID).c_str(), Utf8Str(aMessage).c_str()); + + TRACE(); +} template<> void DummyClass::fireHostPCIDevicePlugEvent(ComPtr&, diff --git a/repos/ports/src/virtualbox/libc.cc b/repos/ports/src/virtualbox/libc.cc index 3fb2cd58e..6a901ecff 100644 --- a/repos/ports/src/virtualbox/libc.cc +++ b/repos/ports/src/virtualbox/libc.cc @@ -118,6 +118,7 @@ extern "C" char *getenv(const char *name) // "+main.e.l.f" // "+hgcm.e.l.f" // "+shared_folders.e.l.f" +// "+drv_host_serial.e.l.f" ; if (Genode::strcmp(name, "VBOX_LOG_FLAGS") == 0 || diff --git a/repos/ports/src/virtualbox/patches/serial.patch b/repos/ports/src/virtualbox/patches/serial.patch new file mode 100644 index 000000000..c37590ae5 --- /dev/null +++ b/repos/ports/src/virtualbox/patches/serial.patch @@ -0,0 +1,9 @@ ++++ src/app/virtualbox/src/VBox/Devices/Serial/DrvHostSerial.cpp +@@ -903,6 +903,7 @@ + PDMDrvHlpVMSetRuntimeError(pDrvIns, 0 /*fFlags*/, "DrvHostSerialFail", + N_("Ioctl failed for serial host device '%s' (%Rrc). The device will not work properly"), + pThis->pszDevicePath, RTErrConvertFromErrno(errno)); ++ pThread->enmState = PDMTHREADSTATE_TERMINATING; + break; + } +