From a2b15349fd4d152f0333f2ebfbcb855ce2576e3d Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Fri, 9 Aug 2013 11:11:03 +0200 Subject: [PATCH] base: Add tracing support to CPU session interface --- base-foc/include/foc_cpu_session/client.h | 12 +++++ .../src/core/include/cpu_session_component.h | 4 ++ base-linux/include/linux_cpu_session/client.h | 12 +++++ .../src/core/include/cpu_session_component.h | 4 ++ base-nova/include/cpu_session/client.h | 12 +++++ .../src/core/include/cpu_session_component.h | 4 ++ base/include/cpu_session/client.h | 12 +++++ base/include/cpu_session/cpu_session.h | 46 ++++++++++++++++++- base/src/core/cpu_session_component.cc | 28 +++++++++++ base/src/core/include/cpu_session_component.h | 4 ++ .../app/gdb_monitor/cpu_session_component.cc | 24 ++++++++++ .../app/gdb_monitor/cpu_session_component.h | 4 ++ ports/src/noux/cpu_session_component.h | 12 +++++ 13 files changed, 177 insertions(+), 1 deletion(-) diff --git a/base-foc/include/foc_cpu_session/client.h b/base-foc/include/foc_cpu_session/client.h index 7b93eeb5e..98168f34d 100644 --- a/base-foc/include/foc_cpu_session/client.h +++ b/base-foc/include/foc_cpu_session/client.h @@ -73,6 +73,18 @@ namespace Genode { void affinity(Thread_capability thread, Affinity::Location location) { call(thread, location); } + Dataspace_capability trace_control() { + return call(); } + + unsigned trace_control_index(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_buffer(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_policy(Thread_capability thread) { + return call(thread); } + void enable_vcpu(Thread_capability cap, addr_t vcpu_state) { call(cap, vcpu_state); } diff --git a/base-foc/src/core/include/cpu_session_component.h b/base-foc/src/core/include/cpu_session_component.h index 158fb27f0..6f38006a7 100644 --- a/base-foc/src/core/include/cpu_session_component.h +++ b/base-foc/src/core/include/cpu_session_component.h @@ -164,6 +164,10 @@ namespace Genode { void exception_handler(Thread_capability, Signal_context_capability); Affinity::Space affinity_space() const; void affinity(Thread_capability, Affinity::Location); + Dataspace_capability trace_control(); + unsigned trace_control_index(Thread_capability); + Dataspace_capability trace_buffer(Thread_capability); + Dataspace_capability trace_policy(Thread_capability); /*********************************** diff --git a/base-linux/include/linux_cpu_session/client.h b/base-linux/include/linux_cpu_session/client.h index f6e61cd8a..bf827b0f0 100644 --- a/base-linux/include/linux_cpu_session/client.h +++ b/base-linux/include/linux_cpu_session/client.h @@ -66,6 +66,18 @@ namespace Genode { void affinity(Thread_capability thread, Affinity::Location location) { call(thread, location); } + Dataspace_capability trace_control() { + return call(); } + + unsigned trace_control_index(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_buffer(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_policy(Thread_capability thread) { + return call(thread); } + /***************************** * Linux-specific extension ** diff --git a/base-linux/src/core/include/cpu_session_component.h b/base-linux/src/core/include/cpu_session_component.h index c6695f3ff..02ddee441 100644 --- a/base-linux/src/core/include/cpu_session_component.h +++ b/base-linux/src/core/include/cpu_session_component.h @@ -155,6 +155,10 @@ namespace Genode { void exception_handler(Thread_capability, Signal_context_capability); Affinity::Space affinity_space() const; void affinity(Thread_capability, Affinity::Location); + Dataspace_capability trace_control(); + unsigned trace_control_index(Thread_capability); + Dataspace_capability trace_buffer(Thread_capability); + Dataspace_capability trace_policy(Thread_capability); /******************************* diff --git a/base-nova/include/cpu_session/client.h b/base-nova/include/cpu_session/client.h index 50d7423a5..8650c2f9b 100644 --- a/base-nova/include/cpu_session/client.h +++ b/base-nova/include/cpu_session/client.h @@ -82,6 +82,18 @@ namespace Genode { void affinity(Thread_capability thread, Affinity::Location location) { call(thread, location); } + Dataspace_capability trace_control() { + return call(); } + + unsigned trace_control_index(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_buffer(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_policy(Thread_capability thread) { + return call(thread); } + private: Native_capability pause_sync(Thread_capability target) { diff --git a/base-nova/src/core/include/cpu_session_component.h b/base-nova/src/core/include/cpu_session_component.h index 3662c6f0f..ca4ee2879 100644 --- a/base-nova/src/core/include/cpu_session_component.h +++ b/base-nova/src/core/include/cpu_session_component.h @@ -161,6 +161,10 @@ namespace Genode { void exception_handler(Thread_capability, Signal_context_capability); Affinity::Space affinity_space() const; void affinity(Thread_capability, Affinity::Location); + Dataspace_capability trace_control(); + unsigned trace_control_index(Thread_capability); + Dataspace_capability trace_buffer(Thread_capability); + Dataspace_capability trace_policy(Thread_capability); /****************************** diff --git a/base/include/cpu_session/client.h b/base/include/cpu_session/client.h index b3ecb7ac2..a50222905 100644 --- a/base/include/cpu_session/client.h +++ b/base/include/cpu_session/client.h @@ -65,6 +65,18 @@ namespace Genode { void affinity(Thread_capability thread, Affinity::Location location) { call(thread, location); } + + Dataspace_capability trace_control() { + return call(); } + + unsigned trace_control_index(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_buffer(Thread_capability thread) { + return call(thread); } + + Dataspace_capability trace_policy(Thread_capability thread) { + return call(thread); } }; } diff --git a/base/include/cpu_session/cpu_session.h b/base/include/cpu_session/cpu_session.h index 7f338627f..1d933aff2 100644 --- a/base/include/cpu_session/cpu_session.h +++ b/base/include/cpu_session/cpu_session.h @@ -222,6 +222,42 @@ namespace Genode { return (prio*pf_prio_limit)/Cpu_session::PRIORITY_LIMIT; } + /** + * Request trace control dataspace + * + * The trace-control dataspace is used to propagate tracing + * control information from core to the threads of a CPU session. + * + * The trace-control dataspace is accounted to the CPU session. + */ + virtual Dataspace_capability trace_control() = 0; + + /** + * Request index of a trace control block for given thread + * + * The trace control dataspace contains the control blocks for + * all threads of the CPU session. Each thread gets assigned a + * different index by the CPU service. + */ + virtual unsigned trace_control_index(Thread_capability thread) = 0; + + /** + * Request trace buffer for the specified thread + * + * The trace buffer is not accounted to the CPU session. It is + * owned by a TRACE session. + */ + virtual Dataspace_capability trace_buffer(Thread_capability thread) = 0; + + /** + * Request trace policy + * + * The trace policy buffer is not accounted to the CPU session. It + * is owned by a TRACE session. + */ + virtual Dataspace_capability trace_policy(Thread_capability thread) = 0; + + /********************* ** RPC declaration ** *********************/ @@ -247,6 +283,10 @@ namespace Genode { GENODE_RPC(Rpc_single_step, void, single_step, Thread_capability, bool); GENODE_RPC(Rpc_affinity_space, Affinity::Space, affinity_space); GENODE_RPC(Rpc_affinity, void, affinity, Thread_capability, Affinity::Location); + GENODE_RPC(Rpc_trace_control, Dataspace_capability, trace_control); + GENODE_RPC(Rpc_trace_control_index, unsigned, trace_control_index, Thread_capability); + GENODE_RPC(Rpc_trace_buffer, Dataspace_capability, trace_buffer, Thread_capability); + GENODE_RPC(Rpc_trace_policy, Dataspace_capability, trace_policy, Thread_capability); /* * 'GENODE_RPC_INTERFACE' declaration done manually @@ -270,8 +310,12 @@ namespace Genode { Meta::Type_tuple - > > > > > > > > > > > > > Rpc_functions; + > > > > > > > > > > > > > > > > > Rpc_functions; }; } diff --git a/base/src/core/cpu_session_component.cc b/base/src/core/cpu_session_component.cc index 18233bb95..7cd975230 100644 --- a/base/src/core/cpu_session_component.cc +++ b/base/src/core/cpu_session_component.cc @@ -213,6 +213,34 @@ void Cpu_session_component::affinity(Thread_capability thread_cap, } +Dataspace_capability Cpu_session_component::trace_control() +{ + /* not implemented */ + return Dataspace_capability(); +} + + +unsigned Cpu_session_component::trace_control_index(Thread_capability thread) +{ + /* not implemented */ + return 0; +} + + +Dataspace_capability Cpu_session_component::trace_buffer(Thread_capability thread) +{ + /* not implemented */ + return Dataspace_capability(); +} + + +Dataspace_capability Cpu_session_component::trace_policy(Thread_capability thread) +{ + /* not implemented */ + return Dataspace_capability(); +} + + Cpu_session_component::Cpu_session_component(Rpc_entrypoint *thread_ep, Pager_entrypoint *pager_ep, Allocator *md_alloc, diff --git a/base/src/core/include/cpu_session_component.h b/base/src/core/include/cpu_session_component.h index 6668aef36..66b70e887 100644 --- a/base/src/core/include/cpu_session_component.h +++ b/base/src/core/include/cpu_session_component.h @@ -154,6 +154,10 @@ namespace Genode { void exception_handler(Thread_capability, Signal_context_capability); Affinity::Space affinity_space() const; void affinity(Thread_capability, Affinity::Location); + Dataspace_capability trace_control(); + unsigned trace_control_index(Thread_capability); + Dataspace_capability trace_buffer(Thread_capability); + Dataspace_capability trace_policy(Thread_capability); }; } diff --git a/ports/src/app/gdb_monitor/cpu_session_component.cc b/ports/src/app/gdb_monitor/cpu_session_component.cc index a4c78794e..47b5c4243 100644 --- a/ports/src/app/gdb_monitor/cpu_session_component.cc +++ b/ports/src/app/gdb_monitor/cpu_session_component.cc @@ -204,6 +204,30 @@ void Cpu_session_component::affinity(Thread_capability thread_cap, } +Dataspace_capability Cpu_session_component::trace_control() +{ + return _parent_cpu_session.trace_control(); +} + + +unsigned Cpu_session_component::trace_control_index(Thread_capability thread) +{ + return _parent_cpu_session.trace_control_index(thread); +} + + +Dataspace_capability Cpu_session_component::trace_buffer(Thread_capability thread) +{ + return _parent_cpu_session.trace_buffer(thread); +} + + +Dataspace_capability Cpu_session_component::trace_policy(Thread_capability thread) +{ + return _parent_cpu_session.trace_policy(thread); +} + + Cpu_session_component::Cpu_session_component(Signal_receiver *exception_signal_receiver, const char *args) : _parent_cpu_session(env()->parent()->session(args)), _exception_signal_receiver(exception_signal_receiver) diff --git a/ports/src/app/gdb_monitor/cpu_session_component.h b/ports/src/app/gdb_monitor/cpu_session_component.h index 192a1b994..7f6f77841 100644 --- a/ports/src/app/gdb_monitor/cpu_session_component.h +++ b/ports/src/app/gdb_monitor/cpu_session_component.h @@ -72,6 +72,10 @@ class Cpu_session_component : public Rpc_object void single_step(Thread_capability thread, bool enable); Affinity::Space affinity_space() const; void affinity(Thread_capability, Affinity::Location); + Dataspace_capability trace_control(); + unsigned trace_control_index(Thread_capability); + Dataspace_capability trace_buffer(Thread_capability); + Dataspace_capability trace_policy(Thread_capability); }; #endif /* _CPU_SESSION_COMPONENT_H_ */ diff --git a/ports/src/noux/cpu_session_component.h b/ports/src/noux/cpu_session_component.h index 5b3a53849..4da391523 100644 --- a/ports/src/noux/cpu_session_component.h +++ b/ports/src/noux/cpu_session_component.h @@ -134,6 +134,18 @@ namespace Noux { void affinity(Thread_capability thread, Affinity::Location location) { _cpu.affinity(thread, location); } + + Dataspace_capability trace_control() { + return _cpu.trace_control(); } + + unsigned trace_control_index(Thread_capability thread) { + return _cpu.trace_control_index(thread); } + + Dataspace_capability trace_buffer(Thread_capability thread) { + return _cpu.trace_buffer(thread); } + + Dataspace_capability trace_policy(Thread_capability thread) { + return _cpu.trace_policy(thread); } }; }