This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] tracepoint: fix tfile byte order issue


Ping


---------- Forwarded message ----------
From: Hui Zhu <teawater@gmail.com>
Date: Thu, Oct 14, 2010 at 14:40
Subject: [PATCH] tracepoint: fix tfile byte order issue
To: gdb-patches ml <gdb-patches@sourceware.org>


Hi,

I found that the "target tfile" doesn't handle the issue that byte
order of target part is different with host part.
For example:
In target part:
In gdbserver/tracepoint.c:add_traceframe
tframe->tpnum = tpoint->number;
It set this number directly.

In gdbserver/tracepoint.c:agent_mem_read
memcpy (mspace, &from, sizeof (from));
The address is set to memory directly.

In host part:
In ttacepoint.c:tfile_trace_find
gotten = read (trace_fd, &tpnum, 2);
After read, it is used directly.

If the byte order of target and host is same, everything is OK.
But if the target and host is not same, it will get error.

So I make a patch to let host part use extract_unsigned_integer covert
the number. ?It will not affect current code. ?But can handle byte
order issue.

Thanks,
Hui


2010-10-14 ?Hui Zhu ?<teawater@gmail.com>

? ? ? ?* tracepoint.c (tfile_get_traceframe_address): Call
? ? ? ?extract_unsigned_integer.
? ? ? ?(tfile_trace_find): Ditto.
? ? ? ?(tfile_fetch_registers): Ditto.
? ? ? ?(tfile_xfer_partial): Ditto.
? ? ? ?(tfile_get_trace_state_variable_value): Ditto.
---
?tracepoint.c | ? 31 ++++++++++++++++++++++++++++++-
?1 file changed, 30 insertions(+), 1 deletion(-)

--- 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_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 ()));
? ? ? 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 = (int) extract_unsigned_integer ((gdb_byte *)&data_size, 4,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gdbarch_byte_order
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (get_current_arch ()));
? ? ? 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
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(get_current_arch ()));
? ? ? ? ?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
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (get_current_arch ()));
? ? ? ? ?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
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(get_current_arch ()));
? ? ? ? ?/* 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
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(get_current_arch ()));
? ? ? ? ?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_unsigned_integer ((gdb_byte *)&vnum, 4,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?gdbarch_byte_order
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(get_current_arch ()));
? ? ? ? ?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_unsigned_integer ((gdb_byte *)val, 8,
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?gdbarch_byte_order
+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(get_current_arch ()));
? ? ? ? ? ? ?return 1;
? ? ? ? ? ?}
? ? ? ? ?lseek (trace_fd, 8, SEEK_CUR);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]