From 8ffcbaaf40fd5eac75e04570c6b8989a70276578 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Sat, 3 Mar 2012 04:04:35 +0000 Subject: [PATCH] gdb: * common/agent.c (struct ipa_sym_addresses) : New. (agent_capability_check, agent_capability_invalidate): New. (symbol_list): New array element. * common/agent.h (enum agent_capa): New. * target.c (target_pre_inferior): Call agent_capability_invalidate. gdb/gdbserver: * tracepoint.c (gdb_agent_capability): New global. (in_process_agent_loaded_ust): Renamed to `in_process_agent_supports_ust'. Update callers. (in_process_agent_supports_ust): Call agent_capability_check. (clear_installed_tracepoints): Assert that agent supports agent. --- gdb/ChangeLog | 8 ++++++++ gdb/common/agent.c | 40 ++++++++++++++++++++++++++++++++++++++ gdb/common/agent.h | 17 ++++++++++++++++ gdb/gdbserver/ChangeLog | 10 ++++++++++ gdb/gdbserver/tracepoint.c | 29 ++++++++++++++++++--------- gdb/target.c | 3 +++ 6 files changed, 98 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3e6e5010cd..a6a7db7d55 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2012-03-03 Yao Qi + + * common/agent.c (struct ipa_sym_addresses) : New. + (agent_capability_check, agent_capability_invalidate): New. + (symbol_list): New array element. + * common/agent.h (enum agent_capa): New. + * target.c (target_pre_inferior): Call agent_capability_invalidate. + 2012-03-03 Yao Qi * target.h (struct target_ops) : New field. diff --git a/gdb/common/agent.c b/gdb/common/agent.c index 2bd3206d3e..f3bdafcfae 100644 --- a/gdb/common/agent.c +++ b/gdb/common/agent.c @@ -51,6 +51,7 @@ struct ipa_sym_addresses { CORE_ADDR addr_helper_thread_id; CORE_ADDR addr_cmd_buf; + CORE_ADDR addr_capability; }; /* Cache of the helper thread id. FIXME: this global should be made @@ -65,6 +66,7 @@ static struct } symbol_list[] = { IPA_SYM(helper_thread_id), IPA_SYM(cmd_buf), + IPA_SYM(capability), }; static struct ipa_sym_addresses ipa_sym_addrs; @@ -303,3 +305,41 @@ agent_run_command (int pid, const char *cmd) return 0; } + +/* Each bit of it stands for a capability of agent. */ +static unsigned int agent_capability = 0; + +/* Return true if agent has capability AGENT_CAP, otherwise return false. */ + +int +agent_capability_check (enum agent_capa agent_capa) +{ + if (agent_capability == 0) + { +#ifdef GDBSERVER + if (read_inferior_memory (ipa_sym_addrs.addr_capability, + (unsigned char *) &agent_capability, + sizeof agent_capability)) +#else + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch); + gdb_byte buf[4]; + + if (target_read_memory (ipa_sym_addrs.addr_capability, + buf, sizeof buf) == 0) + agent_capability = extract_unsigned_integer (buf, sizeof buf, + byte_order); + else +#endif + warning ("Error reading capability of agent"); + } + return agent_capability & agent_capa; +} + +/* Invalidate the cache of agent capability, so we'll read it from inferior + again. Call it when launches a new program or reconnect to remote stub. */ + +void +agent_capability_invalidate (void) +{ + agent_capability = 0; +} diff --git a/gdb/common/agent.h b/gdb/common/agent.h index 296521579c..a1ac9b20d2 100644 --- a/gdb/common/agent.h +++ b/gdb/common/agent.h @@ -36,3 +36,20 @@ int agent_look_up_symbols (void); extern int debug_agent; extern int use_agent; + +/* Capability of agent. Different agents may have different capabilities, + such as installing fast tracepoint or evaluating breakpoint conditions. + Capabilities are represented by bit-maps, and each capability occupies one + bit. */ + +enum agent_capa +{ + /* Capability to install fast tracepoint. */ + AGENT_CAPA_FAST_TRACE = 0x1, + /* Capability to install static tracepoint. */ + AGENT_CAPA_STATIC_TRACE = (0x1 << 1), +}; + +int agent_capability_check (enum agent_capa); + +void agent_capability_invalidate (void); diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index b115b239bb..b96cd7bf9a 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,13 @@ +2012-03-03 Yao Qi + + * tracepoint.c (gdb_agent_capability): New global. + (in_process_agent_loaded_ust): Renamed to + `in_process_agent_supports_ust'. + Update callers. + (in_process_agent_supports_ust): Call agent_capability_check. + (clear_installed_tracepoints): Assert that agent supports + agent. + 2012-03-03 Yao Qi * linux-low.c (linux_supports_agent): New. diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index f5f506a298..bef28a3292 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -232,10 +232,11 @@ in_process_agent_loaded (void) static int read_inferior_integer (CORE_ADDR symaddr, int *val); /* Returns true if both the in-process agent library and the static - tracepoints libraries are loaded in the inferior. */ + tracepoints libraries are loaded in the inferior, and agent has + capability on static tracepoints. */ static int -in_process_agent_loaded_ust (void) +in_process_agent_supports_ust (void) { int loaded = 0; @@ -245,13 +246,20 @@ in_process_agent_loaded_ust (void) return 0; } - if (read_inferior_integer (ipa_sym_addrs.addr_ust_loaded, &loaded)) + if (agent_capability_check (AGENT_CAPA_STATIC_TRACE)) { - warning ("Error reading ust_loaded in lib"); - return 0; - } + /* Agent understands static tracepoint, then check whether UST is in + fact loaded in the inferior. */ + if (read_inferior_integer (ipa_sym_addrs.addr_ust_loaded, &loaded)) + { + warning ("Error reading ust_loaded in lib"); + return 0; + } - return loaded; + return loaded; + } + else + return 0; } static void @@ -303,7 +311,7 @@ maybe_write_ipa_ust_not_loaded (char *buffer) write_e_ipa_not_loaded (buffer); return 1; } - else if (!in_process_agent_loaded_ust ()) + else if (!in_process_agent_supports_ust ()) { write_e_ust_not_loaded (buffer); return 1; @@ -2907,7 +2915,8 @@ install_tracepoint (struct tracepoint *tpoint, char *own_buf) write_e_ipa_not_loaded (own_buf); return; } - if (tpoint->type == static_tracepoint && !in_process_agent_loaded_ust ()) + if (tpoint->type == static_tracepoint + && !in_process_agent_supports_ust ()) { trace_debug ("Requested a static tracepoint, but static " "tracepoints are not supported."); @@ -6826,6 +6835,8 @@ gdb_agent_helper_thread (void *arg) #include #include +IP_AGENT_EXPORT int gdb_agent_capability = AGENT_CAPA_STATIC_TRACE; + static void gdb_agent_init (void) { diff --git a/gdb/target.c b/gdb/target.c index 87ecf79fe5..88703ea6e5 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -43,6 +43,7 @@ #include "inline-frame.h" #include "tracepoint.h" #include "gdb/fileio.h" +#include "agent.h" static void target_info (char *, int); @@ -2500,6 +2501,8 @@ target_pre_inferior (int from_tty) target_clear_description (); } + + agent_capability_invalidate (); } /* Callback for iterate_over_inferiors. Gets rid of the given -- 2.34.1