aboutsummaryrefslogtreecommitdiff
path: root/gdb/common/agent.c
diff options
context:
space:
mode:
authorYao Qi <yao@codesourcery.com>2012-03-03 04:04:35 +0000
committerYao Qi <yao@codesourcery.com>2012-03-03 04:04:35 +0000
commit8ffcbaaf40fd5eac75e04570c6b8989a70276578 (patch)
treefda03da2196ed461094030c7fbe76aa482f71a8c /gdb/common/agent.c
parentd1feda864e0b17c5757197ba1b421e25dac6afd1 (diff)
downloadgdb-8ffcbaaf40fd5eac75e04570c6b8989a70276578.zip
gdb-8ffcbaaf40fd5eac75e04570c6b8989a70276578.tar.gz
gdb-8ffcbaaf40fd5eac75e04570c6b8989a70276578.tar.bz2
gdb:
* common/agent.c (struct ipa_sym_addresses) <addr_capability>: 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.
Diffstat (limited to 'gdb/common/agent.c')
-rw-r--r--gdb/common/agent.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gdb/common/agent.c b/gdb/common/agent.c
index 2bd3206..f3bdafc 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;
+}