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 96d7ee664f..8100a6b8de 100644 --- a/repos/base-foc/src/core/include/vm_session_component.h +++ b/repos/base-foc/src/core/include/vm_session_component.h @@ -108,6 +108,8 @@ class Genode::Vm_session_component void attach_pic(addr_t) override { } void detach(addr_t, size_t) override; Vcpu_id _create_vcpu(Thread_capability); + Capability _native_vcpu(Vcpu_id) { + return Capability(); } }; #endif /* _CORE__VM_SESSION_COMPONENT_H_ */ diff --git a/repos/base-hw/src/core/vm_session_component.cc b/repos/base-hw/src/core/vm_session_component.cc index 4f7aa91533..477d361842 100644 --- a/repos/base-hw/src/core/vm_session_component.cc +++ b/repos/base-hw/src/core/vm_session_component.cc @@ -55,6 +55,13 @@ void Vm_session_component::_pause(Vcpu_id id) } +Capability Vm_session_component::_native_vcpu(Vcpu_id id) +{ + if (!_valid_id(id)) { return Capability(); } + return reinterpret_cap_cast(_vcpus[id.id].kobj.cap()); +} + + void Vm_session_component::_exception_handler(Signal_context_capability handler, Vcpu_id id) { diff --git a/repos/base-hw/src/core/vm_session_component.h b/repos/base-hw/src/core/vm_session_component.h index 19dcc15061..1339fd765b 100644 --- a/repos/base-hw/src/core/vm_session_component.h +++ b/repos/base-hw/src/core/vm_session_component.h @@ -107,12 +107,13 @@ class Genode::Vm_session_component void attach_pic(addr_t) override; void detach(addr_t, size_t) override; - Dataspace_capability _cpu_state(Vcpu_id); - Vcpu_id _create_vcpu(Thread_capability); - void _exception_handler(Signal_context_capability, - Vcpu_id); - void _run(Vcpu_id); - void _pause(Vcpu_id); + Dataspace_capability _cpu_state(Vcpu_id); + Vcpu_id _create_vcpu(Thread_capability); + void _exception_handler(Signal_context_capability, + Vcpu_id); + void _run(Vcpu_id); + void _pause(Vcpu_id); + Capability _native_vcpu(Vcpu_id); }; #endif /* _CORE__VM_SESSION_COMPONENT_H_ */ 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 7ed695fdeb..1598935de7 100644 --- a/repos/base-nova/src/core/include/vm_session_component.h +++ b/repos/base-nova/src/core/include/vm_session_component.h @@ -179,6 +179,8 @@ class Genode::Vm_session_component void attach_pic(addr_t) override {} void detach(addr_t, size_t) override; Vcpu_id _create_vcpu(Thread_capability); + Capability _native_vcpu(Vcpu_id) { + return Capability(); } }; #endif /* _CORE__VM_SESSION_COMPONENT_H_ */ 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 e1348df2ad..618da08afb 100644 --- a/repos/base-sel4/src/core/include/vm_session_component.h +++ b/repos/base-sel4/src/core/include/vm_session_component.h @@ -121,6 +121,8 @@ class Genode::Vm_session_component void attach_pic(addr_t) override {} void detach(addr_t, size_t) override; Vcpu_id _create_vcpu(Thread_capability); + Capability _native_vcpu(Vcpu_id) { + return Capability(); } }; #endif /* _CORE__VM_SESSION_COMPONENT_H_ */ diff --git a/repos/base/include/vm_session/vm_session.h b/repos/base/include/vm_session/vm_session.h index 0a2c6b325f..3f9641a0d3 100644 --- a/repos/base/include/vm_session/vm_session.h +++ b/repos/base/include/vm_session/vm_session.h @@ -78,6 +78,17 @@ struct Genode::Vm_session : Session */ virtual void attach_pic(addr_t vm_addr) = 0; + + /***************************************** + ** Access to kernel-specific interface ** + *****************************************/ + + /** + * Common base class of kernel-specific CPU interfaces + */ + struct Native_vcpu : Interface { }; + + /********************* ** RPC declaration ** *********************/ @@ -87,6 +98,7 @@ struct Genode::Vm_session : Session Signal_context_capability, Vcpu_id); GENODE_RPC(Rpc_run, void, _run, Vcpu_id); GENODE_RPC(Rpc_pause, void, _pause, Vcpu_id); + GENODE_RPC(Rpc_native_vcpu, Capability, _native_vcpu, Vcpu_id); GENODE_RPC_THROW(Rpc_attach, void, attach, GENODE_TYPE_LIST(Out_of_ram, Out_of_caps, Region_conflict, Invalid_dataspace), @@ -99,7 +111,7 @@ struct Genode::Vm_session : Session GENODE_RPC_INTERFACE(Rpc_cpu_state, Rpc_exception_handler, Rpc_run, Rpc_pause, Rpc_attach, Rpc_detach, - Rpc_attach_pic, Rpc_create_vcpu); + Rpc_attach_pic, Rpc_create_vcpu, Rpc_native_vcpu); }; #endif /* _INCLUDE__VM_SESSION__VM_SESSION_H_ */