From cdf57b60f90cd2026e790983e2c248212f82e164 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Thu, 14 Apr 2016 15:14:53 +0200 Subject: [PATCH] noux: keep cap of last pager --- repos/ports/src/noux/rm_session_component.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/repos/ports/src/noux/rm_session_component.h b/repos/ports/src/noux/rm_session_component.h index d607697ab3..d2f8d69313 100644 --- a/repos/ports/src/noux/rm_session_component.h +++ b/repos/ports/src/noux/rm_session_component.h @@ -93,6 +93,16 @@ class Noux::Rm_session_component : public Rpc_object Dataspace_registry &_ds_registry; + /** + * Remember last pager capability returned by add_client + * + * On NOVA, we need to preserve a local copy of the pager capability + * until we have passed to a call of 'Cpu_session::set_pager'. + * Otherwise, NOVA would transitively revoke the capability that we + * handed out to our child. + */ + Pager_capability _last_pager; + public: /** @@ -329,8 +339,11 @@ class Noux::Rm_session_component : public Rpc_object Pager_capability add_client(Thread_capability thread) { return retry( - [&] () { return _rm.add_client(thread); }, - [&] () { Genode::env()->parent()->upgrade(_rm, "ram_quota=8192"); }); + [&] () { + Pager_capability cap = _rm.add_client(thread); + _last_pager = cap; + return cap; + }, [&] () { Genode::env()->parent()->upgrade(_rm, "ram_quota=8192"); }); } void remove_client(Pager_capability pager)