X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Famd64-nat.c;h=3dcac73d88a91e64c287a7b3394dc482727c0e09;hb=3276427003bd1fc676d1cb913c4d09a9f7b1c74f;hp=6663267da2a589aac6dc5672063e181cc8d384e9;hpb=6aba47ca06d9150c6196a374b745c2711b46e045;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/amd64-nat.c b/gdb/amd64-nat.c index 6663267da2..3dcac73d88 100644 --- a/gdb/amd64-nat.c +++ b/gdb/amd64-nat.c @@ -1,12 +1,12 @@ /* Native-dependent code for AMD64. - Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. + Copyright (C) 2003-2019 Free Software Foundation, Inc. This file is part of GDB. 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 2 of the License, or + 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, @@ -15,19 +15,15 @@ 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, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "gdbarch.h" #include "regcache.h" -#include "gdb_assert.h" -#include "gdb_string.h" - #include "i386-tdep.h" #include "amd64-tdep.h" +#include "amd64-nat.h" /* The following bits of code help with implementing debugging 32-bit code natively on AMD64. The idea is to define two mappings between @@ -53,35 +49,42 @@ int amd64_native_gregset64_num_regs = AMD64_NUM_GREGS; general-purpose register set. */ static int -amd64_native_gregset_reg_offset (int regnum) +amd64_native_gregset_reg_offset (struct gdbarch *gdbarch, int regnum) { int *reg_offset = amd64_native_gregset64_reg_offset; int num_regs = amd64_native_gregset64_num_regs; gdb_assert (regnum >= 0); - if (gdbarch_ptr_bit (current_gdbarch) == 32) + if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) { reg_offset = amd64_native_gregset32_reg_offset; num_regs = amd64_native_gregset32_num_regs; } - if (num_regs > NUM_REGS) - num_regs = NUM_REGS; + if (num_regs > gdbarch_num_regs (gdbarch)) + num_regs = gdbarch_num_regs (gdbarch); + + if (regnum >= num_regs) + return -1; - if (regnum < num_regs && regnum < NUM_REGS) - return reg_offset[regnum]; + /* Kernels that predate Linux 2.6.25 don't provide access to + these segment registers in user_regs_struct. */ +#ifndef HAVE_STRUCT_USER_REGS_STRUCT_FS_BASE + if (regnum == AMD64_FSBASE_REGNUM || regnum == AMD64_GSBASE_REGNUM) + return -1; +#endif - return -1; + return reg_offset[regnum]; } /* Return whether the native general-purpose register set supplies register REGNUM. */ int -amd64_native_gregset_supplies_p (int regnum) +amd64_native_gregset_supplies_p (struct gdbarch *gdbarch, int regnum) { - return (amd64_native_gregset_reg_offset (regnum) != -1); + return (amd64_native_gregset_reg_offset (gdbarch, regnum) != -1); } @@ -92,25 +95,25 @@ void amd64_supply_native_gregset (struct regcache *regcache, const void *gregs, int regnum) { - const char *regs = gregs; - struct gdbarch *gdbarch = get_regcache_arch (regcache); + const char *regs = (const char *) gregs; + struct gdbarch *gdbarch = regcache->arch (); int num_regs = amd64_native_gregset64_num_regs; int i; - if (gdbarch_ptr_bit (gdbarch) == 32) + if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) num_regs = amd64_native_gregset32_num_regs; - if (num_regs > NUM_REGS) - num_regs = NUM_REGS; + if (num_regs > gdbarch_num_regs (gdbarch)) + num_regs = gdbarch_num_regs (gdbarch); for (i = 0; i < num_regs; i++) { if (regnum == -1 || regnum == i) { - int offset = amd64_native_gregset_reg_offset (i); + int offset = amd64_native_gregset_reg_offset (gdbarch, i); if (offset != -1) - regcache_raw_supply (regcache, i, regs + offset); + regcache->raw_supply (i, regs + offset); } } } @@ -123,12 +126,12 @@ void amd64_collect_native_gregset (const struct regcache *regcache, void *gregs, int regnum) { - char *regs = gregs; - struct gdbarch *gdbarch = get_regcache_arch (regcache); + char *regs = (char *) gregs; + struct gdbarch *gdbarch = regcache->arch (); int num_regs = amd64_native_gregset64_num_regs; int i; - if (gdbarch_ptr_bit (gdbarch) == 32) + if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32) { num_regs = amd64_native_gregset32_num_regs; @@ -137,27 +140,27 @@ amd64_collect_native_gregset (const struct regcache *regcache, for (i = 0; i <= I386_EIP_REGNUM; i++) { if (regnum == -1 || regnum == i) - memset (regs + amd64_native_gregset_reg_offset (i), 0, 8); + memset (regs + amd64_native_gregset_reg_offset (gdbarch, i), 0, 8); } /* Ditto for %cs, %ss, %ds, %es, %fs, and %gs. */ for (i = I386_CS_REGNUM; i <= I386_GS_REGNUM; i++) { if (regnum == -1 || regnum == i) - memset (regs + amd64_native_gregset_reg_offset (i), 0, 8); + memset (regs + amd64_native_gregset_reg_offset (gdbarch, i), 0, 8); } } - if (num_regs > NUM_REGS) - num_regs = NUM_REGS; + if (num_regs > gdbarch_num_regs (gdbarch)) + num_regs = gdbarch_num_regs (gdbarch); for (i = 0; i < num_regs; i++) { if (regnum == -1 || regnum == i) { - int offset = amd64_native_gregset_reg_offset (i); + int offset = amd64_native_gregset_reg_offset (gdbarch, i); if (offset != -1) - regcache_raw_collect (regcache, i, regs + offset); + regcache->raw_collect (i, regs + offset); } } }