diff --git a/repos/base-foc/src/core/include/vm_session_component.h b/repos/base-foc/src/core/include/vm_session_component.h index 17c3a1f01e..15c8de65c8 100644 --- a/repos/base-foc/src/core/include/vm_session_component.h +++ b/repos/base-foc/src/core/include/vm_session_component.h @@ -125,7 +125,7 @@ class Core::Vm_session_component ** Vm session interface ** **************************/ - Capability create_vcpu(Thread_capability); + Capability create_vcpu(Thread_capability) override; void attach_pic(addr_t) override { /* unused on Fiasco.OC */ } void attach(Dataspace_capability, addr_t, Attach_attr) override; /* vm_session_common.cc */ diff --git a/repos/base-foc/src/lib/base/x86/vm.cc b/repos/base-foc/src/lib/base/x86/vm.cc index 2c626f41ae..72a4af33bb 100644 --- a/repos/base-foc/src/lib/base/x86/vm.cc +++ b/repos/base-foc/src/lib/base/x86/vm.cc @@ -72,8 +72,7 @@ struct Foc_native_vcpu_rpc : Rpc_client, Noncopyable Capability _create_vcpu(Vm_connection &vm, Thread_capability &cap) { - return vm.with_upgrade([&] { - return vm.call(cap); }); + return vm.create_vcpu(cap); } public: diff --git a/repos/base-hw/src/core/vm_session_component.h b/repos/base-hw/src/core/vm_session_component.h index 2eea4e9282..ffc0824851 100644 --- a/repos/base-hw/src/core/vm_session_component.h +++ b/repos/base-hw/src/core/vm_session_component.h @@ -136,7 +136,7 @@ class Core::Vm_session_component void attach_pic(addr_t) override; void detach(addr_t, size_t) override; - Capability create_vcpu(Thread_capability); + Capability create_vcpu(Thread_capability) override; }; #endif /* _CORE__VM_SESSION_COMPONENT_H_ */ diff --git a/repos/base-hw/src/lib/base/vm.cc b/repos/base-hw/src/lib/base/vm.cc index e519056b77..0218bd558a 100644 --- a/repos/base-hw/src/lib/base/vm.cc +++ b/repos/base-hw/src/lib/base/vm.cc @@ -90,8 +90,7 @@ Capability Hw_vcpu::_create_vcpu(Vm_connection &vm, { Thread &tep { *reinterpret_cast(&handler.rpc_ep()) }; - return vm.with_upgrade([&] { - return vm.call(tep.cap()); }); + return vm.create_vcpu(tep.cap()); } diff --git a/repos/base-hw/src/lib/base/x86_64/vm.cc b/repos/base-hw/src/lib/base/x86_64/vm.cc index eb20d519af..f08b48d373 100644 --- a/repos/base-hw/src/lib/base/x86_64/vm.cc +++ b/repos/base-hw/src/lib/base/x86_64/vm.cc @@ -102,8 +102,7 @@ Capability Hw_vcpu::_create_vcpu(Vm_connection &vm, { Thread &tep { *reinterpret_cast(&handler.rpc_ep()) }; - return vm.with_upgrade([&] { - return vm.call(tep.cap()); }); + return vm.create_vcpu(tep.cap()); } diff --git a/repos/base-nova/src/core/include/vm_session_component.h b/repos/base-nova/src/core/include/vm_session_component.h index e86e6636b7..5624ee10e4 100644 --- a/repos/base-nova/src/core/include/vm_session_component.h +++ b/repos/base-nova/src/core/include/vm_session_component.h @@ -173,7 +173,7 @@ class Core::Vm_session_component ** Vm session interface ** **************************/ - Capability create_vcpu(Thread_capability); + Capability create_vcpu(Thread_capability) override; void attach_pic(addr_t) override { /* unused on NOVA */ } void attach(Dataspace_capability, addr_t, Attach_attr) override; diff --git a/repos/base-nova/src/lib/base/vm.cc b/repos/base-nova/src/lib/base/vm.cc index 43603e153b..a4fb5b79e1 100644 --- a/repos/base-nova/src/lib/base/vm.cc +++ b/repos/base-nova/src/lib/base/vm.cc @@ -719,8 +719,7 @@ Capability Nova_vcpu::_create_vcpu(Vm_connection &v { Thread &tep { *reinterpret_cast(&handler.rpc_ep()) }; - return vm.with_upgrade([&] { - return vm.call(tep.cap()); }); + return vm.create_vcpu(tep.cap()); } diff --git a/repos/base-sel4/src/core/include/vm_session_component.h b/repos/base-sel4/src/core/include/vm_session_component.h index 094da243cf..66828e6ea6 100644 --- a/repos/base-sel4/src/core/include/vm_session_component.h +++ b/repos/base-sel4/src/core/include/vm_session_component.h @@ -117,7 +117,7 @@ class Core::Vm_session_component ** Vm session interface ** **************************/ - Capability create_vcpu(Thread_capability); + Capability create_vcpu(Thread_capability) override; void attach_pic(addr_t) override { /* unused on seL4 */ } void attach(Dataspace_capability, addr_t, Attach_attr) override; diff --git a/repos/base-sel4/src/lib/base/x86/vm.cc b/repos/base-sel4/src/lib/base/x86/vm.cc index e263ef9b9a..0bf434d45e 100644 --- a/repos/base-sel4/src/lib/base/x86/vm.cc +++ b/repos/base-sel4/src/lib/base/x86/vm.cc @@ -49,8 +49,7 @@ struct Sel4_native_rpc : Rpc_client, Noncopyable Capability _create_vcpu(Vm_connection &vm, Thread_capability &cap) { - return vm.with_upgrade([&] { - return vm.call(cap); }); + return vm.create_vcpu(cap); } public: diff --git a/repos/base/include/vm_session/connection.h b/repos/base/include/vm_session/connection.h index 054de982b0..cf9d5210e3 100644 --- a/repos/base/include/vm_session/connection.h +++ b/repos/base/include/vm_session/connection.h @@ -133,6 +133,11 @@ struct Genode::Vm_connection : Connection, Rpc_client void attach_pic(addr_t vm_addr) override { call(vm_addr); } + + Capability create_vcpu(Thread_capability tcap) override { + return with_upgrade([&] { + return call(tcap); }); + } }; #endif /* _INCLUDE__VM_SESSION__CONNECTION_H_ */ diff --git a/repos/base/include/vm_session/vm_session.h b/repos/base/include/vm_session/vm_session.h index 1872f9ce3c..ba5258014d 100644 --- a/repos/base/include/vm_session/vm_session.h +++ b/repos/base/include/vm_session/vm_session.h @@ -69,6 +69,7 @@ struct Genode::Vm_session : Session */ virtual void attach_pic(addr_t vm_addr) = 0; + /***************************************** ** Access to kernel-specific interface ** *****************************************/ @@ -78,6 +79,12 @@ struct Genode::Vm_session : Session */ struct Native_vcpu; + /** + * Create a virtual CPU. + */ + virtual Capability create_vcpu(Thread_capability) = 0; + + /********************* ** RPC declaration ** *********************/ diff --git a/repos/os/src/monitor/monitored_vm.h b/repos/os/src/monitor/monitored_vm.h index 89eca6ba4d..000743676c 100644 --- a/repos/os/src/monitor/monitored_vm.h +++ b/repos/os/src/monitor/monitored_vm.h @@ -48,7 +48,7 @@ struct Monitor::Monitored_vm_session : Monitored_rpc_object(vm_addr); } - Capability create_vcpu(Thread_capability thread_cap) + Capability create_vcpu(Thread_capability thread_cap) override { Capability result { };