From 8f3139231259ed3202513d7a83d0a25cb051a62a Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 13 Jul 2009 20:16:48 +0000 Subject: [PATCH] gdb/ Fix memory access from signed 32bit inferior registers on 64bit GDB. * linux-nat.c (linux_xfer_partial ): New variable addr_bit. Mask OFFSET by the ADDR_BIT width. gdb/testsuite/ * gdb.arch/amd64-i386-address.exp, gdb.arch/amd64-i386-address.S: New. --- gdb/ChangeLog | 6 +++ gdb/linux-nat.c | 14 ++++++ gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.arch/amd64-i386-address.S | 24 +++++++++++ gdb/testsuite/gdb.arch/amd64-i386-address.exp | 43 +++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 gdb/testsuite/gdb.arch/amd64-i386-address.S create mode 100644 gdb/testsuite/gdb.arch/amd64-i386-address.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dd8186df15f..b0625e0a9d4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2009-07-13 Jan Kratochvil + + Fix memory access from signed 32bit inferior registers on 64bit GDB. + * linux-nat.c (linux_xfer_partial ): New variable + addr_bit. Mask OFFSET by the ADDR_BIT width. + 2009-07-13 Anthony Green * moxie-tdep.c (moxie_gdbarch_init): Call diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index f8d7a5c1114..d91c6be5c22 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -4260,6 +4260,20 @@ linux_xfer_partial (struct target_ops *ops, enum target_object object, return linux_nat_xfer_osdata (ops, object, annex, readbuf, writebuf, offset, len); + /* GDB calculates all the addresses in possibly larget width of the address. + Address width needs to be masked before its final use - either by + linux_proc_xfer_partial or inf_ptrace_xfer_partial. + + Compare ADDR_BIT first to avoid a compiler warning on shift overflow. */ + + if (object == TARGET_OBJECT_MEMORY) + { + int addr_bit = gdbarch_addr_bit (target_gdbarch); + + if (addr_bit < (sizeof (ULONGEST) * HOST_CHAR_BIT)) + offset &= ((ULONGEST) 1 << addr_bit) - 1; + } + xfer = linux_proc_xfer_partial (ops, object, annex, readbuf, writebuf, offset, len); if (xfer != 0) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bb03bfe9a96..388303d751e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-07-13 Jan Kratochvil + + * gdb.arch/amd64-i386-address.exp, gdb.arch/amd64-i386-address.S: New. + 2009-07-13 Jan Kratochvil Fix gdb.base/macscp.exp when using custom inputrc. diff --git a/gdb/testsuite/gdb.arch/amd64-i386-address.S b/gdb/testsuite/gdb.arch/amd64-i386-address.S new file mode 100644 index 00000000000..edec6569ce9 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-i386-address.S @@ -0,0 +1,24 @@ +/* Copyright 2009 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + This file is part of the gdb testsuite. */ + +_start: .globl _start + movl $0xdeadf00d, %eax + pushl %eax + movl %esp, %ebx + int3 + nop + nop diff --git a/gdb/testsuite/gdb.arch/amd64-i386-address.exp b/gdb/testsuite/gdb.arch/amd64-i386-address.exp new file mode 100644 index 00000000000..22ede0991b2 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-i386-address.exp @@ -0,0 +1,43 @@ +# Copyright 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file is part of the gdb testsuite. + +# Test UNsigned extension of the 32-bit inferior address on a 64-bit host. +# On native 32-bit host the test always PASSed. + +if {![istarget "x86_64-*-*"] && ![istarget "i?86-*-*"]} then { + verbose "Skipping amd64->i386 adress test." + return +} + +if [prepare_for_testing amd64-i386-address.exp amd64-i386-address amd64-i386-address.S [list debug "additional_flags=-m32 -nostdlib"]] { + return -1 +} + +gdb_run_cmd + +set test "trap stop" +gdb_test_multiple "" $test { + -re "Program received signal SIGTRAP,.*_start .*$gdb_prompt $" { + pass $test + } +} + +gdb_test "x/wx \$esp" "0x\[0-9a-f\]*:\t0xdeadf00d" + +# Failure case would be: +# 0xff8d7f00: Cannot access memory at address 0xff8d7f00 +gdb_test "x/wx \$ebx" "0x\[0-9a-f\]*:\t0xdeadf00d" -- 2.39.2