vmm: parameterize Vcpu_dispatcher
Pre-condition to realize #1129, to be able to let a vCPU handler thread also be a pthread.
This commit is contained in:
parent
512c29c486
commit
4782fd34f6
|
@ -18,6 +18,7 @@ namespace Vmm {
|
||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
class Vcpu_dispatcher;
|
class Vcpu_dispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +26,8 @@ namespace Vmm {
|
||||||
/**
|
/**
|
||||||
* Thread that handles virtualization events of a 'Vmm::Vcpu_thread'
|
* Thread that handles virtualization events of a 'Vmm::Vcpu_thread'
|
||||||
*/
|
*/
|
||||||
class Vmm::Vcpu_dispatcher : public Genode::Thread_base
|
template <class T>
|
||||||
|
class Vmm::Vcpu_dispatcher : public T
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -57,17 +59,30 @@ class Vmm::Vcpu_dispatcher : public Genode::Thread_base
|
||||||
|
|
||||||
Vcpu_dispatcher(size_t stack_size, Cap_connection &cap)
|
Vcpu_dispatcher(size_t stack_size, Cap_connection &cap)
|
||||||
:
|
:
|
||||||
Thread_base("vCPU dispatcher", stack_size),
|
T("vCPU dispatcher", stack_size),
|
||||||
_cap(cap)
|
_cap(cap)
|
||||||
{
|
{
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
/* request creation of a 'local' EC */
|
/* request creation of a 'local' EC */
|
||||||
_tid.ec_sel = Native_thread::INVALID_INDEX - 1;
|
T::_tid.ec_sel = Native_thread::INVALID_INDEX - 1;
|
||||||
Thread_base::start();
|
T::start();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename X>
|
||||||
|
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
|
* Register virtualization event handler
|
||||||
*/
|
*/
|
||||||
|
@ -82,7 +97,7 @@ class Vmm::Vcpu_dispatcher : public Genode::Thread_base
|
||||||
/* Create the portal at the desired selector index */
|
/* Create the portal at the desired selector index */
|
||||||
_cap.rcv_window(exc_base + EV);
|
_cap.rcv_window(exc_base + EV);
|
||||||
|
|
||||||
Native_capability thread_cap(tid().ec_sel);
|
Native_capability thread_cap(T::tid().ec_sel);
|
||||||
Native_capability handler =
|
Native_capability handler =
|
||||||
_cap.alloc(thread_cap, (Nova::mword_t)entry, mtd.value());
|
_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()
|
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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ using Genode::printf;
|
||||||
using Genode::sleep_forever;
|
using Genode::sleep_forever;
|
||||||
|
|
||||||
|
|
||||||
class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher
|
class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher<Genode::Thread_base>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher
|
||||||
|
|
||||||
Vcpu_dispatcher(Cap_connection &cap, Type type)
|
Vcpu_dispatcher(Cap_connection &cap, Type type)
|
||||||
:
|
:
|
||||||
Vmm::Vcpu_dispatcher(STACK_SIZE, cap),
|
Vmm::Vcpu_dispatcher<Genode::Thread_base>(STACK_SIZE, cap),
|
||||||
_vcpu_thread(STACK_SIZE)
|
_vcpu_thread(STACK_SIZE)
|
||||||
{
|
{
|
||||||
using namespace Nova;
|
using namespace Nova;
|
||||||
|
|
|
@ -246,7 +246,9 @@ class Guest_memory
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher,
|
typedef Vmm::Vcpu_dispatcher<Genode::Thread_base> Vcpu_handler;
|
||||||
|
|
||||||
|
class Vcpu_dispatcher : public Vcpu_handler,
|
||||||
public StaticReceiver<Vcpu_dispatcher>
|
public StaticReceiver<Vcpu_dispatcher>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -683,7 +685,7 @@ class Vcpu_dispatcher : public Vmm::Vcpu_dispatcher,
|
||||||
bool has_vmx,
|
bool has_vmx,
|
||||||
Vmm::Vcpu_thread *vcpu_thread)
|
Vmm::Vcpu_thread *vcpu_thread)
|
||||||
:
|
:
|
||||||
Vmm::Vcpu_dispatcher(STACK_SIZE, cap_connection),
|
Vcpu_handler(STACK_SIZE, cap_connection),
|
||||||
_vcpu(vcpu_lock, unsynchronized_vcpu),
|
_vcpu(vcpu_lock, unsynchronized_vcpu),
|
||||||
_vcpu_thread(vcpu_thread),
|
_vcpu_thread(vcpu_thread),
|
||||||
_guest_memory(guest_memory),
|
_guest_memory(guest_memory),
|
||||||
|
|
|
@ -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);
|
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<Genode::Thread_base>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -507,7 +507,8 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher
|
||||||
|
|
||||||
Vcpu_handler()
|
Vcpu_handler()
|
||||||
:
|
:
|
||||||
Vmm::Vcpu_dispatcher(STACK_SIZE, _cap_connection),
|
Vmm::Vcpu_dispatcher<Genode::Thread_base>(STACK_SIZE,
|
||||||
|
_cap_connection),
|
||||||
_ec_sel(Genode::cap_map()->insert()),
|
_ec_sel(Genode::cap_map()->insert()),
|
||||||
_lock_startup(Genode::Lock::LOCKED),
|
_lock_startup(Genode::Lock::LOCKED),
|
||||||
_signal_emt(Genode::Lock::LOCKED),
|
_signal_emt(Genode::Lock::LOCKED),
|
||||||
|
|
Loading…
Reference in New Issue