From 64bfe233d7ff1e8aad8e329e0d16824bc756553e Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Tue, 5 May 2015 13:31:11 +0200 Subject: [PATCH] base: make CAP session upgradeable * Introduce 'Out_of_metadata' exception for capability allocation Ref #1443 --- repos/base-foc/src/core/include/cap_session_component.h | 2 ++ repos/base-linux/src/core/include/cap_session_component.h | 2 ++ repos/base-nova/src/core/include/cap_session_component.h | 2 ++ repos/base-sel4/src/core/include/cap_session_component.h | 2 ++ repos/base/include/cap_session/cap_session.h | 8 +++++++- repos/base/src/core/include/cap_root.h | 7 +++++++ repos/base/src/core/include/cap_session_component.h | 2 ++ 7 files changed, 24 insertions(+), 1 deletion(-) 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 70098ae03..495a48580 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 03aa9498d..c033e640e 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 bbe70693e..62ed2201c 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 6f5c96ab3..8e1969759 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 1c9f3238b..d79637222 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 86a5547e4..b9b30eb1d 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 74c07d7bb..cb518f304 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());