summaryrefslogtreecommitdiff
path: root/gdb/inf-ptrace.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2004-10-01 16:12:26 +0000
committerAndrew Cagney <cagney@redhat.com>2004-10-01 16:12:26 +0000
commitcb85a953947f35d14a49eff8f67f82b36f3cf984 (patch)
treec5acb18e11d613b5e7d7e80d3c5622c4255c45b5 /gdb/inf-ptrace.c
parent40a18ebd3ae910042b4d7bf053a41c247db7cbc1 (diff)
downloadbinutils-gdb-cb85a953947f35d14a49eff8f67f82b36f3cf984.tar.gz
2004-10-01 Andrew Cagney <cagney@gnu.org>
* target.c (xfer_using_stratum): Change return type to LONGEST. On each iteration offset, readbuf and writebuf. * inf-ptrace.c (inf_ptrace_xfer_partial): Simplify computation of partial_length, and read/modify/write predicate, update comments. Pass buffer.word to ptrace write.
Diffstat (limited to 'gdb/inf-ptrace.c')
-rw-r--r--gdb/inf-ptrace.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 4a37d394d63..0aa6fd17c81 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -514,25 +514,27 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
ULONGEST rounded_offset;
LONGEST partial_len;
- /* Round the start address down to the next long word boundary. */
+ /* Round the start offset down to the next long word
+ boundary. */
rounded_offset = offset & -(ULONGEST) sizeof (PTRACE_TYPE_RET);
- /* Truncate the length so that at max a single word will be
- transfered. Remember, this function is required to perform
- only a partial read so no more than one word should be
- transfered). */
- if (rounded_offset + sizeof (PTRACE_TYPE_RET) < offset + len)
- partial_len = sizeof (PTRACE_TYPE_RET) - (offset - rounded_offset);
- else
+ /* Since ptrace will transfer a single word starting at that
+ rounded_offset the partial_len needs to be adjusted down to
+ that (remember this function only does a single transfer).
+ Should the required length be even less, adjust it down
+ again. */
+ partial_len = (rounded_offset + sizeof (PTRACE_TYPE_RET)) - offset;
+ if (partial_len > len)
partial_len = len;
if (writebuf)
{
- /* Fill start and end extra bytes of buffer with existing
- memory data. */
+ /* If OFFSET:PARTIAL_LEN is smaller than
+ ROUNDED_OFFSET:WORDSIZE then a read/modify write will
+ be needed. Read in the entire word. */
if (rounded_offset < offset
- || (partial_len + (offset - rounded_offset)
- < sizeof (PTRACE_TYPE_RET)))
+ || (offset + partial_len
+ < rounded_offset + sizeof (PTRACE_TYPE_RET)))
/* Need part of initial word -- fetch it. */
buffer.word = ptrace (PT_READ_I, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) (long) rounded_offset,
@@ -545,7 +547,7 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
errno = 0;
ptrace (PT_WRITE_D, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) (long) rounded_offset,
- (int) buffer.byte);
+ buffer.word);
if (errno)
{
/* Using the appropriate one (I or D) is necessary for
@@ -553,7 +555,7 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
errno = 0;
ptrace (PT_WRITE_I, PIDGET (inferior_ptid),
(PTRACE_TYPE_ARG3) (long) rounded_offset,
- (int) buffer.byte);
+ buffer.word);
if (errno)
return 0;
}