mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-19 05:37:54 +00:00
parent
4673eb9578
commit
a42a5995cf
@ -30,7 +30,7 @@ namespace Vmm {
|
||||
/**
|
||||
* Print message while preserving the UTCB content
|
||||
*/
|
||||
void Vmm::printf(const char *format, ...)
|
||||
inline void Vmm::printf(const char *format, ...)
|
||||
{
|
||||
va_list list;
|
||||
va_start(list, format);
|
||||
|
@ -1 +0,0 @@
|
||||
include $(call select_from_repositories,lib/import/import-libc.mk)
|
@ -28,6 +28,7 @@ VBOX_CC_OPT += -DIN_SUP_R3 -DIN_VMM_R3
|
||||
VBOX_CC_OPT += -DRT_OS_FREEBSD
|
||||
|
||||
VBOX_CC_OPT += -DVBOX_WITH_REM
|
||||
VBOX_CC_OPT += -DVBOX_WITH_HGCM -DVBOX_WITH_HGSMI
|
||||
|
||||
VBOX_CC_OPT += -DVBOXBFE_WITHOUT_COM
|
||||
VBOX_CC_OPT += -DVBOX_WITHOUT_TESTING_FEATURES
|
||||
@ -52,7 +53,7 @@ CC_WARN += -Wno-trigraphs
|
||||
|
||||
CC_OPT += $(VBOX_CC_OPT)
|
||||
|
||||
LIBS += virtualbox_libc_support
|
||||
LIBS += libc libm
|
||||
|
||||
INC_DIR += $(REP_DIR)/src/virtualbox/include
|
||||
INC_DIR += $(VIRTUALBOX_DIR)/include
|
||||
|
@ -25,6 +25,7 @@ SRC_CC += Devices/Storage/fdc.c
|
||||
SRC_CC += Devices/Storage/DrvRawImage.cpp
|
||||
SRC_CC += Devices/Network/DevPCNet.cpp
|
||||
SRC_CC += Devices/VMMDev/VMMDev.cpp
|
||||
SRC_CC += Devices/VMMDev/VMMDevHGCM.cpp
|
||||
SRC_CC += GuestHost/HGSMI/HGSMICommon.cpp
|
||||
SRC_CC += Devices/Serial/DevSerial.cpp
|
||||
SRC_CC += Devices/PC/DevIoApic.cpp
|
||||
@ -42,7 +43,7 @@ CC_WARN += -Wno-unused-but-set-variable
|
||||
# VGASTATE::lock member would violate the assertion
|
||||
# '!((uintptr_t)pvSample & 7)' in 'stamR3RegisterU'.
|
||||
#
|
||||
CC_OPT += -DVBOX_WITH_HGSMI -DVBOX_WITH_WDDM -DVBOX_WITH_VDMA
|
||||
CC_OPT += -DVBOX_WITH_WDDM -DVBOX_WITH_VDMA
|
||||
|
||||
Devices/Graphics/DevVGA.o: vbetables.h
|
||||
|
||||
|
@ -4,6 +4,7 @@ INC_DIR += $(VBOX_DIR)/Runtime/include
|
||||
|
||||
INC_DIR += $(VIRTUALBOX_DIR)/src/libs/liblzf-3.4
|
||||
INC_DIR += $(VIRTUALBOX_DIR)/src/libs/zlib-1.2.6
|
||||
INC_DIR += $(call select_from_ports,libiconv)/include/iconv
|
||||
|
||||
GENERIC_SRC_CC = $(notdir $(wildcard $(VBOX_DIR)/Runtime/generic/*.cpp))
|
||||
|
||||
@ -20,7 +21,8 @@ FILTERED_OUT_SRC_CC = RTLogDefaultInit-generic.cpp \
|
||||
RTSemEventWaitNoResume-2-ex-generic.cpp \
|
||||
RTFileExists-generic.cpp \
|
||||
RTSemMutexRequest-generic.cpp \
|
||||
RTSemMutexRequestDebug-generic.cpp
|
||||
RTSemMutexRequestDebug-generic.cpp \
|
||||
RTDirExists-generic.cpp
|
||||
|
||||
CC_WARN += -Wno-unused-variable
|
||||
|
||||
@ -31,6 +33,7 @@ SRC_CC += Runtime/common/log/logrel.cpp \
|
||||
|
||||
SRC_CC += Runtime/common/err/RTErrConvertFromErrno.cpp
|
||||
SRC_CC += Runtime/common/alloc/memcache.cpp
|
||||
SRC_CC += Runtime/common/alloc/heapoffset.cpp
|
||||
SRC_CC += Runtime/common/checksum/md5.cpp
|
||||
SRC_CC += Runtime/common/log/log.cpp
|
||||
SRC_CC += Runtime/common/log/log.cpp
|
||||
@ -48,14 +51,18 @@ SRC_CC += Runtime/common/misc/RTAssertMsg2AddWeakV.cpp
|
||||
SRC_CC += Runtime/common/misc/RTAssertMsg2Weak.cpp
|
||||
SRC_CC += Runtime/common/misc/RTAssertMsg2WeakV.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathAbsDup.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathAbsEx.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathCalcRelative.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathExt.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathFilename.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathHasPath.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathJoinA.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathParse.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathRealDup.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathStripExt.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathStripFilename.cpp
|
||||
SRC_CC += Runtime/common/path/RTPathStripTrailingSlash.cpp
|
||||
SRC_CC += Runtime/common/path/rtPathVolumeSpecLen.cpp
|
||||
SRC_CC += Runtime/common/rand/rand.cpp
|
||||
SRC_CC += Runtime/common/rand/randadv.cpp
|
||||
SRC_CC += Runtime/common/rand/randparkmiller.cpp
|
||||
@ -82,16 +89,25 @@ SRC_CC += Runtime/common/string/utf-8.cpp
|
||||
SRC_CC += Runtime/common/table/avlpv.cpp
|
||||
SRC_CC += Runtime/common/table/avlroioport.cpp
|
||||
SRC_CC += Runtime/common/table/avlrogcphys.cpp
|
||||
SRC_CC += Runtime/common/table/avlul.cpp
|
||||
SRC_CC += Runtime/common/time/time.cpp
|
||||
SRC_CC += Runtime/common/time/timeprog.cpp
|
||||
SRC_CC += Runtime/common/time/timesup.cpp
|
||||
SRC_CC += Runtime/common/time/timesupref.cpp
|
||||
SRC_CC += Runtime/r3/alloc.cpp
|
||||
SRC_CC += Runtime/r3/dir.cpp
|
||||
SRC_CC += Runtime/r3/fileio.cpp
|
||||
SRC_CC += Runtime/r3/fs.cpp
|
||||
SRC_CC += Runtime/r3/path.cpp
|
||||
SRC_CC += Runtime/r3/generic/semspinmutex-r3-generic.cpp
|
||||
SRC_CC += Runtime/r3/posix/dir-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/env-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/fileio-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/fileio2-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/fs2-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/fs3-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/path-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/path2-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/pipe-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/poll-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/RTTimeNow-posix.cpp
|
||||
@ -102,6 +118,7 @@ SRC_CC += Runtime/r3/posix/thread2-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/thread-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/time-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/tls-posix.cpp
|
||||
SRC_CC += Runtime/r3/posix/utf8-posix.cpp
|
||||
SRC_CC += Runtime/r3/process.cpp
|
||||
SRC_CC += Runtime/r3/stream.cpp
|
||||
SRC_CC += Runtime/VBox/log-vbox.cpp
|
||||
|
@ -1,85 +0,0 @@
|
||||
# FreeBSD libc code
|
||||
SRC_C += gen/ldexp.c
|
||||
SRC_C += gen/usleep.c
|
||||
SRC_C += stdio/ferror.c
|
||||
SRC_C += stdio/fflush.c
|
||||
SRC_C += stdio/fileno.c
|
||||
SRC_C += stdio/findfp.c
|
||||
SRC_C += stdio/stdio.c
|
||||
SRC_C += string/memchr.c
|
||||
SRC_C += string/strncmp.c
|
||||
SRC_C += string/strdup.c
|
||||
|
||||
# Genode libc code
|
||||
SRC_CC += libc/clock_gettime.cc
|
||||
SRC_CC += libc/nanosleep.cc
|
||||
SRC_CC += libc/file_operations.cc
|
||||
SRC_CC += libc/plugin_registry.cc
|
||||
SRC_CC += libc/fd_alloc.cc
|
||||
SRC_CC += libc/libc_mem_alloc.cc
|
||||
SRC_CC += libc/gettimeofday.cc
|
||||
SRC_CC += libc/plugin.cc
|
||||
SRC_CC += libc/select.cc
|
||||
|
||||
# Genode terminal plugin
|
||||
SRC_CC += libc_terminal/plugin.cc
|
||||
|
||||
# Genode vfs plugin
|
||||
SRC_CC += libc/vfs_plugin.cc
|
||||
SRC_CC += libc/pread_pwrite.cc
|
||||
|
||||
# Genode lock pipe plugin (needed by VirtualBox "HostSerial" driver)
|
||||
SRC_CC += libc_lock_pipe/plugin.cc
|
||||
|
||||
# Genode pthread code
|
||||
SRC_CC += pthread/semaphore.cc
|
||||
SRC_CC += pthread/thread.cc
|
||||
LIBS += timed_semaphore
|
||||
|
||||
# setjmp/longjmp needed by recompiler
|
||||
LIBS += libc-setjmp
|
||||
|
||||
INC_DIR += $(LIBC_REP_DIR)/src/lib/libc
|
||||
|
||||
vpath %.cc $(LIBC_REP_DIR)/src/lib
|
||||
|
||||
# FreeBSD libc FPU math
|
||||
FPU_SRC_C = $(wildcard $(LIBC_DIR)/lib/msun/src/*.c) \
|
||||
$(wildcard $(LIBC_DIR)/lib/msun/ld80/*.c) \
|
||||
$(wildcard $(LIBC_DIR)/lib/msun/bsdsrc/*.c)
|
||||
SRC_C += $(filter-out e_rem_pio2.c e_rem_pio2f.c s_exp2l.c, $(notdir $(FPU_SRC_C)))
|
||||
|
||||
vpath %.c $(LIBC_DIR)/lib/msun/src
|
||||
vpath %.c $(LIBC_DIR)/lib/msun/ld80
|
||||
vpath %.c $(LIBC_DIR)/lib/msun/bsdsrc
|
||||
|
||||
# Disable warnings for selected files, i.e., to suppress
|
||||
# 'is static but used in inline function which is not static'
|
||||
# messages
|
||||
CC_OPT_s_tanf = -w
|
||||
CC_OPT_s_tan = -w
|
||||
CC_OPT_s_sin = -w
|
||||
CC_OPT_s_cos = -w
|
||||
CC_OPT_s_cosf = -w
|
||||
CC_OPT_s_sinf = -w
|
||||
CC_OPT_k_cosf = -w
|
||||
CC_OPT_k_sinf = -w
|
||||
CC_OPT_k_tanf = -w
|
||||
|
||||
# Work-around to get over doubly defined symbols produced by several sources
|
||||
# that include 'e_rem_pio2.c' and 'e_rem_pio2f.c'. To avoid symbol clashes,
|
||||
# we rename each occurrence by adding the basename of the compilation unit
|
||||
# as suffix. (copied from libm.mk)
|
||||
CC_OPT_s_sin += -D__ieee754_rem_pio2=__ieee754_rem_pio2_s_sin
|
||||
CC_OPT_s_cos += -D__ieee754_rem_pio2=__ieee754_rem_pio2_s_cos
|
||||
CC_OPT_s_tan += -D__ieee754_rem_pio2=__ieee754_rem_pio2_s_tan
|
||||
CC_OPT_s_sinf += -D__ieee754_rem_pio2f=__ieee754_rem_pio2f_s_sinf
|
||||
CC_OPT_s_sinf += -D__kernel_cosdf=__kernel_cosdf_sinf
|
||||
CC_OPT_s_cosf += -D__ieee754_rem_pio2f=__ieee754_rem_pio2f_s_cosf
|
||||
CC_OPT_s_cosf += -D__kernel_sindf=__kernel_sindf_cosf
|
||||
CC_OPT_s_tanf += -D__ieee754_rem_pio2f=__ieee754_rem_pio2f_s_tanf
|
||||
|
||||
CC_OPT += -D__inline=inline
|
||||
INC_DIR += $(addprefix $(LIBC_DIR)/lib/msun/,src ld80 bsdsrc)
|
||||
|
||||
# vi: set ft=make :
|
@ -1,7 +0,0 @@
|
||||
include $(REP_DIR)/lib/mk/seoul_libc_support.mk
|
||||
|
||||
SRC_C += fenv.c
|
||||
|
||||
vpath fenv.c $(LIBC_DIR)/lib/msun/i387
|
||||
|
||||
include $(REP_DIR)/lib/mk/virtualbox_libc_support.inc
|
@ -1,7 +0,0 @@
|
||||
include $(REP_DIR)/lib/mk/seoul_libc_support.mk
|
||||
|
||||
SRC_C += fenv.c
|
||||
|
||||
vpath fenv.c $(LIBC_DIR)/lib/msun/amd64
|
||||
|
||||
include $(REP_DIR)/lib/mk/virtualbox_libc_support.inc
|
@ -17,6 +17,7 @@ VIRTUALBOX_CONTENT = src/VBox/VMM \
|
||||
src/VBox/Frontends/VBoxBFE \
|
||||
src/VBox/Storage \
|
||||
src/VBox/Disassembler \
|
||||
src/VBox/HostServices/SharedFolders \
|
||||
src/recompiler \
|
||||
src/VBox/Main/include/MouseImpl.h \
|
||||
src/VBox/Main/include/ConsoleEvents.h \
|
||||
@ -31,7 +32,8 @@ VIRTUALBOX_CONTENT = src/VBox/VMM \
|
||||
ostypes.h VMMDev.h VMMDev2.h \
|
||||
vusb.h dbg.h version.h \
|
||||
VBoxVideo.h Hardware bioslogo.h \
|
||||
scsi.h HGSMI) \
|
||||
scsi.h shflsvc.h VBoxGuest2.h \
|
||||
HGSMI) \
|
||||
include/VBox/msi.h \
|
||||
include/VBox/DevPCNet.h \
|
||||
include/VBox/asmdefs.mac \
|
||||
|
@ -7,6 +7,7 @@ set build_components {
|
||||
|
||||
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
|
||||
|
||||
build $build_components
|
||||
|
||||
@ -28,7 +29,7 @@ set config {
|
||||
<service name="SIGNAL"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service> <parent/> <any-child/> </any-service>
|
||||
<any-service> <any-child/> <parent/> </any-service>
|
||||
</default-route>
|
||||
<start name="timer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
@ -53,13 +54,13 @@ append_if [expr ![have_spec acpi] && [have_spec pci]] config {
|
||||
<start name="pci_drv">
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides> <service name="PCI"/> </provides>
|
||||
</start> }
|
||||
</start>}
|
||||
|
||||
append_if [have_spec ps2] config {
|
||||
<start name="ps2_drv">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides><service name="Input"/></provides>
|
||||
</start> }
|
||||
</start>}
|
||||
|
||||
append_if [have_spec framebuffer] config {
|
||||
<start name="fb_drv">
|
||||
@ -76,6 +77,14 @@ append_if [have_spec sdl] config {
|
||||
</provides>
|
||||
</start>}
|
||||
|
||||
append_if [have_spec x86] config {
|
||||
<start name="rtc_drv">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides>
|
||||
<service name="Rtc"/>
|
||||
</provides>
|
||||
</start>}
|
||||
|
||||
append config {
|
||||
<start name="virtualbox">
|
||||
<resource name="RAM" quantum="1G"/>
|
||||
@ -103,6 +112,11 @@ lappend_if [have_spec pci] boot_modules pci_drv
|
||||
lappend_if [have_spec framebuffer] boot_modules fb_drv
|
||||
lappend_if [have_spec linux] boot_modules fb_sdl
|
||||
lappend_if [have_spec nova] boot_modules pci_device_pd
|
||||
lappend_if [have_spec x86] boot_modules rtc_drv
|
||||
|
||||
append boot_modules { ld.lib.so libc.lib.so libm.lib.so pthread.lib.so
|
||||
libc_lock_pipe.lib.so libc_terminal.lib.so
|
||||
libiconv.lib.so }
|
||||
|
||||
build_boot_image $boot_modules
|
||||
|
||||
|
@ -17,6 +17,7 @@ set build_components {
|
||||
|
||||
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
|
||||
|
||||
build $build_components
|
||||
|
||||
@ -38,7 +39,7 @@ set config {
|
||||
<service name="SIGNAL"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service><parent/><any-child/></any-service>
|
||||
<any-service> <any-child/> <parent/> </any-service>
|
||||
</default-route>
|
||||
<start name="timer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
@ -70,8 +71,7 @@ set config {
|
||||
<route>
|
||||
<any-service><child name="part_blk"/> <parent/><any-child/></any-service>
|
||||
</route>
|
||||
</start>
|
||||
}
|
||||
</start>}
|
||||
|
||||
append_if [have_spec acpi] config {
|
||||
<start name="acpi">
|
||||
@ -91,13 +91,13 @@ append_if [expr ![have_spec acpi] && [have_spec pci]] config {
|
||||
<start name="pci_drv">
|
||||
<resource name="RAM" quantum="2M"/>
|
||||
<provides> <service name="PCI"/> </provides>
|
||||
</start> }
|
||||
</start>}
|
||||
|
||||
append_if [have_spec ps2] config {
|
||||
<start name="ps2_drv">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides><service name="Input"/></provides>
|
||||
</start> }
|
||||
</start>}
|
||||
|
||||
append_if [have_spec framebuffer] config {
|
||||
<start name="fb_drv">
|
||||
@ -106,6 +106,14 @@ append_if [have_spec framebuffer] config {
|
||||
<config buffered="yes" width="1024" height="768" depth="16" />
|
||||
</start>}
|
||||
|
||||
append_if [have_spec x86] config {
|
||||
<start name="rtc_drv">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides>
|
||||
<service name="Rtc"/>
|
||||
</provides>
|
||||
</start>}
|
||||
|
||||
append config $config_of_app
|
||||
|
||||
append config {
|
||||
@ -117,7 +125,9 @@ install_config $config
|
||||
set boot_modules {
|
||||
core init timer
|
||||
part_blk ahci
|
||||
ld.lib.so libc.lib.so
|
||||
ld.lib.so libc.lib.so libm.lib.so pthread.lib.so
|
||||
libc_lock_pipe.lib.so libc_terminal.lib.so
|
||||
libiconv.lib.so
|
||||
rump.lib.so rump_fs.lib.so rump_fs
|
||||
virtualbox vbox-auto-test-helper
|
||||
}
|
||||
@ -158,8 +168,6 @@ lappend_if [have_spec acpi] boot_modules acpi_drv
|
||||
lappend_if [have_spec pci] boot_modules pci_drv
|
||||
lappend_if [have_spec framebuffer] boot_modules fb_drv
|
||||
lappend_if [have_spec nova] boot_modules pci_device_pd
|
||||
lappend_if [have_spec x86] boot_modules rtc_drv
|
||||
|
||||
build_boot_image $boot_modules
|
||||
|
||||
append qemu_args " -m 1512 "
|
||||
append qemu_args " -cpu phenom "
|
||||
|
@ -63,7 +63,7 @@ source ${genode_dir}/repos/ports/run/virtualbox_auto.inc
|
||||
|
||||
|
||||
run_genode_until "ignore resize request to 720x400" 20
|
||||
run_genode_until "ignore resize request to 640x480" 15 $spawn_id
|
||||
run_genode_until "ignore resize request to 640x480" 25 $spawn_id
|
||||
run_genode_until "ignore resize request to 800x600" 35 $spawn_id
|
||||
run_genode_until "ignore resize request to 800x600" 90 $spawn_id
|
||||
run_genode_until "ignore resize request to 720x400" 10 $spawn_id
|
||||
|
@ -51,7 +51,7 @@ CHECKED_DUMMY( 0, vmmR3SwitcherInit) /* world switcher */
|
||||
CHECKED_DUMMY(-1, atexit)
|
||||
CHECKED_DUMMY(-1, getpid)
|
||||
CHECKED_DUMMY(-1, pdmR3FileR3)
|
||||
CHECKED_DUMMY(-1, setlocale)
|
||||
CHECKED_DUMMY(0, setlocale)
|
||||
CHECKED_DUMMY(-1, sigaddset)
|
||||
CHECKED_DUMMY(-1, sigemptyset)
|
||||
CHECKED_DUMMY(-1, siginterrupt)
|
||||
@ -127,7 +127,6 @@ CHECKED_DUMMY( 0, PGMR3InitFinalize)
|
||||
DUMMY(-1, PGMR3SharedModuleCheckAll)
|
||||
DUMMY(-1, PGMR3SharedModuleUnregister)
|
||||
DUMMY(-1, PGMR3SharedModuleRegister)
|
||||
DUMMY(-1, PGMR3MappingsSize)
|
||||
DUMMY(-1, PGMR3MappingsUnfix)
|
||||
DUMMY(-1, PGMR3PhysChangeMemBalloon)
|
||||
DUMMY(-1, PGMR3MappingsFix)
|
||||
@ -161,19 +160,14 @@ DUMMY(-1, PGMGetShadowMode)
|
||||
DUMMY(-1, PGMGetHostMode)
|
||||
|
||||
CHECKED_DUMMY(0, poll) /* needed by 'DrvHostSerial.cpp' */
|
||||
DUMMY(-1, printf)
|
||||
DUMMY(-1, pthread_key_delete)
|
||||
DUMMY(-1, reallocf)
|
||||
DUMMY(-1, RTCrc32);
|
||||
DUMMY(-1, RTCrc32Start)
|
||||
DUMMY(-1, RTCrc32Finish)
|
||||
DUMMY(-1, RTCrc32Process)
|
||||
DUMMY(-1, RTMemExecFree)
|
||||
DUMMY(-1, RTMemPageFree)
|
||||
DUMMY(-1, RTPathHasPath)
|
||||
DUMMY(-1, RTPathAppend)
|
||||
DUMMY(-1, rtPathPosixRename)
|
||||
CHECKED_DUMMY(0, rtProcInitExePath)
|
||||
DUMMY(-1, RTSemEventWaitEx)
|
||||
|
||||
CHECKED_DUMMY( 0, SELMR3InitFinalize)
|
||||
@ -206,14 +200,13 @@ DUMMY(-1, VMMR3GetHostToGuestSwitcher)
|
||||
DUMMY(-1, pthread_kill)
|
||||
DUMMY(-1, sscanf)
|
||||
DUMMY(-1, RTHeapSimpleRelocate)
|
||||
DUMMY(-1, RTHeapOffsetInit)
|
||||
DUMMY(-1, RTHeapSimpleAlloc)
|
||||
DUMMY(-1, RTHeapSimpleInit)
|
||||
DUMMY(-1, RTHeapOffsetFree)
|
||||
DUMMY(-1, RTHeapSimpleFree)
|
||||
DUMMY(-1, RTAvloU32Get)
|
||||
DUMMY(-1, RTAvloU32Remove)
|
||||
DUMMY(-1, RTAvloU32GetBestFit)
|
||||
CHECKED_DUMMY(0, RTAvloU32RemoveBestFit)
|
||||
DUMMY( 0, RTAvloU32RemoveBestFit)
|
||||
DUMMY(-1, RTAvlU32Destroy)
|
||||
DUMMY(-1, RTAvlU32GetBestFit)
|
||||
DUMMY(-1, RTAvloU32DoWithAll)
|
||||
@ -240,15 +233,8 @@ DUMMY(-1, IOMInterpretINS)
|
||||
|
||||
DUMMY(-1, DISInstrToStrWithReader)
|
||||
|
||||
DUMMY(0, RTPathQueryInfoEx)
|
||||
|
||||
DUMMY(-1, RTFileQueryFsSizes)
|
||||
|
||||
time_t mktime(tm *) {
|
||||
PERR("mktime not implemented, return 0");
|
||||
return 0;
|
||||
}
|
||||
|
||||
DUMMY(-1, pthread_mutex_timedlock)
|
||||
|
||||
CHECKED_DUMMY( 0, PGMHandlerVirtualDeregister) /* XXX */
|
||||
@ -257,8 +243,6 @@ CHECKED_DUMMY( 0, PGMR3HandlerVirtualRegister) /* XXX */
|
||||
/*
|
||||
* Dummies added for storage
|
||||
*/
|
||||
DUMMY(-1, closedir)
|
||||
DUMMY(-1, readdir_r)
|
||||
DUMMY(-1, RTAvlrFileOffsetDestroy)
|
||||
DUMMY(-1, RTAvlrFileOffsetGet)
|
||||
DUMMY(-1, RTAvlrFileOffsetGetBestFit)
|
||||
@ -271,13 +255,8 @@ DUMMY(-1, RTAvlrU64Insert)
|
||||
DUMMY(-1, RTAvlrU64RangeGet)
|
||||
DUMMY(-1, RTAvlrU64RangeRemove)
|
||||
DUMMY(-1, RTAvlrU64Remove)
|
||||
DUMMY(-1, RTDirOpenFiltered)
|
||||
DUMMY(-1, RTDirReadEx)
|
||||
DUMMY(-1, RTDirClose)
|
||||
DUMMY(-1, RTLdrClose)
|
||||
DUMMY(-1, RTLdrGetSymbol)
|
||||
DUMMY(-1, RTMemDupExTag)
|
||||
DUMMY(-1, RTPathQueryInfo)
|
||||
DUMMY(-1, rtPathRootSpecLen)
|
||||
DUMMY(-1, RTPathStartsWithRoot)
|
||||
DUMMY(-1, RTSocketToNative)
|
||||
@ -296,7 +275,14 @@ DUMMY(-1, RTTcpSgWrite)
|
||||
DUMMY(-1, RTTcpSgWriteNB)
|
||||
DUMMY(-1, RTTcpWrite)
|
||||
DUMMY(-1, RTTcpWriteNB)
|
||||
DUMMY(-1, strncat)
|
||||
DUMMY(-1, RTTimeLocalExplode)
|
||||
|
||||
DUMMY(-1, RTSymlinkCreate)
|
||||
DUMMY(-1, RTSymlinkRead)
|
||||
DUMMY(-1, RTSymlinkDelete)
|
||||
|
||||
CHECKED_DUMMY(0, futimes)
|
||||
CHECKED_DUMMY(0, lutimes)
|
||||
|
||||
int __isthreaded;
|
||||
|
||||
|
76
repos/ports/src/virtualbox/dynlib.cc
Normal file
76
repos/ports/src/virtualbox/dynlib.cc
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* \brief Support to link libraries statically supposed to be dynamic
|
||||
* \author Alexander Boettcher
|
||||
* \date 2014-05-13
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 Genode Labs GmbH
|
||||
*
|
||||
* This file is distributed under the terms of the GNU General Public License
|
||||
* version 2.
|
||||
*/
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/printf.h>
|
||||
#include <util/string.h>
|
||||
|
||||
/* VirtualBox includes */
|
||||
#include <iprt/err.h>
|
||||
#include <iprt/ldr.h>
|
||||
#include <VBox/hgcmsvc.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad (VBOXHGCMSVCFNTABLE *ptable);
|
||||
|
||||
|
||||
static struct shared {
|
||||
const char * name;
|
||||
const char * symbol;
|
||||
void * func;
|
||||
} shared[] = { "/VBoxSharedFolders", VBOX_HGCM_SVCLOAD_NAME, (void *)VBoxHGCMSvcLoad };
|
||||
|
||||
|
||||
int RTLdrLoad(const char *pszFilename, PRTLDRMOD phLdrMod)
|
||||
{
|
||||
for (unsigned i = 0; i < sizeof(shared) / sizeof(shared[0]); i++) {
|
||||
if (Genode::strcmp(shared[i].name, pszFilename))
|
||||
continue;
|
||||
|
||||
*phLdrMod = reinterpret_cast<RTLDRMOD>(&shared[i]);
|
||||
return VINF_SUCCESS;
|
||||
}
|
||||
|
||||
PERR("shared library '%s' not supported", pszFilename);
|
||||
return VERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
|
||||
int RTLdrGetSymbol(RTLDRMOD hLdrMod, const char *pszSymbol, void **ppvValue)
|
||||
{
|
||||
|
||||
struct shared * library = reinterpret_cast<struct shared *>(hLdrMod);
|
||||
|
||||
if (!(shared <= library &&
|
||||
library < shared + sizeof(shared) / sizeof(shared[0]))) {
|
||||
|
||||
PERR("shared library handle %p unknown - symbol looked for '%s'",
|
||||
hLdrMod, pszSymbol);
|
||||
|
||||
return VERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
if (Genode::strcmp(pszSymbol, library->symbol)) {
|
||||
PERR("shared library '%s' does not provide symbol '%s'",
|
||||
library->name, pszSymbol);
|
||||
|
||||
return VERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
*ppvValue = library->func;
|
||||
|
||||
return VINF_SUCCESS;
|
||||
}
|
||||
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
+++ src/app/virtualbox/src/VBox/Devices/Graphics/DevVGA.cpp
|
||||
+++ src/app/virtualbox/src/VBox/Devices/Graphics/DevVGA.cpp 2013-12-09 10:33:02.168894689 +0100
|
||||
@@ -5885,7 +5889,7 @@
|
||||
vgaR3Reset(pDevIns);
|
||||
|
||||
@ -8,13 +8,3 @@
|
||||
PCIDevSetDeviceId( &pThis->Dev, 0xbeef);
|
||||
PCIDevSetClassSub( &pThis->Dev, 0x00); /* VGA controller */
|
||||
PCIDevSetClassBase( &pThis->Dev, 0x03);
|
||||
+++ src/app/virtualbox/src/VBox/Devices/VMMDev/VMMDev.cpp
|
||||
@@ -3429,7 +3431,7 @@
|
||||
pThis->pDevIns = pDevIns;
|
||||
|
||||
/* PCI vendor, just a free bogus value */
|
||||
- PCIDevSetVendorId(&pThis->dev, 0x80ee);
|
||||
+ PCIDevSetVendorId(&pThis->dev, 0x80ef);
|
||||
/* device ID */
|
||||
PCIDevSetDeviceId(&pThis->dev, 0xcafe);
|
||||
/* class sub code (other type of system peripheral) */
|
||||
|
34
repos/ports/src/virtualbox/hgcm_sync.patch
Normal file
34
repos/ports/src/virtualbox/hgcm_sync.patch
Normal file
@ -0,0 +1,34 @@
|
||||
+++ 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 */
|
17
repos/ports/src/virtualbox/iconv.patch
Normal file
17
repos/ports/src/virtualbox/iconv.patch
Normal file
@ -0,0 +1,17 @@
|
||||
+++ src/app/virtualbox/src/VBox/Runtime/r3/posix/utf8-posix.cpp
|
||||
@@ -319,11 +319,11 @@
|
||||
size_t cbOutLeft = cbOutput2;
|
||||
const void *pvInputLeft = pvInput;
|
||||
void *pvOutputLeft = pvOutput;
|
||||
-#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS) || (defined(RT_OS_DARWIN) && defined(_DARWIN_FEATURE_UNIX_CONFORMANCE)) /* there are different opinions about the constness of the input buffer. */
|
||||
+//#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS) || (defined(RT_OS_DARWIN) && defined(_DARWIN_FEATURE_UNIX_CONFORMANCE)) /* there are different opinions about the constness of the input buffer. */
|
||||
if (iconv(icHandle, (char **)&pvInputLeft, &cbInLeft, (char **)&pvOutputLeft, &cbOutLeft) != (size_t)-1)
|
||||
-#else
|
||||
- if (iconv(icHandle, (const char **)&pvInputLeft, &cbInLeft, (char **)&pvOutputLeft, &cbOutLeft) != (size_t)-1)
|
||||
-#endif
|
||||
+//#else
|
||||
+// if (iconv(icHandle, (const char **)&pvInputLeft, &cbInLeft, (char **)&pvOutputLeft, &cbOutLeft) != (size_t)-1)
|
||||
+//#endif
|
||||
{
|
||||
if (!cbInLeft)
|
||||
{
|
@ -241,6 +241,6 @@ class SDLConsole : public Console {
|
||||
|
||||
void eventQuit() { PERR("%s:%s called", __FILE__, __FUNCTION__); }
|
||||
void resetKeys(void) { PERR("%s:%s called", __FILE__, __FUNCTION__); }
|
||||
VMMDev *getVMMDev() { /*PERR("%s:%s called", __FILE__, __FUNCTION__);*/ return 0; }
|
||||
VMMDev *getVMMDev() { return gVMMDev; }
|
||||
Display *getDisplay() { return gDisplay; }
|
||||
};
|
||||
|
@ -133,6 +133,14 @@ class Guest_ioports
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool _white_listed(RTIOPORT port)
|
||||
{
|
||||
/* LPT1 */ if (port >= 0x0378 && port <= 0x037f) return true;
|
||||
/* ECP */ if (port >= 0x0778 && port <= 0x077a) return true;
|
||||
/* IDE1 */ if (port >= 0x0170 && port <= 0x017f) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
int add_range(PPDMDEVINS pDevIns,
|
||||
@ -181,17 +189,19 @@ class Guest_ioports
|
||||
return deleted ? VINF_SUCCESS : VERR_GENERAL_FAILURE;
|
||||
}
|
||||
|
||||
VBOXSTRICTRC write(RTIOPORT Port, uint32_t u32Value, size_t cbValue)
|
||||
VBOXSTRICTRC write(RTIOPORT port, uint32_t u32Value, size_t cbValue)
|
||||
{
|
||||
Range *r = _lookup(Port, cbValue);
|
||||
Range *r = _lookup(port, cbValue);
|
||||
if (r)
|
||||
return r->write(Port, u32Value, cbValue);
|
||||
return r->write(port, u32Value, cbValue);
|
||||
|
||||
if (_white_listed(port))
|
||||
return VINF_SUCCESS;
|
||||
|
||||
char c = u32Value & 0xff;
|
||||
PWRN("attempted to write to non-existing port 0x%lx+%u %c (%02x)", Port, cbValue,
|
||||
c >= 32 && c <= 176 ? c : '.', c);
|
||||
PWRN("attempted to write to non-existing port 0x%lx+%u %c (%02x)",
|
||||
port, cbValue, c >= 32 && c <= 176 ? c : '.', c);
|
||||
return VINF_SUCCESS;
|
||||
// return VERR_GENERAL_FAILURE; /* recompiler does not like this */
|
||||
}
|
||||
|
||||
VBOXSTRICTRC read(RTIOPORT port, uint32_t *pu32Value, unsigned cbValue)
|
||||
@ -203,7 +213,9 @@ class Guest_ioports
|
||||
return err;
|
||||
}
|
||||
|
||||
PWRN("attempted to read from non-existing port 0x%x+%u %p", port, cbValue, r);
|
||||
if (!_white_listed(port))
|
||||
PWRN("attempted to read from non-existing port 0x%x+%u %p",
|
||||
port, cbValue, r);
|
||||
|
||||
switch (cbValue)
|
||||
{
|
||||
|
@ -14,10 +14,14 @@
|
||||
/* Genode includes */
|
||||
#include <base/printf.h>
|
||||
#include <util/string.h>
|
||||
#include <rtc_session/connection.h>
|
||||
|
||||
/* libc includes */
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* libc memory allocator */
|
||||
#include <libc_mem_alloc.h>
|
||||
@ -103,6 +107,9 @@ extern "C" char *getenv(const char *name)
|
||||
"+pdm"
|
||||
// "+dev_pic.e.l.f"
|
||||
// "+dev_apic.e.l.f"
|
||||
// "+dev_vmm.e.l.f"
|
||||
// "+main.e.l.f"
|
||||
// "+hgcm.e.l.f"
|
||||
;
|
||||
|
||||
if (Genode::strcmp(name, "VBOX_LOG_FLAGS") == 0 ||
|
||||
@ -125,3 +132,36 @@ extern "C" int sigaction(int signum, const struct sigaction *act,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Used by RTTimeNow
|
||||
*/
|
||||
extern "C" int gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
{
|
||||
if (!tv)
|
||||
return -1;
|
||||
|
||||
try {
|
||||
static Rtc::Connection rtc;
|
||||
/* we need only seconds, current_time in microseconds */
|
||||
tv->tv_sec = rtc.get_current_time() / 1000000ULL;
|
||||
tv->tv_usec = rtc.get_current_time() % 1000000ULL * 1000;
|
||||
return 0;
|
||||
} catch (...) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Used by Shared Folders
|
||||
*/
|
||||
extern "C" long pathconf(char const *path, int name)
|
||||
{
|
||||
if (name = _PC_NAME_MAX) return 255;
|
||||
|
||||
PERR("pathconf does not support config option %d", name);
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
@ -28,6 +28,9 @@
|
||||
void *operator new (Genode::size_t size) {
|
||||
return Genode::env()->heap()->alloc(size); }
|
||||
|
||||
void *operator new [] (Genode::size_t size) {
|
||||
return Genode::env()->heap()->alloc(size); }
|
||||
|
||||
void operator delete(void * p) {
|
||||
if (Genode::env()->heap()->need_size_for_free()) {
|
||||
PERR("leaking memory - delete operator is missing size information");
|
||||
@ -39,60 +42,40 @@ void operator delete(void * p) {
|
||||
|
||||
namespace {
|
||||
template <int MAX_ARGS>
|
||||
struct Args
|
||||
class Args
|
||||
{
|
||||
int argc = 0;
|
||||
char *argv[MAX_ARGS] = { };
|
||||
private:
|
||||
|
||||
struct Too_many_arguments { };
|
||||
int _argc = 0;
|
||||
char *_argv[MAX_ARGS] = { };
|
||||
|
||||
void add(char const *arg)
|
||||
{
|
||||
/* argv[MAX_ARGS - 1] must be unused and set to 0 */
|
||||
if (argc >= MAX_ARGS - 1)
|
||||
throw Too_many_arguments();
|
||||
public:
|
||||
|
||||
/* XXX yes const-casting hurts but main() needs char** */
|
||||
argv[argc++] = const_cast<char *>(arg);
|
||||
}
|
||||
class Too_many_arguments { };
|
||||
|
||||
void add(char const *arg)
|
||||
{
|
||||
/* argv[MAX_ARGS - 1] must be unused and set to 0 */
|
||||
if (_argc >= MAX_ARGS - 1)
|
||||
throw Too_many_arguments();
|
||||
|
||||
/* XXX yes const-casting hurts but main() needs char**, if in
|
||||
* doubt we should strdup() here, right? */
|
||||
_argv[_argc++] = const_cast<char *>(arg);
|
||||
}
|
||||
|
||||
char *** argvp() {
|
||||
static char ** argv = _argv;
|
||||
return &argv;
|
||||
}
|
||||
|
||||
int argc() { return _argc; }
|
||||
};
|
||||
} /* unnamed namespace */
|
||||
|
||||
|
||||
extern "C" {
|
||||
|
||||
/* string conversion function currently does not convert ... */
|
||||
int RTStrCurrentCPToUtf8Tag(char **ppszString, char *pszString,
|
||||
const char *pszTag)
|
||||
{
|
||||
/* dangerous */
|
||||
*ppszString = pszString;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* don't use 'Runtime/r3/posix/utf8-posix.cpp' because it depends on libiconv */
|
||||
int RTStrUtf8ToCurrentCPTag(char **ppszString, char *pszString,
|
||||
const char *pszTag)
|
||||
{
|
||||
/* dangerous */
|
||||
*ppszString = pszString;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
char * RTPathRealDup(const char *pszPath)
|
||||
{
|
||||
/* dangerous */
|
||||
return (char *)pszPath;
|
||||
}
|
||||
|
||||
|
||||
bool RTPathExists(const char *pszPath)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/* make output of Virtualbox visible */
|
||||
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
{
|
||||
@ -150,6 +133,7 @@ extern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char **envp);
|
||||
int main()
|
||||
{
|
||||
static char c_mem[16];
|
||||
static char c_vram[16];
|
||||
static char c_type[4];
|
||||
static char c_file[128];
|
||||
static bool bOverlay = false;
|
||||
@ -159,13 +143,17 @@ int main()
|
||||
/* request max available memory */
|
||||
size_t vm_size = Genode::env()->ram_session()->avail();
|
||||
|
||||
enum { VMM_MEMORY = 64 * 1024 * 1024 /* let a bit memory for the VMM */ };
|
||||
if (vm_size < VMM_MEMORY) {
|
||||
enum {
|
||||
VMM_MEMORY = 88 * 1024 * 1024, /* let a bit memory for the VMM */
|
||||
VRAM_MEMORY = 8 * 1024 * 1024, /* video memory */
|
||||
};
|
||||
|
||||
if (vm_size < VMM_MEMORY + VRAM_MEMORY) {
|
||||
PERR("not enough memory available - need %u, available only %zu "
|
||||
"- exit", VMM_MEMORY, vm_size);
|
||||
"- exit", VMM_MEMORY + VRAM_MEMORY, vm_size);
|
||||
return 1;
|
||||
}
|
||||
vm_size -= VMM_MEMORY;
|
||||
vm_size -= VMM_MEMORY + VRAM_MEMORY;
|
||||
|
||||
try {
|
||||
using namespace Genode;
|
||||
@ -187,12 +175,14 @@ int main()
|
||||
}
|
||||
|
||||
args.add("virtualbox");
|
||||
args.add("-m");
|
||||
|
||||
Genode::snprintf(c_mem, sizeof(c_mem), "%u", vm_size / 1024 / 1024);
|
||||
args.add(c_mem);
|
||||
args.add("-boot");
|
||||
args.add("-m"); args.add(c_mem);
|
||||
|
||||
Genode::snprintf(c_vram, sizeof(c_vram), "%u", VRAM_MEMORY / 1024 / 1024);
|
||||
args.add("-vram"); args.add(c_vram);
|
||||
|
||||
args.add("-boot");
|
||||
if (!Genode::strcmp(c_type, "iso")) {
|
||||
args.add("d");
|
||||
args.add("-cdrom");
|
||||
@ -211,16 +201,37 @@ int main()
|
||||
if (bOverlay)
|
||||
args.add("-overlay");
|
||||
|
||||
PINF("start %s image '%s' with %zu MB Guest memory=%zu",
|
||||
c_type, c_file, vm_size / 1024 / 1024,
|
||||
Genode::env()->ram_session()->avail());
|
||||
/* shared folder setup */
|
||||
unsigned shares = 0;
|
||||
try {
|
||||
using namespace Genode;
|
||||
for (Xml_node node = config()->xml_node().sub_node("share");
|
||||
true; node = node.next("share")) {
|
||||
|
||||
if (RT_FAILURE(RTR3InitExe(args.argc, (char ***)&args.argv, 0))) {
|
||||
Xml_node::Attribute share_dir_host = node.attribute("host");
|
||||
Xml_node::Attribute share_dir_guest = node.attribute("guest");
|
||||
|
||||
char * dir_host = new char[share_dir_host.value_size()];
|
||||
char * dir_guest = new char[share_dir_guest.value_size()];
|
||||
|
||||
share_dir_host.value(dir_host, share_dir_host.value_size());
|
||||
share_dir_guest.value(dir_guest, share_dir_guest.value_size());
|
||||
|
||||
args.add("-share"); args.add(dir_host), args.add(dir_guest);
|
||||
shares ++;
|
||||
}
|
||||
} catch(Genode::Xml_node::Nonexistent_sub_node) { }
|
||||
|
||||
PINF("start %s image '%s' with %zu MB guest memory=%zu and %u shared folders",
|
||||
c_type, c_file, vm_size / 1024 / 1024,
|
||||
Genode::env()->ram_session()->avail(), shares);
|
||||
|
||||
if (RT_FAILURE(RTR3InitExe(args.argc(), args.argvp(), 0))) {
|
||||
PERR("Intialization of VBox Runtime failed.");
|
||||
return 5;
|
||||
}
|
||||
|
||||
return TrustedMain(args.argc, args.argv, NULL);
|
||||
return TrustedMain(args.argc(), *args.argvp(), NULL);
|
||||
}
|
||||
|
||||
} /* EXTERN "C" */
|
||||
} /* extern "C" */
|
||||
|
@ -22,7 +22,6 @@
|
||||
|
||||
#include <vmm/vcpu_thread.h>
|
||||
#include <vmm/vcpu_dispatcher.h>
|
||||
#include <vmm/printf.h>
|
||||
|
||||
/* NOVA includes that come with Genode */
|
||||
#include <nova/syscalls.h>
|
||||
@ -184,7 +183,8 @@ extern "C" void pthread_yield(void) { Nova::ec_ctrl(Nova::EC_YIELD); }
|
||||
extern "C"
|
||||
bool create_emt_vcpu(pthread_t * pthread, size_t stack,
|
||||
const pthread_attr_t *attr,
|
||||
void *(*start_routine)(void *), void *arg)
|
||||
void *(*start_routine)(void *), void *arg,
|
||||
Genode::Cpu_session * cpu_session)
|
||||
{
|
||||
Nova::Hip * hip = hip_rom.local_addr<Nova::Hip>();
|
||||
|
||||
@ -192,10 +192,12 @@ bool create_emt_vcpu(pthread_t * pthread, size_t stack,
|
||||
return false;
|
||||
|
||||
if (hip->has_feature_vmx())
|
||||
vcpu_handler = new Vcpu_handler_vmx(stack, attr, start_routine, arg);
|
||||
vcpu_handler = new Vcpu_handler_vmx(stack, attr, start_routine, arg,
|
||||
cpu_session);
|
||||
|
||||
if (hip->has_feature_svm())
|
||||
vcpu_handler = new Vcpu_handler_svm(stack, attr, start_routine, arg);
|
||||
vcpu_handler = new Vcpu_handler_svm(stack, attr, start_routine, arg,
|
||||
cpu_session);
|
||||
|
||||
*pthread = vcpu_handler;
|
||||
return true;
|
||||
|
@ -63,9 +63,10 @@ static inline Genode::uint32_t sel_ar_conv_from_nova(Genode::uint16_t v)
|
||||
|
||||
|
||||
/*
|
||||
* Used to map memory for virtual framebuffer to VM
|
||||
* Used to map mmio memory to VM
|
||||
*/
|
||||
extern "C" int MMIO2_MAPPED_SYNC(PVM pVM, RTGCPHYS GCPhys, size_t cbWrite);
|
||||
extern "C" int MMIO2_MAPPED_SYNC(PVM pVM, RTGCPHYS GCPhys, size_t cbWrite,
|
||||
void **ppv);
|
||||
|
||||
|
||||
class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
@ -87,6 +88,8 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
asm volatile ("fxrstor %0" : : "m" (*data));
|
||||
}
|
||||
|
||||
enum { IRQ_INJ_VALID_MASK = 0x80000000UL };
|
||||
|
||||
protected:
|
||||
|
||||
struct {
|
||||
@ -115,13 +118,14 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
|
||||
Assert(!(utcb->intr_state & 3));
|
||||
Assert(utcb->flags & X86_EFL_IF);
|
||||
Assert(!(utcb->inj_info & IRQ_INJ_VALID_MASK));
|
||||
|
||||
if (irq_win(utcb)) {
|
||||
/* reset mtd to not transfer anything back by accident */
|
||||
utcb->mtd = 0;
|
||||
/* inject IRQ */
|
||||
if (inj_event(utcb, _current_vcpu))
|
||||
Nova::reply(_stack_reply);
|
||||
inj_event(utcb, _current_vcpu, utcb->flags & X86_EFL_IF);
|
||||
Nova::reply(_stack_reply);
|
||||
}
|
||||
|
||||
/* go back to re-compiler */
|
||||
@ -130,9 +134,25 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
|
||||
__attribute__((noreturn)) void _default_handler()
|
||||
{
|
||||
Nova::Utcb * utcb = reinterpret_cast<Nova::Utcb *>(Thread_base::utcb());
|
||||
|
||||
Assert(!(utcb->inj_info & IRQ_INJ_VALID_MASK));
|
||||
|
||||
longjmp(_env, 1);
|
||||
}
|
||||
|
||||
__attribute__((noreturn)) void _recall_handler()
|
||||
{
|
||||
/* take care - Mtd::EFL | Mtd::STA are solely written to utcb */
|
||||
Nova::Utcb * utcb = reinterpret_cast<Nova::Utcb *>(Thread_base::utcb());
|
||||
|
||||
Assert(!(utcb->intr_state & 3));
|
||||
|
||||
utcb->mtd = 0;
|
||||
inj_event(utcb, _current_vcpu, utcb->flags & X86_EFL_IF);
|
||||
|
||||
Nova::reply(_stack_reply);
|
||||
}
|
||||
|
||||
template <unsigned NPT_EPT>
|
||||
__attribute__((noreturn)) inline
|
||||
@ -142,37 +162,32 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
using namespace Nova;
|
||||
using namespace Genode;
|
||||
|
||||
addr_t stack_top;
|
||||
|
||||
Assert(utcb->actv_state == 0);
|
||||
Assert(!(utcb->intr_state & 3));
|
||||
|
||||
Assert(!(utcb->inj_info & 0x80000000));
|
||||
Assert(!(utcb->inj_info & IRQ_INJ_VALID_MASK));
|
||||
|
||||
if (unmap) {
|
||||
PERR("unmap not implemented\n");
|
||||
Nova::reply(reinterpret_cast<void *>(&stack_top));
|
||||
Nova::reply(_stack_reply);
|
||||
}
|
||||
|
||||
|
||||
enum { MAP_SIZE = 0x1000UL };
|
||||
|
||||
Flexpage_iterator fli;
|
||||
void *pv = guest_memory()->lookup_ram(reason, 0x1000UL, fli);
|
||||
void *pv = guest_memory()->lookup_ram(reason, MAP_SIZE, fli);
|
||||
|
||||
if (!pv) {
|
||||
pv = vmm_memory()->lookup(reason, 0x1000UL);
|
||||
if (pv) { /* XXX */
|
||||
fli = Genode::Flexpage_iterator((addr_t)pv, 0x1000UL,
|
||||
reason, 0x1000UL, reason);
|
||||
int res = MMIO2_MAPPED_SYNC(_current_vm, reason, 0x1);
|
||||
/*
|
||||
Genode::addr_t fb_phys = 0xf0000000UL;
|
||||
Genode::addr_t fb_size = 0x00400000UL;
|
||||
pv = vmm_memory()->lookup(fb_phys, fb_size);
|
||||
|
||||
fli = Genode::Flexpage_iterator((addr_t)pv, fb_size,
|
||||
fb_phys, fb_size, fb_phys);
|
||||
int res = MMIO2_MAPPED_SYNC(_current_vm, fb_phys, fb_size);
|
||||
*/
|
||||
}
|
||||
/**
|
||||
* Check whether this is some mmio memory provided by VMM
|
||||
* we can map, e.g. VMMDev memory or framebuffer currently.
|
||||
*/
|
||||
int res = MMIO2_MAPPED_SYNC(_current_vm, reason, MAP_SIZE, &pv);
|
||||
if (pv && (res == VINF_SUCCESS))
|
||||
fli = Genode::Flexpage_iterator((addr_t)pv, MAP_SIZE,
|
||||
reason, MAP_SIZE, reason);
|
||||
else
|
||||
pv = 0;
|
||||
}
|
||||
|
||||
/* emulator has to take over if fault region is not ram */
|
||||
@ -209,7 +224,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
res = utcb->append_item(crd, flexpage.hotspot, USER_PD, GUEST_PGT);
|
||||
} while (res);
|
||||
|
||||
Nova::reply(reinterpret_cast<void *>(&stack_top));
|
||||
Nova::reply(_stack_reply);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -395,10 +410,8 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
}
|
||||
|
||||
|
||||
inline bool inj_event(Nova::Utcb * utcb, PVMCPU pVCpu)
|
||||
inline bool inj_event(Nova::Utcb * utcb, PVMCPU pVCpu, bool if_flag)
|
||||
{
|
||||
PCPUMCTX const pCtx = CPUMQueryGuestCtxPtr(pVCpu);
|
||||
|
||||
if (!TRPMHasTrap(pVCpu)) {
|
||||
|
||||
if (VMCPU_FF_TESTANDCLEAR(pVCpu, VMCPU_FF_INTERRUPT_NMI)) {
|
||||
@ -408,7 +421,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
|
||||
if (VMCPU_FF_ISPENDING(pVCpu, (VMCPU_FF_INTERRUPT_APIC|VMCPU_FF_INTERRUPT_PIC))) {
|
||||
|
||||
if (!(pCtx->rflags.u & X86_EFL_IF)) {
|
||||
if (!if_flag) {
|
||||
|
||||
unsigned vector = 0;
|
||||
utcb->inj_info = 0x1000 | vector;
|
||||
@ -424,12 +437,12 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
rc = TRPMAssertTrap(pVCpu, irq, TRPM_HARDWARE_INT);
|
||||
Assert(RT_SUCCESS(rc));
|
||||
} else
|
||||
PWRN("pending interrupt blocked due to INHIBIT flag");
|
||||
Vmm::printf("pending interrupt blocked due to INHIBIT flag\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* can an interrupt be dispatched ? */
|
||||
if (!TRPMHasTrap(pVCpu) || !(pCtx->rflags.u & X86_EFL_IF) ||
|
||||
if (!TRPMHasTrap(pVCpu) || !if_flag ||
|
||||
VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
|
||||
return false;
|
||||
|
||||
@ -452,8 +465,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
/* If a new event is pending, then dispatch it now. */
|
||||
int rc = TRPMQueryTrapAll(pVCpu, &u8Vector, &enmType, &u32ErrorCode, 0);
|
||||
AssertRC(rc);
|
||||
Assert(pCtx->eflags.Bits.u1IF == 1 || enmType == TRPM_TRAP);
|
||||
Assert(enmType != TRPM_SOFTWARE_INT);
|
||||
Assert(enmType == TRPM_HARDWARE_INT);
|
||||
|
||||
/* Clear the pending trap. */
|
||||
rc = TRPMResetTrap(pVCpu);
|
||||
@ -463,8 +475,6 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
Event.n.u1Valid = 1;
|
||||
Event.n.u32ErrorCode = u32ErrorCode;
|
||||
|
||||
Assert(enmType == TRPM_HARDWARE_INT);
|
||||
|
||||
Event.n.u3Type = SVM_EVENT_EXTERNAL_IRQ;
|
||||
|
||||
utcb->inj_info = Event.au64[0];
|
||||
@ -529,10 +539,12 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
|
||||
|
||||
Vcpu_handler(size_t stack_size, const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg)
|
||||
void *(*start_routine) (void *), void *arg,
|
||||
Genode::Cpu_session * cpu_session)
|
||||
:
|
||||
Vmm::Vcpu_dispatcher<pthread>(stack_size, _cap_connection,
|
||||
attr ? *attr : 0, start_routine, arg),
|
||||
_vcpu(cpu_session),
|
||||
_ec_sel(Genode::cap_map()->insert())
|
||||
{ }
|
||||
|
||||
@ -653,7 +665,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher<pthread>
|
||||
using namespace Nova;
|
||||
|
||||
/* check whether to inject interrupts */
|
||||
inj_event(utcb, pVCpu);
|
||||
inj_event(utcb, pVCpu, pCtx->rflags.u & X86_EFL_IF);
|
||||
|
||||
/* Transfer vCPU state from vBox to Nova format */
|
||||
if (!vbox_to_utcb(utcb, pVM, pVCpu) ||
|
||||
|
@ -76,18 +76,24 @@ class Vcpu_handler_svm : public Vcpu_handler
|
||||
Nova::reply(nullptr);
|
||||
}
|
||||
|
||||
__attribute__((noreturn)) void _svm_recall()
|
||||
{
|
||||
Vcpu_handler::_recall_handler();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Vcpu_handler_svm(size_t stack_size, const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg)
|
||||
: Vcpu_handler(stack_size, attr, start_routine, arg)
|
||||
void *(*start_routine) (void *), void *arg,
|
||||
Genode::Cpu_session * cpu_session)
|
||||
: Vcpu_handler(stack_size, attr, start_routine, arg, cpu_session)
|
||||
{
|
||||
using namespace Nova;
|
||||
|
||||
typedef Vcpu_handler_svm This;
|
||||
|
||||
register_handler<RECALL, This,
|
||||
&This::_svm_default>(vcpu().exc_base(), Mtd(Mtd::ALL | Mtd::FPU));
|
||||
&This::_svm_recall>(vcpu().exc_base(), Mtd(Mtd::EFL | Mtd::STA));
|
||||
register_handler<SVM_EXIT_IOIO, This,
|
||||
&This::_svm_ioio> (vcpu().exc_base(), Mtd(Mtd::ALL | Mtd::FPU));
|
||||
register_handler<SVM_EXIT_VINTR, This,
|
||||
|
@ -21,7 +21,6 @@
|
||||
#include "vcpu.h"
|
||||
#include "vmx.h"
|
||||
|
||||
extern "C" int MMIO2_MAPPED_SYNC(PVM pVM, RTGCPHYS GCPhys, size_t cbWrite);
|
||||
|
||||
class Vcpu_handler_vmx : public Vcpu_handler
|
||||
{
|
||||
@ -75,11 +74,17 @@ class Vcpu_handler_vmx : public Vcpu_handler
|
||||
_irq_window(VMX_EXIT_IRQ_WINDOW);
|
||||
}
|
||||
|
||||
__attribute__((noreturn)) void _vmx_recall()
|
||||
{
|
||||
Vcpu_handler::_recall_handler();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Vcpu_handler_vmx(size_t stack_size, const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg)
|
||||
: Vcpu_handler(stack_size, attr, start_routine, arg)
|
||||
void *(*start_routine) (void *), void *arg,
|
||||
Genode::Cpu_session * cpu_session)
|
||||
: Vcpu_handler(stack_size, attr, start_routine, arg, cpu_session)
|
||||
{
|
||||
using namespace Nova;
|
||||
|
||||
@ -116,7 +121,7 @@ class Vcpu_handler_vmx : public Vcpu_handler
|
||||
register_handler<VCPU_STARTUP, This,
|
||||
&This::_vmx_startup> (exc_base, Mtd::ALL | Mtd::FPU);
|
||||
register_handler<RECALL, This,
|
||||
&This::_vmx_default> (exc_base, Mtd::ALL | Mtd::FPU);
|
||||
&This::_vmx_recall> (exc_base, Mtd::EFL | Mtd::STA);
|
||||
|
||||
start();
|
||||
}
|
||||
|
@ -15,6 +15,8 @@
|
||||
#include <base/printf.h>
|
||||
#include <util/string.h>
|
||||
|
||||
#include <vmm/printf.h>
|
||||
|
||||
/* VirtualBox includes */
|
||||
#include "PGMInternal.h" /* enable access to pgm.s.* */
|
||||
#include <VBox/vmm/mm.h>
|
||||
@ -73,10 +75,7 @@ int PGMR3PhysRomRegister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys,
|
||||
int PGMPhysWrite(PVM pVM, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite)
|
||||
{
|
||||
void *pv = guest_memory()->lookup(GCPhys, cbWrite);
|
||||
/*
|
||||
PLOG("PGMPhysWrite: GCPhys=0x%lx pvBuf=0x%p cbWrite=0x%zx pv=%p",
|
||||
(long)GCPhys, pvBuf, cbWrite, pv);
|
||||
*/
|
||||
|
||||
if (pv) {
|
||||
memcpy(pv, pvBuf, cbWrite);
|
||||
return VINF_SUCCESS;
|
||||
@ -309,19 +308,32 @@ int PGMR3Init(PVM pVM)
|
||||
|
||||
int PGMR3PhysTlbGCPhys2Ptr(PVM pVM, RTGCPHYS GCPhys, bool fWritable, void **ppv)
|
||||
{
|
||||
void *pv = guest_memory()->lookup(GCPhys, 1);
|
||||
size_t const size = 1;
|
||||
void *pv = guest_memory()->lookup(GCPhys, size);
|
||||
|
||||
if (pv) {
|
||||
*ppv = pv;
|
||||
return VINF_SUCCESS;
|
||||
}
|
||||
|
||||
PFNPGMR3PHYSHANDLER pfnHandlerR3 = 0;
|
||||
void *pvUserR3 = 0;
|
||||
|
||||
pv = vmm_memory()->lookup(GCPhys, size, &pfnHandlerR3, &pvUserR3);
|
||||
|
||||
if (!pv) {
|
||||
PERR("PGMR3PhysTlbGCPhys2Ptr: lookup for GCPhys=0x%lx failed", (long)GCPhys);
|
||||
guest_memory()->dump();
|
||||
PERR("%s: lookup for GCPhys=0x%p failed", __func__, GCPhys);
|
||||
return VERR_PGM_PHYS_TLB_UNASSIGNED;
|
||||
}
|
||||
|
||||
*ppv = pv;
|
||||
|
||||
// PLOG("PGMR3PhysTlbGCPhys2Ptr: GCPhys=0x%lx -> pv=%p", (long)GCPhys, pv);
|
||||
|
||||
return VINF_SUCCESS;
|
||||
/* pv valid - check handlers next */
|
||||
if (!pfnHandlerR3 && !pvUserR3) {
|
||||
*ppv = pv;
|
||||
return VINF_SUCCESS;
|
||||
}
|
||||
|
||||
PERR("%s: denied access - handlers set - GCPhys=0x%p", __func__, GCPhys);
|
||||
return VERR_PGM_PHYS_TLB_CATCH_ALL;
|
||||
}
|
||||
|
||||
|
||||
@ -524,28 +536,42 @@ int PGMHandlerPhysicalReset(PVM, RTGCPHYS GCPhys)
|
||||
}
|
||||
|
||||
|
||||
extern "C" int MMIO2_MAPPED_SYNC(PVM pVM, RTGCPHYS GCPhys, size_t cbWrite)
|
||||
extern "C" int MMIO2_MAPPED_SYNC(PVM pVM, RTGCPHYS GCPhys, size_t cbWrite,
|
||||
void **ppv)
|
||||
{
|
||||
/* DON'T USE normal printf in this function - corrupts unsaved UTCB !!! */
|
||||
|
||||
PFNPGMR3PHYSHANDLER pfnHandlerR3 = 0;
|
||||
void *pvUserR3 = 0;
|
||||
|
||||
void * pv = vmm_memory()->lookup(GCPhys, cbWrite, &pfnHandlerR3, &pvUserR3);
|
||||
|
||||
if (!pv || !pfnHandlerR3 || !pvUserR3) {
|
||||
PERR("%s: GCPhys=0x%lx cbWrite=0x%zx", __func__,
|
||||
GCPhys, cbWrite);
|
||||
return VERR_GENERAL_FAILURE;
|
||||
}
|
||||
if (!pv)
|
||||
return VERR_PGM_PHYS_TLB_UNASSIGNED;
|
||||
|
||||
int rc = pfnHandlerR3(pVM, GCPhys, 0, 0, cbWrite, PGMACCESSTYPE_WRITE,
|
||||
pvUserR3);
|
||||
|
||||
if (rc == VINF_PGM_HANDLER_DO_DEFAULT) {
|
||||
// PERR("%s: ok %p %lx+%zx", __func__, pfnHandlerR3, GCPhys, cbWrite);
|
||||
if (!pfnHandlerR3 && !pvUserR3) {
|
||||
*ppv = pv;
|
||||
/* you may map it */
|
||||
return VINF_SUCCESS;
|
||||
}
|
||||
|
||||
PERR("unexpected %s return code %d", __FUNCTION__, rc);
|
||||
if (pfnHandlerR3 && pvUserR3) {
|
||||
int rc = pfnHandlerR3(pVM, GCPhys, 0, 0, cbWrite, PGMACCESSTYPE_WRITE,
|
||||
pvUserR3);
|
||||
|
||||
if (rc == VINF_PGM_HANDLER_DO_DEFAULT) {
|
||||
*ppv = pv;
|
||||
/* you may map it */
|
||||
return VINF_SUCCESS;
|
||||
}
|
||||
|
||||
Vmm::printf("%s: GCPhys=0x%lx failed - unexpected rc=%d\n",
|
||||
__func__, GCPhys, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
Vmm::printf("%s: GCPhys=0x%lx failed - unexpected state \n",
|
||||
__func__, GCPhys);
|
||||
return VERR_GENERAL_FAILURE;
|
||||
}
|
||||
|
||||
@ -581,3 +607,13 @@ void PGMR3Reset(PVM pVM)
|
||||
|
||||
PERR("clearing ram and rom areas missing !!!!!!!");
|
||||
}
|
||||
|
||||
|
||||
int PGMR3MappingsSize(PVM pVM, uint32_t *pcb)
|
||||
{
|
||||
PINF("%s - not implemented - %p", __func__, __builtin_return_address(0));
|
||||
|
||||
*pcb = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -77,31 +77,8 @@ uint32_t RTBldCfgVersionBuild(void) { return VBOX_VERSION_BUILD; }
|
||||
uint32_t RTBldCfgRevision(void) { return ~0; }
|
||||
|
||||
|
||||
/*
|
||||
* Copied from 'Runtime/r3/posix/timelocal-posix.cpp'
|
||||
*/
|
||||
|
||||
static int64_t rtTimeLocalUTCOffset(PCRTTIMESPEC pTime, bool fCurrentTime)
|
||||
extern "C" DECLHIDDEN(int) rtProcInitExePath(char *pszPath, size_t cchPath)
|
||||
{
|
||||
PDBG("rtTimeLocalUTCOffset called - not implemented");
|
||||
Genode::strncpy(pszPath, "/virtualbox", cchPath);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
RTDECL(PRTTIME) RTTimeLocalExplode(PRTTIME pTime, PCRTTIMESPEC pTimeSpec)
|
||||
{
|
||||
RTTIMESPEC LocalTime = *pTimeSpec;
|
||||
RTTimeSpecAddNano(&LocalTime, rtTimeLocalUTCOffset(&LocalTime, true /* current time, skip fallback */));
|
||||
pTime = RTTimeExplode(pTime, &LocalTime);
|
||||
if (pTime)
|
||||
pTime->fFlags = (pTime->fFlags & ~RTTIME_FLAGS_TYPE_MASK) | RTTIME_FLAGS_TYPE_LOCAL;
|
||||
return pTime;
|
||||
}
|
||||
|
||||
|
||||
extern "C" RTDECL(int) RTPathAbs(const char *pszPath, char *pszAbsPath, size_t cchAbsPath)
|
||||
{
|
||||
Genode::strncpy(pszAbsPath, pszPath, cchAbsPath);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
9
repos/ports/src/virtualbox/rtc.patch
Normal file
9
repos/ports/src/virtualbox/rtc.patch
Normal file
@ -0,0 +1,9 @@
|
||||
+++ src/app/virtualbox/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp
|
||||
@@ -1470,6 +1481,7 @@
|
||||
rc = CFGMR3InsertNode(pDevices, "mc146818", &pDev); UPDATE_RC();
|
||||
rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
|
||||
rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
|
||||
+ rc = CFGMR3InsertInteger(pCfg, "UseUTC", 1); /* boolean */ UPDATE_RC();
|
||||
|
||||
/*
|
||||
* Serial ports
|
12
repos/ports/src/virtualbox/sharedfolder.patch
Normal file
12
repos/ports/src/virtualbox/sharedfolder.patch
Normal file
@ -0,0 +1,12 @@
|
||||
+++ src/app/virtualbox/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp 2014-05-14
|
||||
@@ -1132,7 +1135,9 @@
|
||||
parms[1].u.pointer.size = sizeof (SHFLSTRING) + cbString;
|
||||
|
||||
parms[2].type = VBOX_HGCM_SVC_PARM_32BIT;
|
||||
- parms[2].u.uint32 = !g_fShareReadOnly[i];
|
||||
+ parms[2].u.uint32 = g_fShareReadOnly[i] ? 0 : SHFL_ADD_MAPPING_F_WRITABLE;
|
||||
+
|
||||
+ parms[2].u.uint32 |= SHFL_ADD_MAPPING_F_AUTOMOUNT;
|
||||
|
||||
rc2 = gVMMDev->hgcmHostCall ("VBoxSharedFolders",
|
||||
SHFL_FN_ADD_MAPPING, SHFL_CPARMS_ADD_MAPPING, &parms[0]);
|
@ -14,22 +14,13 @@
|
||||
/* Genode includes */
|
||||
#include <os/attached_ram_dataspace.h>
|
||||
#include <base/semaphore.h>
|
||||
#include <os/timed_semaphore.h>
|
||||
|
||||
/* Genode/Virtualbox includes */
|
||||
#include "sup.h"
|
||||
|
||||
/* VirtualBox includes */
|
||||
#include <VBox/sup.h>
|
||||
#include <VBox/vmm/vm.h>
|
||||
#include <VBox/vmm/vmm.h>
|
||||
#include <VBox/err.h>
|
||||
#include <iprt/param.h>
|
||||
#include <iprt/err.h>
|
||||
#include <iprt/timer.h>
|
||||
|
||||
using Genode::Semaphore;
|
||||
|
||||
#define B(x) "\033[00;44m" x "\033[0m"
|
||||
|
||||
|
||||
struct Attached_gip : Genode::Attached_ram_dataspace
|
||||
@ -41,7 +32,8 @@ struct Attached_gip : Genode::Attached_ram_dataspace
|
||||
|
||||
|
||||
enum {
|
||||
UPDATE_HZ = 250, /* Hz */
|
||||
UPDATE_HZ = 100, /* Hz */
|
||||
/* Note: UPDATE_MS < 10ms is not supported by alarm timer, take care !*/
|
||||
UPDATE_MS = 1000 / UPDATE_HZ,
|
||||
UPDATE_NS = UPDATE_MS * 1000 * 1000,
|
||||
};
|
||||
@ -50,48 +42,83 @@ enum {
|
||||
PSUPGLOBALINFOPAGE g_pSUPGlobalInfoPage;
|
||||
|
||||
|
||||
static void _update_tick(PRTTIMER pTimer, void *pvUser, uint64_t iTick)
|
||||
{
|
||||
/**
|
||||
* We're using rdtsc here since timer_session->elapsed_ms produces
|
||||
* instable results when the timer service is using the Genode PIC
|
||||
* driver as done for base-nova currently.
|
||||
*/
|
||||
static unsigned long long tsc_last = 0;
|
||||
class Periodic_GIP : public Genode::Alarm {
|
||||
|
||||
unsigned now_low, now_high;
|
||||
asm volatile("rdtsc" : "=a"(now_low), "=d"(now_high) : : "memory");
|
||||
bool on_alarm()
|
||||
{
|
||||
/**
|
||||
* We're using rdtsc here since timer_session->elapsed_ms produces
|
||||
* instable results when the timer service is using the Genode PIC
|
||||
* driver as done for base-nova currently.
|
||||
*/
|
||||
static unsigned long long tsc_last = 0;
|
||||
|
||||
unsigned long long tsc_current = now_high;
|
||||
tsc_current <<= 32;
|
||||
tsc_current |= now_low;
|
||||
Genode::uint32_t now_low, now_high;
|
||||
asm volatile("rdtsc" : "=a"(now_low), "=d"(now_high) : : "memory");
|
||||
|
||||
unsigned long long elapsed_tsc = tsc_current - tsc_last;
|
||||
unsigned long elapsed_ms = elapsed_tsc * 1000 / genode_cpu_hz();
|
||||
unsigned long long elapsed_nanots = 1000ULL * 1000 * elapsed_ms;
|
||||
Genode::uint64_t tsc_current = now_high;
|
||||
tsc_current <<= 32;
|
||||
tsc_current |= now_low;
|
||||
|
||||
tsc_last = tsc_current;
|
||||
Genode::uint64_t elapsed_tsc;
|
||||
Genode::uint32_t elapsed_ms;
|
||||
enum { BOGUS_MULTIPLIER = 10 };
|
||||
|
||||
/* handle wrap around, backwards running tsc and too bogus timeouts */
|
||||
if (tsc_current < tsc_last ||
|
||||
tsc_current - tsc_last > BOGUS_MULTIPLIER * UPDATE_MS * genode_cpu_hz() / 1000) {
|
||||
|
||||
/*
|
||||
if (tsc_current < tsc_last)
|
||||
PDBG("bogus timeout - set fixed to %lums - calculated ms %llu "
|
||||
" - time wrapped", UPDATE_MS,
|
||||
(tsc_current - tsc_last) * 1000 / genode_cpu_hz());
|
||||
else
|
||||
PDBG("bogus timeout - set fixed to %lums - calculated ms %llu "
|
||||
" > %u * %lums", UPDATE_MS,
|
||||
(tsc_current - tsc_last) * 1000 / genode_cpu_hz(),
|
||||
BOGUS_MULTIPLIER, UPDATE_MS);
|
||||
*/
|
||||
elapsed_ms = UPDATE_MS;
|
||||
elapsed_tsc = UPDATE_MS * genode_cpu_hz() / 1000;
|
||||
|
||||
} else {
|
||||
elapsed_tsc = tsc_current - tsc_last;
|
||||
elapsed_ms = elapsed_tsc * 1000 / genode_cpu_hz();
|
||||
}
|
||||
|
||||
Genode::uint64_t elapsed_nanots = 1000ULL * 1000 * elapsed_ms;
|
||||
|
||||
tsc_last = tsc_current;
|
||||
|
||||
|
||||
|
||||
SUPGIPCPU *cpu = &g_pSUPGlobalInfoPage->aCPUs[0];
|
||||
SUPGIPCPU *cpu = &g_pSUPGlobalInfoPage->aCPUs[0];
|
||||
|
||||
cpu->u32TransactionId++;
|
||||
/*
|
||||
* Transaction id must be incremented before and after update,
|
||||
* read struct SUPGIPCPU description for more details.
|
||||
*/
|
||||
ASMAtomicIncU32(&cpu->u32TransactionId);
|
||||
|
||||
cpu->u64NanoTS += elapsed_nanots;
|
||||
cpu->u64TSC += elapsed_tsc;
|
||||
cpu->u64NanoTS += elapsed_nanots;
|
||||
cpu->u64TSC += elapsed_tsc;
|
||||
|
||||
cpu->u32TransactionId++;
|
||||
/*
|
||||
* Transaction id must be incremented before and after update,
|
||||
* read struct SUPGIPCPU description for more details.
|
||||
*/
|
||||
ASMAtomicIncU32(&cpu->u32TransactionId);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
asm volatile ("":::"memory");
|
||||
}
|
||||
|
||||
|
||||
int SUPR3Init(PSUPDRVSESSION *ppSession)
|
||||
{
|
||||
static bool initialized(false);
|
||||
static bool initialized = false;
|
||||
|
||||
if (initialized) return VINF_SUCCESS;
|
||||
|
||||
@ -132,10 +159,9 @@ int SUPR3Init(PSUPDRVSESSION *ppSession)
|
||||
cpu->iCpuSet = 0;
|
||||
cpu->idApic = 0;
|
||||
|
||||
PRTTIMER pTimer;
|
||||
|
||||
RTTimerCreate(&pTimer, UPDATE_MS, _update_tick, 0);
|
||||
RTTimerStart(pTimer, 0);
|
||||
/* schedule periodic call of GIP update function */
|
||||
static Periodic_GIP alarm;
|
||||
Genode::Timeout_thread::alarm_timer()->schedule(&alarm, UPDATE_MS);
|
||||
|
||||
initialized = true;
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define _SUP_H_
|
||||
|
||||
/* Genode includes */
|
||||
#include <cpu_session/cpu_session.h>
|
||||
#include "util/misc_math.h"
|
||||
#include "util/string.h"
|
||||
|
||||
@ -73,4 +74,6 @@ void inline genode_VMMR0_DO_GVMM_CREATE_VM(PSUPVMMR0REQHDR pReqHdr)
|
||||
req.pVMR3 = pVM;
|
||||
}
|
||||
|
||||
Genode::Cpu_session * get_vcpu_cpu_session();
|
||||
|
||||
#endif /* _SUP_H_ */
|
||||
|
@ -5,7 +5,7 @@ include $(REP_DIR)/lib/mk/virtualbox-common.inc
|
||||
TARGET = virtualbox
|
||||
SRC_CC = main.cc cxx_dummies.cc devices.cc drivers.cc dummies.cc libc.cc \
|
||||
logger.cc mm.cc pdm.cc pgm.cc rt.cc sup.cc iommio.cc ioport.cc \
|
||||
hwaccm.cc thread.cc
|
||||
hwaccm.cc thread.cc dynlib.cc
|
||||
|
||||
LIBS += base
|
||||
LIBS += config_args
|
||||
@ -15,18 +15,29 @@ LIBS += virtualbox-bios virtualbox-recompiler virtualbox-runtime \
|
||||
virtualbox-storage virtualbox-zlib virtualbox-liblzf \
|
||||
virtualbox-hwaccl virtualbox-dis
|
||||
|
||||
LIBS += pthread libc_terminal libc_lock_pipe libiconv
|
||||
|
||||
INC_DIR += $(call select_from_repositories,src/lib/libc)
|
||||
INC_DIR += $(call select_from_repositories,src/lib/pthread)
|
||||
|
||||
INC_DIR += $(VBOX_DIR)/Runtime/include
|
||||
INC_DIR += $(VBOX_DIR)/Frontends/VBoxBFE
|
||||
|
||||
SRC_CC += Frontends/VBoxBFE/VBoxBFE.cpp
|
||||
# basic frontend
|
||||
SRC_CC += Frontends/VBoxBFE/DisplayImpl.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/VMMDevInterface.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/HGCM.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/HGCMObjects.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/HGCMThread.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/KeyboardImpl.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/MachineDebuggerImpl.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/StatusImpl.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/VBoxBFE.cpp
|
||||
SRC_CC += Frontends/VBoxBFE/VMMDevInterface.cpp
|
||||
|
||||
SRC_CC += HostServices/SharedFolders/service.cpp
|
||||
SRC_CC += HostServices/SharedFolders/mappings.cpp
|
||||
SRC_CC += HostServices/SharedFolders/vbsf.cpp
|
||||
SRC_CC += HostServices/SharedFolders/shflhandle.cpp
|
||||
|
||||
INC_DIR += $(VBOX_DIR)/Main/include
|
||||
INC_DIR += $(VBOX_DIR)/VMM/include
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <base/printf.h>
|
||||
#include <base/thread.h>
|
||||
#include <base/env.h>
|
||||
#include <cpu_session/connection.h>
|
||||
|
||||
/* Genode libc pthread binding */
|
||||
#include "thread.h"
|
||||
@ -26,6 +27,32 @@
|
||||
/* vbox */
|
||||
#include <internal/thread.h>
|
||||
|
||||
static Genode::Cpu_session * get_cpu_session(RTTHREADTYPE type) {
|
||||
using namespace Genode;
|
||||
|
||||
static Cpu_connection * con[RTTHREADTYPE_END - 1];
|
||||
static Lock lock;
|
||||
|
||||
Assert(type && type < RTTHREADTYPE_END);
|
||||
|
||||
Lock::Guard guard(lock);
|
||||
|
||||
if (con[type - 1])
|
||||
return con[type - 1];
|
||||
|
||||
long const prio = (RTTHREADTYPE_END - type) *
|
||||
(Cpu_session::PRIORITY_LIMIT / RTTHREADTYPE_END);
|
||||
|
||||
char * data = new (env()->heap()) char[32];
|
||||
|
||||
snprintf(data, 32, "vbox %u", type);
|
||||
|
||||
con[type - 1] = new (env()->heap()) Cpu_connection(data, prio);
|
||||
|
||||
return con[type - 1];
|
||||
}
|
||||
|
||||
|
||||
extern "C" {
|
||||
|
||||
/**
|
||||
@ -34,7 +61,8 @@ extern "C" {
|
||||
*/
|
||||
bool create_emt_vcpu(pthread_t * pthread, size_t stack,
|
||||
const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg);
|
||||
void *(*start_routine) (void *), void *arg,
|
||||
Genode::Cpu_session *);
|
||||
|
||||
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg)
|
||||
@ -52,17 +80,23 @@ extern "C" {
|
||||
PWRN("requested stack for thread '%s' of %zu Bytes is too large, "
|
||||
"limit to %zu Bytes", rtthread->szName, rtthread->cbStack,
|
||||
stack_size);
|
||||
|
||||
|
||||
/* sanity check - emt and vcpu thread have to have same prio class */
|
||||
if (!Genode::strcmp(rtthread->szName, "EMT"))
|
||||
Assert(rtthread->enmType == RTTHREADTYPE_EMULATION);
|
||||
|
||||
if (rtthread->enmType == RTTHREADTYPE_EMULATION) {
|
||||
|
||||
if (create_emt_vcpu(thread, stack_size, attr, start_routine, arg))
|
||||
if (create_emt_vcpu(thread, stack_size, attr, start_routine, arg,
|
||||
get_cpu_session(RTTHREADTYPE_EMULATION)))
|
||||
return 0;
|
||||
/* no haredware support, create normal pthread thread */
|
||||
}
|
||||
|
||||
pthread_t thread_obj = new (Genode::env()->heap())
|
||||
pthread(attr ? *attr : 0, start_routine,
|
||||
arg, stack_size, rtthread->szName, nullptr);
|
||||
arg, stack_size, rtthread->szName,
|
||||
get_cpu_session(rtthread->enmType));
|
||||
|
||||
if (!thread_obj)
|
||||
return EAGAIN;
|
||||
|
11
repos/ports/src/virtualbox/time-log-deadlock.patch
Normal file
11
repos/ports/src/virtualbox/time-log-deadlock.patch
Normal file
@ -0,0 +1,11 @@
|
||||
+++ src/app/virtualbox/src/VBox/Runtime/common/log/log.cpp
|
||||
@@ -3063,7 +3066,8 @@
|
||||
{
|
||||
|
||||
#if defined(IN_RING3) || defined(IN_RC)
|
||||
- uint64_t u64 = RTTimeProgramMicroTS();
|
||||
+// uint64_t u64 = RTTimeProgramMicroTS();
|
||||
+ uint64_t u64 = 0;
|
||||
psz += RTStrFormatNumber(psz, (uint32_t)(u64 / RT_US_1HOUR), 10, 2, 0, RTSTR_F_ZEROPAD);
|
||||
*psz++ = ':';
|
||||
uint32_t u32 = (uint32_t)(u64 % RT_US_1HOUR);
|
@ -11,37 +11,3 @@
|
||||
#include <iprt/alloc.h>
|
||||
#include <iprt/assert.h>
|
||||
#include <iprt/critsect.h>
|
||||
+++ src/app/virtualbox/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp
|
||||
@@ -1765,19 +1779,19 @@
|
||||
/*
|
||||
* VMM Device
|
||||
*/
|
||||
- rc = CFGMR3InsertNode(pDevices, "VMMDev", &pDev); UPDATE_RC();
|
||||
- rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
|
||||
- rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
|
||||
- rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
|
||||
- rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 4); UPDATE_RC();
|
||||
- rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
|
||||
- rc = CFGMR3InsertInteger(pCfg, "RamSize", g_u32MemorySizeMB * _1M); UPDATE_RC();
|
||||
-
|
||||
- /* the VMM device's Main driver */
|
||||
- rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
|
||||
- rc = CFGMR3InsertString(pLunL0, "Driver", "HGCM"); UPDATE_RC();
|
||||
- rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
|
||||
- rc = CFGMR3InsertInteger(pCfg, "Object", (uintptr_t)gVMMDev); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertNode(pDevices, "VMMDev", &pDev); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertNode(pDev, "0", &pInst); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertNode(pInst, "Config", &pCfg); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertInteger(pInst, "Trusted", 1); /* boolean */ UPDATE_RC();
|
||||
+// rc = CFGMR3InsertInteger(pInst, "PCIDeviceNo", 4); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertInteger(pInst, "PCIFunctionNo", 0); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertInteger(pCfg, "RamSize", g_u32MemorySizeMB * _1M); UPDATE_RC();
|
||||
+//
|
||||
+// /* the VMM device's Main driver */
|
||||
+// rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertString(pLunL0, "Driver", "HGCM"); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg); UPDATE_RC();
|
||||
+// rc = CFGMR3InsertInteger(pCfg, "Object", (uintptr_t)gVMMDev); UPDATE_RC();
|
||||
|
||||
/*
|
||||
* AC'97 ICH audio
|
||||
|
@ -168,28 +168,6 @@ class Vmm_memory
|
||||
}
|
||||
|
||||
bool unmap_from_vm(RTGCPHYS GCPhys);
|
||||
/*
|
||||
{
|
||||
size_t const size = 1;
|
||||
|
||||
Region *r = _lookup_unsynchronized(GCPhys, size);
|
||||
if (!r) return false;
|
||||
|
||||
using Genode::addr_t;
|
||||
addr_t const vmm_local = (addr_t)r->local_addr<addr_t>();
|
||||
|
||||
Assert(vmm_local);
|
||||
Assert(!((r->size() - 1) & vmm_local));
|
||||
|
||||
using namespace Nova;
|
||||
unsigned const order = Genode::log2(r->size() >> PAGE_SIZE_LOG2);
|
||||
|
||||
Rights rwx(true, true, true);
|
||||
revoke(Mem_crd(vmm_local >> PAGE_SIZE_LOG2, order, rwx), false);
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
|
@ -1,5 +1,16 @@
|
||||
+++ src/app/virtualbox/src/VBox/Devices/VMMDev/VMMDev.cpp
|
||||
@@ -1854,7 +1854,6 @@
|
||||
@@ -770,6 +770,10 @@
|
||||
("%u\n", pReq->header.size), VERR_INVALID_PARAMETER);
|
||||
|
||||
pReq->fEnabled = false;
|
||||
+
|
||||
+ if (!pThis || !pThis->pDrv || !pThis->pDrv->pfnIsPageFusionEnabled)
|
||||
+ return VINF_SUCCESS;
|
||||
+
|
||||
int rc = pThis->pDrv->pfnIsPageFusionEnabled(pThis->pDrv, &pReq->fEnabled);
|
||||
if (RT_FAILURE(rc))
|
||||
pReq->fEnabled = false;
|
||||
@@ -1854,7 +1858,6 @@
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -7,7 +18,7 @@
|
||||
|
||||
case VMMDevReq_HGCMCancel:
|
||||
{
|
||||
@@ -1899,6 +1898,7 @@
|
||||
@@ -1899,6 +1902,7 @@
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -15,7 +26,7 @@
|
||||
|
||||
case VMMDevReq_VideoAccelEnable:
|
||||
{
|
||||
@@ -3341,8 +3341,10 @@
|
||||
@@ -3341,8 +3345,10 @@
|
||||
/* disabled statistics updating */
|
||||
pThis->u32LastStatIntervalSize = 0;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user