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()