diff --git a/repos/base-foc/src/core/include/cap_session_component.h b/repos/base-foc/src/core/include/cap_session_component.h index 70098ae03d..495a485801 100644 --- a/repos/base-foc/src/core/include/cap_session_component.h +++ b/repos/base-foc/src/core/include/cap_session_component.h @@ -26,6 +26,8 @@ namespace Genode { Cap_session_component(Allocator *md_alloc, const char *args) {} + void upgrade_ram_quota(size_t ram_quota) { } + Native_capability alloc(Native_capability ep); void free(Native_capability cap); diff --git a/repos/base-linux/src/core/include/cap_session_component.h b/repos/base-linux/src/core/include/cap_session_component.h index 03aa9498de..c033e640ec 100644 --- a/repos/base-linux/src/core/include/cap_session_component.h +++ b/repos/base-linux/src/core/include/cap_session_component.h @@ -36,6 +36,8 @@ namespace Genode { Cap_session_component(Allocator *md_alloc, const char *args) {} + void upgrade_ram_quota(size_t ram_quota) { } + Native_capability alloc(Native_capability ep) { Lock::Guard lock_guard(_lock()); diff --git a/repos/base-nova/src/core/include/cap_session_component.h b/repos/base-nova/src/core/include/cap_session_component.h index bbe70693e8..62ed2201ca 100644 --- a/repos/base-nova/src/core/include/cap_session_component.h +++ b/repos/base-nova/src/core/include/cap_session_component.h @@ -62,6 +62,8 @@ namespace Genode { } } + void upgrade_ram_quota(size_t ram_quota) { } + Native_capability alloc(Native_capability ep, addr_t entry, addr_t mtd) { diff --git a/repos/base-sel4/src/core/include/cap_session_component.h b/repos/base-sel4/src/core/include/cap_session_component.h index 6f5c96ab3c..8e19697592 100644 --- a/repos/base-sel4/src/core/include/cap_session_component.h +++ b/repos/base-sel4/src/core/include/cap_session_component.h @@ -24,6 +24,8 @@ struct Genode::Cap_session_component : Rpc_object { Cap_session_component(Allocator *md_alloc, const char *args) {} + void upgrade_ram_quota(size_t ram_quota) { } + Native_capability alloc(Native_capability ep); void free(Native_capability cap); diff --git a/repos/base/include/cap_session/cap_session.h b/repos/base/include/cap_session/cap_session.h index 1c9f3238be..d79637222e 100644 --- a/repos/base/include/cap_session/cap_session.h +++ b/repos/base/include/cap_session/cap_session.h @@ -18,6 +18,7 @@ #ifndef _INCLUDE__CAP_SESSION__CAP_SESSION_H_ #define _INCLUDE__CAP_SESSION__CAP_SESSION_H_ +#include #include #include @@ -26,6 +27,8 @@ namespace Genode { struct Cap_session; } struct Genode::Cap_session : Session { + class Out_of_metadata : public Exception { }; + static const char *service_name() { return "CAP"; } virtual ~Cap_session() { } @@ -35,6 +38,8 @@ struct Genode::Cap_session : Session * * \param ep entry point that will use this capability * + * \throw Out_of_metadata if meta-data backing store is exhausted + * * \return new userland capability */ virtual Native_capability alloc(Native_capability ep) = 0; @@ -51,7 +56,8 @@ struct Genode::Cap_session : Session ** RPC declaration ** *********************/ - GENODE_RPC(Rpc_alloc, Native_capability, alloc, Native_capability); + GENODE_RPC_THROW(Rpc_alloc, Native_capability, alloc, + GENODE_TYPE_LIST(Out_of_metadata), Native_capability); GENODE_RPC(Rpc_free, void, free, Native_capability); GENODE_RPC_INTERFACE(Rpc_alloc, Rpc_free); }; diff --git a/repos/base/src/core/include/cap_root.h b/repos/base/src/core/include/cap_root.h index 86a5547e47..b9b30eb1da 100644 --- a/repos/base/src/core/include/cap_root.h +++ b/repos/base/src/core/include/cap_root.h @@ -33,6 +33,13 @@ namespace Genode { Cap_session_component *_create_session(const char *args) { return new (md_alloc()) Cap_session_component(_md_alloc, args); } + void _upgrade_session(Cap_session_component *c, const char *args) + { + size_t ram_quota = + Arg_string::find_arg(args, "ram_quota").ulong_value(0); + c->upgrade_ram_quota(ram_quota); + } + public: /** diff --git a/repos/base/src/core/include/cap_session_component.h b/repos/base/src/core/include/cap_session_component.h index 74c07d7bb6..cb518f3043 100644 --- a/repos/base/src/core/include/cap_session_component.h +++ b/repos/base/src/core/include/cap_session_component.h @@ -36,6 +36,8 @@ namespace Genode { Cap_session_component(Allocator *md_alloc, const char *args) {} + void upgrade_ram_quota(size_t ram_quota) { } + Native_capability alloc(Native_capability ep) { Lock::Guard lock_guard(_lock());