Blame SOURCES/gdb-rhbz1187581-power8-regs-6of7.patch

689258
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
689258
From: Jan Kratochvil <jan.kratochvil@redhat.com>
689258
Date: Thu, 9 Aug 2018 17:18:15 +0200
689258
Subject: gdb-rhbz1187581-power8-regs-6of7.patch
689258
689258
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
689258
689258
commit 296956befef3711ed458c7cba8041fde0dab9c50
689258
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
689258
Date:   Mon Aug 6 16:24:55 2018 -0300
689258
689258
    Allow larger regblock sizes when saving tracefiles
689258
689258
    The tracefile.c:trace_save function assumes trace_regblock_size won't
689258
    be larger than the MAX_TRACE_UPLOAD constant, used to size the buffer
689258
    which holds trace data.  This can cause buffer overruns when this is
689258
    not the case.  This patch changes this function so that the larger
689258
    size is used to size the buffer.
689258
689258
    gdb/ChangeLog:
689258
    2018-08-06  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
689258
689258
            * tracefile.c: Include common/byte-vector.h.
689258
            (trace_save): Change type of buf to gdb::byte_vector.  Initialize
689258
            with trace_regblock_size if needed.  Update uses of buf.
689258
689258
+2018-08-06  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
689258
+
689258
+	* tracefile.c: Include common/byte-vector.h.
689258
+	(trace_save): Change type of buf to gdb::byte_vector.  Initialize
689258
+	with trace_regblock_size if needed.  Update uses of buf.
689258
+
689258
 2018-08-06  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
689258
689258
 	* tracepoint.h (collection_list) <m_regs_mask>: Change type to
689258
689258
diff --git a/gdb/tracefile.c b/gdb/tracefile.c
689258
--- a/gdb/tracefile.c
689258
+++ b/gdb/tracefile.c
689258
@@ -22,6 +22,7 @@
689258
 #include "ctf.h"
689258
 #include "exec.h"
689258
 #include "regcache.h"
689258
+#include "common/byte-vector.h"
689258
 
689258
 /* Helper macros.  */
689258
 
689258
@@ -67,7 +68,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 
689258
   ULONGEST offset = 0;
689258
 #define MAX_TRACE_UPLOAD 2000
689258
-  gdb_byte buf[MAX_TRACE_UPLOAD];
689258
+  gdb::byte_vector buf (std::max (MAX_TRACE_UPLOAD, trace_regblock_size));
689258
   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
689258
 
689258
   /* If the target is to save the data to a file on its own, then just
689258
@@ -144,7 +145,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 	  /* We ask for big blocks, in the hopes of efficiency, but
689258
 	     will take less if the target has packet size limitations
689258
 	     or some such.  */
689258
-	  gotten = target_get_raw_trace_data (buf, offset,
689258
+	  gotten = target_get_raw_trace_data (buf.data (), offset,
689258
 					      MAX_TRACE_UPLOAD);
689258
 	  if (gotten < 0)
689258
 	    error (_("Failure to get requested trace buffer data"));
689258
@@ -152,7 +153,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 	  if (gotten == 0)
689258
 	    break;
689258
 
689258
-	  writer->ops->write_trace_buffer (writer, buf, gotten);
689258
+	  writer->ops->write_trace_buffer (writer, buf.data (), gotten);
689258
 
689258
 	  offset += gotten;
689258
 	}
689258
@@ -163,7 +164,7 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 	  /* Parse the trace buffers according to how data are stored
689258
 	     in trace buffer in GDBserver.  */
689258
 
689258
-	  gotten = target_get_raw_trace_data (buf, offset, 6);
689258
+	  gotten = target_get_raw_trace_data (buf.data (), offset, 6);
689258
 
689258
 	  if (gotten == 0)
689258
 	    break;
689258
@@ -171,10 +172,10 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 	  /* Read the first six bytes in, which is the tracepoint
689258
 	     number and trace frame size.  */
689258
 	  tp_num = (uint16_t)
689258
-	    extract_unsigned_integer (&buf[0], 2, byte_order);
689258
+	    extract_unsigned_integer (&((buf.data ())[0]), 2, byte_order);
689258
 
689258
 	  tf_size = (uint32_t)
689258
-	    extract_unsigned_integer (&buf[2], 4, byte_order);
689258
+	    extract_unsigned_integer (&((buf.data ())[2]), 4, byte_order);
689258
 
689258
 	  writer->ops->frame_ops->start (writer, tp_num);
689258
 	  gotten = 6;
689258
@@ -192,7 +193,8 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 		  /* We'll fetch one block each time, in order to
689258
 		     handle the extremely large 'M' block.  We first
689258
 		     fetch one byte to get the type of the block.  */
689258
-		  gotten = target_get_raw_trace_data (buf, offset, 1);
689258
+		  gotten = target_get_raw_trace_data (buf.data (),
689258
+						      offset, 1);
689258
 		  if (gotten < 1)
689258
 		    error (_("Failure to get requested trace buffer data"));
689258
 
689258
@@ -205,13 +207,13 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 		    {
689258
 		    case 'R':
689258
 		      gotten
689258
-			= target_get_raw_trace_data (buf, offset,
689258
+			= target_get_raw_trace_data (buf.data (), offset,
689258
 						     trace_regblock_size);
689258
 		      if (gotten < trace_regblock_size)
689258
 			error (_("Failure to get requested trace"
689258
 				 " buffer data"));
689258
 
689258
-		      TRACE_WRITE_R_BLOCK (writer, buf,
689258
+		      TRACE_WRITE_R_BLOCK (writer, buf.data (),
689258
 					   trace_regblock_size);
689258
 		      break;
689258
 		    case 'M':
689258
@@ -221,7 +223,8 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 			LONGEST t;
689258
 			int j;
689258
 
689258
-			t = target_get_raw_trace_data (buf,offset, 10);
689258
+			t = target_get_raw_trace_data (buf.data (),
689258
+						       offset, 10);
689258
 			if (t < 10)
689258
 			  error (_("Failure to get requested trace"
689258
 				   " buffer data"));
689258
@@ -231,10 +234,10 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 
689258
 			gotten = 0;
689258
 			addr = (ULONGEST)
689258
-			  extract_unsigned_integer (buf, 8,
689258
+			  extract_unsigned_integer (buf.data (), 8,
689258
 						    byte_order);
689258
 			mlen = (unsigned short)
689258
-			  extract_unsigned_integer (&buf[8], 2,
689258
+			  extract_unsigned_integer (&((buf.data ())[8]), 2,
689258
 						    byte_order);
689258
 
689258
 			TRACE_WRITE_M_BLOCK_HEADER (writer, addr,
689258
@@ -252,14 +255,15 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 			    else
689258
 			      read_length = mlen - j;
689258
 
689258
-			    t = target_get_raw_trace_data (buf,
689258
+			    t = target_get_raw_trace_data (buf.data (),
689258
 							   offset + j,
689258
 							   read_length);
689258
 			    if (t < read_length)
689258
 			      error (_("Failure to get requested"
689258
 				       " trace buffer data"));
689258
 
689258
-			    TRACE_WRITE_M_BLOCK_MEMORY (writer, buf,
689258
+			    TRACE_WRITE_M_BLOCK_MEMORY (writer,
689258
+							buf.data (),
689258
 							read_length);
689258
 
689258
 			    j += read_length;
689258
@@ -274,18 +278,18 @@ trace_save (const char *filename, struct trace_file_writer *writer,
689258
 			LONGEST val;
689258
 
689258
 			gotten
689258
-			  = target_get_raw_trace_data (buf, offset,
689258
-						       12);
689258
+			  = target_get_raw_trace_data (buf.data (),
689258
+						       offset, 12);
689258
 			if (gotten < 12)
689258
 			  error (_("Failure to get requested"
689258
 				   " trace buffer data"));
689258
 
689258
-			vnum  = (int) extract_signed_integer (buf,
689258
+			vnum  = (int) extract_signed_integer (buf.data (),
689258
 							      4,
689258
 							      byte_order);
689258
 			val
689258
-			  = extract_signed_integer (&buf[4], 8,
689258
-						    byte_order);
689258
+			  = extract_signed_integer (&((buf.data ())[4]),
689258
+						    8, byte_order);
689258
 
689258
 			TRACE_WRITE_V_BLOCK (writer, vnum, val);
689258
 		      }