diff --git a/base-nova/include/nova_cpu_session/client.h b/base-nova/include/cpu_session/client.h similarity index 72% rename from base-nova/include/nova_cpu_session/client.h rename to base-nova/include/cpu_session/client.h index 3b1cfc57cd..a65ca609e5 100644 --- a/base-nova/include/nova_cpu_session/client.h +++ b/base-nova/include/cpu_session/client.h @@ -11,17 +11,21 @@ * under the terms of the GNU General Public License version 2. */ -#ifndef _INCLUDE__NOVA_CPU_SESSION__CLIENT_H_ -#define _INCLUDE__NOVA_CPU_SESSION__CLIENT_H_ +#ifndef _INCLUDE__CPU_SESSION__CLIENT_H_ +#define _INCLUDE__CPU_SESSION__CLIENT_H_ + +#include +#include + +#include -#include #include namespace Genode { - struct Nova_cpu_session_client : Rpc_client + struct Cpu_session_client : Rpc_client { - explicit Nova_cpu_session_client(Cpu_session_capability session) + explicit Cpu_session_client(Cpu_session_capability session) : Rpc_client(static_cap_cast(session)) { } Thread_capability create_thread(Name const &name, addr_t utcb = 0) { @@ -46,8 +50,17 @@ namespace Genode { int start(Thread_capability thread, addr_t ip, addr_t sp) { return call(thread, ip, sp); } - void pause(Thread_capability thread) { - call(thread); } + void pause(Thread_capability thread) + { + Native_capability block = call(thread); + if (!block.valid()) + return; + + Nova::sm_ctrl(block.local_name(), Nova::SEMAPHORE_DOWN); + + Nova::revoke(Nova::Obj_crd(block.local_name(), 0)); + cap_selector_allocator()->free(block.local_name(), 0); + } void resume(Thread_capability thread) { call(thread); } @@ -75,8 +88,12 @@ namespace Genode { exc_base, vcpu); } + private: + + Native_capability pause_sync(Thread_capability target) { + return Native_capability::invalid_cap(); } }; } -#endif /* _INCLUDE__NOVA_CPU_SESSION__CLIENT_H_ */ +#endif /* _INCLUDE__CPU_SESSION__CLIENT_H_ */ diff --git a/base-nova/include/nova_cpu_session/connection.h b/base-nova/include/nova_cpu_session/connection.h index 1398dec5bf..0cce751293 100644 --- a/base-nova/include/nova_cpu_session/connection.h +++ b/base-nova/include/nova_cpu_session/connection.h @@ -14,12 +14,12 @@ #ifndef _INCLUDE__NOVA_CPU_SESSION__CONNECTION_H_ #define _INCLUDE__NOVA_CPU_SESSION__CONNECTION_H_ -#include +#include #include namespace Genode { - struct Nova_cpu_connection : Connection, Nova_cpu_session_client + struct Nova_cpu_connection : Connection, Cpu_session_client { /** * Constructor @@ -33,7 +33,7 @@ namespace Genode { Connection( session("priority=0x%lx, ram_quota=32K, label=\"%s\"", priority, label)), - Nova_cpu_session_client(cap()) { } + Cpu_session_client(cap()) { } }; } diff --git a/base-nova/include/nova_cpu_session/nova_cpu_session.h b/base-nova/include/nova_cpu_session/nova_cpu_session.h index 4112c7dc3f..c5dd45e3fb 100644 --- a/base-nova/include/nova_cpu_session/nova_cpu_session.h +++ b/base-nova/include/nova_cpu_session/nova_cpu_session.h @@ -29,6 +29,9 @@ namespace Genode { virtual Native_capability native_cap(Thread_capability cap) = 0; + virtual + Native_capability pause_sync(Thread_capability) = 0; + /********************* ** RPC declaration ** *********************/ @@ -37,9 +40,11 @@ namespace Genode { Thread_capability, addr_t, addr_t, addr_t, bool); GENODE_RPC(Rpc_native_cap, Native_capability, native_cap, Thread_capability); + GENODE_RPC(Rpc_pause_sync, Native_capability, pause_sync, + Thread_capability); GENODE_RPC_INTERFACE_INHERIT(Cpu_session, Rpc_native_cap, - Rpc_start_exc_base_vcpu); + Rpc_start_exc_base_vcpu, Rpc_pause_sync); }; } diff --git a/base-nova/src/core/cpu_session_extension.cc b/base-nova/src/core/cpu_session_extension.cc index 3d2dd2e6b7..094e6d28bd 100644 --- a/base-nova/src/core/cpu_session_extension.cc +++ b/base-nova/src/core/cpu_session_extension.cc @@ -40,3 +40,13 @@ Cpu_session_component::start_exc_base_vcpu(Thread_capability thread_cap, return thread->platform_thread()->start((void *)ip, (void *)sp, exc_base, vcpu); } + +Native_capability +Cpu_session_component::pause_sync(Thread_capability target_thread_cap) +{ + Cpu_thread_component *thread = _lookup_thread(target_thread_cap); + if (!thread || !thread->platform_thread()) + return Native_capability::invalid_cap(); + + return thread->platform_thread()->pause(); +} diff --git a/base-nova/src/core/include/cpu_session_component.h b/base-nova/src/core/include/cpu_session_component.h index c3c85858e6..24a9d10c76 100644 --- a/base-nova/src/core/include/cpu_session_component.h +++ b/base-nova/src/core/include/cpu_session_component.h @@ -150,6 +150,7 @@ namespace Genode { int start_exc_base_vcpu(Thread_capability, addr_t, addr_t, addr_t, bool); Native_capability native_cap(Thread_capability); + Native_capability pause_sync(Thread_capability); }; } diff --git a/base-nova/src/core/include/platform_thread.h b/base-nova/src/core/include/platform_thread.h index ba860bdad1..0c87aee258 100644 --- a/base-nova/src/core/include/platform_thread.h +++ b/base-nova/src/core/include/platform_thread.h @@ -75,7 +75,7 @@ namespace Genode { /** * Pause this thread */ - void pause(); + Native_capability pause(); /** * Resume this thread diff --git a/base-nova/src/core/platform_thread.cc b/base-nova/src/core/platform_thread.cc index 5cb37324df..bd62b082fa 100644 --- a/base-nova/src/core/platform_thread.cc +++ b/base-nova/src/core/platform_thread.cc @@ -200,7 +200,11 @@ int Platform_thread::start(void *ip, void *sp, addr_t exc_base, bool vcpu) } -void Platform_thread::pause() { PDBG("not implemented"); } +Native_capability Platform_thread::pause() +{ + PDBG("not implemented"); + return Native_capability::invalid_cap(); +} void Platform_thread::resume()