Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
This commit is contained in:
parent
af8b999134
commit
22998d94f7
@ -513,3 +513,24 @@ Patch123: gdb-rhbz881849-ipv6-2of3.patch
|
|||||||
|
|
||||||
Patch124: gdb-rhbz881849-ipv6-3of3.patch
|
Patch124: gdb-rhbz881849-ipv6-3of3.patch
|
||||||
|
|
||||||
|
# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
Patch125: gdb-rhbz1187581-power8-regs-1of7.patch
|
||||||
|
|
||||||
|
# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
Patch126: gdb-rhbz1187581-power8-regs-2of7.patch
|
||||||
|
|
||||||
|
# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
Patch127: gdb-rhbz1187581-power8-regs-3of7.patch
|
||||||
|
|
||||||
|
# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
Patch128: gdb-rhbz1187581-power8-regs-4of7.patch
|
||||||
|
|
||||||
|
# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
Patch129: gdb-rhbz1187581-power8-regs-5of7.patch
|
||||||
|
|
||||||
|
# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
Patch130: gdb-rhbz1187581-power8-regs-6of7.patch
|
||||||
|
|
||||||
|
# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
Patch131: gdb-rhbz1187581-power8-regs-7of7.patch
|
||||||
|
|
||||||
|
@ -122,3 +122,10 @@
|
|||||||
%patch122 -p1
|
%patch122 -p1
|
||||||
%patch123 -p1
|
%patch123 -p1
|
||||||
%patch124 -p1
|
%patch124 -p1
|
||||||
|
%patch125 -p1
|
||||||
|
%patch126 -p1
|
||||||
|
%patch127 -p1
|
||||||
|
%patch128 -p1
|
||||||
|
%patch129 -p1
|
||||||
|
%patch130 -p1
|
||||||
|
%patch131 -p1
|
||||||
|
@ -122,3 +122,10 @@ gdb-rhbz1553104-s390x-arch12-test.patch
|
|||||||
gdb-rhbz881849-ipv6-1of3.patch
|
gdb-rhbz881849-ipv6-1of3.patch
|
||||||
gdb-rhbz881849-ipv6-2of3.patch
|
gdb-rhbz881849-ipv6-2of3.patch
|
||||||
gdb-rhbz881849-ipv6-3of3.patch
|
gdb-rhbz881849-ipv6-3of3.patch
|
||||||
|
gdb-rhbz1187581-power8-regs-1of7.patch
|
||||||
|
gdb-rhbz1187581-power8-regs-2of7.patch
|
||||||
|
gdb-rhbz1187581-power8-regs-3of7.patch
|
||||||
|
gdb-rhbz1187581-power8-regs-4of7.patch
|
||||||
|
gdb-rhbz1187581-power8-regs-5of7.patch
|
||||||
|
gdb-rhbz1187581-power8-regs-6of7.patch
|
||||||
|
gdb-rhbz1187581-power8-regs-7of7.patch
|
||||||
|
65
gdb-rhbz1187581-power8-regs-1of7.patch
Normal file
65
gdb-rhbz1187581-power8-regs-1of7.patch
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Date: Thu, 9 Aug 2018 17:09:48 +0200
|
||||||
|
Subject: gdb-rhbz1187581-power8-regs-1of7.patch
|
||||||
|
|
||||||
|
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
|
commit 05abfc39c719e740530000059bb963ad33462479
|
||||||
|
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
Date: Mon Aug 6 16:24:55 2018 -0300
|
||||||
|
|
||||||
|
Fix indentation in remote_target::download_tracepoint
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* remote.c (remote_target::download_tracepoint): Fix indentation
|
||||||
|
in for block.
|
||||||
|
|
||||||
|
diff --git a/gdb/remote.c b/gdb/remote.c
|
||||||
|
--- a/gdb/remote.c
|
||||||
|
+++ b/gdb/remote.c
|
||||||
|
@@ -12912,24 +12912,24 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
error (_("Error on target while setting tracepoints."));
|
||||||
|
}
|
||||||
|
|
||||||
|
- for (auto action_it = stepping_actions.begin ();
|
||||||
|
- action_it != stepping_actions.end (); action_it++)
|
||||||
|
- {
|
||||||
|
- QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
-
|
||||||
|
- bool is_first = action_it == stepping_actions.begin ();
|
||||||
|
- bool has_more = action_it != stepping_actions.end ();
|
||||||
|
-
|
||||||
|
- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s",
|
||||||
|
- b->number, addrbuf, /* address */
|
||||||
|
- is_first ? "S" : "",
|
||||||
|
- action_it->c_str (),
|
||||||
|
- has_more ? "-" : "");
|
||||||
|
- putpkt (buf);
|
||||||
|
- remote_get_noisy_reply ();
|
||||||
|
- if (strcmp (rs->buf, "OK"))
|
||||||
|
- error (_("Error on target while setting tracepoints."));
|
||||||
|
- }
|
||||||
|
+ for (auto action_it = stepping_actions.begin ();
|
||||||
|
+ action_it != stepping_actions.end (); action_it++)
|
||||||
|
+ {
|
||||||
|
+ QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
+
|
||||||
|
+ bool is_first = action_it == stepping_actions.begin ();
|
||||||
|
+ bool has_more = action_it != stepping_actions.end ();
|
||||||
|
+
|
||||||
|
+ xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s",
|
||||||
|
+ b->number, addrbuf, /* address */
|
||||||
|
+ is_first ? "S" : "",
|
||||||
|
+ action_it->c_str (),
|
||||||
|
+ has_more ? "-" : "");
|
||||||
|
+ putpkt (buf);
|
||||||
|
+ remote_get_noisy_reply ();
|
||||||
|
+ if (strcmp (rs->buf, "OK"))
|
||||||
|
+ error (_("Error on target while setting tracepoints."));
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (packet_support (PACKET_TracepointSource) == PACKET_ENABLE)
|
||||||
|
{
|
45
gdb-rhbz1187581-power8-regs-2of7.patch
Normal file
45
gdb-rhbz1187581-power8-regs-2of7.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Date: Thu, 9 Aug 2018 17:10:46 +0200
|
||||||
|
Subject: gdb-rhbz1187581-power8-regs-2of7.patch
|
||||||
|
|
||||||
|
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
|
commit aa6f3694ce867884e43d1c0406c64df08ea24bd3
|
||||||
|
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
Date: Mon Aug 6 16:24:55 2018 -0300
|
||||||
|
|
||||||
|
Remove trailing '-' from the last QTDP action packet
|
||||||
|
|
||||||
|
The has_more predicate in remote_target::download_tracepoint always
|
||||||
|
evaluates to true, so the last action packet will be sent with a
|
||||||
|
trailing '-'. This patch changes the predicate to remove the last
|
||||||
|
trailing '-'.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* remote.c (remote_target::download_tracepoint): Fix the has_more
|
||||||
|
predicate in the QTDP action list iteration.
|
||||||
|
|
||||||
|
diff --git a/gdb/remote.c b/gdb/remote.c
|
||||||
|
--- a/gdb/remote.c
|
||||||
|
+++ b/gdb/remote.c
|
||||||
|
@@ -12899,7 +12899,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
{
|
||||||
|
QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
|
||||||
|
- bool has_more = (action_it != tdp_actions.end ()
|
||||||
|
+ bool has_more = ((action_it + 1) != tdp_actions.end ()
|
||||||
|
|| !stepping_actions.empty ());
|
||||||
|
|
||||||
|
xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%c",
|
||||||
|
@@ -12918,7 +12918,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
|
||||||
|
bool is_first = action_it == stepping_actions.begin ();
|
||||||
|
- bool has_more = action_it != stepping_actions.end ();
|
||||||
|
+ bool has_more = (action_it + 1) != stepping_actions.end ();
|
||||||
|
|
||||||
|
xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s",
|
||||||
|
b->number, addrbuf, /* address */
|
258
gdb-rhbz1187581-power8-regs-3of7.patch
Normal file
258
gdb-rhbz1187581-power8-regs-3of7.patch
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Date: Thu, 9 Aug 2018 17:11:09 +0200
|
||||||
|
Subject: gdb-rhbz1187581-power8-regs-3of7.patch
|
||||||
|
|
||||||
|
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
|
commit 3df3a985a475db004706d64f83d9085f99053611
|
||||||
|
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
Date: Mon Aug 6 16:24:55 2018 -0300
|
||||||
|
|
||||||
|
Use get_remote_packet_size in download_tracepoint
|
||||||
|
|
||||||
|
This patch changes the remote target to use the remote packet size to
|
||||||
|
build QTDP packets, and to check if there is enough room for the
|
||||||
|
packet.
|
||||||
|
|
||||||
|
I changed the function to raise an error if the packet is too small,
|
||||||
|
instead of aborting gdb (through xsnprintf). It isn't clear if gdb
|
||||||
|
will be in a consistent state with respect to the stub after this,
|
||||||
|
since it's possible that some packets will be sent but not others, and
|
||||||
|
there could be an incomplete tracepoint on the stub.
|
||||||
|
|
||||||
|
The char array used to build the packets is changed to a
|
||||||
|
gdb::char_vector and sized with the result from
|
||||||
|
get_remote_packet_size.
|
||||||
|
|
||||||
|
When checking if the buffer is large enough to hold the tracepoint
|
||||||
|
condition agent expression, the length of the expression is multiplied
|
||||||
|
by two, since it is encoded with two hex digits per expression
|
||||||
|
byte. For simplicity, I assume that the result won't overflow, which
|
||||||
|
can happen for very long condition expressions.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* remote.c (remote_target::download_tracepoint): Remove BUF_SIZE.
|
||||||
|
Replace array buf with gdb::char_vector buf, of size
|
||||||
|
get_remote_packet_size (). Replace references to buf and
|
||||||
|
BUF_SIZE to buf.data () and buf.size (). Replace strcpy, strcat
|
||||||
|
and xsnprintf with snprintf. Raise errors if the buffer is too
|
||||||
|
small.
|
||||||
|
|
||||||
|
diff --git a/gdb/remote.c b/gdb/remote.c
|
||||||
|
--- a/gdb/remote.c
|
||||||
|
+++ b/gdb/remote.c
|
||||||
|
@@ -12799,26 +12799,35 @@ remote_target::remote_download_command_source (int num, ULONGEST addr,
|
||||||
|
void
|
||||||
|
remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
{
|
||||||
|
-#define BUF_SIZE 2048
|
||||||
|
-
|
||||||
|
CORE_ADDR tpaddr;
|
||||||
|
char addrbuf[40];
|
||||||
|
- char buf[BUF_SIZE];
|
||||||
|
std::vector<std::string> tdp_actions;
|
||||||
|
std::vector<std::string> stepping_actions;
|
||||||
|
char *pkt;
|
||||||
|
struct breakpoint *b = loc->owner;
|
||||||
|
struct tracepoint *t = (struct tracepoint *) b;
|
||||||
|
struct remote_state *rs = get_remote_state ();
|
||||||
|
+ int ret;
|
||||||
|
+ char *err_msg = _("Tracepoint packet too large for target.");
|
||||||
|
+ size_t size_left;
|
||||||
|
+
|
||||||
|
+ /* We use a buffer other than rs->buf because we'll build strings
|
||||||
|
+ across multiple statements, and other statements in between could
|
||||||
|
+ modify rs->buf. */
|
||||||
|
+ gdb::char_vector buf (get_remote_packet_size ());
|
||||||
|
|
||||||
|
encode_actions_rsp (loc, &tdp_actions, &stepping_actions);
|
||||||
|
|
||||||
|
tpaddr = loc->address;
|
||||||
|
sprintf_vma (addrbuf, tpaddr);
|
||||||
|
- xsnprintf (buf, BUF_SIZE, "QTDP:%x:%s:%c:%lx:%x", b->number,
|
||||||
|
- addrbuf, /* address */
|
||||||
|
- (b->enable_state == bp_enabled ? 'E' : 'D'),
|
||||||
|
- t->step_count, t->pass_count);
|
||||||
|
+ ret = snprintf (buf.data (), buf.size (), "QTDP:%x:%s:%c:%lx:%x",
|
||||||
|
+ b->number, addrbuf, /* address */
|
||||||
|
+ (b->enable_state == bp_enabled ? 'E' : 'D'),
|
||||||
|
+ t->step_count, t->pass_count);
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= buf.size ())
|
||||||
|
+ error (err_msg);
|
||||||
|
+
|
||||||
|
/* Fast tracepoints are mostly handled by the target, but we can
|
||||||
|
tell the target how big of an instruction block should be moved
|
||||||
|
around. */
|
||||||
|
@@ -12830,8 +12839,15 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
{
|
||||||
|
if (gdbarch_fast_tracepoint_valid_at (loc->gdbarch, tpaddr,
|
||||||
|
NULL))
|
||||||
|
- xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":F%x",
|
||||||
|
- gdb_insn_length (loc->gdbarch, tpaddr));
|
||||||
|
+ {
|
||||||
|
+ size_left = buf.size () - strlen (buf.data ());
|
||||||
|
+ ret = snprintf (buf.data () + strlen (buf.data ()),
|
||||||
|
+ size_left, ":F%x",
|
||||||
|
+ gdb_insn_length (loc->gdbarch, tpaddr));
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= size_left)
|
||||||
|
+ error (err_msg);
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
/* If it passed validation at definition but fails now,
|
||||||
|
something is very wrong. */
|
||||||
|
@@ -12855,7 +12871,14 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
struct static_tracepoint_marker marker;
|
||||||
|
|
||||||
|
if (target_static_tracepoint_marker_at (tpaddr, &marker))
|
||||||
|
- strcat (buf, ":S");
|
||||||
|
+ {
|
||||||
|
+ size_left = buf.size () - strlen (buf.data ());
|
||||||
|
+ ret = snprintf (buf.data () + strlen (buf.data ()),
|
||||||
|
+ size_left, ":S");
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= size_left)
|
||||||
|
+ error (err_msg);
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
error (_("Static tracepoint not valid during download"));
|
||||||
|
}
|
||||||
|
@@ -12873,10 +12896,26 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
capabilities at definition time. */
|
||||||
|
if (remote_supports_cond_tracepoints ())
|
||||||
|
{
|
||||||
|
- agent_expr_up aexpr = gen_eval_for_expr (tpaddr, loc->cond.get ());
|
||||||
|
- xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":X%x,",
|
||||||
|
- aexpr->len);
|
||||||
|
- pkt = buf + strlen (buf);
|
||||||
|
+ agent_expr_up aexpr = gen_eval_for_expr (tpaddr,
|
||||||
|
+ loc->cond.get ());
|
||||||
|
+
|
||||||
|
+ size_left = buf.size () - strlen (buf.data ());
|
||||||
|
+
|
||||||
|
+ ret = snprintf (buf.data () + strlen (buf.data ()),
|
||||||
|
+ size_left, ":X%x,", aexpr->len);
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= size_left)
|
||||||
|
+ error (err_msg);
|
||||||
|
+
|
||||||
|
+ size_left = buf.size () - strlen (buf.data ());
|
||||||
|
+
|
||||||
|
+ /* Two bytes to encode each aexpr byte, plus the terminating
|
||||||
|
+ null byte. */
|
||||||
|
+ if (aexpr->len * 2 + 1 > size_left)
|
||||||
|
+ error (err_msg);
|
||||||
|
+
|
||||||
|
+ pkt = buf.data () + strlen (buf.data ());
|
||||||
|
+
|
||||||
|
for (int ndx = 0; ndx < aexpr->len; ++ndx)
|
||||||
|
pkt = pack_hex_byte (pkt, aexpr->buf[ndx]);
|
||||||
|
*pkt = '\0';
|
||||||
|
@@ -12887,8 +12926,17 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b->commands || *default_collect)
|
||||||
|
- strcat (buf, "-");
|
||||||
|
- putpkt (buf);
|
||||||
|
+ {
|
||||||
|
+ size_left = buf.size () - strlen (buf.data ());
|
||||||
|
+
|
||||||
|
+ ret = snprintf (buf.data () + strlen (buf.data ()),
|
||||||
|
+ size_left, "-");
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= size_left)
|
||||||
|
+ error (err_msg);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ putpkt (buf.data ());
|
||||||
|
remote_get_noisy_reply ();
|
||||||
|
if (strcmp (rs->buf, "OK"))
|
||||||
|
error (_("Target does not support tracepoints."));
|
||||||
|
@@ -12902,11 +12950,15 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
bool has_more = ((action_it + 1) != tdp_actions.end ()
|
||||||
|
|| !stepping_actions.empty ());
|
||||||
|
|
||||||
|
- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%c",
|
||||||
|
- b->number, addrbuf, /* address */
|
||||||
|
- action_it->c_str (),
|
||||||
|
- has_more ? '-' : 0);
|
||||||
|
- putpkt (buf);
|
||||||
|
+ ret = snprintf (buf.data (), buf.size (), "QTDP:-%x:%s:%s%c",
|
||||||
|
+ b->number, addrbuf, /* address */
|
||||||
|
+ action_it->c_str (),
|
||||||
|
+ has_more ? '-' : 0);
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= buf.size ())
|
||||||
|
+ error (err_msg);
|
||||||
|
+
|
||||||
|
+ putpkt (buf.data ());
|
||||||
|
remote_get_noisy_reply ();
|
||||||
|
if (strcmp (rs->buf, "OK"))
|
||||||
|
error (_("Error on target while setting tracepoints."));
|
||||||
|
@@ -12920,12 +12972,16 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
bool is_first = action_it == stepping_actions.begin ();
|
||||||
|
bool has_more = (action_it + 1) != stepping_actions.end ();
|
||||||
|
|
||||||
|
- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s",
|
||||||
|
- b->number, addrbuf, /* address */
|
||||||
|
- is_first ? "S" : "",
|
||||||
|
- action_it->c_str (),
|
||||||
|
- has_more ? "-" : "");
|
||||||
|
- putpkt (buf);
|
||||||
|
+ ret = snprintf (buf.data (), buf.size (), "QTDP:-%x:%s:%s%s%s",
|
||||||
|
+ b->number, addrbuf, /* address */
|
||||||
|
+ is_first ? "S" : "",
|
||||||
|
+ action_it->c_str (),
|
||||||
|
+ has_more ? "-" : "");
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= buf.size ())
|
||||||
|
+ error (err_msg);
|
||||||
|
+
|
||||||
|
+ putpkt (buf.data ());
|
||||||
|
remote_get_noisy_reply ();
|
||||||
|
if (strcmp (rs->buf, "OK"))
|
||||||
|
error (_("Error on target while setting tracepoints."));
|
||||||
|
@@ -12935,22 +12991,32 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
{
|
||||||
|
if (b->location != NULL)
|
||||||
|
{
|
||||||
|
- strcpy (buf, "QTDPsrc:");
|
||||||
|
+ ret = snprintf (buf.data (), buf.size (), "QTDPsrc:");
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= buf.size ())
|
||||||
|
+ error (err_msg);
|
||||||
|
+
|
||||||
|
encode_source_string (b->number, loc->address, "at",
|
||||||
|
event_location_to_string (b->location.get ()),
|
||||||
|
- buf + strlen (buf), 2048 - strlen (buf));
|
||||||
|
- putpkt (buf);
|
||||||
|
+ buf.data () + strlen (buf.data ()),
|
||||||
|
+ buf.size () - strlen (buf.data ()));
|
||||||
|
+ putpkt (buf.data ());
|
||||||
|
remote_get_noisy_reply ();
|
||||||
|
if (strcmp (rs->buf, "OK"))
|
||||||
|
warning (_("Target does not support source download."));
|
||||||
|
}
|
||||||
|
if (b->cond_string)
|
||||||
|
{
|
||||||
|
- strcpy (buf, "QTDPsrc:");
|
||||||
|
+ ret = snprintf (buf.data (), buf.size (), "QTDPsrc:");
|
||||||
|
+
|
||||||
|
+ if (ret < 0 || ret >= buf.size ())
|
||||||
|
+ error (err_msg);
|
||||||
|
+
|
||||||
|
encode_source_string (b->number, loc->address,
|
||||||
|
- "cond", b->cond_string, buf + strlen (buf),
|
||||||
|
- 2048 - strlen (buf));
|
||||||
|
- putpkt (buf);
|
||||||
|
+ "cond", b->cond_string,
|
||||||
|
+ buf.data () + strlen (buf.data ()),
|
||||||
|
+ buf.size () - strlen (buf.data ()));
|
||||||
|
+ putpkt (buf.data ());
|
||||||
|
remote_get_noisy_reply ();
|
||||||
|
if (strcmp (rs->buf, "OK"))
|
||||||
|
warning (_("Target does not support source download."));
|
449
gdb-rhbz1187581-power8-regs-4of7.patch
Normal file
449
gdb-rhbz1187581-power8-regs-4of7.patch
Normal file
@ -0,0 +1,449 @@
|
|||||||
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Date: Thu, 9 Aug 2018 17:17:16 +0200
|
||||||
|
Subject: gdb-rhbz1187581-power8-regs-4of7.patch
|
||||||
|
|
||||||
|
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
|
commit 4277c4b87addb5354cc47b98d7a73e44cfaf22c2
|
||||||
|
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
Date: Mon Aug 6 16:24:55 2018 -0300
|
||||||
|
|
||||||
|
Use remote register numbers in tracepoint mask
|
||||||
|
|
||||||
|
Currently, tracepoint register masks in the QTDP packets include both
|
||||||
|
internal and remote register numbers, as well as pseudo-register
|
||||||
|
numbers.
|
||||||
|
|
||||||
|
This patch changes this so that the mask only includes remote register
|
||||||
|
numbers.
|
||||||
|
|
||||||
|
Register numbers from agent expressions are already set in the mask
|
||||||
|
using remote numbers. Other tracepoint actions used internal numbers,
|
||||||
|
e.g. "collect $regs" or "collect $<pseudoreg>". To handle pseudoreg
|
||||||
|
numbers, an empty agent expression is created and ax_reg_mask is
|
||||||
|
called for this expression and the pseudoreg. This will cause the ax
|
||||||
|
to set its mask with the corresponding remote raw register
|
||||||
|
numbers (using ax_regs_mask, which calls
|
||||||
|
gdbarch_ax_pseudo_register_collect).
|
||||||
|
|
||||||
|
If ax_regs_mask and gdbarch_ax_pseudo_register_collect also generate
|
||||||
|
more ax bytecode, the ax is also appended to the collection list. It
|
||||||
|
isn't clear that this was the original intent for
|
||||||
|
gdbarch_ax_pseudo_register_collect, and none of the arches seem to do
|
||||||
|
this, but if this changes in the future, it should work.
|
||||||
|
|
||||||
|
The patch also refactors the code used by validate_action line to
|
||||||
|
validate axs into a function that is now called from every place that
|
||||||
|
generates axs. Previously, some parts of tracepoint.c that generated
|
||||||
|
axs didn't check if the ax length was greater than MAX_AGENT_EXPR_LEN.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* tracepoint.h (class collection_list) <add_register>: Remove.
|
||||||
|
<add_remote_register, add_ax_registers, add_local_register>:
|
||||||
|
Declare.
|
||||||
|
<add_memrange>: Add scope parameter.
|
||||||
|
* tracepoint.c (encode_actions_1): Likewise.
|
||||||
|
(collection_list::add_register): Rename to ...
|
||||||
|
(collection_list::add_remote_register): ... this. Update
|
||||||
|
comment.
|
||||||
|
(collection_list::add_ax_registers, add_local_register): New
|
||||||
|
methods.
|
||||||
|
(collection_list::add_memrange): Add scope parameter. Call
|
||||||
|
add_local_register instead of add_register.
|
||||||
|
(finalize_tracepoint_aexpr): New function.
|
||||||
|
(collection_list::collect_symbol): Update calls to add_memrange.
|
||||||
|
Call add_local_register instead of add_register. Call
|
||||||
|
add_ax_registers. Call finalize_tracepoint_aexpr.
|
||||||
|
(encode_actions_1): Get remote regnos for $reg action. Call
|
||||||
|
add_remote_register, add_ax_registers, and add_local_register.
|
||||||
|
Update call to add_memrange. Call finalize_tracepoint_aexpr.
|
||||||
|
(validate_actionline): Call finalize_tracepoint_aexpr.
|
||||||
|
|
||||||
|
+2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
+
|
||||||
|
+ * tracepoint.h (class collection_list) <add_register>: Remove.
|
||||||
|
+ <add_remote_register, add_ax_registers, add_local_register>:
|
||||||
|
+ Declare.
|
||||||
|
+ <add_memrange>: Add scope parameter.
|
||||||
|
+ * tracepoint.c (encode_actions_1): Likewise.
|
||||||
|
+ (collection_list::add_register): Rename to ...
|
||||||
|
+ (collection_list::add_remote_register): ... this. Update
|
||||||
|
+ comment.
|
||||||
|
+ (collection_list::add_ax_registers, add_local_register): New
|
||||||
|
+ methods.
|
||||||
|
+ (collection_list::add_memrange): Add scope parameter. Call
|
||||||
|
+ add_local_register instead of add_register.
|
||||||
|
+ (finalize_tracepoint_aexpr): New function.
|
||||||
|
+ (collection_list::collect_symbol): Update calls to add_memrange.
|
||||||
|
+ Call add_local_register instead of add_register. Call
|
||||||
|
+ add_ax_registers. Call finalize_tracepoint_aexpr.
|
||||||
|
+ (encode_actions_1): Get remote regnos for $reg action. Call
|
||||||
|
+ add_remote_register, add_ax_registers, and add_local_register.
|
||||||
|
+ Update call to add_memrange. Call finalize_tracepoint_aexpr.
|
||||||
|
+ (validate_actionline): Call finalize_tracepoint_aexpr.
|
||||||
|
+
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* remote.c (remote_target::download_tracepoint): Remove BUF_SIZE.
|
||||||
|
|
||||||
|
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
|
||||||
|
--- a/gdb/tracepoint.c
|
||||||
|
+++ b/gdb/tracepoint.c
|
||||||
|
@@ -615,6 +615,19 @@ report_agent_reqs_errors (struct agent_expr *aexpr)
|
||||||
|
error (_("Expression is too complicated."));
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Call ax_reqs on AEXPR and raise an error if something is wrong. */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+finalize_tracepoint_aexpr (struct agent_expr *aexpr)
|
||||||
|
+{
|
||||||
|
+ ax_reqs (aexpr);
|
||||||
|
+
|
||||||
|
+ if (aexpr->len > MAX_AGENT_EXPR_LEN)
|
||||||
|
+ error (_("Expression is too complicated."));
|
||||||
|
+
|
||||||
|
+ report_agent_reqs_errors (aexpr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* worker function */
|
||||||
|
void
|
||||||
|
validate_actionline (const char *line, struct breakpoint *b)
|
||||||
|
@@ -699,12 +712,7 @@ validate_actionline (const char *line, struct breakpoint *b)
|
||||||
|
exp.get (),
|
||||||
|
trace_string);
|
||||||
|
|
||||||
|
- if (aexpr->len > MAX_AGENT_EXPR_LEN)
|
||||||
|
- error (_("Expression is too complicated."));
|
||||||
|
-
|
||||||
|
- ax_reqs (aexpr.get ());
|
||||||
|
-
|
||||||
|
- report_agent_reqs_errors (aexpr.get ());
|
||||||
|
+ finalize_tracepoint_aexpr (aexpr.get ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (p && *p++ == ',');
|
||||||
|
@@ -731,11 +739,7 @@ validate_actionline (const char *line, struct breakpoint *b)
|
||||||
|
long. */
|
||||||
|
agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ());
|
||||||
|
|
||||||
|
- if (aexpr->len > MAX_AGENT_EXPR_LEN)
|
||||||
|
- error (_("Expression is too complicated."));
|
||||||
|
-
|
||||||
|
- ax_reqs (aexpr.get ());
|
||||||
|
- report_agent_reqs_errors (aexpr.get ());
|
||||||
|
+ finalize_tracepoint_aexpr (aexpr.get ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (p && *p++ == ',');
|
||||||
|
@@ -811,10 +815,10 @@ memrange_sortmerge (std::vector<memrange> &memranges)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* Add a register to a collection list. */
|
||||||
|
+/* Add remote register number REGNO to the collection list mask. */
|
||||||
|
|
||||||
|
void
|
||||||
|
-collection_list::add_register (unsigned int regno)
|
||||||
|
+collection_list::add_remote_register (unsigned int regno)
|
||||||
|
{
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("collect register %d\n", regno);
|
||||||
|
@@ -824,12 +828,74 @@ collection_list::add_register (unsigned int regno)
|
||||||
|
m_regs_mask[regno / 8] |= 1 << (regno % 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Add all the registers from the mask in AEXPR to the mask in the
|
||||||
|
+ collection list. Registers in the AEXPR mask are already remote
|
||||||
|
+ register numbers. */
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+collection_list::add_ax_registers (struct agent_expr *aexpr)
|
||||||
|
+{
|
||||||
|
+ if (aexpr->reg_mask_len > 0)
|
||||||
|
+ {
|
||||||
|
+ for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
|
||||||
|
+ {
|
||||||
|
+ QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
+ if (aexpr->reg_mask[ndx1] != 0)
|
||||||
|
+ {
|
||||||
|
+ /* Assume chars have 8 bits. */
|
||||||
|
+ for (int ndx2 = 0; ndx2 < 8; ndx2++)
|
||||||
|
+ if (aexpr->reg_mask[ndx1] & (1 << ndx2))
|
||||||
|
+ /* It's used -- record it. */
|
||||||
|
+ add_remote_register (ndx1 * 8 + ndx2);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* If REGNO is raw, add its corresponding remote register number to
|
||||||
|
+ the mask. If REGNO is a pseudo-register, figure out the necessary
|
||||||
|
+ registers using a temporary agent expression, and add it to the
|
||||||
|
+ list if it needs more than just a mask. */
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+collection_list::add_local_register (struct gdbarch *gdbarch,
|
||||||
|
+ unsigned int regno,
|
||||||
|
+ CORE_ADDR scope)
|
||||||
|
+{
|
||||||
|
+ if (regno < gdbarch_num_regs (gdbarch))
|
||||||
|
+ {
|
||||||
|
+ int remote_regno = gdbarch_remote_register_number (gdbarch, regno);
|
||||||
|
+
|
||||||
|
+ if (remote_regno < 0)
|
||||||
|
+ error (_("Can't collect register %d"), regno);
|
||||||
|
+
|
||||||
|
+ add_remote_register (remote_regno);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ agent_expr_up aexpr (new agent_expr (gdbarch, scope));
|
||||||
|
+
|
||||||
|
+ ax_reg_mask (aexpr.get (), regno);
|
||||||
|
+
|
||||||
|
+ finalize_tracepoint_aexpr (aexpr.get ());
|
||||||
|
+
|
||||||
|
+ add_ax_registers (aexpr.get ());
|
||||||
|
+
|
||||||
|
+ /* Usually ax_reg_mask for a pseudo-regiser only sets the
|
||||||
|
+ corresponding raw registers in the ax mask, but if this isn't
|
||||||
|
+ the case add the expression that is generated to the
|
||||||
|
+ collection list. */
|
||||||
|
+ if (aexpr->len > 0)
|
||||||
|
+ add_aexpr (std::move (aexpr));
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Add a memrange to a collection list. */
|
||||||
|
|
||||||
|
void
|
||||||
|
collection_list::add_memrange (struct gdbarch *gdbarch,
|
||||||
|
int type, bfd_signed_vma base,
|
||||||
|
- ULONGEST len)
|
||||||
|
+ ULONGEST len, CORE_ADDR scope)
|
||||||
|
{
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("(%d,%s,%s)\n", type, paddress (gdbarch, base), pulongest (len));
|
||||||
|
@@ -840,7 +906,7 @@ collection_list::add_memrange (struct gdbarch *gdbarch,
|
||||||
|
m_memranges.emplace_back (type, base, base + len);
|
||||||
|
|
||||||
|
if (type != memrange_absolute) /* Better collect the base register! */
|
||||||
|
- add_register (type);
|
||||||
|
+ add_local_register (gdbarch, type, scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add a symbol to a collection list. */
|
||||||
|
@@ -882,19 +948,19 @@ collection_list::collect_symbol (struct symbol *sym,
|
||||||
|
if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
|
||||||
|
treat_as_expr = 1;
|
||||||
|
else
|
||||||
|
- add_memrange (gdbarch, memrange_absolute, offset, len);
|
||||||
|
+ add_memrange (gdbarch, memrange_absolute, offset, len, scope);
|
||||||
|
break;
|
||||||
|
case LOC_REGISTER:
|
||||||
|
reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("LOC_REG[parm] %s: ",
|
||||||
|
SYMBOL_PRINT_NAME (sym));
|
||||||
|
- add_register (reg);
|
||||||
|
+ add_local_register (gdbarch, reg, scope);
|
||||||
|
/* Check for doubles stored in two registers. */
|
||||||
|
/* FIXME: how about larger types stored in 3 or more regs? */
|
||||||
|
if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
|
||||||
|
len > register_size (gdbarch, reg))
|
||||||
|
- add_register (reg + 1);
|
||||||
|
+ add_local_register (gdbarch, reg + 1, scope);
|
||||||
|
break;
|
||||||
|
case LOC_REF_ARG:
|
||||||
|
printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
|
||||||
|
@@ -911,7 +977,7 @@ collection_list::collect_symbol (struct symbol *sym,
|
||||||
|
SYMBOL_PRINT_NAME (sym), pulongest (len),
|
||||||
|
paddress (gdbarch, offset), reg);
|
||||||
|
}
|
||||||
|
- add_memrange (gdbarch, reg, offset, len);
|
||||||
|
+ add_memrange (gdbarch, reg, offset, len, scope);
|
||||||
|
break;
|
||||||
|
case LOC_REGPARM_ADDR:
|
||||||
|
reg = SYMBOL_VALUE (sym);
|
||||||
|
@@ -923,7 +989,7 @@ collection_list::collect_symbol (struct symbol *sym,
|
||||||
|
SYMBOL_PRINT_NAME (sym), pulongest (len),
|
||||||
|
paddress (gdbarch, offset), reg);
|
||||||
|
}
|
||||||
|
- add_memrange (gdbarch, reg, offset, len);
|
||||||
|
+ add_memrange (gdbarch, reg, offset, len, scope);
|
||||||
|
break;
|
||||||
|
case LOC_LOCAL:
|
||||||
|
reg = frame_regno;
|
||||||
|
@@ -935,7 +1001,7 @@ collection_list::collect_symbol (struct symbol *sym,
|
||||||
|
SYMBOL_PRINT_NAME (sym), pulongest (len),
|
||||||
|
paddress (gdbarch, offset), reg);
|
||||||
|
}
|
||||||
|
- add_memrange (gdbarch, reg, offset, len);
|
||||||
|
+ add_memrange (gdbarch, reg, offset, len, scope);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LOC_UNRESOLVED:
|
||||||
|
@@ -968,26 +1034,10 @@ collection_list::collect_symbol (struct symbol *sym,
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ax_reqs (aexpr.get ());
|
||||||
|
-
|
||||||
|
- report_agent_reqs_errors (aexpr.get ());
|
||||||
|
+ finalize_tracepoint_aexpr (aexpr.get ());
|
||||||
|
|
||||||
|
/* Take care of the registers. */
|
||||||
|
- if (aexpr->reg_mask_len > 0)
|
||||||
|
- {
|
||||||
|
- for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
|
||||||
|
- {
|
||||||
|
- QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
- if (aexpr->reg_mask[ndx1] != 0)
|
||||||
|
- {
|
||||||
|
- /* Assume chars have 8 bits. */
|
||||||
|
- for (int ndx2 = 0; ndx2 < 8; ndx2++)
|
||||||
|
- if (aexpr->reg_mask[ndx1] & (1 << ndx2))
|
||||||
|
- /* It's used -- record it. */
|
||||||
|
- add_register (ndx1 * 8 + ndx2);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ add_ax_registers (aexpr.get ());
|
||||||
|
|
||||||
|
add_aexpr (std::move (aexpr));
|
||||||
|
}
|
||||||
|
@@ -1257,8 +1307,18 @@ encode_actions_1 (struct command_line *action,
|
||||||
|
|
||||||
|
if (0 == strncasecmp ("$reg", action_exp, 4))
|
||||||
|
{
|
||||||
|
- for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
|
||||||
|
- collect->add_register (i);
|
||||||
|
+ for (i = 0; i < gdbarch_num_regs (target_gdbarch ());
|
||||||
|
+ i++)
|
||||||
|
+ {
|
||||||
|
+ int remote_regno = (gdbarch_remote_register_number
|
||||||
|
+ (target_gdbarch (), i));
|
||||||
|
+
|
||||||
|
+ /* Ignore arch regnos without a corresponding
|
||||||
|
+ remote regno. This can happen for regnos not
|
||||||
|
+ in the tdesc. */
|
||||||
|
+ if (remote_regno >= 0)
|
||||||
|
+ collect->add_remote_register (remote_regno);
|
||||||
|
+ }
|
||||||
|
action_exp = strchr (action_exp, ','); /* more? */
|
||||||
|
}
|
||||||
|
else if (0 == strncasecmp ("$arg", action_exp, 4))
|
||||||
|
@@ -1288,27 +1348,10 @@ encode_actions_1 (struct command_line *action,
|
||||||
|
target_gdbarch (),
|
||||||
|
trace_string);
|
||||||
|
|
||||||
|
- ax_reqs (aexpr.get ());
|
||||||
|
- report_agent_reqs_errors (aexpr.get ());
|
||||||
|
+ finalize_tracepoint_aexpr (aexpr.get ());
|
||||||
|
|
||||||
|
/* take care of the registers */
|
||||||
|
- if (aexpr->reg_mask_len > 0)
|
||||||
|
- {
|
||||||
|
- for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
|
||||||
|
- {
|
||||||
|
- QUIT; /* allow user to bail out with ^C */
|
||||||
|
- if (aexpr->reg_mask[ndx1] != 0)
|
||||||
|
- {
|
||||||
|
- /* assume chars have 8 bits */
|
||||||
|
- for (int ndx2 = 0; ndx2 < 8; ndx2++)
|
||||||
|
- if (aexpr->reg_mask[ndx1] & (1 << ndx2))
|
||||||
|
- {
|
||||||
|
- /* It's used -- record it. */
|
||||||
|
- collect->add_register (ndx1 * 8 + ndx2);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ collect->add_ax_registers (aexpr.get ());
|
||||||
|
|
||||||
|
collect->add_aexpr (std::move (aexpr));
|
||||||
|
action_exp = strchr (action_exp, ','); /* more? */
|
||||||
|
@@ -1340,7 +1383,8 @@ encode_actions_1 (struct command_line *action,
|
||||||
|
name);
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("OP_REGISTER: ");
|
||||||
|
- collect->add_register (i);
|
||||||
|
+ collect->add_local_register (target_gdbarch (),
|
||||||
|
+ i, tloc->address);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1352,7 +1396,8 @@ encode_actions_1 (struct command_line *action,
|
||||||
|
check_typedef (exp->elts[1].type);
|
||||||
|
collect->add_memrange (target_gdbarch (),
|
||||||
|
memrange_absolute, addr,
|
||||||
|
- TYPE_LENGTH (exp->elts[1].type));
|
||||||
|
+ TYPE_LENGTH (exp->elts[1].type),
|
||||||
|
+ tloc->address);
|
||||||
|
collect->append_exp (exp.get ());
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -1376,28 +1421,10 @@ encode_actions_1 (struct command_line *action,
|
||||||
|
exp.get (),
|
||||||
|
trace_string);
|
||||||
|
|
||||||
|
- ax_reqs (aexpr.get ());
|
||||||
|
-
|
||||||
|
- report_agent_reqs_errors (aexpr.get ());
|
||||||
|
+ finalize_tracepoint_aexpr (aexpr.get ());
|
||||||
|
|
||||||
|
/* Take care of the registers. */
|
||||||
|
- if (aexpr->reg_mask_len > 0)
|
||||||
|
- {
|
||||||
|
- for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
|
||||||
|
- {
|
||||||
|
- QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
- if (aexpr->reg_mask[ndx1] != 0)
|
||||||
|
- {
|
||||||
|
- /* Assume chars have 8 bits. */
|
||||||
|
- for (int ndx2 = 0; ndx2 < 8; ndx2++)
|
||||||
|
- if (aexpr->reg_mask[ndx1] & (1 << ndx2))
|
||||||
|
- {
|
||||||
|
- /* It's used -- record it. */
|
||||||
|
- collect->add_register (ndx1 * 8 + ndx2);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ collect->add_ax_registers (aexpr.get ());
|
||||||
|
|
||||||
|
collect->add_aexpr (std::move (aexpr));
|
||||||
|
collect->append_exp (exp.get ());
|
||||||
|
@@ -1422,8 +1449,7 @@ encode_actions_1 (struct command_line *action,
|
||||||
|
agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
|
||||||
|
exp.get ());
|
||||||
|
|
||||||
|
- ax_reqs (aexpr.get ());
|
||||||
|
- report_agent_reqs_errors (aexpr.get ());
|
||||||
|
+ finalize_tracepoint_aexpr (aexpr.get ());
|
||||||
|
|
||||||
|
/* Even though we're not officially collecting, add
|
||||||
|
to the collect list anyway. */
|
||||||
|
diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
|
||||||
|
--- a/gdb/tracepoint.h
|
||||||
|
+++ b/gdb/tracepoint.h
|
||||||
|
@@ -263,9 +263,14 @@ public:
|
||||||
|
void add_aexpr (agent_expr_up aexpr);
|
||||||
|
|
||||||
|
void add_register (unsigned int regno);
|
||||||
|
+ void add_remote_register (unsigned int regno);
|
||||||
|
+ void add_ax_registers (struct agent_expr *aexpr);
|
||||||
|
+ void add_local_register (struct gdbarch *gdbarch,
|
||||||
|
+ unsigned int regno,
|
||||||
|
+ CORE_ADDR scope);
|
||||||
|
void add_memrange (struct gdbarch *gdbarch,
|
||||||
|
int type, bfd_signed_vma base,
|
||||||
|
- ULONGEST len);
|
||||||
|
+ ULONGEST len, CORE_ADDR scope);
|
||||||
|
void collect_symbol (struct symbol *sym,
|
||||||
|
struct gdbarch *gdbarch,
|
||||||
|
long frame_regno, long frame_offset,
|
215
gdb-rhbz1187581-power8-regs-5of7.patch
Normal file
215
gdb-rhbz1187581-power8-regs-5of7.patch
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Date: Thu, 9 Aug 2018 17:17:46 +0200
|
||||||
|
Subject: gdb-rhbz1187581-power8-regs-5of7.patch
|
||||||
|
|
||||||
|
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
|
commit a04b9d62a234923826e431a209d396a628661548
|
||||||
|
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
Date: Mon Aug 6 16:24:55 2018 -0300
|
||||||
|
|
||||||
|
Variable size for regs mask in collection list
|
||||||
|
|
||||||
|
This patch changes collection_list to allow larger register masks.
|
||||||
|
|
||||||
|
The mask is changed from an array to a vector and is initialized to
|
||||||
|
hold the maximum possible remote register number. The stringify
|
||||||
|
method is updated to resize temp_buf if needed.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* tracepoint.h (collection_list) <m_regs_mask>: Change type to
|
||||||
|
std::vector<unsigned char>.
|
||||||
|
* tracepoint.c (collection_list::collection_list): Remove
|
||||||
|
m_regs_mask initializer from initializer list. Resize
|
||||||
|
m_regs_mask using the largest remote register number.
|
||||||
|
(collection_list::add_remote_register): Remove size check on
|
||||||
|
m_regs_mask. Use at to access element.
|
||||||
|
(collection_list::stringify): Change type of temp_buf to
|
||||||
|
gdb::char_vector. Update uses of temp_buf. Resize if needed to
|
||||||
|
stringify the register mask. Use pack_hex_byte for the register
|
||||||
|
mask.
|
||||||
|
|
||||||
|
+2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
+
|
||||||
|
+ * tracepoint.h (collection_list) <m_regs_mask>: Change type to
|
||||||
|
+ std::vector<unsigned char>.
|
||||||
|
+ * tracepoint.c (collection_list::collection_list): Remove
|
||||||
|
+ m_regs_mask initializer from initializer list. Resize
|
||||||
|
+ m_regs_mask using the largest remote register number.
|
||||||
|
+ (collection_list::add_remote_register): Remove size check on
|
||||||
|
+ m_regs_mask. Use at to access element.
|
||||||
|
+ (collection_list::stringify): Change type of temp_buf to
|
||||||
|
+ gdb::char_vector. Update uses of temp_buf. Resize if needed to
|
||||||
|
+ stringify the register mask. Use pack_hex_byte for the register
|
||||||
|
+ mask.
|
||||||
|
+
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* tracepoint.h (class collection_list) <add_register>: Remove.
|
||||||
|
|
||||||
|
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
|
||||||
|
--- a/gdb/tracepoint.c
|
||||||
|
+++ b/gdb/tracepoint.c
|
||||||
|
@@ -822,10 +822,8 @@ collection_list::add_remote_register (unsigned int regno)
|
||||||
|
{
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("collect register %d\n", regno);
|
||||||
|
- if (regno >= (8 * sizeof (m_regs_mask)))
|
||||||
|
- error (_("Internal: register number %d too large for tracepoint"),
|
||||||
|
- regno);
|
||||||
|
- m_regs_mask[regno / 8] |= 1 << (regno % 8);
|
||||||
|
+
|
||||||
|
+ m_regs_mask.at (regno / 8) |= 1 << (regno % 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add all the registers from the mask in AEXPR to the mask in the
|
||||||
|
@@ -1136,9 +1134,20 @@ collection_list::add_static_trace_data ()
|
||||||
|
}
|
||||||
|
|
||||||
|
collection_list::collection_list ()
|
||||||
|
- : m_regs_mask (),
|
||||||
|
- m_strace_data (false)
|
||||||
|
+ : m_strace_data (false)
|
||||||
|
{
|
||||||
|
+ int max_remote_regno = 0;
|
||||||
|
+ for (int i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
|
||||||
|
+ {
|
||||||
|
+ int remote_regno = (gdbarch_remote_register_number
|
||||||
|
+ (target_gdbarch (), i));
|
||||||
|
+
|
||||||
|
+ if (remote_regno >= 0 && remote_regno > max_remote_regno)
|
||||||
|
+ max_remote_regno = remote_regno;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ m_regs_mask.resize ((max_remote_regno / 8) + 1);
|
||||||
|
+
|
||||||
|
m_memranges.reserve (128);
|
||||||
|
m_aexprs.reserve (128);
|
||||||
|
}
|
||||||
|
@@ -1148,7 +1157,8 @@ collection_list::collection_list ()
|
||||||
|
std::vector<std::string>
|
||||||
|
collection_list::stringify ()
|
||||||
|
{
|
||||||
|
- char temp_buf[2048];
|
||||||
|
+ gdb::char_vector temp_buf (2048);
|
||||||
|
+
|
||||||
|
int count;
|
||||||
|
char *end;
|
||||||
|
long i;
|
||||||
|
@@ -1158,35 +1168,45 @@ collection_list::stringify ()
|
||||||
|
{
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("\nCollecting static trace data\n");
|
||||||
|
- end = temp_buf;
|
||||||
|
+ end = temp_buf.data ();
|
||||||
|
*end++ = 'L';
|
||||||
|
- str_list.emplace_back (temp_buf, end - temp_buf);
|
||||||
|
+ str_list.emplace_back (temp_buf.data (), end - temp_buf.data ());
|
||||||
|
}
|
||||||
|
|
||||||
|
- for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
|
||||||
|
+ for (i = m_regs_mask.size () - 1; i > 0; i--)
|
||||||
|
if (m_regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
|
||||||
|
break;
|
||||||
|
if (m_regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
|
||||||
|
{
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("\nCollecting registers (mask): 0x");
|
||||||
|
- end = temp_buf;
|
||||||
|
+
|
||||||
|
+ /* One char for 'R', one for the null terminator and two per
|
||||||
|
+ mask byte. */
|
||||||
|
+ std::size_t new_size = (i + 1) * 2 + 2;
|
||||||
|
+ if (new_size > temp_buf.size ())
|
||||||
|
+ temp_buf.resize (new_size);
|
||||||
|
+
|
||||||
|
+ end = temp_buf.data ();
|
||||||
|
*end++ = 'R';
|
||||||
|
for (; i >= 0; i--)
|
||||||
|
{
|
||||||
|
QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("%02X", m_regs_mask[i]);
|
||||||
|
- sprintf (end, "%02X", m_regs_mask[i]);
|
||||||
|
- end += 2;
|
||||||
|
+
|
||||||
|
+ end = pack_hex_byte (end, m_regs_mask[i]);
|
||||||
|
}
|
||||||
|
- str_list.emplace_back (temp_buf);
|
||||||
|
+ *end = '\0';
|
||||||
|
+
|
||||||
|
+ str_list.emplace_back (temp_buf.data ());
|
||||||
|
}
|
||||||
|
if (info_verbose)
|
||||||
|
printf_filtered ("\n");
|
||||||
|
if (!m_memranges.empty () && info_verbose)
|
||||||
|
printf_filtered ("Collecting memranges: \n");
|
||||||
|
- for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
|
||||||
|
+ for (i = 0, count = 0, end = temp_buf.data ();
|
||||||
|
+ i < m_memranges.size (); i++)
|
||||||
|
{
|
||||||
|
QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
if (info_verbose)
|
||||||
|
@@ -1200,9 +1220,9 @@ collection_list::stringify ()
|
||||||
|
}
|
||||||
|
if (count + 27 > MAX_AGENT_EXPR_LEN)
|
||||||
|
{
|
||||||
|
- str_list.emplace_back (temp_buf, count);
|
||||||
|
+ str_list.emplace_back (temp_buf.data (), count);
|
||||||
|
count = 0;
|
||||||
|
- end = temp_buf;
|
||||||
|
+ end = temp_buf.data ();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
@@ -1222,7 +1242,7 @@ collection_list::stringify ()
|
||||||
|
}
|
||||||
|
|
||||||
|
count += strlen (end);
|
||||||
|
- end = temp_buf + count;
|
||||||
|
+ end = temp_buf.data () + count;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < m_aexprs.size (); i++)
|
||||||
|
@@ -1230,9 +1250,9 @@ collection_list::stringify ()
|
||||||
|
QUIT; /* Allow user to bail out with ^C. */
|
||||||
|
if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
|
||||||
|
{
|
||||||
|
- str_list.emplace_back (temp_buf, count);
|
||||||
|
+ str_list.emplace_back (temp_buf.data (), count);
|
||||||
|
count = 0;
|
||||||
|
- end = temp_buf;
|
||||||
|
+ end = temp_buf.data ();
|
||||||
|
}
|
||||||
|
sprintf (end, "X%08X,", m_aexprs[i]->len);
|
||||||
|
end += 10; /* 'X' + 8 hex digits + ',' */
|
||||||
|
@@ -1244,9 +1264,9 @@ collection_list::stringify ()
|
||||||
|
|
||||||
|
if (count != 0)
|
||||||
|
{
|
||||||
|
- str_list.emplace_back (temp_buf, count);
|
||||||
|
+ str_list.emplace_back (temp_buf.data (), count);
|
||||||
|
count = 0;
|
||||||
|
- end = temp_buf;
|
||||||
|
+ end = temp_buf.data ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return str_list;
|
||||||
|
diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
|
||||||
|
--- a/gdb/tracepoint.h
|
||||||
|
+++ b/gdb/tracepoint.h
|
||||||
|
@@ -293,8 +293,9 @@ public:
|
||||||
|
{ return m_computed; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
- /* room for up to 256 regs */
|
||||||
|
- unsigned char m_regs_mask[32];
|
||||||
|
+ /* We need the allocator zero-initialize the mask, so we don't use
|
||||||
|
+ gdb::byte_vector. */
|
||||||
|
+ std::vector<unsigned char> m_regs_mask;
|
||||||
|
|
||||||
|
std::vector<memrange> m_memranges;
|
||||||
|
|
187
gdb-rhbz1187581-power8-regs-6of7.patch
Normal file
187
gdb-rhbz1187581-power8-regs-6of7.patch
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Date: Thu, 9 Aug 2018 17:18:15 +0200
|
||||||
|
Subject: gdb-rhbz1187581-power8-regs-6of7.patch
|
||||||
|
|
||||||
|
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
|
commit 296956befef3711ed458c7cba8041fde0dab9c50
|
||||||
|
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
Date: Mon Aug 6 16:24:55 2018 -0300
|
||||||
|
|
||||||
|
Allow larger regblock sizes when saving tracefiles
|
||||||
|
|
||||||
|
The tracefile.c:trace_save function assumes trace_regblock_size won't
|
||||||
|
be larger than the MAX_TRACE_UPLOAD constant, used to size the buffer
|
||||||
|
which holds trace data. This can cause buffer overruns when this is
|
||||||
|
not the case. This patch changes this function so that the larger
|
||||||
|
size is used to size the buffer.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* tracefile.c: Include common/byte-vector.h.
|
||||||
|
(trace_save): Change type of buf to gdb::byte_vector. Initialize
|
||||||
|
with trace_regblock_size if needed. Update uses of buf.
|
||||||
|
|
||||||
|
+2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
+
|
||||||
|
+ * tracefile.c: Include common/byte-vector.h.
|
||||||
|
+ (trace_save): Change type of buf to gdb::byte_vector. Initialize
|
||||||
|
+ with trace_regblock_size if needed. Update uses of buf.
|
||||||
|
+
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* tracepoint.h (collection_list) <m_regs_mask>: Change type to
|
||||||
|
|
||||||
|
diff --git a/gdb/tracefile.c b/gdb/tracefile.c
|
||||||
|
--- a/gdb/tracefile.c
|
||||||
|
+++ b/gdb/tracefile.c
|
||||||
|
@@ -22,6 +22,7 @@
|
||||||
|
#include "ctf.h"
|
||||||
|
#include "exec.h"
|
||||||
|
#include "regcache.h"
|
||||||
|
+#include "common/byte-vector.h"
|
||||||
|
|
||||||
|
/* Helper macros. */
|
||||||
|
|
||||||
|
@@ -67,7 +68,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
|
||||||
|
ULONGEST offset = 0;
|
||||||
|
#define MAX_TRACE_UPLOAD 2000
|
||||||
|
- gdb_byte buf[MAX_TRACE_UPLOAD];
|
||||||
|
+ gdb::byte_vector buf (std::max (MAX_TRACE_UPLOAD, trace_regblock_size));
|
||||||
|
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
||||||
|
|
||||||
|
/* If the target is to save the data to a file on its own, then just
|
||||||
|
@@ -144,7 +145,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
/* We ask for big blocks, in the hopes of efficiency, but
|
||||||
|
will take less if the target has packet size limitations
|
||||||
|
or some such. */
|
||||||
|
- gotten = target_get_raw_trace_data (buf, offset,
|
||||||
|
+ gotten = target_get_raw_trace_data (buf.data (), offset,
|
||||||
|
MAX_TRACE_UPLOAD);
|
||||||
|
if (gotten < 0)
|
||||||
|
error (_("Failure to get requested trace buffer data"));
|
||||||
|
@@ -152,7 +153,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
if (gotten == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
- writer->ops->write_trace_buffer (writer, buf, gotten);
|
||||||
|
+ writer->ops->write_trace_buffer (writer, buf.data (), gotten);
|
||||||
|
|
||||||
|
offset += gotten;
|
||||||
|
}
|
||||||
|
@@ -163,7 +164,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
/* Parse the trace buffers according to how data are stored
|
||||||
|
in trace buffer in GDBserver. */
|
||||||
|
|
||||||
|
- gotten = target_get_raw_trace_data (buf, offset, 6);
|
||||||
|
+ gotten = target_get_raw_trace_data (buf.data (), offset, 6);
|
||||||
|
|
||||||
|
if (gotten == 0)
|
||||||
|
break;
|
||||||
|
@@ -171,10 +172,10 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
/* Read the first six bytes in, which is the tracepoint
|
||||||
|
number and trace frame size. */
|
||||||
|
tp_num = (uint16_t)
|
||||||
|
- extract_unsigned_integer (&buf[0], 2, byte_order);
|
||||||
|
+ extract_unsigned_integer (&((buf.data ())[0]), 2, byte_order);
|
||||||
|
|
||||||
|
tf_size = (uint32_t)
|
||||||
|
- extract_unsigned_integer (&buf[2], 4, byte_order);
|
||||||
|
+ extract_unsigned_integer (&((buf.data ())[2]), 4, byte_order);
|
||||||
|
|
||||||
|
writer->ops->frame_ops->start (writer, tp_num);
|
||||||
|
gotten = 6;
|
||||||
|
@@ -192,7 +193,8 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
/* We'll fetch one block each time, in order to
|
||||||
|
handle the extremely large 'M' block. We first
|
||||||
|
fetch one byte to get the type of the block. */
|
||||||
|
- gotten = target_get_raw_trace_data (buf, offset, 1);
|
||||||
|
+ gotten = target_get_raw_trace_data (buf.data (),
|
||||||
|
+ offset, 1);
|
||||||
|
if (gotten < 1)
|
||||||
|
error (_("Failure to get requested trace buffer data"));
|
||||||
|
|
||||||
|
@@ -205,13 +207,13 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
{
|
||||||
|
case 'R':
|
||||||
|
gotten
|
||||||
|
- = target_get_raw_trace_data (buf, offset,
|
||||||
|
+ = target_get_raw_trace_data (buf.data (), offset,
|
||||||
|
trace_regblock_size);
|
||||||
|
if (gotten < trace_regblock_size)
|
||||||
|
error (_("Failure to get requested trace"
|
||||||
|
" buffer data"));
|
||||||
|
|
||||||
|
- TRACE_WRITE_R_BLOCK (writer, buf,
|
||||||
|
+ TRACE_WRITE_R_BLOCK (writer, buf.data (),
|
||||||
|
trace_regblock_size);
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
@@ -221,7 +223,8 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
LONGEST t;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
- t = target_get_raw_trace_data (buf,offset, 10);
|
||||||
|
+ t = target_get_raw_trace_data (buf.data (),
|
||||||
|
+ offset, 10);
|
||||||
|
if (t < 10)
|
||||||
|
error (_("Failure to get requested trace"
|
||||||
|
" buffer data"));
|
||||||
|
@@ -231,10 +234,10 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
|
||||||
|
gotten = 0;
|
||||||
|
addr = (ULONGEST)
|
||||||
|
- extract_unsigned_integer (buf, 8,
|
||||||
|
+ extract_unsigned_integer (buf.data (), 8,
|
||||||
|
byte_order);
|
||||||
|
mlen = (unsigned short)
|
||||||
|
- extract_unsigned_integer (&buf[8], 2,
|
||||||
|
+ extract_unsigned_integer (&((buf.data ())[8]), 2,
|
||||||
|
byte_order);
|
||||||
|
|
||||||
|
TRACE_WRITE_M_BLOCK_HEADER (writer, addr,
|
||||||
|
@@ -252,14 +255,15 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
else
|
||||||
|
read_length = mlen - j;
|
||||||
|
|
||||||
|
- t = target_get_raw_trace_data (buf,
|
||||||
|
+ t = target_get_raw_trace_data (buf.data (),
|
||||||
|
offset + j,
|
||||||
|
read_length);
|
||||||
|
if (t < read_length)
|
||||||
|
error (_("Failure to get requested"
|
||||||
|
" trace buffer data"));
|
||||||
|
|
||||||
|
- TRACE_WRITE_M_BLOCK_MEMORY (writer, buf,
|
||||||
|
+ TRACE_WRITE_M_BLOCK_MEMORY (writer,
|
||||||
|
+ buf.data (),
|
||||||
|
read_length);
|
||||||
|
|
||||||
|
j += read_length;
|
||||||
|
@@ -274,18 +278,18 @@ trace_save (const char *filename, struct trace_file_writer *writer,
|
||||||
|
LONGEST val;
|
||||||
|
|
||||||
|
gotten
|
||||||
|
- = target_get_raw_trace_data (buf, offset,
|
||||||
|
- 12);
|
||||||
|
+ = target_get_raw_trace_data (buf.data (),
|
||||||
|
+ offset, 12);
|
||||||
|
if (gotten < 12)
|
||||||
|
error (_("Failure to get requested"
|
||||||
|
" trace buffer data"));
|
||||||
|
|
||||||
|
- vnum = (int) extract_signed_integer (buf,
|
||||||
|
+ vnum = (int) extract_signed_integer (buf.data (),
|
||||||
|
4,
|
||||||
|
byte_order);
|
||||||
|
val
|
||||||
|
- = extract_signed_integer (&buf[4], 8,
|
||||||
|
- byte_order);
|
||||||
|
+ = extract_signed_integer (&((buf.data ())[4]),
|
||||||
|
+ 8, byte_order);
|
||||||
|
|
||||||
|
TRACE_WRITE_V_BLOCK (writer, vnum, val);
|
||||||
|
}
|
129
gdb-rhbz1187581-power8-regs-7of7.patch
Normal file
129
gdb-rhbz1187581-power8-regs-7of7.patch
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Date: Thu, 9 Aug 2018 17:18:49 +0200
|
||||||
|
Subject: gdb-rhbz1187581-power8-regs-7of7.patch
|
||||||
|
|
||||||
|
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
|
commit a7f25a84f4cc1df5248c46346337f19a2a66af5a
|
||||||
|
Author: Simon Marchi <simon.marchi@ericsson.com>
|
||||||
|
Date: Mon Aug 6 16:54:47 2018 -0400
|
||||||
|
|
||||||
|
Fix compilation failure in remote.c
|
||||||
|
|
||||||
|
A recent patch introduced a few of these:
|
||||||
|
|
||||||
|
/home/emaisin/src/binutils-gdb/gdb/remote.c:12862:19: error: format not a string literal and no format arguments [-Werror=format-security]
|
||||||
|
error (err_msg);
|
||||||
|
^
|
||||||
|
|
||||||
|
Fix them by replacing the call to error with
|
||||||
|
|
||||||
|
error ("%s", err_msg);
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
* remote.c (remote_target::download_tracepoint): Fix format
|
||||||
|
string errors.
|
||||||
|
|
||||||
|
+2018-08-06 Simon Marchi <simon.marchi@ericsson.com>
|
||||||
|
+
|
||||||
|
+ * remote.c (remote_target::download_tracepoint): Fix format
|
||||||
|
+ string errors.
|
||||||
|
+
|
||||||
|
2018-08-06 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||||
|
|
||||||
|
* tracefile.c: Include common/byte-vector.h.
|
||||||
|
|
||||||
|
diff --git a/gdb/remote.c b/gdb/remote.c
|
||||||
|
--- a/gdb/remote.c
|
||||||
|
+++ b/gdb/remote.c
|
||||||
|
@@ -12826,7 +12826,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
t->step_count, t->pass_count);
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= buf.size ())
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
|
||||||
|
/* Fast tracepoints are mostly handled by the target, but we can
|
||||||
|
tell the target how big of an instruction block should be moved
|
||||||
|
@@ -12846,7 +12846,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
gdb_insn_length (loc->gdbarch, tpaddr));
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= size_left)
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* If it passed validation at definition but fails now,
|
||||||
|
@@ -12877,7 +12877,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
size_left, ":S");
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= size_left)
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error (_("Static tracepoint not valid during download"));
|
||||||
|
@@ -12905,14 +12905,14 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
size_left, ":X%x,", aexpr->len);
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= size_left)
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
|
||||||
|
size_left = buf.size () - strlen (buf.data ());
|
||||||
|
|
||||||
|
/* Two bytes to encode each aexpr byte, plus the terminating
|
||||||
|
null byte. */
|
||||||
|
if (aexpr->len * 2 + 1 > size_left)
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
|
||||||
|
pkt = buf.data () + strlen (buf.data ());
|
||||||
|
|
||||||
|
@@ -12933,7 +12933,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
size_left, "-");
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= size_left)
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
putpkt (buf.data ());
|
||||||
|
@@ -12956,7 +12956,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
has_more ? '-' : 0);
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= buf.size ())
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
|
||||||
|
putpkt (buf.data ());
|
||||||
|
remote_get_noisy_reply ();
|
||||||
|
@@ -12979,7 +12979,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
has_more ? "-" : "");
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= buf.size ())
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
|
||||||
|
putpkt (buf.data ());
|
||||||
|
remote_get_noisy_reply ();
|
||||||
|
@@ -12994,7 +12994,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
ret = snprintf (buf.data (), buf.size (), "QTDPsrc:");
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= buf.size ())
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
|
||||||
|
encode_source_string (b->number, loc->address, "at",
|
||||||
|
event_location_to_string (b->location.get ()),
|
||||||
|
@@ -13010,7 +13010,7 @@ remote_target::download_tracepoint (struct bp_location *loc)
|
||||||
|
ret = snprintf (buf.data (), buf.size (), "QTDPsrc:");
|
||||||
|
|
||||||
|
if (ret < 0 || ret >= buf.size ())
|
||||||
|
- error (err_msg);
|
||||||
|
+ error ("%s", err_msg);
|
||||||
|
|
||||||
|
encode_source_string (b->number, loc->address,
|
||||||
|
"cond", b->cond_string,
|
5
gdb.spec
5
gdb.spec
@ -26,7 +26,7 @@ Version: 8.1.90.%{snapsrc}
|
|||||||
|
|
||||||
# The release always contains a leading reserved number, start it at 1.
|
# The release always contains a leading reserved number, start it at 1.
|
||||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||||
Release: 43%{?dist}
|
Release: 44%{?dist}
|
||||||
|
|
||||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
|
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
|
||||||
Group: Development/Debuggers
|
Group: Development/Debuggers
|
||||||
@ -1022,6 +1022,9 @@ fi
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Aug 9 2018 Jan Kratochvil <jan.kratochvil@redhat.com> - 8.1.90.20180727-44.fc29
|
||||||
|
- Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
|
||||||
|
|
||||||
* Thu Aug 9 2018 Sergio Durigan Junior <sergiodj@redhat.com> - 8.1.90.20180727-43.fc29
|
* Thu Aug 9 2018 Sergio Durigan Junior <sergiodj@redhat.com> - 8.1.90.20180727-43.fc29
|
||||||
- Reenable libipt.
|
- Reenable libipt.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user