public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Jan Kratochvil <jan.kratochvil@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/gdb] gdb-17.2-rebase-f44: Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
Date: Sat, 27 Jun 2026 23:59:14 GMT [thread overview]
Message-ID: <178260475467.1.17583777480504987350.rpms-gdb-22998d94f750@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/gdb
Branch : gdb-17.2-rebase-f44
Commit : 22998d94f750fbba57ca3ddf5648ae2b772366ee
Author : Jan Kratochvil <jan.kratochvil@redhat.com>
Date : 2018-08-09T18:37:55+02:00
Stats : +1387/-1 in 11 file(s)
URL : https://src.fedoraproject.org/rpms/gdb/c/22998d94f750fbba57ca3ddf5648ae2b772366ee?branch=gdb-17.2-rebase-f44
Log:
Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
---
diff --git a/_gdb.spec.Patch.include b/_gdb.spec.Patch.include
index 946c4af..b3c5633 100644
--- a/_gdb.spec.Patch.include
+++ b/_gdb.spec.Patch.include
@@ -513,3 +513,24 @@ Patch123: gdb-rhbz881849-ipv6-2of3.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
+
diff --git a/_gdb.spec.patch.include b/_gdb.spec.patch.include
index 97f12c4..ca390b7 100644
--- a/_gdb.spec.patch.include
+++ b/_gdb.spec.patch.include
@@ -122,3 +122,10 @@
%patch122 -p1
%patch123 -p1
%patch124 -p1
+%patch125 -p1
+%patch126 -p1
+%patch127 -p1
+%patch128 -p1
+%patch129 -p1
+%patch130 -p1
+%patch131 -p1
diff --git a/_patch_order b/_patch_order
index b10536c..ec2f86f 100644
--- a/_patch_order
+++ b/_patch_order
@@ -122,3 +122,10 @@ gdb-rhbz1553104-s390x-arch12-test.patch
gdb-rhbz881849-ipv6-1of3.patch
gdb-rhbz881849-ipv6-2of3.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
diff --git a/gdb-rhbz1187581-power8-regs-1of7.patch b/gdb-rhbz1187581-power8-regs-1of7.patch
new file mode 100644
index 0000000..29bd798
--- /dev/null
+++ b/gdb-rhbz1187581-power8-regs-1of7.patch
@@ -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)
+ {
diff --git a/gdb-rhbz1187581-power8-regs-2of7.patch b/gdb-rhbz1187581-power8-regs-2of7.patch
new file mode 100644
index 0000000..b0d42cd
--- /dev/null
+++ b/gdb-rhbz1187581-power8-regs-2of7.patch
@@ -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 */
diff --git a/gdb-rhbz1187581-power8-regs-3of7.patch b/gdb-rhbz1187581-power8-regs-3of7.patch
new file mode 100644
index 0000000..5546f2b
--- /dev/null
+++ b/gdb-rhbz1187581-power8-regs-3of7.patch
@@ -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."));
diff --git a/gdb-rhbz1187581-power8-regs-4of7.patch b/gdb-rhbz1187581-power8-regs-4of7.patch
new file mode 100644
index 0000000..8c553a8
--- /dev/null
+++ b/gdb-rhbz1187581-power8-regs-4of7.patch
@@ -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,
diff --git a/gdb-rhbz1187581-power8-regs-5of7.patch b/gdb-rhbz1187581-power8-regs-5of7.patch
new file mode 100644
index 0000000..eaca52f
--- /dev/null
+++ b/gdb-rhbz1187581-power8-regs-5of7.patch
@@ -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;
+
diff --git a/gdb-rhbz1187581-power8-regs-6of7.patch b/gdb-rhbz1187581-power8-regs-6of7.patch
new file mode 100644
index 0000000..b0a5e1f
--- /dev/null
+++ b/gdb-rhbz1187581-power8-regs-6of7.patch
@@ -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);
+ }
diff --git a/gdb-rhbz1187581-power8-regs-7of7.patch b/gdb-rhbz1187581-power8-regs-7of7.patch
new file mode 100644
index 0000000..ee82673
--- /dev/null
+++ b/gdb-rhbz1187581-power8-regs-7of7.patch
@@ -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,
diff --git a/gdb.spec b/gdb.spec
index 4271cff..809aeae 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -26,7 +26,7 @@ Version: 8.1.90.%{snapsrc}
# 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.
-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
Group: Development/Debuggers
@@ -1022,6 +1022,9 @@ fi
%endif
%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
- Reenable libipt.
reply other threads:[~2026-06-27 23:59 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178260475467.1.17583777480504987350.rpms-gdb-22998d94f750@fedoraproject.org \
--to=jan.kratochvil@redhat.com \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox