vm_session: use Callable for with_state

Issue #5420
This commit is contained in:
Norman Feske 2025-01-15 16:36:09 +01:00 committed by Christian Helmuth
parent 2407968242
commit d1c4bc5115
8 changed files with 42 additions and 51 deletions

View File

@ -42,7 +42,6 @@ namespace Foc {
using namespace Genode;
using Exit_config = Vm_connection::Exit_config;
using Call_with_state = Vm_connection::Call_with_state;
enum Virt { VMX, SVM, UNKNOWN };
@ -1341,7 +1340,7 @@ struct Foc_vcpu : Thread, Noncopyable
_wake_up.up();
}
void with_state(Call_with_state &cw)
void with_state(auto const &fn)
{
if (!_dispatching) {
if (Thread::myself() != _ep_handler) {
@ -1374,7 +1373,7 @@ struct Foc_vcpu : Thread, Noncopyable
_state_ready.down();
}
if (cw.call_with_state(_vcpu_state)
if (fn(_vcpu_state)
|| _extra_dispatch_up)
resume();
@ -1416,7 +1415,10 @@ static enum Virt virt_type(Env &env)
** vCPU API **
**************/
void Vm_connection::Vcpu::_with_state(Call_with_state &cw) { static_cast<Foc_native_vcpu_rpc &>(_native_vcpu).vcpu.with_state(cw); }
void Vm_connection::Vcpu::_with_state(With_state::Ft const &fn)
{
static_cast<Foc_native_vcpu_rpc &>(_native_vcpu).vcpu.with_state(fn);
}
Vm_connection::Vcpu::Vcpu(Vm_connection &vm, Allocator &alloc,

View File

@ -27,7 +27,6 @@
using namespace Genode;
using Exit_config = Vm_connection::Exit_config;
using Call_with_state = Vm_connection::Call_with_state;
/****************************
@ -56,8 +55,7 @@ struct Hw_vcpu : Rpc_client<Vm_session::Native_vcpu>, Noncopyable
Hw_vcpu(Env &, Vm_connection &, Vcpu_handler_base &);
void with_state(Call_with_state &);
void with_state(auto const &);
};
@ -72,7 +70,7 @@ Hw_vcpu::Hw_vcpu(Env &env, Vm_connection &vm, Vcpu_handler_base &handler)
}
void Hw_vcpu::with_state(Call_with_state &cw)
void Hw_vcpu::with_state(auto const &fn)
{
if (Thread::myself() != _ep_handler) {
error("vCPU state requested outside of vcpu_handler EP");
@ -80,7 +78,7 @@ void Hw_vcpu::with_state(Call_with_state &cw)
}
Kernel::pause_vm(Capability_space::capid(_kernel_vcpu));
if (cw.call_with_state(_local_state()))
if (fn(_local_state()))
Kernel::run_vm(Capability_space::capid(_kernel_vcpu));
}
@ -98,7 +96,10 @@ Capability<Vm_session::Native_vcpu> Hw_vcpu::_create_vcpu(Vm_connection &vm,
** vCPU API **
**************/
void Vm_connection::Vcpu::_with_state(Call_with_state &cw) { static_cast<Hw_vcpu &>(_native_vcpu).with_state(cw); }
void Vm_connection::Vcpu::_with_state(With_state::Ft const &fn)
{
static_cast<Hw_vcpu &>(_native_vcpu).with_state(fn);
}
Vm_connection::Vcpu::Vcpu(Vm_connection &vm, Allocator &alloc,

View File

@ -29,7 +29,6 @@
using namespace Genode;
using Exit_config = Vm_connection::Exit_config;
using Call_with_state = Vm_connection::Call_with_state;
/****************************
@ -58,7 +57,7 @@ struct Hw_vcpu : Rpc_client<Vm_session::Native_vcpu>, Noncopyable
Hw_vcpu(Env &, Vm_connection &, Vcpu_handler_base &);
void with_state(Call_with_state &);
void with_state(auto const &fn);
};
@ -84,7 +83,7 @@ void Hw_vcpu::_run()
}
void Hw_vcpu::with_state(Call_with_state &cw)
void Hw_vcpu::with_state(auto const &fn)
{
if (Thread::myself() != _ep_handler) {
error("vCPU state requested outside of vcpu_handler EP");
@ -92,7 +91,7 @@ void Hw_vcpu::with_state(Call_with_state &cw)
}
Kernel::pause_vm(Capability_space::capid(_kernel_vcpu));
if(cw.call_with_state(_local_state()))
if (fn(_local_state()))
_run();
}
@ -110,7 +109,10 @@ Capability<Vm_session::Native_vcpu> Hw_vcpu::_create_vcpu(Vm_connection &vm,
** vCPU API **
**************/
void Vm_connection::Vcpu::_with_state(Call_with_state &cw) { static_cast<Hw_vcpu &>(_native_vcpu).with_state(cw); }
void Vm_connection::Vcpu::_with_state(With_state::Ft const &fn)
{
static_cast<Hw_vcpu &>(_native_vcpu).with_state(fn);
}
Vm_connection::Vcpu::Vcpu(Vm_connection &vm, Allocator &alloc,

View File

@ -35,7 +35,6 @@
using namespace Genode;
using Exit_config = Vm_connection::Exit_config;
using Call_with_state = Vm_connection::Call_with_state;
/******************************
@ -163,7 +162,7 @@ struct Nova_vcpu : Rpc_client<Vm_session::Native_vcpu>, Noncopyable
call<Rpc_startup>();
}
void with_state(Call_with_state &cw);
void with_state(auto const &fn);
};
@ -601,7 +600,7 @@ void Nova_vcpu::_handle_exit(Nova::Utcb &utcb)
}
void Nova_vcpu::with_state(Call_with_state &cw)
void Nova_vcpu::with_state(auto const &fn)
{
Thread *myself = Thread::myself();
bool remote = (_dispatching != myself);
@ -626,7 +625,7 @@ void Nova_vcpu::with_state(Call_with_state &cw)
_read_nova_state(utcb);
}
_resume = cw.call_with_state(_vcpu_state);
_resume = fn(_vcpu_state);
if (remote) {
_write_nova_state(utcb);
@ -762,7 +761,10 @@ Nova_vcpu::Nova_vcpu(Env &env, Vm_connection &vm, Allocator &alloc,
** vCPU API **
**************/
void Vm_connection::Vcpu::_with_state(Call_with_state &cw) { static_cast<Nova_vcpu &>(_native_vcpu).with_state(cw); }
void Vm_connection::Vcpu::_with_state(With_state::Ft const &fn)
{
static_cast<Nova_vcpu &>(_native_vcpu).with_state(fn);
}
Vm_connection::Vcpu::Vcpu(Vm_connection &vm, Allocator &alloc,

View File

@ -38,7 +38,6 @@
using namespace Genode;
using Exit_config = Vm_connection::Exit_config;
using Call_with_state = Vm_connection::Call_with_state;
struct Sel4_vcpu;
@ -810,7 +809,7 @@ struct Sel4_vcpu : Genode::Thread, Noncopyable
_wake_up.up();
}
void with_state(Call_with_state &cw)
void with_state(auto const &fn)
{
if (!_dispatching) {
if (Thread::myself() != _ep_handler) {
@ -839,7 +838,7 @@ struct Sel4_vcpu : Genode::Thread, Noncopyable
_state_ready.down();
}
if (cw.call_with_state(_state)
if (fn(_state)
|| _extra_dispatch_up)
resume();
@ -859,11 +858,15 @@ struct Sel4_vcpu : Genode::Thread, Noncopyable
Sel4_native_rpc * rpc() { return &*_rpc; }
};
/**************
** vCPU API **
**************/
void Vm_connection::Vcpu::_with_state(Call_with_state &cw) { static_cast<Sel4_native_rpc &>(_native_vcpu).vcpu.with_state(cw); }
void Vm_connection::Vcpu::_with_state(With_state::Ft const &fn)
{
static_cast<Sel4_native_rpc &>(_native_vcpu).vcpu.with_state(fn);
}
Vm_connection::Vcpu::Vcpu(Vm_connection &vm, Allocator &alloc,

View File

@ -19,6 +19,7 @@
#ifndef _INCLUDE__VM_SESSION__CONNECTION_H_
#define _INCLUDE__VM_SESSION__CONNECTION_H_
#include <util/callable.h>
#include <base/connection.h>
#include <base/rpc_client.h>
#include <vm_session/vm_session.h>
@ -49,11 +50,7 @@ struct Genode::Vm_connection : Connection<Vm_session>, Rpc_client<Vm_session>
/* for example OMIT_FPU_ON_IRQ */
};
struct Call_with_state : Genode::Interface
{
virtual bool call_with_state(Vcpu_state &) = 0;
};
using With_state = Callable<bool, Vcpu_state &>;
/**
* Virtual CPU
@ -63,28 +60,13 @@ struct Genode::Vm_connection : Connection<Vm_session>, Rpc_client<Vm_session>
*/
struct Vcpu : Genode::Noncopyable
{
void _with_state(Call_with_state &);
void _with_state(With_state::Ft const &);
void with_state(auto const &fn) { _with_state(With_state::Fn { fn }); }
Native_vcpu &_native_vcpu;
Vcpu(Vm_connection &, Allocator &, Vcpu_handler_base &, Exit_config const &);
template <typename FN>
void with_state(FN const &fn)
{
struct Untyped_fn : Call_with_state
{
FN const &_fn;
Untyped_fn(FN const &fn) : _fn(fn) {}
bool call_with_state(Vcpu_state &state) override
{
return _fn(state);
}
} untyped_fn(fn);
_with_state(untyped_fn);
}
};
friend class Vcpu;

View File

@ -92,7 +92,7 @@ _ZN6Genode13Shared_objectC1ERNS_3EnvERNS_9AllocatorEPKcNS0_4BindENS0_4KeepE T
_ZN6Genode13Shared_objectC2ERNS_3EnvERNS_9AllocatorEPKcNS0_4BindENS0_4KeepE T
_ZN6Genode13Shared_objectD1Ev T
_ZN6Genode13Shared_objectD2Ev T
_ZN6Genode13Vm_connection4Vcpu11_with_stateERNS0_15Call_with_stateE T
_ZN6Genode13Vm_connection4Vcpu11_with_stateERKNS_8CallableIbJRNS_10Vcpu_stateEEE2FtE T
_ZN6Genode13Vm_connection4VcpuC1ERS0_RNS_9AllocatorERNS_17Vcpu_handler_baseERKNS0_11Exit_configE T
_ZN6Genode13Vm_connection4VcpuC2ERS0_RNS_9AllocatorERNS_17Vcpu_handler_baseERKNS0_11Exit_configE T
_ZN6Genode13Xml_generator4NodeC1ERS0_PKcRKNS1_3_FnE T

View File

@ -24,11 +24,10 @@ static Vm_session::Native_vcpu dummy;
struct Genode::Vcpu_state { };
void Vm_connection::Vcpu::_with_state(Call_with_state &) {};
void Vm_connection::Vcpu::_with_state(With_state::Ft const &) { };
Vm_connection::Vcpu::Vcpu(Vm_connection &, Allocator &,
Vcpu_handler_base &, Exit_config const &)
:
_native_vcpu(dummy)
{
}
{ }