/* * \brief Client-side TRACE session interface * \author Norman Feske * \date 2013-08-12 */ /* * Copyright (C) 2013 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__TRACE_SESSION__CLIENT_H_ #define _INCLUDE__TRACE_SESSION__CLIENT_H_ #include #include #include namespace Genode { namespace Trace { struct Session_client; } } struct Genode::Trace::Session_client : Genode::Rpc_client { private: /** * Shared-memory buffer used for carrying the payload of the * 'subjects()' RPC function. */ struct Argument_buffer { char *base; size_t size; Argument_buffer(Dataspace_capability ds) : base(env()->rm_session()->attach(ds)), size(ds.call()) { } ~Argument_buffer() { env()->rm_session()->detach(base); } }; Argument_buffer _argument_buffer; public: /** * Constructor */ explicit Session_client(Capability session) : Rpc_client(session), _argument_buffer(call()) { } /** * Retrieve subject directory */ size_t subjects(Subject_id *dst, size_t dst_len) { size_t const num_subjects = min(call(), dst_len); memcpy(dst, _argument_buffer.base, dst_len*sizeof(Subject_id)); return num_subjects; } Policy_id alloc_policy(size_t size) { return call(size); } Dataspace_capability policy(Policy_id policy_id) { return call(policy_id); } void unload_policy(Policy_id policy_id) { call(policy_id); } void trace(Subject_id s, Policy_id p, size_t buffer_size) { call(s, p, buffer_size); } void rule(Session_label const &label, Thread_name const &thread, Policy_id policy, size_t buffer_size) { call(label, thread, policy, buffer_size); } void pause(Subject_id subject) { call(subject); } void resume(Subject_id subject) { call(subject); } Subject_info subject_info(Subject_id subject) { return call(subject); } Dataspace_capability buffer(Subject_id subject) { return call(subject); } void free(Subject_id subject) { call(subject); } }; #endif /* _INCLUDE__TRACE_SESSION__CLIENT_H_ */