[patch 6/8] Agent's capability

Yao Qi
2012-01-23T14:03:35Z

[-- Attachment #1: Type: text/plain, Size: 558 bytes --]

GDB/GDBserver could be able to talk with different agents, if they
follow the same protocol. However, different agents may have different
capabilities, say, one agent can install fast tracepoint, while the
other agent can't. Agent capability is to present what agent can do.

In agent side, we use an interger bit map, and each bit represents a
corresponding capability.

This piece of work is different from this, which is about target capability,

http://sourceware.org/gdb/current/onlinedocs/gdb/Varying-Target-Capabilities.html

--
Yao (é½å°§)

[-- Attachment #2: 0006-agent-capability.patch --]
[-- Type: text/x-patch, Size: 2776 bytes --]

2012-01-23 Yao Qi <yao@codesourcery.com>

* common/agent.c (struct ipa_sym_addresses) <addr_capability>: New.
(agent_check_capability): New.
(symbol_list): New array element.
* common/agent.h (enum agent_capa): New.
---
gdb/common/agent.c | 31 +++++++++++++++++++++++++++++++
gdb/common/agent.h | 15 +++++++++++++++
2 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/gdb/common/agent.c b/gdb/common/agent.c
index 5c66071..f4ff08c 100644
--- a/gdb/common/agent.c
+++ b/gdb/common/agent.c
@@ -44,6 +44,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. */
@@ -57,6 +58,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;
@@ -114,6 +116,9 @@ agent_get_helper_thread_id (void)
return helper_thread_id;
}

+/* Each bit of it stands for a capability of agent. */
+static unsigned int agent_capability = 0;
+
/* Connects to synchronization socket. PID is the pid of inferior, which is
used to set up connection socket. */

@@ -260,3 +265,29 @@ agent_run_command (int pid, const char *cmd, int len)
}
}
}
+
+/* Return true if agent has capability AGENT_CAP, otherwise return false. */
+
+int
+agent_check_capability (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 helper thread's id in lib");
+ }
+ return agent_capability & agent_capa;
+}
diff --git a/gdb/common/agent.h b/gdb/common/agent.h
index 079b65e..cf3fab1 100644
--- a/gdb/common/agent.h
+++ b/gdb/common/agent.h
@@ -36,3 +36,18 @@ void 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 occupy 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_check_capability (enum agent_capa);
--
1.7.0.4