From 4782fd34f69d53cfaab64057c89a8292c9d54523 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Thu, 17 Apr 2014 14:00:58 +0200 Subject: [PATCH] vmm: parameterize Vcpu_dispatcher Pre-condition to realize #1129, to be able to let a vCPU handler thread also be a pthread. --- ports/include/vmm/vcpu_dispatcher.h | 29 ++++++++++++++++++++++------- ports/src/test/vmm_utils/main.cc | 4 ++-- ports/src/vancouver/main.cc | 6 ++++-- ports/src/virtualbox/nova/vcpu.h | 5 +++-- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/ports/include/vmm/vcpu_dispatcher.h b/ports/include/vmm/vcpu_dispatcher.h index 43f4a6592..92398ebd3 100644 --- a/ports/include/vmm/vcpu_dispatcher.h +++ b/ports/include/vmm/vcpu_dispatcher.h @@ -18,6 +18,7 @@ namespace Vmm { using namespace Genode; + template class Vcpu_dispatcher; } @@ -25,7 +26,8 @@ namespace Vmm { /** * Thread that handles virtualization events of a 'Vmm::Vcpu_thread' */ -class Vmm::Vcpu_dispatcher : public Genode::Thread_base +template +class Vmm::Vcpu_dispatcher : public T { private: @@ -57,17 +59,30 @@ class Vmm::Vcpu_dispatcher : public Genode::Thread_base Vcpu_dispatcher(size_t stack_size, Cap_connection &cap) : - Thread_base("vCPU dispatcher", stack_size), + T("vCPU dispatcher", stack_size), _cap(cap) { using namespace Genode; - /* request creation of a 'local' EC */ - _tid.ec_sel = Native_thread::INVALID_INDEX - 1; - Thread_base::start(); + /* request creation of a 'local' EC */ + T::_tid.ec_sel = Native_thread::INVALID_INDEX - 1; + T::start(); } + template + Vcpu_dispatcher(size_t stack_size, Cap_connection &cap, + X attr, void *(*start_routine) (void *), void *arg) + : T(attr, start_routine, arg, stack_size, "vCPU dispatcher", nullptr), + _cap(cap) + { + using namespace Genode; + + /* request creation of a 'local' EC */ + T::_tid.ec_sel = Native_thread::INVALID_INDEX - 1; + T::start(); + } + /** * Register virtualization event handler */ @@ -82,7 +97,7 @@ class Vmm::Vcpu_dispatcher : public Genode::Thread_base /* Create the portal at the desired selector index */ _cap.rcv_window(exc_base + EV); - Native_capability thread_cap(tid().ec_sel); + Native_capability thread_cap(T::tid().ec_sel); Native_capability handler = _cap.alloc(thread_cap, (Nova::mword_t)entry, mtd.value()); @@ -111,7 +126,7 @@ class Vmm::Vcpu_dispatcher : public Genode::Thread_base */ Nova::mword_t sel_sm_ec() { - return tid().exc_pt_sel + Nova::SM_SEL_EC; + return T::tid().exc_pt_sel + Nova::SM_SEL_EC; } }; diff --git a/ports/src/test/vmm_utils/main.cc b/ports/src/test/vmm_utils/main.cc index f14dbe2c6..7793320af 100644 --- a/ports/src/test/vmm_utils/main.cc +++ b/ports/src/test/vmm_utils/main.cc @@ -24,7 +24,7 @@ using Genode::printf; using Genode::sleep_forever; -class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher +class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher { private: @@ -60,7 +60,7 @@ class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher Vcpu_dispatcher(Cap_connection &cap, Type type) : - Vmm::Vcpu_dispatcher(STACK_SIZE, cap), + Vmm::Vcpu_dispatcher(STACK_SIZE, cap), _vcpu_thread(STACK_SIZE) { using namespace Nova; diff --git a/ports/src/vancouver/main.cc b/ports/src/vancouver/main.cc index 1e02545d6..4a689664c 100644 --- a/ports/src/vancouver/main.cc +++ b/ports/src/vancouver/main.cc @@ -246,7 +246,9 @@ class Guest_memory }; -class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher, +typedef Vmm::Vcpu_dispatcher Vcpu_handler; + +class Vcpu_dispatcher : public Vcpu_handler, public StaticReceiver { private: @@ -683,7 +685,7 @@ class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher, bool has_vmx, Vmm::Vcpu_thread *vcpu_thread) : - Vmm::Vcpu_dispatcher(STACK_SIZE, cap_connection), + Vcpu_handler(STACK_SIZE, cap_connection), _vcpu(vcpu_lock, unsynchronized_vcpu), _vcpu_thread(vcpu_thread), _guest_memory(guest_memory), diff --git a/ports/src/virtualbox/nova/vcpu.h b/ports/src/virtualbox/nova/vcpu.h index 380fbad83..bb8ff46d5 100644 --- a/ports/src/virtualbox/nova/vcpu.h +++ b/ports/src/virtualbox/nova/vcpu.h @@ -58,7 +58,7 @@ static inline Genode::uint32_t sel_ar_conv_from_nova(Genode::uint16_t v) extern "C" int MMIO2_MAPPED_SYNC(PVM pVM, RTGCPHYS GCPhys, size_t cbWrite); -class Vcpu_handler : public Vmm::Vcpu_dispatcher +class Vcpu_handler : public Vmm::Vcpu_dispatcher { private: @@ -507,7 +507,8 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher Vcpu_handler() : - Vmm::Vcpu_dispatcher(STACK_SIZE, _cap_connection), + Vmm::Vcpu_dispatcher(STACK_SIZE, + _cap_connection), _ec_sel(Genode::cap_map()->insert()), _lock_startup(Genode::Lock::LOCKED), _signal_emt(Genode::Lock::LOCKED),