From 869abe4ec6e881feefaca9fc5fe5011630b95c8e Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Thu, 16 Aug 2012 14:47:08 +0200 Subject: [PATCH] NOVA: make noux_tool_chain happy Multiple calls to get the dataspace capability on NOVA lead to the situation that the caller gets each time a new mapping of the same capability at different indexes. The client/caller assumes to get every time the very same index, e.g. in Noux the index is used to look up structures. Cache the dataspace capability returned via a rm_session for base-nova. --- base-nova/include/rm_session/client.h | 59 +++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 base-nova/include/rm_session/client.h diff --git a/base-nova/include/rm_session/client.h b/base-nova/include/rm_session/client.h new file mode 100644 index 000000000..42673f5c7 --- /dev/null +++ b/base-nova/include/rm_session/client.h @@ -0,0 +1,59 @@ +/* + * \brief Client-side region manager session interface + * \author Christian Helmuth + * \author Alexander Boettcher + * \date 2006-07-11 + */ + +/* + * Copyright (C) 2006-2012 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _INCLUDE__RM_SESSION__CLIENT_H_ +#define _INCLUDE__RM_SESSION__CLIENT_H_ + +#include +#include + +namespace Genode { + + struct Rm_session_client : Rpc_client + { + Dataspace_capability _rm_ds_cap; + + explicit Rm_session_client(Rm_session_capability session) + : Rpc_client(session) { } + + Local_addr attach(Dataspace_capability ds, size_t size, off_t offset, + bool use_local_addr, Local_addr local_addr, + bool executable = false) + { + return call(ds, size, offset, + use_local_addr, local_addr, + executable); + } + + void detach(Local_addr local_addr) { + call(local_addr); } + + Pager_capability add_client(Thread_capability thread) { + return call(thread); } + + void fault_handler(Signal_context_capability handler) { + call(handler); } + + State state() { + return call(); } + + Dataspace_capability dataspace() { + if (!_rm_ds_cap.valid()) + _rm_ds_cap = call(); + return _rm_ds_cap; + } + }; +} + +#endif /* _INCLUDE__RM_SESSION__CLIENT_H_ */