This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] tracepoint: fix tfile byte order issue
On Tue, Oct 19, 2010 at 17:20, Pedro Alves <pedro@codesourcery.com> wrote:
> On Tuesday 19 October 2010 09:48:28, Hui Zhu wrote:
>
>> @@ -3665,6 +3665,9 @@ tfile_get_traceframe_address (off_t tfra
>> ? ? perror_with_name (trace_filename);
>> ? else if (gotten < 2)
>> ? ? error (_("Premature end of file while reading trace file"));
>> + ?tpnum = (short) extract_unsigned_integer ((gdb_byte *)&tpnum, 2,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gdbarch_byte_order
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (get_current_arch ()));
>>
>> ? tp = get_tracepoint_by_number_on_target (tpnum);
>> ? /* FIXME this is a poor heuristic if multiple locations */
>> @@ -3703,6 +3706,9 @@ tfile_trace_find (enum trace_find_type t
>> ? ? ? ?perror_with_name (trace_filename);
>> ? ? ? else if (gotten < 2)
>> ? ? ? ?error (_("Premature end of file while reading trace file"));
>> + ? ? ?tpnum = (short) extract_unsigned_integer ((gdb_byte *)&tpnum, 2,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gdbarch_byte_order
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (get_current_arch ()));
>
> "The data in this section is raw binary, not a
> hexadecimal or other encoding; its endianness matches the target's
> endianness."
>
> Please use target_gdbarch instead.
>
> And use extract_signed_integer thus avoiding the casts.
>
> --
> Pedro Alves
>
Thanks Pedro.
I make a new patch change to use target_gdbarch and use
extract_signed_integer in signed value.
And I found that tfile_trace_find define the size of a frame to a int:
int data_size;
But I found that gdbserver/tracepoint.c:struct traceframe:
unsigned int data_size : 32;
So I change this int to unsigned int.
Please help me review the new one.
Best,
Hui
2010-10-20 Hui Zhu <teawater@gmail.com>
* tracepoint.c (tfile_get_traceframe_address): Call
extract_signed_integer.
(tfile_trace_find): Call extract_signed_integer and
extract_unsigned_integer. Change data_size to unsigned int.
(tfile_fetch_registers): Call extract_unsigned_integer.
(tfile_xfer_partial): Ditto.
(tfile_get_trace_state_variable_value): Call
extract_signed_integer and extract_unsigned_integer.
---
tracepoint.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
--- a/tracepoint.c
+++ b/tracepoint.c
@@ -3665,6 +3665,9 @@ tfile_get_traceframe_address (off_t tfra
perror_with_name (trace_filename);
else if (gotten < 2)
error (_("Premature end of file while reading trace file"));
+ tpnum = (short) extract_signed_integer ((gdb_byte *)&tpnum, 2,
+ gdbarch_byte_order
+ (target_gdbarch));
tp = get_tracepoint_by_number_on_target (tpnum);
/* FIXME this is a poor heuristic if multiple locations */
@@ -3688,7 +3691,7 @@ tfile_trace_find (enum trace_find_type t
{
short tpnum;
int tfnum = 0, found = 0, gotten;
- int data_size;
+ unsigned int data_size;
struct breakpoint *tp;
off_t offset, tframe_offset;
ULONGEST tfaddr;
@@ -3703,6 +3706,9 @@ tfile_trace_find (enum trace_find_type t
perror_with_name (trace_filename);
else if (gotten < 2)
error (_("Premature end of file while reading trace file"));
+ tpnum = (short) extract_signed_integer ((gdb_byte *)&tpnum, 2,
+ gdbarch_byte_order
+ (target_gdbarch));
offset += 2;
if (tpnum == 0)
break;
@@ -3711,6 +3717,9 @@ tfile_trace_find (enum trace_find_type t
perror_with_name (trace_filename);
else if (gotten < 4)
error (_("Premature end of file while reading trace file"));
+ data_size = (unsigned int) extract_unsigned_integer
+ ((gdb_byte *)&data_size, 4,
+ gdbarch_byte_order (target_gdbarch));
offset += 4;
switch (type)
{
@@ -3832,6 +3841,10 @@ tfile_fetch_registers (struct target_ops
perror_with_name (trace_filename);
else if (gotten < 2)
error (_("Premature end of file while reading trace file"));
+ mlen = (unsigned short)
+ extract_unsigned_integer ((gdb_byte *)&mlen, 2,
+ gdbarch_byte_order
+ (target_gdbarch));
lseek (trace_fd, mlen, SEEK_CUR);
pos += (8 + 2 + mlen);
break;
@@ -3924,12 +3937,18 @@ tfile_xfer_partial (struct target_ops *o
perror_with_name (trace_filename);
else if (gotten < 8)
error (_("Premature end of file while reading trace file"));
-
+ maddr = extract_unsigned_integer ((gdb_byte *)&maddr, 8,
+ gdbarch_byte_order
+ (target_gdbarch));
gotten = read (trace_fd, &mlen, 2);
if (gotten < 0)
perror_with_name (trace_filename);
else if (gotten < 2)
error (_("Premature end of file while reading trace file"));
+ mlen = (unsigned short)
+ extract_unsigned_integer ((gdb_byte *)&mlen, 2,
+ gdbarch_byte_order
+ (target_gdbarch));
/* If the block includes the first part of the desired
range, return as much it has; GDB will re-request the
remainder, which might be in a different block of this
@@ -4032,6 +4051,10 @@ tfile_get_trace_state_variable_value (in
perror_with_name (trace_filename);
else if (gotten < 2)
error (_("Premature end of file while reading trace file"));
+ mlen = (unsigned short)
+ extract_unsigned_integer ((gdb_byte *)&mlen, 2,
+ gdbarch_byte_order
+ (target_gdbarch));
lseek (trace_fd, mlen, SEEK_CUR);
pos += (8 + 2 + mlen);
break;
@@ -4041,6 +4064,9 @@ tfile_get_trace_state_variable_value (in
perror_with_name (trace_filename);
else if (gotten < 4)
error (_("Premature end of file while reading trace file"));
+ vnum = (int) extract_signed_integer ((gdb_byte *)&vnum, 4,
+ gdbarch_byte_order
+ (target_gdbarch));
if (tsvnum == vnum)
{
gotten = read (trace_fd, val, 8);
@@ -4048,6 +4074,9 @@ tfile_get_trace_state_variable_value (in
perror_with_name (trace_filename);
else if (gotten < 8)
error (_("Premature end of file while reading trace file"));
+ *val = extract_signed_integer ((gdb_byte *)val, 8,
+ gdbarch_byte_order
+ (target_gdbarch));
return 1;
}
lseek (trace_fd, 8, SEEK_CUR);