diff --git a/repos/ports/src/noux/rm_session_component.h b/repos/ports/src/noux/rm_session_component.h index d607697ab..d2f8d6931 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)