Home | History | Annotate | Line # | Download | only in gdb
      1   1.1  christos /* Target-dependent code for AMD64.
      2   1.1  christos 
      3  1.11  christos    Copyright (C) 2001-2024 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    Contributed by Jiri Smid, SuSE Labs.
      6   1.1  christos 
      7   1.1  christos    This file is part of GDB.
      8   1.1  christos 
      9   1.1  christos    This program is free software; you can redistribute it and/or modify
     10   1.1  christos    it under the terms of the GNU General Public License as published by
     11   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     12   1.1  christos    (at your option) any later version.
     13   1.1  christos 
     14   1.1  christos    This program is distributed in the hope that it will be useful,
     15   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     16   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17   1.1  christos    GNU General Public License for more details.
     18   1.1  christos 
     19   1.1  christos    You should have received a copy of the GNU General Public License
     20   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     21   1.1  christos 
     22  1.11  christos #include "extract-store-integer.h"
     23  1.11  christos #include "language.h"
     24   1.1  christos #include "opcode/i386.h"
     25   1.1  christos #include "dis-asm.h"
     26   1.1  christos #include "arch-utils.h"
     27   1.1  christos #include "dummy-frame.h"
     28   1.1  christos #include "frame.h"
     29   1.1  christos #include "frame-base.h"
     30   1.1  christos #include "frame-unwind.h"
     31   1.1  christos #include "inferior.h"
     32   1.3  christos #include "infrun.h"
     33  1.11  christos #include "cli/cli-cmds.h"
     34   1.1  christos #include "gdbcore.h"
     35   1.1  christos #include "objfiles.h"
     36   1.1  christos #include "regcache.h"
     37   1.1  christos #include "regset.h"
     38   1.1  christos #include "symfile.h"
     39   1.1  christos #include "disasm.h"
     40   1.1  christos #include "amd64-tdep.h"
     41   1.1  christos #include "i387-tdep.h"
     42   1.9  christos #include "gdbsupport/x86-xstate.h"
     43   1.7  christos #include <algorithm>
     44   1.8  christos #include "target-descriptions.h"
     45   1.8  christos #include "arch/amd64.h"
     46   1.8  christos #include "producer.h"
     47   1.1  christos #include "ax.h"
     48   1.1  christos #include "ax-gdb.h"
     49   1.9  christos #include "gdbsupport/byte-vector.h"
     50   1.8  christos #include "osabi.h"
     51   1.8  christos #include "x86-tdep.h"
     52  1.10  christos #include "amd64-ravenscar-thread.h"
     53   1.1  christos 
     54   1.1  christos /* Note that the AMD64 architecture was previously known as x86-64.
     55   1.1  christos    The latter is (forever) engraved into the canonical system name as
     56   1.1  christos    returned by config.guess, and used as the name for the AMD64 port
     57   1.1  christos    of GNU/Linux.  The BSD's have renamed their ports to amd64; they
     58   1.1  christos    don't like to shout.  For GDB we prefer the amd64_-prefix over the
     59   1.1  christos    x86_64_-prefix since it's so much easier to type.  */
     60   1.1  christos 
     61   1.1  christos /* Register information.  */
     62   1.1  christos 
     63  1.10  christos static const char * const amd64_register_names[] =
     64   1.1  christos {
     65   1.1  christos   "rax", "rbx", "rcx", "rdx", "rsi", "rdi", "rbp", "rsp",
     66   1.1  christos 
     67   1.1  christos   /* %r8 is indeed register number 8.  */
     68   1.1  christos   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
     69   1.1  christos   "rip", "eflags", "cs", "ss", "ds", "es", "fs", "gs",
     70   1.1  christos 
     71   1.1  christos   /* %st0 is register number 24.  */
     72   1.1  christos   "st0", "st1", "st2", "st3", "st4", "st5", "st6", "st7",
     73   1.1  christos   "fctrl", "fstat", "ftag", "fiseg", "fioff", "foseg", "fooff", "fop",
     74   1.1  christos 
     75   1.1  christos   /* %xmm0 is register number 40.  */
     76   1.1  christos   "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
     77   1.1  christos   "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
     78   1.1  christos   "mxcsr",
     79   1.1  christos };
     80   1.1  christos 
     81  1.10  christos static const char * const amd64_ymm_names[] =
     82   1.1  christos {
     83   1.1  christos   "ymm0", "ymm1", "ymm2", "ymm3",
     84   1.1  christos   "ymm4", "ymm5", "ymm6", "ymm7",
     85   1.1  christos   "ymm8", "ymm9", "ymm10", "ymm11",
     86   1.1  christos   "ymm12", "ymm13", "ymm14", "ymm15"
     87   1.1  christos };
     88   1.1  christos 
     89  1.10  christos static const char * const amd64_ymm_avx512_names[] =
     90   1.3  christos {
     91   1.3  christos   "ymm16", "ymm17", "ymm18", "ymm19",
     92   1.3  christos   "ymm20", "ymm21", "ymm22", "ymm23",
     93   1.3  christos   "ymm24", "ymm25", "ymm26", "ymm27",
     94   1.3  christos   "ymm28", "ymm29", "ymm30", "ymm31"
     95   1.3  christos };
     96   1.3  christos 
     97  1.10  christos static const char * const amd64_ymmh_names[] =
     98   1.1  christos {
     99   1.1  christos   "ymm0h", "ymm1h", "ymm2h", "ymm3h",
    100   1.1  christos   "ymm4h", "ymm5h", "ymm6h", "ymm7h",
    101   1.1  christos   "ymm8h", "ymm9h", "ymm10h", "ymm11h",
    102   1.1  christos   "ymm12h", "ymm13h", "ymm14h", "ymm15h"
    103   1.1  christos };
    104   1.1  christos 
    105  1.10  christos static const char * const amd64_ymmh_avx512_names[] =
    106   1.3  christos {
    107   1.3  christos   "ymm16h", "ymm17h", "ymm18h", "ymm19h",
    108   1.3  christos   "ymm20h", "ymm21h", "ymm22h", "ymm23h",
    109   1.3  christos   "ymm24h", "ymm25h", "ymm26h", "ymm27h",
    110   1.3  christos   "ymm28h", "ymm29h", "ymm30h", "ymm31h"
    111   1.3  christos };
    112   1.3  christos 
    113  1.10  christos static const char * const amd64_mpx_names[] =
    114   1.1  christos {
    115   1.1  christos   "bnd0raw", "bnd1raw", "bnd2raw", "bnd3raw", "bndcfgu", "bndstatus"
    116   1.1  christos };
    117   1.1  christos 
    118  1.10  christos static const char * const amd64_k_names[] =
    119   1.3  christos {
    120   1.3  christos   "k0", "k1", "k2", "k3",
    121   1.3  christos   "k4", "k5", "k6", "k7"
    122   1.3  christos };
    123   1.3  christos 
    124  1.10  christos static const char * const amd64_zmmh_names[] =
    125   1.3  christos {
    126   1.3  christos   "zmm0h", "zmm1h", "zmm2h", "zmm3h",
    127   1.3  christos   "zmm4h", "zmm5h", "zmm6h", "zmm7h",
    128   1.3  christos   "zmm8h", "zmm9h", "zmm10h", "zmm11h",
    129   1.3  christos   "zmm12h", "zmm13h", "zmm14h", "zmm15h",
    130   1.3  christos   "zmm16h", "zmm17h", "zmm18h", "zmm19h",
    131   1.3  christos   "zmm20h", "zmm21h", "zmm22h", "zmm23h",
    132   1.3  christos   "zmm24h", "zmm25h", "zmm26h", "zmm27h",
    133   1.3  christos   "zmm28h", "zmm29h", "zmm30h", "zmm31h"
    134   1.3  christos };
    135   1.3  christos 
    136  1.10  christos static const char * const amd64_zmm_names[] =
    137   1.3  christos {
    138   1.3  christos   "zmm0", "zmm1", "zmm2", "zmm3",
    139   1.3  christos   "zmm4", "zmm5", "zmm6", "zmm7",
    140   1.3  christos   "zmm8", "zmm9", "zmm10", "zmm11",
    141   1.3  christos   "zmm12", "zmm13", "zmm14", "zmm15",
    142   1.3  christos   "zmm16", "zmm17", "zmm18", "zmm19",
    143   1.3  christos   "zmm20", "zmm21", "zmm22", "zmm23",
    144   1.3  christos   "zmm24", "zmm25", "zmm26", "zmm27",
    145   1.3  christos   "zmm28", "zmm29", "zmm30", "zmm31"
    146   1.3  christos };
    147   1.3  christos 
    148  1.10  christos static const char * const amd64_xmm_avx512_names[] = {
    149   1.3  christos     "xmm16",  "xmm17",  "xmm18",  "xmm19",
    150   1.3  christos     "xmm20",  "xmm21",  "xmm22",  "xmm23",
    151   1.3  christos     "xmm24",  "xmm25",  "xmm26",  "xmm27",
    152   1.3  christos     "xmm28",  "xmm29",  "xmm30",  "xmm31"
    153   1.3  christos };
    154   1.3  christos 
    155  1.10  christos static const char * const amd64_pkeys_names[] = {
    156   1.7  christos     "pkru"
    157   1.7  christos };
    158   1.7  christos 
    159   1.1  christos /* DWARF Register Number Mapping as defined in the System V psABI,
    160   1.1  christos    section 3.6.  */
    161   1.1  christos 
    162   1.1  christos static int amd64_dwarf_regmap[] =
    163   1.1  christos {
    164   1.1  christos   /* General Purpose Registers RAX, RDX, RCX, RBX, RSI, RDI.  */
    165   1.1  christos   AMD64_RAX_REGNUM, AMD64_RDX_REGNUM,
    166   1.1  christos   AMD64_RCX_REGNUM, AMD64_RBX_REGNUM,
    167   1.1  christos   AMD64_RSI_REGNUM, AMD64_RDI_REGNUM,
    168   1.1  christos 
    169   1.1  christos   /* Frame Pointer Register RBP.  */
    170   1.1  christos   AMD64_RBP_REGNUM,
    171   1.1  christos 
    172   1.1  christos   /* Stack Pointer Register RSP.  */
    173   1.1  christos   AMD64_RSP_REGNUM,
    174   1.1  christos 
    175   1.1  christos   /* Extended Integer Registers 8 - 15.  */
    176   1.1  christos   AMD64_R8_REGNUM,		/* %r8 */
    177   1.1  christos   AMD64_R9_REGNUM,		/* %r9 */
    178   1.1  christos   AMD64_R10_REGNUM,		/* %r10 */
    179   1.1  christos   AMD64_R11_REGNUM,		/* %r11 */
    180   1.1  christos   AMD64_R12_REGNUM,		/* %r12 */
    181   1.1  christos   AMD64_R13_REGNUM,		/* %r13 */
    182   1.1  christos   AMD64_R14_REGNUM,		/* %r14 */
    183   1.1  christos   AMD64_R15_REGNUM,		/* %r15 */
    184   1.1  christos 
    185   1.1  christos   /* Return Address RA.  Mapped to RIP.  */
    186   1.1  christos   AMD64_RIP_REGNUM,
    187   1.1  christos 
    188   1.1  christos   /* SSE Registers 0 - 7.  */
    189   1.1  christos   AMD64_XMM0_REGNUM + 0, AMD64_XMM1_REGNUM,
    190   1.1  christos   AMD64_XMM0_REGNUM + 2, AMD64_XMM0_REGNUM + 3,
    191   1.1  christos   AMD64_XMM0_REGNUM + 4, AMD64_XMM0_REGNUM + 5,
    192   1.1  christos   AMD64_XMM0_REGNUM + 6, AMD64_XMM0_REGNUM + 7,
    193   1.1  christos 
    194   1.1  christos   /* Extended SSE Registers 8 - 15.  */
    195   1.1  christos   AMD64_XMM0_REGNUM + 8, AMD64_XMM0_REGNUM + 9,
    196   1.1  christos   AMD64_XMM0_REGNUM + 10, AMD64_XMM0_REGNUM + 11,
    197   1.1  christos   AMD64_XMM0_REGNUM + 12, AMD64_XMM0_REGNUM + 13,
    198   1.1  christos   AMD64_XMM0_REGNUM + 14, AMD64_XMM0_REGNUM + 15,
    199   1.1  christos 
    200   1.1  christos   /* Floating Point Registers 0-7.  */
    201   1.1  christos   AMD64_ST0_REGNUM + 0, AMD64_ST0_REGNUM + 1,
    202   1.1  christos   AMD64_ST0_REGNUM + 2, AMD64_ST0_REGNUM + 3,
    203   1.1  christos   AMD64_ST0_REGNUM + 4, AMD64_ST0_REGNUM + 5,
    204   1.1  christos   AMD64_ST0_REGNUM + 6, AMD64_ST0_REGNUM + 7,
    205   1.3  christos 
    206   1.3  christos   /* MMX Registers 0 - 7.
    207   1.3  christos      We have to handle those registers specifically, as their register
    208   1.3  christos      number within GDB depends on the target (or they may even not be
    209   1.3  christos      available at all).  */
    210   1.3  christos   -1, -1, -1, -1, -1, -1, -1, -1,
    211   1.3  christos 
    212   1.1  christos   /* Control and Status Flags Register.  */
    213   1.1  christos   AMD64_EFLAGS_REGNUM,
    214   1.1  christos 
    215   1.1  christos   /* Selector Registers.  */
    216   1.1  christos   AMD64_ES_REGNUM,
    217   1.1  christos   AMD64_CS_REGNUM,
    218   1.1  christos   AMD64_SS_REGNUM,
    219   1.1  christos   AMD64_DS_REGNUM,
    220   1.1  christos   AMD64_FS_REGNUM,
    221   1.1  christos   AMD64_GS_REGNUM,
    222   1.1  christos   -1,
    223   1.1  christos   -1,
    224   1.1  christos 
    225   1.1  christos   /* Segment Base Address Registers.  */
    226   1.1  christos   -1,
    227   1.1  christos   -1,
    228   1.1  christos   -1,
    229   1.1  christos   -1,
    230   1.1  christos 
    231   1.1  christos   /* Special Selector Registers.  */
    232   1.1  christos   -1,
    233   1.1  christos   -1,
    234   1.1  christos 
    235   1.1  christos   /* Floating Point Control Registers.  */
    236   1.1  christos   AMD64_MXCSR_REGNUM,
    237   1.1  christos   AMD64_FCTRL_REGNUM,
    238  1.11  christos   AMD64_FSTAT_REGNUM,
    239  1.11  christos 
    240  1.11  christos   /* XMM16-XMM31.  */
    241  1.11  christos   AMD64_XMM16_REGNUM + 0, AMD64_XMM16_REGNUM + 1,
    242  1.11  christos   AMD64_XMM16_REGNUM + 2, AMD64_XMM16_REGNUM + 3,
    243  1.11  christos   AMD64_XMM16_REGNUM + 4, AMD64_XMM16_REGNUM + 5,
    244  1.11  christos   AMD64_XMM16_REGNUM + 6, AMD64_XMM16_REGNUM + 7,
    245  1.11  christos   AMD64_XMM16_REGNUM + 8, AMD64_XMM16_REGNUM + 9,
    246  1.11  christos   AMD64_XMM16_REGNUM + 10, AMD64_XMM16_REGNUM + 11,
    247  1.11  christos   AMD64_XMM16_REGNUM + 12, AMD64_XMM16_REGNUM + 13,
    248  1.11  christos   AMD64_XMM16_REGNUM + 14, AMD64_XMM16_REGNUM + 15,
    249  1.11  christos 
    250  1.11  christos   /* Reserved.  */
    251  1.11  christos   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    252  1.11  christos   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    253  1.11  christos   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    254  1.11  christos 
    255  1.11  christos   /* Mask Registers.  */
    256  1.11  christos   AMD64_K0_REGNUM + 0, AMD64_K0_REGNUM + 1,
    257  1.11  christos   AMD64_K0_REGNUM + 2, AMD64_K0_REGNUM + 3,
    258  1.11  christos   AMD64_K0_REGNUM + 4, AMD64_K0_REGNUM + 5,
    259  1.11  christos   AMD64_K0_REGNUM + 6, AMD64_K0_REGNUM + 7
    260   1.1  christos };
    261   1.1  christos 
    262   1.1  christos static const int amd64_dwarf_regmap_len =
    263   1.1  christos   (sizeof (amd64_dwarf_regmap) / sizeof (amd64_dwarf_regmap[0]));
    264   1.1  christos 
    265   1.1  christos /* Convert DWARF register number REG to the appropriate register
    266   1.1  christos    number used by GDB.  */
    267   1.1  christos 
    268   1.1  christos static int
    269   1.1  christos amd64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
    270   1.1  christos {
    271  1.10  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
    272   1.1  christos   int ymm0_regnum = tdep->ymm0_regnum;
    273   1.1  christos   int regnum = -1;
    274   1.1  christos 
    275   1.1  christos   if (reg >= 0 && reg < amd64_dwarf_regmap_len)
    276   1.1  christos     regnum = amd64_dwarf_regmap[reg];
    277   1.1  christos 
    278  1.11  christos   if (ymm0_regnum >= 0 && i386_xmm_regnum_p (gdbarch, regnum))
    279   1.1  christos     regnum += ymm0_regnum - I387_XMM0_REGNUM (tdep);
    280   1.1  christos 
    281   1.1  christos   return regnum;
    282   1.1  christos }
    283   1.1  christos 
    284   1.1  christos /* Map architectural register numbers to gdb register numbers.  */
    285   1.1  christos 
    286   1.1  christos static const int amd64_arch_regmap[16] =
    287   1.1  christos {
    288   1.1  christos   AMD64_RAX_REGNUM,	/* %rax */
    289   1.1  christos   AMD64_RCX_REGNUM,	/* %rcx */
    290   1.1  christos   AMD64_RDX_REGNUM,	/* %rdx */
    291   1.1  christos   AMD64_RBX_REGNUM,	/* %rbx */
    292   1.1  christos   AMD64_RSP_REGNUM,	/* %rsp */
    293   1.1  christos   AMD64_RBP_REGNUM,	/* %rbp */
    294   1.1  christos   AMD64_RSI_REGNUM,	/* %rsi */
    295   1.1  christos   AMD64_RDI_REGNUM,	/* %rdi */
    296   1.1  christos   AMD64_R8_REGNUM,	/* %r8 */
    297   1.1  christos   AMD64_R9_REGNUM,	/* %r9 */
    298   1.1  christos   AMD64_R10_REGNUM,	/* %r10 */
    299   1.1  christos   AMD64_R11_REGNUM,	/* %r11 */
    300   1.1  christos   AMD64_R12_REGNUM,	/* %r12 */
    301   1.1  christos   AMD64_R13_REGNUM,	/* %r13 */
    302   1.1  christos   AMD64_R14_REGNUM,	/* %r14 */
    303   1.1  christos   AMD64_R15_REGNUM	/* %r15 */
    304   1.1  christos };
    305   1.1  christos 
    306   1.1  christos static const int amd64_arch_regmap_len =
    307   1.1  christos   (sizeof (amd64_arch_regmap) / sizeof (amd64_arch_regmap[0]));
    308   1.1  christos 
    309   1.1  christos /* Convert architectural register number REG to the appropriate register
    310   1.1  christos    number used by GDB.  */
    311   1.1  christos 
    312   1.1  christos static int
    313   1.1  christos amd64_arch_reg_to_regnum (int reg)
    314   1.1  christos {
    315   1.1  christos   gdb_assert (reg >= 0 && reg < amd64_arch_regmap_len);
    316   1.1  christos 
    317   1.1  christos   return amd64_arch_regmap[reg];
    318   1.1  christos }
    319   1.1  christos 
    320   1.1  christos /* Register names for byte pseudo-registers.  */
    321   1.1  christos 
    322  1.10  christos static const char * const amd64_byte_names[] =
    323   1.1  christos {
    324   1.1  christos   "al", "bl", "cl", "dl", "sil", "dil", "bpl", "spl",
    325   1.1  christos   "r8l", "r9l", "r10l", "r11l", "r12l", "r13l", "r14l", "r15l",
    326   1.1  christos   "ah", "bh", "ch", "dh"
    327   1.1  christos };
    328   1.1  christos 
    329   1.1  christos /* Number of lower byte registers.  */
    330   1.1  christos #define AMD64_NUM_LOWER_BYTE_REGS 16
    331   1.1  christos 
    332   1.1  christos /* Register names for word pseudo-registers.  */
    333   1.1  christos 
    334  1.10  christos static const char * const amd64_word_names[] =
    335   1.1  christos {
    336   1.1  christos   "ax", "bx", "cx", "dx", "si", "di", "bp", "",
    337   1.1  christos   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
    338   1.1  christos };
    339   1.1  christos 
    340   1.1  christos /* Register names for dword pseudo-registers.  */
    341   1.1  christos 
    342  1.10  christos static const char * const amd64_dword_names[] =
    343   1.1  christos {
    344   1.1  christos   "eax", "ebx", "ecx", "edx", "esi", "edi", "ebp", "esp",
    345   1.1  christos   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d",
    346   1.1  christos   "eip"
    347   1.1  christos };
    348   1.1  christos 
    349   1.1  christos /* Return the name of register REGNUM.  */
    350   1.1  christos 
    351   1.1  christos static const char *
    352   1.1  christos amd64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
    353   1.1  christos {
    354  1.10  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
    355   1.1  christos   if (i386_byte_regnum_p (gdbarch, regnum))
    356   1.1  christos     return amd64_byte_names[regnum - tdep->al_regnum];
    357   1.3  christos   else if (i386_zmm_regnum_p (gdbarch, regnum))
    358   1.3  christos     return amd64_zmm_names[regnum - tdep->zmm0_regnum];
    359   1.1  christos   else if (i386_ymm_regnum_p (gdbarch, regnum))
    360   1.1  christos     return amd64_ymm_names[regnum - tdep->ymm0_regnum];
    361   1.3  christos   else if (i386_ymm_avx512_regnum_p (gdbarch, regnum))
    362   1.3  christos     return amd64_ymm_avx512_names[regnum - tdep->ymm16_regnum];
    363   1.1  christos   else if (i386_word_regnum_p (gdbarch, regnum))
    364   1.1  christos     return amd64_word_names[regnum - tdep->ax_regnum];
    365   1.1  christos   else if (i386_dword_regnum_p (gdbarch, regnum))
    366   1.1  christos     return amd64_dword_names[regnum - tdep->eax_regnum];
    367   1.1  christos   else
    368   1.1  christos     return i386_pseudo_register_name (gdbarch, regnum);
    369   1.1  christos }
    370   1.1  christos 
    371  1.11  christos static value *
    372  1.11  christos amd64_pseudo_register_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame,
    373   1.1  christos 				  int regnum)
    374   1.1  christos {
    375  1.10  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
    376   1.1  christos 
    377   1.1  christos   if (i386_byte_regnum_p (gdbarch, regnum))
    378   1.1  christos     {
    379   1.1  christos       int gpnum = regnum - tdep->al_regnum;
    380   1.1  christos 
    381   1.1  christos       /* Extract (always little endian).  */
    382   1.1  christos       if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
    383   1.1  christos 	{
    384   1.8  christos 	  gpnum -= AMD64_NUM_LOWER_BYTE_REGS;
    385   1.8  christos 
    386   1.1  christos 	  /* Special handling for AH, BH, CH, DH.  */
    387  1.11  christos 	  return pseudo_from_raw_part (next_frame, regnum, gpnum, 1);
    388   1.1  christos 	}
    389   1.1  christos       else
    390  1.11  christos 	return pseudo_from_raw_part (next_frame, regnum, gpnum, 0);
    391   1.1  christos     }
    392   1.1  christos   else if (i386_dword_regnum_p (gdbarch, regnum))
    393   1.1  christos     {
    394   1.1  christos       int gpnum = regnum - tdep->eax_regnum;
    395  1.11  christos 
    396  1.11  christos       return pseudo_from_raw_part (next_frame, regnum, gpnum, 0);
    397   1.1  christos     }
    398   1.1  christos   else
    399  1.11  christos     return i386_pseudo_register_read_value (gdbarch, next_frame, regnum);
    400   1.1  christos }
    401   1.1  christos 
    402   1.1  christos static void
    403  1.11  christos amd64_pseudo_register_write (gdbarch *gdbarch, const frame_info_ptr &next_frame,
    404  1.11  christos 			     int regnum, gdb::array_view<const gdb_byte> buf)
    405   1.1  christos {
    406  1.10  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
    407   1.1  christos 
    408   1.1  christos   if (i386_byte_regnum_p (gdbarch, regnum))
    409   1.1  christos     {
    410   1.1  christos       int gpnum = regnum - tdep->al_regnum;
    411   1.1  christos 
    412   1.1  christos       if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
    413   1.1  christos 	{
    414   1.8  christos 	  gpnum -= AMD64_NUM_LOWER_BYTE_REGS;
    415  1.11  christos 	  pseudo_to_raw_part (next_frame, buf, gpnum, 1);
    416   1.1  christos 	}
    417   1.1  christos       else
    418  1.11  christos 	pseudo_to_raw_part (next_frame, buf, gpnum, 0);
    419   1.1  christos     }
    420   1.1  christos   else if (i386_dword_regnum_p (gdbarch, regnum))
    421   1.1  christos     {
    422   1.1  christos       int gpnum = regnum - tdep->eax_regnum;
    423  1.11  christos       pseudo_to_raw_part (next_frame, buf, gpnum, 0);
    424   1.1  christos     }
    425   1.1  christos   else
    426  1.11  christos     i386_pseudo_register_write (gdbarch, next_frame, regnum, buf);
    427   1.1  christos }
    428   1.1  christos 
    429   1.6  christos /* Implement the 'ax_pseudo_register_collect' gdbarch method.  */
    430   1.6  christos 
    431   1.6  christos static int
    432   1.6  christos amd64_ax_pseudo_register_collect (struct gdbarch *gdbarch,
    433   1.6  christos 				  struct agent_expr *ax, int regnum)
    434   1.6  christos {
    435  1.10  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
    436   1.6  christos 
    437   1.6  christos   if (i386_byte_regnum_p (gdbarch, regnum))
    438   1.6  christos     {
    439   1.6  christos       int gpnum = regnum - tdep->al_regnum;
    440   1.6  christos 
    441   1.6  christos       if (gpnum >= AMD64_NUM_LOWER_BYTE_REGS)
    442   1.6  christos 	ax_reg_mask (ax, gpnum - AMD64_NUM_LOWER_BYTE_REGS);
    443   1.6  christos       else
    444   1.6  christos 	ax_reg_mask (ax, gpnum);
    445   1.6  christos       return 0;
    446   1.6  christos     }
    447   1.6  christos   else if (i386_dword_regnum_p (gdbarch, regnum))
    448   1.6  christos     {
    449   1.6  christos       int gpnum = regnum - tdep->eax_regnum;
    450   1.6  christos 
    451   1.6  christos       ax_reg_mask (ax, gpnum);
    452   1.6  christos       return 0;
    453   1.6  christos     }
    454   1.6  christos   else
    455   1.6  christos     return i386_ax_pseudo_register_collect (gdbarch, ax, regnum);
    456   1.6  christos }
    457   1.6  christos 
    458   1.1  christos 
    459   1.1  christos 
    461   1.1  christos /* Register classes as defined in the psABI.  */
    462   1.1  christos 
    463   1.1  christos enum amd64_reg_class
    464   1.1  christos {
    465   1.1  christos   AMD64_INTEGER,
    466   1.1  christos   AMD64_SSE,
    467   1.1  christos   AMD64_SSEUP,
    468   1.1  christos   AMD64_X87,
    469   1.1  christos   AMD64_X87UP,
    470   1.1  christos   AMD64_COMPLEX_X87,
    471   1.1  christos   AMD64_NO_CLASS,
    472   1.1  christos   AMD64_MEMORY
    473   1.1  christos };
    474   1.1  christos 
    475   1.1  christos /* Return the union class of CLASS1 and CLASS2.  See the psABI for
    476   1.1  christos    details.  */
    477   1.1  christos 
    478   1.1  christos static enum amd64_reg_class
    479   1.1  christos amd64_merge_classes (enum amd64_reg_class class1, enum amd64_reg_class class2)
    480   1.1  christos {
    481   1.1  christos   /* Rule (a): If both classes are equal, this is the resulting class.  */
    482   1.1  christos   if (class1 == class2)
    483   1.1  christos     return class1;
    484   1.1  christos 
    485   1.1  christos   /* Rule (b): If one of the classes is NO_CLASS, the resulting class
    486   1.1  christos      is the other class.  */
    487   1.1  christos   if (class1 == AMD64_NO_CLASS)
    488   1.1  christos     return class2;
    489   1.1  christos   if (class2 == AMD64_NO_CLASS)
    490   1.1  christos     return class1;
    491   1.1  christos 
    492   1.1  christos   /* Rule (c): If one of the classes is MEMORY, the result is MEMORY.  */
    493   1.1  christos   if (class1 == AMD64_MEMORY || class2 == AMD64_MEMORY)
    494   1.1  christos     return AMD64_MEMORY;
    495   1.1  christos 
    496   1.1  christos   /* Rule (d): If one of the classes is INTEGER, the result is INTEGER.  */
    497   1.1  christos   if (class1 == AMD64_INTEGER || class2 == AMD64_INTEGER)
    498   1.1  christos     return AMD64_INTEGER;
    499   1.1  christos 
    500   1.1  christos   /* Rule (e): If one of the classes is X87, X87UP, COMPLEX_X87 class,
    501   1.1  christos      MEMORY is used as class.  */
    502   1.1  christos   if (class1 == AMD64_X87 || class1 == AMD64_X87UP
    503   1.1  christos       || class1 == AMD64_COMPLEX_X87 || class2 == AMD64_X87
    504   1.1  christos       || class2 == AMD64_X87UP || class2 == AMD64_COMPLEX_X87)
    505   1.1  christos     return AMD64_MEMORY;
    506   1.1  christos 
    507   1.1  christos   /* Rule (f): Otherwise class SSE is used.  */
    508   1.1  christos   return AMD64_SSE;
    509   1.1  christos }
    510   1.5  christos 
    511   1.1  christos static void amd64_classify (struct type *type, enum amd64_reg_class theclass[2]);
    512   1.9  christos 
    513   1.1  christos /* Return true if TYPE is a structure or union with unaligned fields.  */
    514   1.9  christos 
    515   1.9  christos static bool
    516   1.1  christos amd64_has_unaligned_fields (struct type *type)
    517   1.9  christos {
    518   1.9  christos   if (type->code () == TYPE_CODE_STRUCT
    519   1.9  christos       || type->code () == TYPE_CODE_UNION)
    520   1.9  christos     {
    521   1.9  christos       for (int i = 0; i < type->num_fields (); i++)
    522   1.9  christos 	{
    523   1.9  christos 	  struct type *subtype = check_typedef (type->field (i).type ());
    524   1.9  christos 
    525   1.9  christos 	  /* Ignore static fields, empty fields (for example nested
    526   1.9  christos 	     empty structures), and bitfields (these are handled by
    527  1.11  christos 	     the caller).  */
    528  1.11  christos 	  if (type->field (i).is_static ()
    529  1.10  christos 	      || (type->field (i).bitsize () == 0
    530  1.11  christos 		  && subtype->length () == 0)
    531   1.9  christos 	      || type->field (i).is_packed ())
    532   1.9  christos 	    continue;
    533  1.10  christos 
    534  1.10  christos 	  int bitpos = type->field (i).loc_bitpos ();
    535   1.9  christos 
    536   1.9  christos 	  if (bitpos % 8 != 0)
    537   1.9  christos 	    return true;
    538  1.10  christos 
    539  1.10  christos 	  int align = type_align (subtype);
    540  1.10  christos 	  if (align == 0)
    541  1.10  christos 	    error (_("could not determine alignment of type"));
    542   1.9  christos 
    543   1.9  christos 	  int bytepos = bitpos / 8;
    544   1.9  christos 	  if (bytepos % align != 0)
    545   1.9  christos 	    return true;
    546   1.9  christos 
    547   1.9  christos 	  if (amd64_has_unaligned_fields (subtype))
    548   1.9  christos 	    return true;
    549   1.9  christos 	}
    550   1.9  christos     }
    551   1.9  christos 
    552   1.9  christos   return false;
    553   1.9  christos }
    554   1.9  christos 
    555   1.9  christos /* Classify field I of TYPE starting at BITOFFSET according to the rules for
    556   1.9  christos    structures and union types, and store the result in THECLASS.  */
    557   1.9  christos 
    558   1.9  christos static void
    559   1.9  christos amd64_classify_aggregate_field (struct type *type, int i,
    560   1.9  christos 				enum amd64_reg_class theclass[2],
    561   1.9  christos 				unsigned int bitoffset)
    562   1.9  christos {
    563   1.9  christos   struct type *subtype = check_typedef (type->field (i).type ());
    564  1.11  christos   enum amd64_reg_class subclass[2];
    565   1.9  christos   int bitsize = type->field (i).bitsize ();
    566   1.9  christos 
    567  1.10  christos   if (bitsize == 0)
    568   1.9  christos     bitsize = subtype->length () * 8;
    569   1.9  christos 
    570   1.9  christos   /* Ignore static fields, or empty fields, for example nested
    571  1.11  christos      empty structures.*/
    572   1.9  christos   if (type->field (i).is_static () || bitsize == 0)
    573   1.9  christos     return;
    574  1.10  christos 
    575  1.10  christos   int bitpos = bitoffset + type->field (i).loc_bitpos ();
    576  1.10  christos   int pos = bitpos / 64;
    577  1.10  christos   int endpos = (bitpos + bitsize - 1) / 64;
    578   1.9  christos 
    579   1.9  christos   if (subtype->code () == TYPE_CODE_STRUCT
    580   1.9  christos       || subtype->code () == TYPE_CODE_UNION)
    581   1.9  christos     {
    582   1.9  christos       /* Each field of an object is classified recursively.  */
    583   1.9  christos       int j;
    584   1.9  christos       for (j = 0; j < subtype->num_fields (); j++)
    585   1.9  christos 	amd64_classify_aggregate_field (subtype, j, theclass, bitpos);
    586   1.9  christos       return;
    587   1.9  christos     }
    588   1.9  christos 
    589   1.1  christos   gdb_assert (pos == 0 || pos == 1);
    590   1.9  christos 
    591   1.9  christos   amd64_classify (subtype, subclass);
    592   1.9  christos   theclass[pos] = amd64_merge_classes (theclass[pos], subclass[0]);
    593   1.9  christos   if (bitsize <= 64 && pos == 0 && endpos == 1)
    594   1.9  christos     /* This is a bit of an odd case:  We have a field that would
    595   1.9  christos        normally fit in one of the two eightbytes, except that
    596   1.9  christos        it is placed in a way that this field straddles them.
    597   1.9  christos        This has been seen with a structure containing an array.
    598   1.9  christos 
    599   1.9  christos        The ABI is a bit unclear in this case, but we assume that
    600   1.9  christos        this field's class (stored in subclass[0]) must also be merged
    601   1.9  christos        into class[1].  In other words, our field has a piece stored
    602   1.9  christos        in the second eight-byte, and thus its class applies to
    603   1.9  christos        the second eight-byte as well.
    604   1.9  christos 
    605   1.9  christos        In the case where the field length exceeds 8 bytes,
    606   1.9  christos        it should not be necessary to merge the field class
    607   1.9  christos        into class[1].  As LEN > 8, subclass[1] is necessarily
    608   1.9  christos        different from AMD64_NO_CLASS.  If subclass[1] is equal
    609   1.9  christos        to subclass[0], then the normal class[1]/subclass[1]
    610   1.9  christos        merging will take care of everything.  For subclass[1]
    611   1.9  christos        to be different from subclass[0], I can only see the case
    612   1.9  christos        where we have a SSE/SSEUP or X87/X87UP pair, which both
    613   1.9  christos        use up all 16 bytes of the aggregate, and are already
    614   1.9  christos        handled just fine (because each portion sits on its own
    615   1.9  christos        8-byte).  */
    616   1.9  christos     theclass[1] = amd64_merge_classes (theclass[1], subclass[0]);
    617   1.9  christos   if (pos == 0)
    618   1.1  christos     theclass[1] = amd64_merge_classes (theclass[1], subclass[1]);
    619   1.1  christos }
    620   1.1  christos 
    621   1.1  christos /* Classify TYPE according to the rules for aggregate (structures and
    622   1.1  christos    arrays) and union types, and store the result in CLASS.  */
    623   1.1  christos 
    624   1.5  christos static void
    625   1.1  christos amd64_classify_aggregate (struct type *type, enum amd64_reg_class theclass[2])
    626  1.10  christos {
    627  1.10  christos   /* 1. If the size of an object is larger than two times eight bytes, or
    628  1.10  christos 	it is a non-trivial C++ object, or it has unaligned fields, then it
    629  1.10  christos 	has class memory.
    630  1.10  christos 
    631  1.10  christos 	It is important that the trivially_copyable check is before the
    632  1.10  christos 	unaligned fields check, as C++ classes with virtual base classes
    633  1.10  christos 	will have fields (for the virtual base classes) with non-constant
    634  1.10  christos 	loc_bitpos attributes, which will cause an assert to trigger within
    635  1.10  christos 	the unaligned field check.  As classes with virtual bases are not
    636  1.11  christos 	trivially copyable, checking that first avoids this problem.  */
    637  1.11  christos   if (TYPE_HAS_DYNAMIC_LENGTH (type)
    638  1.10  christos       || type->length () > 16
    639  1.10  christos       || !language_pass_by_reference (type).trivially_copyable
    640   1.1  christos       || amd64_has_unaligned_fields (type))
    641   1.5  christos     {
    642   1.1  christos       theclass[0] = theclass[1] = AMD64_MEMORY;
    643   1.1  christos       return;
    644   1.1  christos     }
    645   1.1  christos 
    646   1.5  christos   /* 2. Both eightbytes get initialized to class NO_CLASS.  */
    647   1.1  christos   theclass[0] = theclass[1] = AMD64_NO_CLASS;
    648   1.1  christos 
    649  1.10  christos   /* 3. Each field of an object is classified recursively so that
    650  1.10  christos 	always two fields are considered. The resulting class is
    651  1.10  christos 	calculated according to the classes of the fields in the
    652   1.1  christos 	eightbyte: */
    653   1.9  christos 
    654   1.1  christos   if (type->code () == TYPE_CODE_ARRAY)
    655  1.10  christos     {
    656   1.1  christos       struct type *subtype = check_typedef (type->target_type ());
    657   1.1  christos 
    658   1.5  christos       /* All fields in an array have the same type.  */
    659  1.10  christos       amd64_classify (subtype, theclass);
    660   1.5  christos       if (type->length () > 8 && theclass[1] == AMD64_NO_CLASS)
    661   1.1  christos 	theclass[1] = theclass[0];
    662   1.1  christos     }
    663   1.1  christos   else
    664   1.1  christos     {
    665   1.1  christos       int i;
    666   1.1  christos 
    667   1.9  christos       /* Structure or union.  */
    668   1.9  christos       gdb_assert (type->code () == TYPE_CODE_STRUCT
    669   1.1  christos 		  || type->code () == TYPE_CODE_UNION);
    670   1.9  christos 
    671   1.9  christos       for (i = 0; i < type->num_fields (); i++)
    672   1.1  christos 	amd64_classify_aggregate_field (type, i, theclass, 0);
    673   1.1  christos     }
    674   1.1  christos 
    675   1.1  christos   /* 4. Then a post merger cleanup is done:  */
    676   1.1  christos 
    677   1.1  christos   /* Rule (a): If one of the classes is MEMORY, the whole argument is
    678   1.5  christos      passed in memory.  */
    679   1.5  christos   if (theclass[0] == AMD64_MEMORY || theclass[1] == AMD64_MEMORY)
    680   1.1  christos     theclass[0] = theclass[1] = AMD64_MEMORY;
    681   1.1  christos 
    682   1.1  christos   /* Rule (b): If SSEUP is not preceded by SSE, it is converted to
    683   1.5  christos      SSE.  */
    684   1.5  christos   if (theclass[0] == AMD64_SSEUP)
    685   1.5  christos     theclass[0] = AMD64_SSE;
    686   1.5  christos   if (theclass[1] == AMD64_SSEUP && theclass[0] != AMD64_SSE)
    687   1.1  christos     theclass[1] = AMD64_SSE;
    688   1.1  christos }
    689   1.1  christos 
    690   1.1  christos /* Classify TYPE, and store the result in CLASS.  */
    691   1.1  christos 
    692   1.5  christos static void
    693   1.1  christos amd64_classify (struct type *type, enum amd64_reg_class theclass[2])
    694   1.9  christos {
    695  1.10  christos   enum type_code code = type->code ();
    696   1.1  christos   int len = type->length ();
    697   1.5  christos 
    698   1.1  christos   theclass[0] = theclass[1] = AMD64_NO_CLASS;
    699   1.1  christos 
    700   1.1  christos   /* Arguments of types (signed and unsigned) _Bool, char, short, int,
    701   1.1  christos      long, long long, and pointers are in the INTEGER class.  Similarly,
    702   1.1  christos      range types, used by languages such as Ada, are also in the INTEGER
    703   1.1  christos      class.  */
    704   1.1  christos   if ((code == TYPE_CODE_INT || code == TYPE_CODE_ENUM
    705   1.1  christos        || code == TYPE_CODE_BOOL || code == TYPE_CODE_RANGE
    706   1.7  christos        || code == TYPE_CODE_CHAR
    707   1.1  christos        || code == TYPE_CODE_PTR || TYPE_IS_REFERENCE (type))
    708   1.5  christos       && (len == 1 || len == 2 || len == 4 || len == 8))
    709   1.1  christos     theclass[0] = AMD64_INTEGER;
    710  1.10  christos 
    711  1.10  christos   /* Arguments of types _Float16, float, double, _Decimal32, _Decimal64 and
    712   1.1  christos      __m64 are in class SSE.  */
    713  1.10  christos   else if ((code == TYPE_CODE_FLT || code == TYPE_CODE_DECFLOAT)
    714   1.1  christos 	   && (len == 2 || len == 4 || len == 8))
    715   1.5  christos     /* FIXME: __m64 .  */
    716   1.1  christos     theclass[0] = AMD64_SSE;
    717   1.1  christos 
    718   1.1  christos   /* Arguments of types __float128, _Decimal128 and __m128 are split into
    719   1.1  christos      two halves.  The least significant ones belong to class SSE, the most
    720   1.1  christos      significant one to class SSEUP.  */
    721   1.1  christos   else if (code == TYPE_CODE_DECFLOAT && len == 16)
    722   1.5  christos     /* FIXME: __float128, __m128.  */
    723   1.1  christos     theclass[0] = AMD64_SSE, theclass[1] = AMD64_SSEUP;
    724   1.1  christos 
    725   1.1  christos   /* The 64-bit mantissa of arguments of type long double belongs to
    726   1.1  christos      class X87, the 16-bit exponent plus 6 bytes of padding belongs to
    727   1.1  christos      class X87UP.  */
    728   1.1  christos   else if (code == TYPE_CODE_FLT && len == 16)
    729   1.5  christos     /* Class X87 and X87UP.  */
    730   1.1  christos     theclass[0] = AMD64_X87, theclass[1] = AMD64_X87UP;
    731  1.10  christos 
    732  1.10  christos   /* Arguments of complex T - where T is one of the types _Float16, float or
    733   1.1  christos      double - get treated as if they are implemented as:
    734   1.1  christos 
    735   1.1  christos      struct complexT {
    736   1.1  christos        T real;
    737   1.3  christos        T imag;
    738   1.3  christos      };
    739   1.3  christos 
    740  1.10  christos   */
    741   1.5  christos   else if (code == TYPE_CODE_COMPLEX && (len == 8 || len == 4))
    742   1.1  christos     theclass[0] = AMD64_SSE;
    743   1.5  christos   else if (code == TYPE_CODE_COMPLEX && len == 16)
    744   1.1  christos     theclass[0] = theclass[1] = AMD64_SSE;
    745   1.1  christos 
    746   1.1  christos   /* A variable of type complex long double is classified as type
    747   1.1  christos      COMPLEX_X87.  */
    748   1.5  christos   else if (code == TYPE_CODE_COMPLEX && len == 32)
    749   1.1  christos     theclass[0] = AMD64_COMPLEX_X87;
    750   1.1  christos 
    751   1.1  christos   /* Aggregates.  */
    752   1.1  christos   else if (code == TYPE_CODE_ARRAY || code == TYPE_CODE_STRUCT
    753   1.5  christos 	   || code == TYPE_CODE_UNION)
    754   1.1  christos     amd64_classify_aggregate (type, theclass);
    755   1.1  christos }
    756   1.1  christos 
    757   1.1  christos static enum return_value_convention
    758   1.1  christos amd64_return_value (struct gdbarch *gdbarch, struct value *function,
    759  1.11  christos 		    struct type *type, struct regcache *regcache,
    760   1.1  christos 		    struct value **read_value, const gdb_byte *writebuf)
    761   1.5  christos {
    762  1.10  christos   enum amd64_reg_class theclass[2];
    763   1.1  christos   int len = type->length ();
    764   1.1  christos   static int integer_regnum[] = { AMD64_RAX_REGNUM, AMD64_RDX_REGNUM };
    765   1.1  christos   static int sse_regnum[] = { AMD64_XMM0_REGNUM, AMD64_XMM1_REGNUM };
    766   1.1  christos   int integer_reg = 0;
    767   1.1  christos   int sse_reg = 0;
    768   1.1  christos   int i;
    769  1.11  christos 
    770   1.1  christos   gdb_assert (!(read_value && writebuf));
    771   1.1  christos 
    772   1.5  christos   /* 1. Classify the return type with the classification algorithm.  */
    773   1.1  christos   amd64_classify (type, theclass);
    774   1.1  christos 
    775   1.1  christos   /* 2. If the type has class MEMORY, then the caller provides space
    776   1.1  christos      for the return value and passes the address of this storage in
    777   1.1  christos      %rdi as if it were the first argument to the function.  In effect,
    778   1.1  christos      this address becomes a hidden first argument.
    779   1.1  christos 
    780   1.1  christos      On return %rax will contain the address that has been passed in
    781   1.5  christos      by the caller in %rdi.  */
    782   1.1  christos   if (theclass[0] == AMD64_MEMORY)
    783   1.1  christos     {
    784  1.10  christos       /* As indicated by the comment above, the ABI guarantees that we
    785  1.10  christos 	 can always find the return value just after the function has
    786   1.1  christos 	 returned.  */
    787  1.11  christos 
    788   1.1  christos       if (read_value != nullptr)
    789   1.1  christos 	{
    790   1.1  christos 	  ULONGEST addr;
    791   1.1  christos 
    792  1.11  christos 	  regcache_raw_read_unsigned (regcache, AMD64_RAX_REGNUM, &addr);
    793   1.1  christos 	  *read_value = value_at_non_lval (type, addr);
    794   1.1  christos 	}
    795   1.1  christos 
    796   1.1  christos       return RETURN_VALUE_ABI_RETURNS_ADDRESS;
    797   1.1  christos     }
    798  1.11  christos 
    799  1.11  christos   gdb_byte *readbuf = nullptr;
    800  1.11  christos   if (read_value != nullptr)
    801  1.11  christos     {
    802  1.11  christos       *read_value = value::allocate (type);
    803  1.11  christos       readbuf = (*read_value)->contents_raw ().data ();
    804  1.11  christos     }
    805   1.1  christos 
    806  1.10  christos   /* 8. If the class is COMPLEX_X87, the real part of the value is
    807   1.5  christos 	returned in %st0 and the imaginary part in %st1.  */
    808   1.1  christos   if (theclass[0] == AMD64_COMPLEX_X87)
    809   1.1  christos     {
    810   1.1  christos       if (readbuf)
    811   1.8  christos 	{
    812   1.8  christos 	  regcache->raw_read (AMD64_ST0_REGNUM, readbuf);
    813   1.1  christos 	  regcache->raw_read (AMD64_ST1_REGNUM, readbuf + 16);
    814   1.1  christos 	}
    815   1.1  christos 
    816   1.1  christos       if (writebuf)
    817   1.1  christos 	{
    818   1.8  christos 	  i387_return_value (gdbarch, regcache);
    819   1.8  christos 	  regcache->raw_write (AMD64_ST0_REGNUM, writebuf);
    820   1.1  christos 	  regcache->raw_write (AMD64_ST1_REGNUM, writebuf + 16);
    821   1.1  christos 
    822   1.1  christos 	  /* Fix up the tag word such that both %st(0) and %st(1) are
    823   1.1  christos 	     marked as valid.  */
    824   1.1  christos 	  regcache_raw_write_unsigned (regcache, AMD64_FTAG_REGNUM, 0xfff);
    825   1.1  christos 	}
    826   1.1  christos 
    827   1.1  christos       return RETURN_VALUE_REGISTER_CONVENTION;
    828   1.1  christos     }
    829   1.5  christos 
    830   1.1  christos   gdb_assert (theclass[1] != AMD64_MEMORY);
    831   1.1  christos   gdb_assert (len <= 16);
    832   1.1  christos 
    833   1.1  christos   for (i = 0; len > 0; i++, len -= 8)
    834   1.1  christos     {
    835   1.1  christos       int regnum = -1;
    836   1.1  christos       int offset = 0;
    837   1.5  christos 
    838   1.1  christos       switch (theclass[i])
    839   1.1  christos 	{
    840   1.1  christos 	case AMD64_INTEGER:
    841   1.1  christos 	  /* 3. If the class is INTEGER, the next available register
    842   1.1  christos 	     of the sequence %rax, %rdx is used.  */
    843   1.1  christos 	  regnum = integer_regnum[integer_reg++];
    844   1.1  christos 	  break;
    845   1.1  christos 
    846   1.1  christos 	case AMD64_SSE:
    847  1.10  christos 	  /* 4. If the class is SSE, the next available SSE register
    848   1.1  christos 	     of the sequence %xmm0, %xmm1 is used.  */
    849   1.1  christos 	  regnum = sse_regnum[sse_reg++];
    850   1.1  christos 	  break;
    851   1.1  christos 
    852   1.1  christos 	case AMD64_SSEUP:
    853   1.1  christos 	  /* 5. If the class is SSEUP, the eightbyte is passed in the
    854   1.1  christos 	     upper half of the last used SSE register.  */
    855   1.1  christos 	  gdb_assert (sse_reg > 0);
    856   1.1  christos 	  regnum = sse_regnum[sse_reg - 1];
    857   1.1  christos 	  offset = 8;
    858   1.1  christos 	  break;
    859   1.1  christos 
    860   1.1  christos 	case AMD64_X87:
    861  1.10  christos 	  /* 6. If the class is X87, the value is returned on the X87
    862   1.1  christos 	     stack in %st0 as 80-bit x87 number.  */
    863   1.1  christos 	  regnum = AMD64_ST0_REGNUM;
    864   1.1  christos 	  if (writebuf)
    865   1.1  christos 	    i387_return_value (gdbarch, regcache);
    866   1.1  christos 	  break;
    867   1.1  christos 
    868   1.1  christos 	case AMD64_X87UP:
    869  1.10  christos 	  /* 7. If the class is X87UP, the value is returned together
    870   1.5  christos 	     with the previous X87 value in %st0.  */
    871   1.1  christos 	  gdb_assert (i > 0 && theclass[0] == AMD64_X87);
    872   1.1  christos 	  regnum = AMD64_ST0_REGNUM;
    873   1.1  christos 	  offset = 8;
    874   1.1  christos 	  len = 2;
    875   1.1  christos 	  break;
    876   1.1  christos 
    877   1.1  christos 	case AMD64_NO_CLASS:
    878   1.1  christos 	  continue;
    879   1.1  christos 
    880   1.1  christos 	default:
    881   1.1  christos 	  gdb_assert (!"Unexpected register class.");
    882   1.1  christos 	}
    883   1.1  christos 
    884   1.1  christos       gdb_assert (regnum != -1);
    885   1.1  christos 
    886   1.8  christos       if (readbuf)
    887   1.8  christos 	regcache->raw_read_part (regnum, offset, std::min (len, 8),
    888   1.1  christos 				 readbuf + i * 8);
    889   1.8  christos       if (writebuf)
    890   1.8  christos 	regcache->raw_write_part (regnum, offset, std::min (len, 8),
    891   1.1  christos 				  writebuf + i * 8);
    892   1.1  christos     }
    893   1.1  christos 
    894   1.1  christos   return RETURN_VALUE_REGISTER_CONVENTION;
    895   1.1  christos }
    896   1.1  christos 
    897   1.1  christos 
    899   1.8  christos static CORE_ADDR
    900   1.1  christos amd64_push_arguments (struct regcache *regcache, int nargs, struct value **args,
    901   1.1  christos 		      CORE_ADDR sp, function_call_return_method return_method)
    902   1.1  christos {
    903   1.1  christos   static int integer_regnum[] =
    904   1.1  christos   {
    905   1.1  christos     AMD64_RDI_REGNUM,		/* %rdi */
    906   1.1  christos     AMD64_RSI_REGNUM,		/* %rsi */
    907   1.1  christos     AMD64_RDX_REGNUM,		/* %rdx */
    908   1.1  christos     AMD64_RCX_REGNUM,		/* %rcx */
    909   1.1  christos     AMD64_R8_REGNUM,		/* %r8 */
    910   1.1  christos     AMD64_R9_REGNUM		/* %r9 */
    911   1.1  christos   };
    912   1.1  christos   static int sse_regnum[] =
    913   1.1  christos   {
    914   1.1  christos     /* %xmm0 ... %xmm7 */
    915   1.1  christos     AMD64_XMM0_REGNUM + 0, AMD64_XMM1_REGNUM,
    916   1.1  christos     AMD64_XMM0_REGNUM + 2, AMD64_XMM0_REGNUM + 3,
    917   1.1  christos     AMD64_XMM0_REGNUM + 4, AMD64_XMM0_REGNUM + 5,
    918   1.6  christos     AMD64_XMM0_REGNUM + 6, AMD64_XMM0_REGNUM + 7,
    919   1.1  christos   };
    920   1.1  christos   struct value **stack_args = XALLOCAVEC (struct value *, nargs);
    921   1.1  christos   int num_stack_args = 0;
    922   1.1  christos   int num_elements = 0;
    923   1.1  christos   int element = 0;
    924   1.1  christos   int integer_reg = 0;
    925   1.1  christos   int sse_reg = 0;
    926   1.1  christos   int i;
    927   1.8  christos 
    928   1.1  christos   /* Reserve a register for the "hidden" argument.  */
    929   1.1  christos if (return_method == return_method_struct)
    930   1.1  christos     integer_reg++;
    931   1.1  christos 
    932  1.11  christos   for (i = 0; i < nargs; i++)
    933  1.10  christos     {
    934   1.5  christos       struct type *type = args[i]->type ();
    935   1.1  christos       int len = type->length ();
    936   1.1  christos       enum amd64_reg_class theclass[2];
    937   1.1  christos       int needed_integer_regs = 0;
    938   1.1  christos       int needed_sse_regs = 0;
    939   1.1  christos       int j;
    940   1.5  christos 
    941   1.1  christos       /* Classify argument.  */
    942   1.1  christos       amd64_classify (type, theclass);
    943  1.10  christos 
    944   1.1  christos       /* Calculate the number of integer and SSE registers needed for
    945   1.1  christos 	 this argument.  */
    946   1.5  christos       for (j = 0; j < 2; j++)
    947   1.1  christos 	{
    948   1.5  christos 	  if (theclass[j] == AMD64_INTEGER)
    949   1.1  christos 	    needed_integer_regs++;
    950   1.1  christos 	  else if (theclass[j] == AMD64_SSE)
    951   1.1  christos 	    needed_sse_regs++;
    952   1.1  christos 	}
    953  1.10  christos 
    954   1.1  christos       /* Check whether enough registers are available, and if the
    955   1.1  christos 	 argument should be passed in registers at all.  */
    956   1.1  christos       if (integer_reg + needed_integer_regs > ARRAY_SIZE (integer_regnum)
    957   1.1  christos 	  || sse_reg + needed_sse_regs > ARRAY_SIZE (sse_regnum)
    958   1.1  christos 	  || (needed_integer_regs == 0 && needed_sse_regs == 0))
    959   1.1  christos 	{
    960   1.1  christos 	  /* The argument will be passed on the stack.  */
    961   1.1  christos 	  num_elements += ((len + 7) / 8);
    962   1.1  christos 	  stack_args[num_stack_args++] = args[i];
    963   1.1  christos 	}
    964   1.1  christos       else
    965  1.11  christos 	{
    966   1.1  christos 	  /* The argument will be passed in registers.  */
    967   1.1  christos 	  const gdb_byte *valbuf = args[i]->contents ().data ();
    968   1.1  christos 	  gdb_byte buf[8];
    969   1.1  christos 
    970   1.1  christos 	  gdb_assert (len <= 16);
    971   1.1  christos 
    972   1.1  christos 	  for (j = 0; len > 0; j++, len -= 8)
    973   1.1  christos 	    {
    974   1.1  christos 	      int regnum = -1;
    975   1.5  christos 	      int offset = 0;
    976   1.1  christos 
    977   1.1  christos 	      switch (theclass[j])
    978   1.1  christos 		{
    979   1.1  christos 		case AMD64_INTEGER:
    980   1.1  christos 		  regnum = integer_regnum[integer_reg++];
    981   1.1  christos 		  break;
    982   1.1  christos 
    983   1.1  christos 		case AMD64_SSE:
    984   1.1  christos 		  regnum = sse_regnum[sse_reg++];
    985   1.1  christos 		  break;
    986   1.1  christos 
    987   1.1  christos 		case AMD64_SSEUP:
    988   1.1  christos 		  gdb_assert (sse_reg > 0);
    989   1.1  christos 		  regnum = sse_regnum[sse_reg - 1];
    990   1.1  christos 		  offset = 8;
    991   1.9  christos 		  break;
    992   1.9  christos 
    993   1.9  christos 		case AMD64_NO_CLASS:
    994   1.1  christos 		  continue;
    995   1.1  christos 
    996   1.1  christos 		default:
    997   1.1  christos 		  gdb_assert (!"Unexpected register class.");
    998   1.1  christos 		}
    999   1.1  christos 
   1000   1.7  christos 	      gdb_assert (regnum != -1);
   1001   1.8  christos 	      memset (buf, 0, sizeof buf);
   1002   1.1  christos 	      memcpy (buf, valbuf + j * 8, std::min (len, 8));
   1003   1.1  christos 	      regcache->raw_write_part (regnum, offset, 8, buf);
   1004   1.1  christos 	    }
   1005   1.1  christos 	}
   1006   1.1  christos     }
   1007   1.1  christos 
   1008   1.1  christos   /* Allocate space for the arguments on the stack.  */
   1009   1.1  christos   sp -= num_elements * 8;
   1010   1.1  christos 
   1011   1.1  christos   /* The psABI says that "The end of the input argument area shall be
   1012   1.1  christos      aligned on a 16 byte boundary."  */
   1013   1.1  christos   sp &= ~0xf;
   1014   1.1  christos 
   1015   1.1  christos   /* Write out the arguments to the stack.  */
   1016  1.11  christos   for (i = 0; i < num_stack_args; i++)
   1017  1.11  christos     {
   1018  1.10  christos       struct type *type = stack_args[i]->type ();
   1019   1.1  christos       const gdb_byte *valbuf = stack_args[i]->contents ().data ();
   1020   1.1  christos       int len = type->length ();
   1021   1.1  christos 
   1022   1.1  christos       write_memory (sp + element * 8, valbuf, len);
   1023   1.1  christos       element += ((len + 7) / 8);
   1024   1.1  christos     }
   1025   1.1  christos 
   1026   1.1  christos   /* The psABI says that "For calls that may call functions that use
   1027   1.1  christos      varargs or stdargs (prototype-less calls or calls to functions
   1028   1.1  christos      containing ellipsis (...) in the declaration) %al is used as
   1029   1.1  christos      hidden argument to specify the number of SSE registers used.  */
   1030   1.1  christos   regcache_raw_write_unsigned (regcache, AMD64_RAX_REGNUM, sse_reg);
   1031   1.1  christos   return sp;
   1032   1.1  christos }
   1033   1.1  christos 
   1034   1.1  christos static CORE_ADDR
   1035   1.1  christos amd64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   1036   1.8  christos 		       struct regcache *regcache, CORE_ADDR bp_addr,
   1037   1.8  christos 		       int nargs, struct value **args,	CORE_ADDR sp,
   1038   1.1  christos 		       function_call_return_method return_method,
   1039   1.1  christos 		       CORE_ADDR struct_addr)
   1040   1.1  christos {
   1041   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1042   1.7  christos   gdb_byte buf[8];
   1043   1.7  christos 
   1044   1.7  christos   /* BND registers can be in arbitrary values at the moment of the
   1045   1.7  christos      inferior call.  This can cause boundary violations that are not
   1046   1.7  christos      due to a real bug or even desired by the user.  The best to be done
   1047   1.7  christos      is set the BND registers to allow access to the whole memory, INIT
   1048   1.7  christos      state, before pushing the inferior call.   */
   1049   1.1  christos   i387_reset_bnd_regs (gdbarch, regcache);
   1050   1.8  christos 
   1051   1.1  christos   /* Pass arguments.  */
   1052   1.1  christos   sp = amd64_push_arguments (regcache, nargs, args, sp, return_method);
   1053   1.8  christos 
   1054   1.1  christos   /* Pass "hidden" argument".  */
   1055   1.1  christos   if (return_method == return_method_struct)
   1056   1.8  christos     {
   1057   1.1  christos       store_unsigned_integer (buf, 8, byte_order, struct_addr);
   1058   1.1  christos       regcache->cooked_write (AMD64_RDI_REGNUM, buf);
   1059   1.1  christos     }
   1060   1.1  christos 
   1061   1.1  christos   /* Store return address.  */
   1062   1.1  christos   sp -= 8;
   1063   1.1  christos   store_unsigned_integer (buf, 8, byte_order, bp_addr);
   1064   1.1  christos   write_memory (sp, buf, 8);
   1065   1.1  christos 
   1066   1.8  christos   /* Finally, update the stack pointer...  */
   1067   1.1  christos   store_unsigned_integer (buf, 8, byte_order, sp);
   1068   1.1  christos   regcache->cooked_write (AMD64_RSP_REGNUM, buf);
   1069   1.8  christos 
   1070   1.1  christos   /* ...and fake a frame pointer.  */
   1071   1.1  christos   regcache->cooked_write (AMD64_RBP_REGNUM, buf);
   1072   1.1  christos 
   1073   1.1  christos   return sp + 16;
   1074   1.1  christos }
   1075   1.1  christos 
   1076   1.1  christos /* Displaced instruction handling.  */
   1078   1.1  christos 
   1079   1.1  christos /* A partially decoded instruction.
   1080   1.1  christos    This contains enough details for displaced stepping purposes.  */
   1081   1.1  christos 
   1082   1.1  christos struct amd64_insn
   1083   1.8  christos {
   1084   1.8  christos   /* The number of opcode bytes.  */
   1085   1.8  christos   int opcode_len;
   1086   1.1  christos   /* The offset of the REX/VEX instruction encoding prefix or -1 if
   1087   1.1  christos      not present.  */
   1088   1.1  christos   int enc_prefix_offset;
   1089   1.1  christos   /* The offset to the first opcode byte.  */
   1090   1.1  christos   int opcode_offset;
   1091   1.1  christos   /* The offset to the modrm byte or -1 if not present.  */
   1092   1.1  christos   int modrm_offset;
   1093   1.1  christos 
   1094   1.1  christos   /* The raw instruction.  */
   1095  1.10  christos   gdb_byte *raw_insn;
   1096  1.10  christos };
   1097   1.1  christos 
   1098  1.10  christos struct amd64_displaced_step_copy_insn_closure
   1099   1.8  christos   : public displaced_step_copy_insn_closure
   1100   1.8  christos {
   1101   1.8  christos   amd64_displaced_step_copy_insn_closure (int insn_buf_len)
   1102   1.1  christos   : insn_buf (insn_buf_len, 0)
   1103   1.8  christos   {}
   1104   1.1  christos 
   1105   1.1  christos   /* For rip-relative insns, saved copy of the reg we use instead of %rip.  */
   1106   1.1  christos   int tmp_used = 0;
   1107   1.1  christos   int tmp_regno;
   1108   1.1  christos   ULONGEST tmp_save;
   1109   1.1  christos 
   1110   1.8  christos   /* Details of the instruction.  */
   1111   1.8  christos   struct amd64_insn insn_details;
   1112   1.1  christos 
   1113   1.1  christos   /* The possibly modified insn.  */
   1114   1.1  christos   gdb::byte_vector insn_buf;
   1115   1.1  christos };
   1116   1.1  christos 
   1117   1.1  christos /* WARNING: Keep onebyte_has_modrm, twobyte_has_modrm in sync with
   1118   1.1  christos    ../opcodes/i386-dis.c (until libopcodes exports them, or an alternative,
   1119   1.1  christos    at which point delete these in favor of libopcodes' versions).  */
   1120   1.1  christos 
   1121   1.1  christos static const unsigned char onebyte_has_modrm[256] = {
   1122   1.1  christos   /*	   0 1 2 3 4 5 6 7 8 9 a b c d e f	  */
   1123   1.1  christos   /*	   -------------------------------	  */
   1124   1.1  christos   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
   1125   1.1  christos   /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
   1126   1.1  christos   /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
   1127   1.1  christos   /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
   1128   1.1  christos   /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
   1129   1.1  christos   /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
   1130   1.1  christos   /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
   1131   1.1  christos   /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
   1132   1.1  christos   /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
   1133   1.1  christos   /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
   1134   1.1  christos   /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
   1135   1.1  christos   /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
   1136   1.1  christos   /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
   1137   1.1  christos   /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
   1138   1.1  christos   /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
   1139   1.1  christos   /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1  /* f0 */
   1140   1.1  christos   /*	   -------------------------------	  */
   1141   1.1  christos   /*	   0 1 2 3 4 5 6 7 8 9 a b c d e f	  */
   1142   1.1  christos };
   1143   1.1  christos 
   1144   1.1  christos static const unsigned char twobyte_has_modrm[256] = {
   1145   1.1  christos   /*	   0 1 2 3 4 5 6 7 8 9 a b c d e f	  */
   1146   1.1  christos   /*	   -------------------------------	  */
   1147   1.1  christos   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
   1148   1.1  christos   /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
   1149   1.1  christos   /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
   1150   1.1  christos   /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
   1151   1.1  christos   /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
   1152   1.1  christos   /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
   1153   1.1  christos   /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
   1154   1.1  christos   /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
   1155   1.1  christos   /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
   1156   1.1  christos   /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
   1157   1.1  christos   /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
   1158   1.1  christos   /* b0 */ 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, /* bf */
   1159   1.1  christos   /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
   1160   1.1  christos   /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
   1161   1.1  christos   /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
   1162   1.1  christos   /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0  /* ff */
   1163   1.1  christos   /*	   -------------------------------	  */
   1164   1.1  christos   /*	   0 1 2 3 4 5 6 7 8 9 a b c d e f	  */
   1165   1.1  christos };
   1166   1.1  christos 
   1167   1.1  christos static int amd64_syscall_p (const struct amd64_insn *insn, int *lengthp);
   1168   1.1  christos 
   1169   1.1  christos static int
   1170   1.1  christos rex_prefix_p (gdb_byte pfx)
   1171   1.1  christos {
   1172   1.8  christos   return REX_PREFIX_P (pfx);
   1173   1.8  christos }
   1174   1.8  christos 
   1175   1.8  christos /* True if PFX is the start of the 2-byte VEX prefix.  */
   1176   1.8  christos 
   1177   1.8  christos static bool
   1178   1.8  christos vex2_prefix_p (gdb_byte pfx)
   1179   1.8  christos {
   1180   1.8  christos   return pfx == 0xc5;
   1181   1.8  christos }
   1182   1.8  christos 
   1183   1.8  christos /* True if PFX is the start of the 3-byte VEX prefix.  */
   1184   1.8  christos 
   1185   1.8  christos static bool
   1186   1.8  christos vex3_prefix_p (gdb_byte pfx)
   1187   1.8  christos {
   1188   1.1  christos   return pfx == 0xc4;
   1189   1.1  christos }
   1190   1.1  christos 
   1191   1.1  christos /* Skip the legacy instruction prefixes in INSN.
   1192   1.1  christos    We assume INSN is properly sentineled so we don't have to worry
   1193   1.1  christos    about falling off the end of the buffer.  */
   1194   1.1  christos 
   1195   1.1  christos static gdb_byte *
   1196   1.1  christos amd64_skip_prefixes (gdb_byte *insn)
   1197   1.1  christos {
   1198   1.1  christos   while (1)
   1199   1.1  christos     {
   1200   1.1  christos       switch (*insn)
   1201   1.1  christos 	{
   1202   1.1  christos 	case DATA_PREFIX_OPCODE:
   1203   1.1  christos 	case ADDR_PREFIX_OPCODE:
   1204   1.1  christos 	case CS_PREFIX_OPCODE:
   1205   1.1  christos 	case DS_PREFIX_OPCODE:
   1206   1.1  christos 	case ES_PREFIX_OPCODE:
   1207   1.1  christos 	case FS_PREFIX_OPCODE:
   1208   1.1  christos 	case GS_PREFIX_OPCODE:
   1209   1.1  christos 	case SS_PREFIX_OPCODE:
   1210   1.1  christos 	case LOCK_PREFIX_OPCODE:
   1211   1.1  christos 	case REPE_PREFIX_OPCODE:
   1212   1.1  christos 	case REPNE_PREFIX_OPCODE:
   1213   1.1  christos 	  ++insn;
   1214   1.1  christos 	  continue;
   1215   1.1  christos 	default:
   1216   1.1  christos 	  break;
   1217   1.1  christos 	}
   1218   1.1  christos       break;
   1219   1.1  christos     }
   1220   1.1  christos 
   1221   1.1  christos   return insn;
   1222   1.1  christos }
   1223   1.1  christos 
   1224   1.1  christos /* Return an integer register (other than RSP) that is unused as an input
   1225   1.1  christos    operand in INSN.
   1226   1.1  christos    In order to not require adding a rex prefix if the insn doesn't already
   1227   1.1  christos    have one, the result is restricted to RAX ... RDI, sans RSP.
   1228   1.1  christos    The register numbering of the result follows architecture ordering,
   1229   1.1  christos    e.g. RDI = 7.  */
   1230   1.1  christos 
   1231   1.1  christos static int
   1232   1.1  christos amd64_get_unused_input_int_reg (const struct amd64_insn *details)
   1233   1.1  christos {
   1234   1.1  christos   /* 1 bit for each reg */
   1235   1.1  christos   int used_regs_mask = 0;
   1236   1.1  christos 
   1237   1.1  christos   /* There can be at most 3 int regs used as inputs in an insn, and we have
   1238   1.1  christos      7 to choose from (RAX ... RDI, sans RSP).
   1239   1.1  christos      This allows us to take a conservative approach and keep things simple.
   1240   1.1  christos      E.g. By avoiding RAX, we don't have to specifically watch for opcodes
   1241   1.1  christos      that implicitly specify RAX.  */
   1242   1.1  christos 
   1243   1.1  christos   /* Avoid RAX.  */
   1244   1.1  christos   used_regs_mask |= 1 << EAX_REG_NUM;
   1245   1.1  christos   /* Similarily avoid RDX, implicit operand in divides.  */
   1246   1.1  christos   used_regs_mask |= 1 << EDX_REG_NUM;
   1247   1.1  christos   /* Avoid RSP.  */
   1248   1.1  christos   used_regs_mask |= 1 << ESP_REG_NUM;
   1249   1.1  christos 
   1250   1.1  christos   /* If the opcode is one byte long and there's no ModRM byte,
   1251   1.1  christos      assume the opcode specifies a register.  */
   1252   1.1  christos   if (details->opcode_len == 1 && details->modrm_offset == -1)
   1253   1.1  christos     used_regs_mask |= 1 << (details->raw_insn[details->opcode_offset] & 7);
   1254   1.1  christos 
   1255   1.1  christos   /* Mark used regs in the modrm/sib bytes.  */
   1256   1.1  christos   if (details->modrm_offset != -1)
   1257   1.1  christos     {
   1258   1.1  christos       int modrm = details->raw_insn[details->modrm_offset];
   1259   1.1  christos       int mod = MODRM_MOD_FIELD (modrm);
   1260   1.1  christos       int reg = MODRM_REG_FIELD (modrm);
   1261   1.1  christos       int rm = MODRM_RM_FIELD (modrm);
   1262   1.1  christos       int have_sib = mod != 3 && rm == 4;
   1263   1.1  christos 
   1264   1.1  christos       /* Assume the reg field of the modrm byte specifies a register.  */
   1265   1.1  christos       used_regs_mask |= 1 << reg;
   1266   1.1  christos 
   1267   1.1  christos       if (have_sib)
   1268   1.1  christos 	{
   1269   1.1  christos 	  int base = SIB_BASE_FIELD (details->raw_insn[details->modrm_offset + 1]);
   1270   1.1  christos 	  int idx = SIB_INDEX_FIELD (details->raw_insn[details->modrm_offset + 1]);
   1271   1.1  christos 	  used_regs_mask |= 1 << base;
   1272   1.1  christos 	  used_regs_mask |= 1 << idx;
   1273   1.1  christos 	}
   1274   1.1  christos       else
   1275   1.1  christos 	{
   1276   1.1  christos 	  used_regs_mask |= 1 << rm;
   1277   1.1  christos 	}
   1278   1.1  christos     }
   1279   1.1  christos 
   1280   1.1  christos   gdb_assert (used_regs_mask < 256);
   1281   1.1  christos   gdb_assert (used_regs_mask != 255);
   1282   1.1  christos 
   1283   1.1  christos   /* Finally, find a free reg.  */
   1284   1.1  christos   {
   1285   1.1  christos     int i;
   1286   1.1  christos 
   1287   1.1  christos     for (i = 0; i < 8; ++i)
   1288   1.1  christos       {
   1289   1.1  christos 	if (! (used_regs_mask & (1 << i)))
   1290   1.1  christos 	  return i;
   1291  1.10  christos       }
   1292   1.1  christos 
   1293   1.1  christos     /* We shouldn't get here.  */
   1294   1.1  christos     internal_error (_("unable to find free reg"));
   1295   1.1  christos   }
   1296   1.1  christos }
   1297   1.1  christos 
   1298   1.1  christos /* Extract the details of INSN that we need.  */
   1299   1.1  christos 
   1300   1.1  christos static void
   1301   1.1  christos amd64_get_insn_details (gdb_byte *insn, struct amd64_insn *details)
   1302   1.1  christos {
   1303   1.1  christos   gdb_byte *start = insn;
   1304   1.1  christos   int need_modrm;
   1305   1.1  christos 
   1306   1.8  christos   details->raw_insn = insn;
   1307   1.1  christos 
   1308   1.1  christos   details->opcode_len = -1;
   1309   1.1  christos   details->enc_prefix_offset = -1;
   1310   1.1  christos   details->opcode_offset = -1;
   1311   1.1  christos   details->modrm_offset = -1;
   1312   1.1  christos 
   1313   1.8  christos   /* Skip legacy instruction prefixes.  */
   1314   1.1  christos   insn = amd64_skip_prefixes (insn);
   1315   1.1  christos 
   1316   1.8  christos   /* Skip REX/VEX instruction encoding prefixes.  */
   1317   1.1  christos   if (rex_prefix_p (*insn))
   1318   1.1  christos     {
   1319   1.8  christos       details->enc_prefix_offset = insn - start;
   1320   1.8  christos       ++insn;
   1321   1.8  christos     }
   1322   1.8  christos   else if (vex2_prefix_p (*insn))
   1323   1.8  christos     {
   1324   1.8  christos       /* Don't record the offset in this case because this prefix has
   1325   1.8  christos 	 no REX.B equivalent.  */
   1326   1.8  christos       insn += 2;
   1327   1.8  christos     }
   1328   1.8  christos   else if (vex3_prefix_p (*insn))
   1329   1.8  christos     {
   1330   1.1  christos       details->enc_prefix_offset = insn - start;
   1331   1.1  christos       insn += 3;
   1332   1.1  christos     }
   1333   1.1  christos 
   1334   1.1  christos   details->opcode_offset = insn - start;
   1335   1.1  christos 
   1336   1.1  christos   if (*insn == TWO_BYTE_OPCODE_ESCAPE)
   1337   1.1  christos     {
   1338   1.1  christos       /* Two or three-byte opcode.  */
   1339   1.1  christos       ++insn;
   1340   1.1  christos       need_modrm = twobyte_has_modrm[*insn];
   1341   1.1  christos 
   1342   1.1  christos       /* Check for three-byte opcode.  */
   1343   1.1  christos       switch (*insn)
   1344   1.1  christos 	{
   1345   1.1  christos 	case 0x24:
   1346   1.1  christos 	case 0x25:
   1347   1.1  christos 	case 0x38:
   1348   1.1  christos 	case 0x3a:
   1349   1.1  christos 	case 0x7a:
   1350   1.1  christos 	case 0x7b:
   1351   1.1  christos 	  ++insn;
   1352   1.1  christos 	  details->opcode_len = 3;
   1353   1.1  christos 	  break;
   1354   1.1  christos 	default:
   1355   1.1  christos 	  details->opcode_len = 2;
   1356   1.1  christos 	  break;
   1357   1.1  christos 	}
   1358   1.1  christos     }
   1359   1.1  christos   else
   1360   1.1  christos     {
   1361   1.1  christos       /* One-byte opcode.  */
   1362   1.1  christos       need_modrm = onebyte_has_modrm[*insn];
   1363   1.1  christos       details->opcode_len = 1;
   1364   1.1  christos     }
   1365   1.1  christos 
   1366   1.1  christos   if (need_modrm)
   1367   1.1  christos     {
   1368   1.1  christos       ++insn;
   1369   1.1  christos       details->modrm_offset = insn - start;
   1370   1.1  christos     }
   1371   1.1  christos }
   1372   1.1  christos 
   1373   1.1  christos /* Update %rip-relative addressing in INSN.
   1374   1.1  christos 
   1375   1.1  christos    %rip-relative addressing only uses a 32-bit displacement.
   1376   1.1  christos    32 bits is not enough to be guaranteed to cover the distance between where
   1377   1.1  christos    the real instruction is and where its copy is.
   1378   1.1  christos    Convert the insn to use base+disp addressing.
   1379  1.10  christos    We set base = pc + insn_length so we can leave disp unchanged.  */
   1380  1.10  christos 
   1381   1.1  christos static void
   1382   1.1  christos fixup_riprel (struct gdbarch *gdbarch,
   1383   1.1  christos 	      amd64_displaced_step_copy_insn_closure *dsc,
   1384   1.1  christos 	      CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
   1385   1.1  christos {
   1386   1.1  christos   const struct amd64_insn *insn_details = &dsc->insn_details;
   1387   1.1  christos   int modrm_offset = insn_details->modrm_offset;
   1388   1.1  christos   CORE_ADDR rip_base;
   1389   1.1  christos   int insn_length;
   1390   1.1  christos   int arch_tmp_regno, tmp_regno;
   1391   1.8  christos   ULONGEST orig_value;
   1392   1.8  christos 
   1393   1.1  christos   /* Compute the rip-relative address.	*/
   1394   1.1  christos   insn_length = gdb_buffered_insn_length (gdbarch, dsc->insn_buf.data (),
   1395   1.1  christos 					  dsc->insn_buf.size (), from);
   1396   1.1  christos   rip_base = from + insn_length;
   1397   1.1  christos 
   1398   1.1  christos   /* We need a register to hold the address.
   1399   1.1  christos      Pick one not used in the insn.
   1400   1.1  christos      NOTE: arch_tmp_regno uses architecture ordering, e.g. RDI = 7.  */
   1401   1.8  christos   arch_tmp_regno = amd64_get_unused_input_int_reg (insn_details);
   1402   1.8  christos   tmp_regno = amd64_arch_reg_to_regnum (arch_tmp_regno);
   1403   1.8  christos 
   1404   1.8  christos   /* Position of the not-B bit in the 3-byte VEX prefix (in byte 1).  */
   1405   1.8  christos   static constexpr gdb_byte VEX3_NOT_B = 0x20;
   1406   1.8  christos 
   1407   1.8  christos   /* REX.B should be unset (VEX.!B set) as we were using rip-relative
   1408   1.8  christos      addressing, but ensure it's unset (set for VEX) anyway, tmp_regno
   1409   1.8  christos      is not r8-r15.  */
   1410   1.8  christos   if (insn_details->enc_prefix_offset != -1)
   1411   1.8  christos     {
   1412   1.8  christos       gdb_byte *pfx = &dsc->insn_buf[insn_details->enc_prefix_offset];
   1413   1.8  christos       if (rex_prefix_p (pfx[0]))
   1414   1.8  christos 	pfx[0] &= ~REX_B;
   1415   1.8  christos       else if (vex3_prefix_p (pfx[0]))
   1416   1.8  christos 	pfx[1] |= VEX3_NOT_B;
   1417   1.1  christos       else
   1418   1.1  christos 	gdb_assert_not_reached ("unhandled prefix");
   1419   1.1  christos     }
   1420   1.1  christos 
   1421   1.1  christos   regcache_cooked_read_unsigned (regs, tmp_regno, &orig_value);
   1422   1.1  christos   dsc->tmp_regno = tmp_regno;
   1423   1.1  christos   dsc->tmp_save = orig_value;
   1424   1.1  christos   dsc->tmp_used = 1;
   1425   1.1  christos 
   1426   1.1  christos   /* Convert the ModRM field to be base+disp.  */
   1427   1.1  christos   dsc->insn_buf[modrm_offset] &= ~0xc7;
   1428   1.1  christos   dsc->insn_buf[modrm_offset] |= 0x80 + arch_tmp_regno;
   1429  1.10  christos 
   1430  1.10  christos   regcache_cooked_write_unsigned (regs, tmp_regno, rip_base);
   1431  1.10  christos 
   1432  1.10  christos   displaced_debug_printf ("%%rip-relative addressing used.");
   1433   1.1  christos   displaced_debug_printf ("using temp reg %d, old value %s, new value %s",
   1434   1.1  christos 			  dsc->tmp_regno, paddress (gdbarch, dsc->tmp_save),
   1435   1.1  christos 			  paddress (gdbarch, rip_base));
   1436   1.1  christos }
   1437  1.10  christos 
   1438   1.1  christos static void
   1439   1.1  christos fixup_displaced_copy (struct gdbarch *gdbarch,
   1440   1.1  christos 		      amd64_displaced_step_copy_insn_closure *dsc,
   1441   1.1  christos 		      CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
   1442   1.1  christos {
   1443   1.1  christos   const struct amd64_insn *details = &dsc->insn_details;
   1444   1.1  christos 
   1445   1.1  christos   if (details->modrm_offset != -1)
   1446   1.1  christos     {
   1447   1.1  christos       gdb_byte modrm = details->raw_insn[details->modrm_offset];
   1448   1.1  christos 
   1449   1.1  christos       if ((modrm & 0xc7) == 0x05)
   1450   1.1  christos 	{
   1451   1.1  christos 	  /* The insn uses rip-relative addressing.
   1452   1.1  christos 	     Deal with it.  */
   1453   1.1  christos 	  fixup_riprel (gdbarch, dsc, from, to, regs);
   1454   1.1  christos 	}
   1455  1.10  christos     }
   1456   1.1  christos }
   1457   1.1  christos 
   1458   1.1  christos displaced_step_copy_insn_closure_up
   1459   1.1  christos amd64_displaced_step_copy_insn (struct gdbarch *gdbarch,
   1460   1.1  christos 				CORE_ADDR from, CORE_ADDR to,
   1461   1.1  christos 				struct regcache *regs)
   1462   1.1  christos {
   1463   1.1  christos   int len = gdbarch_max_insn_length (gdbarch);
   1464  1.10  christos   /* Extra space for sentinels so fixup_{riprel,displaced_copy} don't have to
   1465  1.10  christos      continually watch for running off the end of the buffer.  */
   1466   1.1  christos   int fixup_sentinel_space = len;
   1467   1.1  christos   std::unique_ptr<amd64_displaced_step_copy_insn_closure> dsc
   1468   1.1  christos     (new amd64_displaced_step_copy_insn_closure (len + fixup_sentinel_space));
   1469   1.1  christos   gdb_byte *buf = &dsc->insn_buf[0];
   1470   1.1  christos   struct amd64_insn *details = &dsc->insn_details;
   1471   1.1  christos 
   1472   1.1  christos   read_memory (from, buf, len);
   1473   1.1  christos 
   1474   1.1  christos   /* Set up the sentinel space so we don't have to worry about running
   1475   1.1  christos      off the end of the buffer.  An excessive number of leading prefixes
   1476   1.1  christos      could otherwise cause this.  */
   1477   1.1  christos   memset (buf + len, 0, fixup_sentinel_space);
   1478   1.1  christos 
   1479   1.1  christos   amd64_get_insn_details (buf, details);
   1480   1.1  christos 
   1481   1.1  christos   /* GDB may get control back after the insn after the syscall.
   1482   1.1  christos      Presumably this is a kernel bug.
   1483   1.1  christos      If this is a syscall, make sure there's a nop afterwards.  */
   1484   1.1  christos   {
   1485   1.1  christos     int syscall_length;
   1486   1.1  christos 
   1487   1.1  christos     if (amd64_syscall_p (details, &syscall_length))
   1488   1.1  christos       buf[details->opcode_offset + syscall_length] = NOP_OPCODE;
   1489   1.1  christos   }
   1490   1.9  christos 
   1491   1.1  christos   /* Modify the insn to cope with the address where it will be executed from.
   1492   1.1  christos      In particular, handle any rip-relative addressing.	 */
   1493   1.1  christos   fixup_displaced_copy (gdbarch, dsc.get (), from, to, regs);
   1494  1.10  christos 
   1495  1.10  christos   write_memory (to, buf, len);
   1496  1.11  christos 
   1497   1.1  christos   displaced_debug_printf ("copy %s->%s: %s",
   1498   1.9  christos 			  paddress (gdbarch, from), paddress (gdbarch, to),
   1499  1.10  christos 			  bytes_to_string (buf, len).c_str ());
   1500   1.1  christos 
   1501   1.1  christos   /* This is a work around for a problem with g++ 4.8.  */
   1502   1.1  christos   return displaced_step_copy_insn_closure_up (dsc.release ());
   1503   1.1  christos }
   1504   1.1  christos 
   1505   1.1  christos static int
   1506   1.1  christos amd64_absolute_jmp_p (const struct amd64_insn *details)
   1507   1.1  christos {
   1508   1.1  christos   const gdb_byte *insn = &details->raw_insn[details->opcode_offset];
   1509   1.1  christos 
   1510   1.1  christos   if (insn[0] == 0xff)
   1511   1.1  christos     {
   1512   1.1  christos       /* jump near, absolute indirect (/4) */
   1513   1.1  christos       if ((insn[1] & 0x38) == 0x20)
   1514   1.1  christos 	return 1;
   1515   1.1  christos 
   1516   1.1  christos       /* jump far, absolute indirect (/5) */
   1517   1.1  christos       if ((insn[1] & 0x38) == 0x28)
   1518   1.1  christos 	return 1;
   1519   1.1  christos     }
   1520   1.1  christos 
   1521   1.3  christos   return 0;
   1522   1.3  christos }
   1523   1.3  christos 
   1524   1.3  christos /* Return non-zero if the instruction DETAILS is a jump, zero otherwise.  */
   1525   1.3  christos 
   1526   1.3  christos static int
   1527   1.3  christos amd64_jmp_p (const struct amd64_insn *details)
   1528   1.3  christos {
   1529   1.3  christos   const gdb_byte *insn = &details->raw_insn[details->opcode_offset];
   1530   1.3  christos 
   1531   1.3  christos   /* jump short, relative.  */
   1532   1.3  christos   if (insn[0] == 0xeb)
   1533   1.3  christos     return 1;
   1534   1.3  christos 
   1535   1.3  christos   /* jump near, relative.  */
   1536   1.3  christos   if (insn[0] == 0xe9)
   1537   1.3  christos     return 1;
   1538   1.3  christos 
   1539   1.1  christos   return amd64_absolute_jmp_p (details);
   1540   1.1  christos }
   1541   1.1  christos 
   1542   1.1  christos static int
   1543   1.1  christos amd64_absolute_call_p (const struct amd64_insn *details)
   1544   1.1  christos {
   1545   1.1  christos   const gdb_byte *insn = &details->raw_insn[details->opcode_offset];
   1546   1.1  christos 
   1547   1.1  christos   if (insn[0] == 0xff)
   1548   1.1  christos     {
   1549   1.1  christos       /* Call near, absolute indirect (/2) */
   1550   1.1  christos       if ((insn[1] & 0x38) == 0x10)
   1551   1.1  christos 	return 1;
   1552   1.1  christos 
   1553   1.1  christos       /* Call far, absolute indirect (/3) */
   1554   1.1  christos       if ((insn[1] & 0x38) == 0x18)
   1555   1.1  christos 	return 1;
   1556   1.1  christos     }
   1557   1.1  christos 
   1558   1.1  christos   return 0;
   1559   1.1  christos }
   1560   1.1  christos 
   1561   1.1  christos static int
   1562   1.1  christos amd64_ret_p (const struct amd64_insn *details)
   1563   1.1  christos {
   1564   1.1  christos   /* NOTE: gcc can emit "repz ; ret".  */
   1565   1.1  christos   const gdb_byte *insn = &details->raw_insn[details->opcode_offset];
   1566   1.1  christos 
   1567   1.1  christos   switch (insn[0])
   1568   1.1  christos     {
   1569   1.1  christos     case 0xc2: /* ret near, pop N bytes */
   1570   1.1  christos     case 0xc3: /* ret near */
   1571   1.1  christos     case 0xca: /* ret far, pop N bytes */
   1572   1.1  christos     case 0xcb: /* ret far */
   1573   1.1  christos     case 0xcf: /* iret */
   1574   1.1  christos       return 1;
   1575   1.1  christos 
   1576   1.1  christos     default:
   1577   1.1  christos       return 0;
   1578   1.1  christos     }
   1579   1.1  christos }
   1580   1.1  christos 
   1581   1.1  christos static int
   1582   1.1  christos amd64_call_p (const struct amd64_insn *details)
   1583   1.1  christos {
   1584   1.1  christos   const gdb_byte *insn = &details->raw_insn[details->opcode_offset];
   1585   1.1  christos 
   1586   1.1  christos   if (amd64_absolute_call_p (details))
   1587   1.1  christos     return 1;
   1588   1.1  christos 
   1589   1.1  christos   /* call near, relative */
   1590   1.1  christos   if (insn[0] == 0xe8)
   1591   1.1  christos     return 1;
   1592   1.1  christos 
   1593   1.1  christos   return 0;
   1594   1.1  christos }
   1595   1.1  christos 
   1596   1.1  christos /* Return non-zero if INSN is a system call, and set *LENGTHP to its
   1597   1.1  christos    length in bytes.  Otherwise, return zero.  */
   1598   1.1  christos 
   1599   1.1  christos static int
   1600   1.1  christos amd64_syscall_p (const struct amd64_insn *details, int *lengthp)
   1601   1.1  christos {
   1602   1.1  christos   const gdb_byte *insn = &details->raw_insn[details->opcode_offset];
   1603   1.1  christos 
   1604   1.1  christos   if (insn[0] == 0x0f && insn[1] == 0x05)
   1605   1.1  christos     {
   1606   1.1  christos       *lengthp = 2;
   1607   1.1  christos       return 1;
   1608   1.1  christos     }
   1609   1.1  christos 
   1610   1.3  christos   return 0;
   1611   1.3  christos }
   1612   1.3  christos 
   1613   1.3  christos /* Classify the instruction at ADDR using PRED.
   1614   1.3  christos    Throw an error if the memory can't be read.  */
   1615   1.3  christos 
   1616   1.3  christos static int
   1617   1.3  christos amd64_classify_insn_at (struct gdbarch *gdbarch, CORE_ADDR addr,
   1618   1.3  christos 			int (*pred) (const struct amd64_insn *))
   1619  1.11  christos {
   1620   1.3  christos   struct amd64_insn details;
   1621  1.11  christos 
   1622  1.11  christos   gdb::byte_vector buf (gdbarch_max_insn_length (gdbarch));
   1623   1.3  christos 
   1624  1.11  christos   read_code (addr, buf.data (), buf.size ());
   1625   1.3  christos   amd64_get_insn_details (buf.data (), &details);
   1626   1.3  christos 
   1627   1.3  christos   int classification = pred (&details);
   1628   1.3  christos 
   1629   1.3  christos   return classification;
   1630   1.3  christos }
   1631   1.3  christos 
   1632   1.3  christos /* The gdbarch insn_is_call method.  */
   1633   1.3  christos 
   1634   1.3  christos static int
   1635   1.3  christos amd64_insn_is_call (struct gdbarch *gdbarch, CORE_ADDR addr)
   1636   1.3  christos {
   1637   1.3  christos   return amd64_classify_insn_at (gdbarch, addr, amd64_call_p);
   1638   1.3  christos }
   1639   1.3  christos 
   1640   1.3  christos /* The gdbarch insn_is_ret method.  */
   1641   1.3  christos 
   1642   1.3  christos static int
   1643   1.3  christos amd64_insn_is_ret (struct gdbarch *gdbarch, CORE_ADDR addr)
   1644   1.3  christos {
   1645   1.3  christos   return amd64_classify_insn_at (gdbarch, addr, amd64_ret_p);
   1646   1.3  christos }
   1647   1.3  christos 
   1648   1.3  christos /* The gdbarch insn_is_jump method.  */
   1649   1.3  christos 
   1650   1.3  christos static int
   1651   1.3  christos amd64_insn_is_jump (struct gdbarch *gdbarch, CORE_ADDR addr)
   1652   1.3  christos {
   1653   1.1  christos   return amd64_classify_insn_at (gdbarch, addr, amd64_jmp_p);
   1654   1.1  christos }
   1655   1.1  christos 
   1656   1.1  christos /* Fix up the state of registers and memory after having single-stepped
   1657   1.1  christos    a displaced instruction.  */
   1658  1.10  christos 
   1659   1.1  christos void
   1660  1.11  christos amd64_displaced_step_fixup (struct gdbarch *gdbarch,
   1661   1.1  christos 			    struct displaced_step_copy_insn_closure *dsc_,
   1662  1.10  christos 			    CORE_ADDR from, CORE_ADDR to,
   1663  1.10  christos 			    struct regcache *regs, bool completed_p)
   1664   1.1  christos {
   1665   1.1  christos   amd64_displaced_step_copy_insn_closure *dsc
   1666   1.1  christos     = (amd64_displaced_step_copy_insn_closure *) dsc_;
   1667   1.8  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1668   1.1  christos   /* The offset we applied to the instruction's address.  */
   1669   1.1  christos   ULONGEST insn_offset = to - from;
   1670  1.10  christos   gdb_byte *insn = dsc->insn_buf.data ();
   1671  1.10  christos   const struct amd64_insn *insn_details = &dsc->insn_details;
   1672  1.10  christos 
   1673   1.1  christos   displaced_debug_printf ("fixup (%s, %s), insn = 0x%02x 0x%02x ...",
   1674   1.1  christos 			  paddress (gdbarch, from), paddress (gdbarch, to),
   1675   1.1  christos 			  insn[0], insn[1]);
   1676   1.1  christos 
   1677   1.1  christos   /* If we used a tmp reg, restore it.	*/
   1678  1.10  christos 
   1679  1.10  christos   if (dsc->tmp_used)
   1680   1.1  christos     {
   1681   1.1  christos       displaced_debug_printf ("restoring reg %d to %s",
   1682   1.1  christos 			      dsc->tmp_regno, paddress (gdbarch, dsc->tmp_save));
   1683   1.1  christos       regcache_cooked_write_unsigned (regs, dsc->tmp_regno, dsc->tmp_save);
   1684   1.1  christos     }
   1685   1.1  christos 
   1686   1.1  christos   /* The list of issues to contend with here is taken from
   1687   1.1  christos      resume_execution in arch/x86/kernel/kprobes.c, Linux 2.6.28.
   1688   1.1  christos      Yay for Free Software!  */
   1689   1.1  christos 
   1690   1.1  christos   /* Relocate the %rip back to the program's instruction stream,
   1691   1.1  christos      if necessary.  */
   1692   1.1  christos 
   1693   1.1  christos   /* Except in the case of absolute or indirect jump or call
   1694   1.1  christos      instructions, or a return instruction, the new rip is relative to
   1695  1.11  christos      the displaced instruction; make it relative to the original insn.
   1696  1.11  christos      Well, signal handler returns don't need relocation either, but we use the
   1697  1.11  christos      value of %rip to recognize those; see below.  */
   1698  1.11  christos   if (!completed_p
   1699   1.1  christos       || (!amd64_absolute_jmp_p (insn_details)
   1700   1.1  christos 	  && !amd64_absolute_call_p (insn_details)
   1701   1.1  christos 	  && !amd64_ret_p (insn_details)))
   1702  1.11  christos     {
   1703   1.1  christos       int insn_len;
   1704   1.1  christos 
   1705   1.1  christos       CORE_ADDR pc = regcache_read_pc (regs);
   1706   1.1  christos 
   1707   1.1  christos       /* A signal trampoline system call changes the %rip, resuming
   1708   1.1  christos 	 execution of the main program after the signal handler has
   1709   1.1  christos 	 returned.  That makes them like 'return' instructions; we
   1710   1.1  christos 	 shouldn't relocate %rip.
   1711   1.1  christos 
   1712   1.1  christos 	 But most system calls don't, and we do need to relocate %rip.
   1713   1.1  christos 
   1714   1.1  christos 	 Our heuristic for distinguishing these cases: if stepping
   1715   1.1  christos 	 over the system call instruction left control directly after
   1716   1.1  christos 	 the instruction, the we relocate --- control almost certainly
   1717   1.1  christos 	 doesn't belong in the displaced copy.	Otherwise, we assume
   1718   1.1  christos 	 the instruction has put control where it belongs, and leave
   1719   1.1  christos 	 it unrelocated.  Goodness help us if there are PC-relative
   1720  1.11  christos 	 system calls.	*/
   1721  1.11  christos       if (amd64_syscall_p (insn_details, &insn_len)
   1722  1.11  christos 	  /* GDB can get control back after the insn after the syscall.
   1723  1.10  christos 	     Presumably this is a kernel bug.  Fixup ensures it's a nop, we
   1724   1.1  christos 	     add one to the length for it.  */
   1725   1.1  christos 	  && (pc < to || pc > (to + insn_len + 1)))
   1726  1.11  christos 	displaced_debug_printf ("syscall changed %%rip; not relocating");
   1727   1.1  christos       else
   1728   1.1  christos 	{
   1729   1.1  christos 	  CORE_ADDR rip = pc - insn_offset;
   1730   1.1  christos 
   1731   1.1  christos 	  /* If we just stepped over a breakpoint insn, we don't backup
   1732  1.11  christos 	     the pc on purpose; this is to match behaviour without
   1733   1.1  christos 	     stepping.  */
   1734  1.10  christos 
   1735  1.11  christos 	  regcache_write_pc (regs, rip);
   1736  1.10  christos 
   1737   1.1  christos 	  displaced_debug_printf ("relocated %%rip from %s to %s",
   1738   1.1  christos 				  paddress (gdbarch, pc),
   1739   1.1  christos 				  paddress (gdbarch, rip));
   1740   1.1  christos 	}
   1741   1.1  christos     }
   1742   1.1  christos 
   1743   1.1  christos   /* If the instruction was PUSHFL, then the TF bit will be set in the
   1744   1.1  christos      pushed value, and should be cleared.  We'll leave this for later,
   1745   1.1  christos      since GDB already messes up the TF flag when stepping over a
   1746   1.1  christos      pushfl.  */
   1747   1.1  christos 
   1748  1.11  christos   /* If the instruction was a call, the return address now atop the
   1749   1.1  christos      stack is the address following the copied instruction.  We need
   1750   1.1  christos      to make it the address following the original instruction.	 */
   1751   1.1  christos   if (completed_p && amd64_call_p (insn_details))
   1752   1.1  christos     {
   1753   1.1  christos       ULONGEST rsp;
   1754   1.1  christos       ULONGEST retaddr;
   1755   1.1  christos       const ULONGEST retaddr_len = 8;
   1756   1.5  christos 
   1757   1.1  christos       regcache_cooked_read_unsigned (regs, AMD64_RSP_REGNUM, &rsp);
   1758   1.1  christos       retaddr = read_memory_unsigned_integer (rsp, retaddr_len, byte_order);
   1759  1.10  christos       retaddr = (retaddr - insn_offset) & 0xffffffffffffffffULL;
   1760  1.10  christos       write_memory_unsigned_integer (rsp, retaddr_len, byte_order, retaddr);
   1761  1.10  christos 
   1762   1.1  christos       displaced_debug_printf ("relocated return addr at %s to %s",
   1763   1.1  christos 			      paddress (gdbarch, rsp),
   1764   1.1  christos 			      paddress (gdbarch, retaddr));
   1765   1.1  christos     }
   1766   1.1  christos }
   1767   1.1  christos 
   1768   1.1  christos /* If the instruction INSN uses RIP-relative addressing, return the
   1769   1.1  christos    offset into the raw INSN where the displacement to be adjusted is
   1770   1.1  christos    found.  Returns 0 if the instruction doesn't use RIP-relative
   1771   1.1  christos    addressing.  */
   1772   1.1  christos 
   1773   1.1  christos static int
   1774   1.1  christos rip_relative_offset (struct amd64_insn *insn)
   1775   1.1  christos {
   1776   1.1  christos   if (insn->modrm_offset != -1)
   1777   1.1  christos     {
   1778   1.1  christos       gdb_byte modrm = insn->raw_insn[insn->modrm_offset];
   1779   1.1  christos 
   1780   1.1  christos       if ((modrm & 0xc7) == 0x05)
   1781   1.1  christos 	{
   1782   1.1  christos 	  /* The displacement is found right after the ModRM byte.  */
   1783   1.1  christos 	  return insn->modrm_offset + 1;
   1784   1.1  christos 	}
   1785   1.1  christos     }
   1786   1.1  christos 
   1787   1.1  christos   return 0;
   1788   1.1  christos }
   1789   1.1  christos 
   1790   1.1  christos static void
   1791   1.1  christos append_insns (CORE_ADDR *to, ULONGEST len, const gdb_byte *buf)
   1792   1.1  christos {
   1793   1.1  christos   target_write_memory (*to, buf, len);
   1794   1.1  christos   *to += len;
   1795   1.1  christos }
   1796   1.1  christos 
   1797   1.1  christos static void
   1798   1.1  christos amd64_relocate_instruction (struct gdbarch *gdbarch,
   1799   1.1  christos 			    CORE_ADDR *to, CORE_ADDR oldloc)
   1800   1.1  christos {
   1801   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1802  1.11  christos   int len = gdbarch_max_insn_length (gdbarch);
   1803   1.1  christos   /* Extra space for sentinels.  */
   1804   1.1  christos   int fixup_sentinel_space = len;
   1805   1.1  christos   gdb::byte_vector buf (len + fixup_sentinel_space);
   1806   1.1  christos   struct amd64_insn insn_details;
   1807   1.1  christos   int offset = 0;
   1808   1.1  christos   LONGEST rel32, newrel;
   1809  1.11  christos   gdb_byte *insn;
   1810   1.1  christos   int insn_length;
   1811   1.1  christos 
   1812   1.1  christos   read_memory (oldloc, buf.data (), len);
   1813   1.1  christos 
   1814  1.11  christos   /* Set up the sentinel space so we don't have to worry about running
   1815   1.1  christos      off the end of the buffer.  An excessive number of leading prefixes
   1816  1.11  christos      could otherwise cause this.  */
   1817   1.1  christos   memset (buf.data () + len, 0, fixup_sentinel_space);
   1818   1.1  christos 
   1819   1.1  christos   insn = buf.data ();
   1820   1.1  christos   amd64_get_insn_details (insn, &insn_details);
   1821   1.1  christos 
   1822   1.1  christos   insn_length = gdb_buffered_insn_length (gdbarch, insn, len, oldloc);
   1823   1.1  christos 
   1824   1.1  christos   /* Skip legacy instruction prefixes.  */
   1825   1.1  christos   insn = amd64_skip_prefixes (insn);
   1826   1.1  christos 
   1827   1.1  christos   /* Adjust calls with 32-bit relative addresses as push/jump, with
   1828   1.1  christos      the address pushed being the location where the original call in
   1829   1.6  christos      the user program would return to.  */
   1830   1.6  christos   if (insn[0] == 0xe8)
   1831   1.6  christos     {
   1832   1.1  christos       gdb_byte push_buf[32];
   1833   1.1  christos       CORE_ADDR ret_addr;
   1834   1.1  christos       int i = 0;
   1835   1.6  christos 
   1836   1.6  christos       /* Where "ret" in the original code will return to.  */
   1837   1.6  christos       ret_addr = oldloc + insn_length;
   1838   1.6  christos 
   1839   1.6  christos       /* If pushing an address higher than or equal to 0x80000000,
   1840   1.6  christos 	 avoid 'pushq', as that sign extends its 32-bit operand, which
   1841   1.6  christos 	 would be incorrect.  */
   1842   1.6  christos       if (ret_addr <= 0x7fffffff)
   1843   1.6  christos 	{
   1844   1.6  christos 	  push_buf[0] = 0x68; /* pushq $...  */
   1845   1.6  christos 	  store_unsigned_integer (&push_buf[1], 4, byte_order, ret_addr);
   1846   1.6  christos 	  i = 5;
   1847   1.6  christos 	}
   1848   1.6  christos       else
   1849   1.6  christos 	{
   1850   1.6  christos 	  push_buf[i++] = 0x48; /* sub    $0x8,%rsp */
   1851   1.6  christos 	  push_buf[i++] = 0x83;
   1852   1.6  christos 	  push_buf[i++] = 0xec;
   1853   1.6  christos 	  push_buf[i++] = 0x08;
   1854   1.6  christos 
   1855   1.6  christos 	  push_buf[i++] = 0xc7; /* movl    $imm,(%rsp) */
   1856   1.6  christos 	  push_buf[i++] = 0x04;
   1857   1.6  christos 	  push_buf[i++] = 0x24;
   1858   1.6  christos 	  store_unsigned_integer (&push_buf[i], 4, byte_order,
   1859   1.6  christos 				  ret_addr & 0xffffffff);
   1860   1.6  christos 	  i += 4;
   1861   1.6  christos 
   1862   1.6  christos 	  push_buf[i++] = 0xc7; /* movl    $imm,4(%rsp) */
   1863   1.6  christos 	  push_buf[i++] = 0x44;
   1864   1.6  christos 	  push_buf[i++] = 0x24;
   1865   1.6  christos 	  push_buf[i++] = 0x04;
   1866   1.6  christos 	  store_unsigned_integer (&push_buf[i], 4, byte_order,
   1867   1.6  christos 				  ret_addr >> 32);
   1868   1.1  christos 	  i += 4;
   1869   1.6  christos 	}
   1870   1.1  christos       gdb_assert (i <= sizeof (push_buf));
   1871   1.1  christos       /* Push the push.  */
   1872   1.1  christos       append_insns (to, i, push_buf);
   1873   1.1  christos 
   1874   1.1  christos       /* Convert the relative call to a relative jump.  */
   1875   1.1  christos       insn[0] = 0xe9;
   1876   1.1  christos 
   1877   1.1  christos       /* Adjust the destination offset.  */
   1878   1.1  christos       rel32 = extract_signed_integer (insn + 1, 4, byte_order);
   1879  1.10  christos       newrel = (oldloc - *to) + rel32;
   1880  1.10  christos       store_signed_integer (insn + 1, 4, byte_order, newrel);
   1881  1.10  christos 
   1882   1.1  christos       displaced_debug_printf ("adjusted insn rel32=%s at %s to rel32=%s at %s",
   1883   1.1  christos 			      hex_string (rel32), paddress (gdbarch, oldloc),
   1884   1.1  christos 			      hex_string (newrel), paddress (gdbarch, *to));
   1885   1.1  christos 
   1886   1.1  christos       /* Write the adjusted jump into its displaced location.  */
   1887   1.1  christos       append_insns (to, 5, insn);
   1888   1.1  christos       return;
   1889   1.1  christos     }
   1890   1.1  christos 
   1891   1.1  christos   offset = rip_relative_offset (&insn_details);
   1892   1.1  christos   if (!offset)
   1893   1.1  christos     {
   1894   1.1  christos       /* Adjust jumps with 32-bit relative addresses.  Calls are
   1895   1.1  christos 	 already handled above.  */
   1896   1.1  christos       if (insn[0] == 0xe9)
   1897   1.1  christos 	offset = 1;
   1898   1.1  christos       /* Adjust conditional jumps.  */
   1899   1.1  christos       else if (insn[0] == 0x0f && (insn[1] & 0xf0) == 0x80)
   1900   1.1  christos 	offset = 2;
   1901   1.1  christos     }
   1902   1.1  christos 
   1903   1.1  christos   if (offset)
   1904   1.1  christos     {
   1905  1.10  christos       rel32 = extract_signed_integer (insn + offset, 4, byte_order);
   1906  1.10  christos       newrel = (oldloc - *to) + rel32;
   1907  1.10  christos       store_signed_integer (insn + offset, 4, byte_order, newrel);
   1908   1.1  christos       displaced_debug_printf ("adjusted insn rel32=%s at %s to rel32=%s at %s",
   1909   1.1  christos 			      hex_string (rel32), paddress (gdbarch, oldloc),
   1910   1.1  christos 			      hex_string (newrel), paddress (gdbarch, *to));
   1911  1.11  christos     }
   1912   1.1  christos 
   1913   1.1  christos   /* Write the adjusted instruction into its displaced location.  */
   1914   1.1  christos   append_insns (to, insn_length, buf.data ());
   1915   1.1  christos }
   1916   1.1  christos 
   1917   1.1  christos 
   1918   1.1  christos /* The maximum number of saved registers.  This should include %rip.  */
   1920   1.1  christos #define AMD64_NUM_SAVED_REGS	AMD64_NUM_GREGS
   1921   1.1  christos 
   1922   1.1  christos struct amd64_frame_cache
   1923   1.1  christos {
   1924   1.1  christos   /* Base address.  */
   1925   1.1  christos   CORE_ADDR base;
   1926   1.1  christos   int base_p;
   1927   1.1  christos   CORE_ADDR sp_offset;
   1928   1.1  christos   CORE_ADDR pc;
   1929   1.1  christos 
   1930   1.1  christos   /* Saved registers.  */
   1931   1.1  christos   CORE_ADDR saved_regs[AMD64_NUM_SAVED_REGS];
   1932   1.1  christos   CORE_ADDR saved_sp;
   1933   1.1  christos   int saved_sp_reg;
   1934   1.1  christos 
   1935   1.1  christos   /* Do we have a frame?  */
   1936   1.1  christos   int frameless_p;
   1937   1.1  christos };
   1938   1.1  christos 
   1939   1.1  christos /* Initialize a frame cache.  */
   1940   1.1  christos 
   1941   1.1  christos static void
   1942   1.1  christos amd64_init_frame_cache (struct amd64_frame_cache *cache)
   1943   1.1  christos {
   1944   1.1  christos   int i;
   1945   1.1  christos 
   1946   1.1  christos   /* Base address.  */
   1947   1.1  christos   cache->base = 0;
   1948   1.1  christos   cache->base_p = 0;
   1949   1.1  christos   cache->sp_offset = -8;
   1950   1.1  christos   cache->pc = 0;
   1951   1.1  christos 
   1952   1.1  christos   /* Saved registers.  We initialize these to -1 since zero is a valid
   1953   1.1  christos      offset (that's where %rbp is supposed to be stored).
   1954   1.1  christos      The values start out as being offsets, and are later converted to
   1955   1.1  christos      addresses (at which point -1 is interpreted as an address, still meaning
   1956   1.1  christos      "invalid").  */
   1957   1.1  christos   for (i = 0; i < AMD64_NUM_SAVED_REGS; i++)
   1958   1.1  christos     cache->saved_regs[i] = -1;
   1959   1.1  christos   cache->saved_sp = 0;
   1960   1.1  christos   cache->saved_sp_reg = -1;
   1961   1.1  christos 
   1962   1.1  christos   /* Frameless until proven otherwise.  */
   1963   1.1  christos   cache->frameless_p = 1;
   1964   1.1  christos }
   1965   1.1  christos 
   1966   1.1  christos /* Allocate and initialize a frame cache.  */
   1967   1.1  christos 
   1968   1.1  christos static struct amd64_frame_cache *
   1969   1.1  christos amd64_alloc_frame_cache (void)
   1970   1.1  christos {
   1971   1.1  christos   struct amd64_frame_cache *cache;
   1972   1.1  christos 
   1973   1.1  christos   cache = FRAME_OBSTACK_ZALLOC (struct amd64_frame_cache);
   1974   1.1  christos   amd64_init_frame_cache (cache);
   1975   1.1  christos   return cache;
   1976   1.1  christos }
   1977   1.1  christos 
   1978   1.1  christos /* GCC 4.4 and later, can put code in the prologue to realign the
   1979   1.1  christos    stack pointer.  Check whether PC points to such code, and update
   1980   1.1  christos    CACHE accordingly.  Return the first instruction after the code
   1981   1.1  christos    sequence or CURRENT_PC, whichever is smaller.  If we don't
   1982   1.1  christos    recognize the code, return PC.  */
   1983   1.1  christos 
   1984   1.1  christos static CORE_ADDR
   1985   1.1  christos amd64_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
   1986   1.1  christos 			   struct amd64_frame_cache *cache)
   1987   1.1  christos {
   1988   1.1  christos   /* There are 2 code sequences to re-align stack before the frame
   1989   1.1  christos      gets set up:
   1990   1.1  christos 
   1991   1.1  christos 	1. Use a caller-saved saved register:
   1992   1.1  christos 
   1993   1.1  christos 		leaq  8(%rsp), %reg
   1994   1.1  christos 		andq  $-XXX, %rsp
   1995   1.1  christos 		pushq -8(%reg)
   1996   1.1  christos 
   1997   1.1  christos 	2. Use a callee-saved saved register:
   1998   1.1  christos 
   1999   1.1  christos 		pushq %reg
   2000   1.1  christos 		leaq  16(%rsp), %reg
   2001   1.1  christos 		andq  $-XXX, %rsp
   2002  1.10  christos 		pushq -8(%reg)
   2003  1.10  christos 
   2004   1.1  christos      "andq $-XXX, %rsp" can be either 4 bytes or 7 bytes:
   2005   1.1  christos 
   2006   1.1  christos 	0x48 0x83 0xe4 0xf0			andq $-16, %rsp
   2007   1.1  christos 	0x48 0x81 0xe4 0x00 0xff 0xff 0xff	andq $-256, %rsp
   2008   1.1  christos    */
   2009   1.1  christos 
   2010   1.1  christos   gdb_byte buf[18];
   2011   1.1  christos   int reg, r;
   2012   1.1  christos   int offset, offset_and;
   2013   1.1  christos 
   2014   1.1  christos   if (target_read_code (pc, buf, sizeof buf))
   2015   1.1  christos     return pc;
   2016   1.1  christos 
   2017   1.1  christos   /* Check caller-saved saved register.  The first instruction has
   2018   1.1  christos      to be "leaq 8(%rsp), %reg".  */
   2019   1.1  christos   if ((buf[0] & 0xfb) == 0x48
   2020   1.1  christos       && buf[1] == 0x8d
   2021   1.1  christos       && buf[3] == 0x24
   2022   1.1  christos       && buf[4] == 0x8)
   2023   1.1  christos     {
   2024   1.1  christos       /* MOD must be binary 10 and R/M must be binary 100.  */
   2025   1.1  christos       if ((buf[2] & 0xc7) != 0x44)
   2026   1.1  christos 	return pc;
   2027   1.1  christos 
   2028   1.1  christos       /* REG has register number.  */
   2029   1.1  christos       reg = (buf[2] >> 3) & 7;
   2030   1.1  christos 
   2031   1.1  christos       /* Check the REX.R bit.  */
   2032   1.1  christos       if (buf[0] == 0x4c)
   2033   1.1  christos 	reg += 8;
   2034   1.1  christos 
   2035   1.1  christos       offset = 5;
   2036   1.1  christos     }
   2037   1.1  christos   else
   2038   1.1  christos     {
   2039   1.1  christos       /* Check callee-saved saved register.  The first instruction
   2040   1.1  christos 	 has to be "pushq %reg".  */
   2041   1.1  christos       reg = 0;
   2042   1.1  christos       if ((buf[0] & 0xf8) == 0x50)
   2043   1.1  christos 	offset = 0;
   2044   1.1  christos       else if ((buf[0] & 0xf6) == 0x40
   2045   1.1  christos 	       && (buf[1] & 0xf8) == 0x50)
   2046   1.1  christos 	{
   2047   1.1  christos 	  /* Check the REX.B bit.  */
   2048   1.1  christos 	  if ((buf[0] & 1) != 0)
   2049   1.1  christos 	    reg = 8;
   2050   1.1  christos 
   2051   1.1  christos 	  offset = 1;
   2052   1.1  christos 	}
   2053   1.1  christos       else
   2054   1.1  christos 	return pc;
   2055   1.1  christos 
   2056   1.1  christos       /* Get register.  */
   2057   1.1  christos       reg += buf[offset] & 0x7;
   2058   1.1  christos 
   2059   1.1  christos       offset++;
   2060   1.1  christos 
   2061   1.1  christos       /* The next instruction has to be "leaq 16(%rsp), %reg".  */
   2062   1.1  christos       if ((buf[offset] & 0xfb) != 0x48
   2063   1.1  christos 	  || buf[offset + 1] != 0x8d
   2064   1.1  christos 	  || buf[offset + 3] != 0x24
   2065   1.1  christos 	  || buf[offset + 4] != 0x10)
   2066   1.1  christos 	return pc;
   2067   1.1  christos 
   2068   1.1  christos       /* MOD must be binary 10 and R/M must be binary 100.  */
   2069   1.1  christos       if ((buf[offset + 2] & 0xc7) != 0x44)
   2070   1.1  christos 	return pc;
   2071   1.1  christos 
   2072   1.1  christos       /* REG has register number.  */
   2073   1.1  christos       r = (buf[offset + 2] >> 3) & 7;
   2074   1.1  christos 
   2075   1.1  christos       /* Check the REX.R bit.  */
   2076   1.1  christos       if (buf[offset] == 0x4c)
   2077   1.1  christos 	r += 8;
   2078   1.1  christos 
   2079   1.1  christos       /* Registers in pushq and leaq have to be the same.  */
   2080   1.1  christos       if (reg != r)
   2081   1.1  christos 	return pc;
   2082   1.1  christos 
   2083   1.1  christos       offset += 5;
   2084   1.1  christos     }
   2085   1.1  christos 
   2086   1.1  christos   /* Rigister can't be %rsp nor %rbp.  */
   2087   1.1  christos   if (reg == 4 || reg == 5)
   2088   1.1  christos     return pc;
   2089   1.1  christos 
   2090   1.1  christos   /* The next instruction has to be "andq $-XXX, %rsp".  */
   2091   1.1  christos   if (buf[offset] != 0x48
   2092   1.1  christos       || buf[offset + 2] != 0xe4
   2093   1.1  christos       || (buf[offset + 1] != 0x81 && buf[offset + 1] != 0x83))
   2094   1.1  christos     return pc;
   2095   1.1  christos 
   2096   1.1  christos   offset_and = offset;
   2097   1.1  christos   offset += buf[offset + 1] == 0x81 ? 7 : 4;
   2098   1.1  christos 
   2099   1.1  christos   /* The next instruction has to be "pushq -8(%reg)".  */
   2100   1.1  christos   r = 0;
   2101   1.1  christos   if (buf[offset] == 0xff)
   2102   1.1  christos     offset++;
   2103   1.1  christos   else if ((buf[offset] & 0xf6) == 0x40
   2104   1.1  christos 	   && buf[offset + 1] == 0xff)
   2105   1.1  christos     {
   2106   1.1  christos       /* Check the REX.B bit.  */
   2107   1.1  christos       if ((buf[offset] & 0x1) != 0)
   2108   1.1  christos 	r = 8;
   2109   1.1  christos       offset += 2;
   2110   1.1  christos     }
   2111   1.1  christos   else
   2112   1.1  christos     return pc;
   2113   1.1  christos 
   2114   1.1  christos   /* 8bit -8 is 0xf8.  REG must be binary 110 and MOD must be binary
   2115   1.1  christos      01.  */
   2116   1.1  christos   if (buf[offset + 1] != 0xf8
   2117   1.1  christos       || (buf[offset] & 0xf8) != 0x70)
   2118   1.1  christos     return pc;
   2119   1.1  christos 
   2120   1.1  christos   /* R/M has register.  */
   2121   1.1  christos   r += buf[offset] & 7;
   2122   1.1  christos 
   2123   1.1  christos   /* Registers in leaq and pushq have to be the same.  */
   2124   1.1  christos   if (reg != r)
   2125   1.1  christos     return pc;
   2126   1.7  christos 
   2127   1.1  christos   if (current_pc > pc + offset_and)
   2128   1.1  christos     cache->saved_sp_reg = amd64_arch_reg_to_regnum (reg);
   2129   1.1  christos 
   2130   1.1  christos   return std::min (pc + offset + 2, current_pc);
   2131   1.1  christos }
   2132   1.1  christos 
   2133   1.1  christos /* Similar to amd64_analyze_stack_align for x32.  */
   2134   1.1  christos 
   2135   1.1  christos static CORE_ADDR
   2136   1.1  christos amd64_x32_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
   2137   1.1  christos 			       struct amd64_frame_cache *cache)
   2138   1.1  christos {
   2139   1.1  christos   /* There are 2 code sequences to re-align stack before the frame
   2140   1.1  christos      gets set up:
   2141   1.1  christos 
   2142   1.1  christos 	1. Use a caller-saved saved register:
   2143   1.1  christos 
   2144   1.1  christos 		leaq  8(%rsp), %reg
   2145   1.1  christos 		andq  $-XXX, %rsp
   2146   1.1  christos 		pushq -8(%reg)
   2147   1.1  christos 
   2148   1.1  christos 	   or
   2149   1.1  christos 
   2150   1.1  christos 		[addr32] leal  8(%rsp), %reg
   2151   1.1  christos 		andl  $-XXX, %esp
   2152   1.1  christos 		[addr32] pushq -8(%reg)
   2153   1.1  christos 
   2154   1.1  christos 	2. Use a callee-saved saved register:
   2155   1.1  christos 
   2156   1.1  christos 		pushq %reg
   2157   1.1  christos 		leaq  16(%rsp), %reg
   2158   1.1  christos 		andq  $-XXX, %rsp
   2159   1.1  christos 		pushq -8(%reg)
   2160   1.1  christos 
   2161   1.1  christos 	   or
   2162   1.1  christos 
   2163   1.1  christos 		pushq %reg
   2164   1.1  christos 		[addr32] leal  16(%rsp), %reg
   2165   1.1  christos 		andl  $-XXX, %esp
   2166  1.10  christos 		[addr32] pushq -8(%reg)
   2167  1.10  christos 
   2168   1.1  christos      "andq $-XXX, %rsp" can be either 4 bytes or 7 bytes:
   2169   1.1  christos 
   2170   1.1  christos 	0x48 0x83 0xe4 0xf0			andq $-16, %rsp
   2171  1.10  christos 	0x48 0x81 0xe4 0x00 0xff 0xff 0xff	andq $-256, %rsp
   2172  1.10  christos 
   2173   1.1  christos      "andl $-XXX, %esp" can be either 3 bytes or 6 bytes:
   2174   1.1  christos 
   2175   1.1  christos 	0x83 0xe4 0xf0			andl $-16, %esp
   2176   1.1  christos 	0x81 0xe4 0x00 0xff 0xff 0xff	andl $-256, %esp
   2177   1.1  christos    */
   2178   1.1  christos 
   2179   1.1  christos   gdb_byte buf[19];
   2180   1.1  christos   int reg, r;
   2181   1.1  christos   int offset, offset_and;
   2182   1.1  christos 
   2183   1.1  christos   if (target_read_memory (pc, buf, sizeof buf))
   2184   1.1  christos     return pc;
   2185   1.1  christos 
   2186   1.1  christos   /* Skip optional addr32 prefix.  */
   2187   1.1  christos   offset = buf[0] == 0x67 ? 1 : 0;
   2188   1.1  christos 
   2189   1.1  christos   /* Check caller-saved saved register.  The first instruction has
   2190   1.1  christos      to be "leaq 8(%rsp), %reg" or "leal 8(%rsp), %reg".  */
   2191   1.1  christos   if (((buf[offset] & 0xfb) == 0x48 || (buf[offset] & 0xfb) == 0x40)
   2192   1.1  christos       && buf[offset + 1] == 0x8d
   2193   1.1  christos       && buf[offset + 3] == 0x24
   2194   1.1  christos       && buf[offset + 4] == 0x8)
   2195   1.1  christos     {
   2196   1.1  christos       /* MOD must be binary 10 and R/M must be binary 100.  */
   2197   1.1  christos       if ((buf[offset + 2] & 0xc7) != 0x44)
   2198   1.1  christos 	return pc;
   2199   1.1  christos 
   2200   1.1  christos       /* REG has register number.  */
   2201   1.1  christos       reg = (buf[offset + 2] >> 3) & 7;
   2202   1.1  christos 
   2203   1.1  christos       /* Check the REX.R bit.  */
   2204   1.1  christos       if ((buf[offset] & 0x4) != 0)
   2205   1.1  christos 	reg += 8;
   2206   1.1  christos 
   2207   1.1  christos       offset += 5;
   2208   1.1  christos     }
   2209   1.1  christos   else
   2210   1.1  christos     {
   2211   1.1  christos       /* Check callee-saved saved register.  The first instruction
   2212   1.1  christos 	 has to be "pushq %reg".  */
   2213   1.1  christos       reg = 0;
   2214   1.1  christos       if ((buf[offset] & 0xf6) == 0x40
   2215   1.1  christos 	  && (buf[offset + 1] & 0xf8) == 0x50)
   2216   1.1  christos 	{
   2217   1.1  christos 	  /* Check the REX.B bit.  */
   2218   1.1  christos 	  if ((buf[offset] & 1) != 0)
   2219   1.1  christos 	    reg = 8;
   2220   1.1  christos 
   2221   1.1  christos 	  offset += 1;
   2222   1.1  christos 	}
   2223   1.1  christos       else if ((buf[offset] & 0xf8) != 0x50)
   2224   1.1  christos 	return pc;
   2225   1.1  christos 
   2226   1.1  christos       /* Get register.  */
   2227   1.1  christos       reg += buf[offset] & 0x7;
   2228   1.1  christos 
   2229   1.1  christos       offset++;
   2230   1.1  christos 
   2231   1.1  christos       /* Skip optional addr32 prefix.  */
   2232   1.1  christos       if (buf[offset] == 0x67)
   2233   1.1  christos 	offset++;
   2234   1.1  christos 
   2235   1.1  christos       /* The next instruction has to be "leaq 16(%rsp), %reg" or
   2236   1.1  christos 	 "leal 16(%rsp), %reg".  */
   2237   1.1  christos       if (((buf[offset] & 0xfb) != 0x48 && (buf[offset] & 0xfb) != 0x40)
   2238   1.1  christos 	  || buf[offset + 1] != 0x8d
   2239   1.1  christos 	  || buf[offset + 3] != 0x24
   2240   1.1  christos 	  || buf[offset + 4] != 0x10)
   2241   1.1  christos 	return pc;
   2242   1.1  christos 
   2243   1.1  christos       /* MOD must be binary 10 and R/M must be binary 100.  */
   2244   1.1  christos       if ((buf[offset + 2] & 0xc7) != 0x44)
   2245   1.1  christos 	return pc;
   2246   1.1  christos 
   2247   1.1  christos       /* REG has register number.  */
   2248   1.1  christos       r = (buf[offset + 2] >> 3) & 7;
   2249   1.1  christos 
   2250   1.1  christos       /* Check the REX.R bit.  */
   2251   1.1  christos       if ((buf[offset] & 0x4) != 0)
   2252   1.1  christos 	r += 8;
   2253   1.1  christos 
   2254   1.1  christos       /* Registers in pushq and leaq have to be the same.  */
   2255   1.1  christos       if (reg != r)
   2256   1.1  christos 	return pc;
   2257   1.1  christos 
   2258   1.1  christos       offset += 5;
   2259   1.1  christos     }
   2260   1.1  christos 
   2261   1.1  christos   /* Rigister can't be %rsp nor %rbp.  */
   2262   1.1  christos   if (reg == 4 || reg == 5)
   2263   1.1  christos     return pc;
   2264   1.1  christos 
   2265   1.1  christos   /* The next instruction may be "andq $-XXX, %rsp" or
   2266   1.1  christos      "andl $-XXX, %esp".  */
   2267   1.1  christos   if (buf[offset] != 0x48)
   2268   1.1  christos     offset--;
   2269   1.1  christos 
   2270   1.1  christos   if (buf[offset + 2] != 0xe4
   2271   1.1  christos       || (buf[offset + 1] != 0x81 && buf[offset + 1] != 0x83))
   2272   1.1  christos     return pc;
   2273   1.1  christos 
   2274   1.1  christos   offset_and = offset;
   2275   1.1  christos   offset += buf[offset + 1] == 0x81 ? 7 : 4;
   2276   1.1  christos 
   2277   1.1  christos   /* Skip optional addr32 prefix.  */
   2278   1.1  christos   if (buf[offset] == 0x67)
   2279   1.1  christos     offset++;
   2280   1.1  christos 
   2281   1.1  christos   /* The next instruction has to be "pushq -8(%reg)".  */
   2282   1.1  christos   r = 0;
   2283   1.1  christos   if (buf[offset] == 0xff)
   2284   1.1  christos     offset++;
   2285   1.1  christos   else if ((buf[offset] & 0xf6) == 0x40
   2286   1.1  christos 	   && buf[offset + 1] == 0xff)
   2287   1.1  christos     {
   2288   1.1  christos       /* Check the REX.B bit.  */
   2289   1.1  christos       if ((buf[offset] & 0x1) != 0)
   2290   1.1  christos 	r = 8;
   2291   1.1  christos       offset += 2;
   2292   1.1  christos     }
   2293   1.1  christos   else
   2294   1.1  christos     return pc;
   2295   1.1  christos 
   2296   1.1  christos   /* 8bit -8 is 0xf8.  REG must be binary 110 and MOD must be binary
   2297   1.1  christos      01.  */
   2298   1.1  christos   if (buf[offset + 1] != 0xf8
   2299   1.1  christos       || (buf[offset] & 0xf8) != 0x70)
   2300   1.1  christos     return pc;
   2301   1.1  christos 
   2302   1.1  christos   /* R/M has register.  */
   2303   1.1  christos   r += buf[offset] & 7;
   2304   1.1  christos 
   2305   1.1  christos   /* Registers in leaq and pushq have to be the same.  */
   2306   1.1  christos   if (reg != r)
   2307   1.1  christos     return pc;
   2308   1.7  christos 
   2309   1.1  christos   if (current_pc > pc + offset_and)
   2310   1.1  christos     cache->saved_sp_reg = amd64_arch_reg_to_regnum (reg);
   2311   1.1  christos 
   2312   1.1  christos   return std::min (pc + offset + 2, current_pc);
   2313   1.1  christos }
   2314   1.1  christos 
   2315   1.1  christos /* Do a limited analysis of the prologue at PC and update CACHE
   2316   1.1  christos    accordingly.  Bail out early if CURRENT_PC is reached.  Return the
   2317   1.1  christos    address where the analysis stopped.
   2318   1.1  christos 
   2319   1.1  christos    We will handle only functions beginning with:
   2320   1.1  christos 
   2321   1.1  christos       pushq %rbp        0x55
   2322   1.1  christos       movq %rsp, %rbp   0x48 0x89 0xe5 (or 0x48 0x8b 0xec)
   2323   1.1  christos 
   2324   1.1  christos    or (for the X32 ABI):
   2325   1.9  christos 
   2326   1.9  christos       pushq %rbp        0x55
   2327   1.9  christos       movl %esp, %ebp   0x89 0xe5 (or 0x8b 0xec)
   2328   1.1  christos 
   2329   1.1  christos    The `endbr64` instruction can be found before these sequences, and will be
   2330   1.1  christos    skipped if found.
   2331   1.1  christos 
   2332   1.1  christos    Any function that doesn't start with one of these sequences will be
   2333   1.1  christos    assumed to have no prologue and thus no valid frame pointer in
   2334   1.1  christos    %rbp.  */
   2335   1.1  christos 
   2336   1.1  christos static CORE_ADDR
   2337   1.1  christos amd64_analyze_prologue (struct gdbarch *gdbarch,
   2338   1.9  christos 			CORE_ADDR pc, CORE_ADDR current_pc,
   2339   1.9  christos 			struct amd64_frame_cache *cache)
   2340   1.1  christos {
   2341   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   2342   1.1  christos   /* The `endbr64` instruction.  */
   2343   1.1  christos   static const gdb_byte endbr64[4] = { 0xf3, 0x0f, 0x1e, 0xfa };
   2344   1.1  christos   /* There are two variations of movq %rsp, %rbp.  */
   2345   1.1  christos   static const gdb_byte mov_rsp_rbp_1[3] = { 0x48, 0x89, 0xe5 };
   2346   1.1  christos   static const gdb_byte mov_rsp_rbp_2[3] = { 0x48, 0x8b, 0xec };
   2347   1.1  christos   /* Ditto for movl %esp, %ebp.  */
   2348   1.1  christos   static const gdb_byte mov_esp_ebp_1[2] = { 0x89, 0xe5 };
   2349   1.1  christos   static const gdb_byte mov_esp_ebp_2[2] = { 0x8b, 0xec };
   2350   1.1  christos 
   2351   1.1  christos   gdb_byte buf[3];
   2352   1.1  christos   gdb_byte op;
   2353   1.1  christos 
   2354   1.1  christos   if (current_pc <= pc)
   2355   1.1  christos     return current_pc;
   2356   1.1  christos 
   2357   1.1  christos   if (gdbarch_ptr_bit (gdbarch) == 32)
   2358   1.1  christos     pc = amd64_x32_analyze_stack_align (pc, current_pc, cache);
   2359   1.1  christos   else
   2360   1.9  christos     pc = amd64_analyze_stack_align (pc, current_pc, cache);
   2361   1.9  christos 
   2362   1.9  christos   op = read_code_unsigned_integer (pc, 1, byte_order);
   2363   1.9  christos 
   2364   1.9  christos   /* Check for the `endbr64` instruction, skip it if found.  */
   2365   1.9  christos   if (op == endbr64[0])
   2366   1.9  christos     {
   2367   1.9  christos       read_code (pc + 1, buf, 3);
   2368   1.9  christos 
   2369   1.9  christos       if (memcmp (buf, &endbr64[1], 3) == 0)
   2370   1.9  christos 	pc += 4;
   2371   1.9  christos 
   2372   1.9  christos       op = read_code_unsigned_integer (pc, 1, byte_order);
   2373   1.9  christos     }
   2374   1.1  christos 
   2375   1.1  christos   if (current_pc <= pc)
   2376   1.1  christos     return current_pc;
   2377  1.10  christos 
   2378   1.1  christos   if (op == 0x55)		/* pushq %rbp */
   2379   1.1  christos     {
   2380   1.1  christos       /* Take into account that we've executed the `pushq %rbp' that
   2381   1.1  christos 	 starts this instruction sequence.  */
   2382   1.1  christos       cache->saved_regs[AMD64_RBP_REGNUM] = 0;
   2383  1.10  christos       cache->sp_offset += 8;
   2384   1.1  christos 
   2385   1.1  christos       /* If that's all, return now.  */
   2386   1.1  christos       if (current_pc <= pc + 1)
   2387   1.1  christos 	return current_pc;
   2388   1.1  christos 
   2389   1.1  christos       read_code (pc + 1, buf, 3);
   2390   1.1  christos 
   2391   1.1  christos       /* Check for `movq %rsp, %rbp'.  */
   2392   1.1  christos       if (memcmp (buf, mov_rsp_rbp_1, 3) == 0
   2393   1.1  christos 	  || memcmp (buf, mov_rsp_rbp_2, 3) == 0)
   2394   1.1  christos 	{
   2395   1.1  christos 	  /* OK, we actually have a frame.  */
   2396   1.9  christos 	  cache->frameless_p = 0;
   2397   1.1  christos 	  return pc + 4;
   2398   1.1  christos 	}
   2399   1.1  christos 
   2400   1.1  christos       /* For X32, also check for `movl %esp, %ebp'.  */
   2401   1.1  christos       if (gdbarch_ptr_bit (gdbarch) == 32)
   2402   1.1  christos 	{
   2403   1.1  christos 	  if (memcmp (buf, mov_esp_ebp_1, 2) == 0
   2404   1.1  christos 	      || memcmp (buf, mov_esp_ebp_2, 2) == 0)
   2405   1.1  christos 	    {
   2406   1.1  christos 	      /* OK, we actually have a frame.  */
   2407   1.1  christos 	      cache->frameless_p = 0;
   2408   1.1  christos 	      return pc + 3;
   2409   1.1  christos 	    }
   2410   1.1  christos 	}
   2411   1.1  christos 
   2412   1.1  christos       return pc + 1;
   2413   1.1  christos     }
   2414   1.1  christos 
   2415   1.1  christos   return pc;
   2416   1.1  christos }
   2417   1.1  christos 
   2418   1.1  christos /* Work around false termination of prologue - GCC PR debug/48827.
   2419   1.1  christos 
   2420   1.1  christos    START_PC is the first instruction of a function, PC is its minimal already
   2421   1.1  christos    determined advanced address.  Function returns PC if it has nothing to do.
   2422   1.1  christos 
   2423   1.1  christos    84 c0                test   %al,%al
   2424   1.1  christos    74 23                je     after
   2425   1.1  christos    <-- here is 0 lines advance - the false prologue end marker.
   2426   1.1  christos    0f 29 85 70 ff ff ff movaps %xmm0,-0x90(%rbp)
   2427   1.1  christos    0f 29 4d 80          movaps %xmm1,-0x80(%rbp)
   2428   1.1  christos    0f 29 55 90          movaps %xmm2,-0x70(%rbp)
   2429   1.1  christos    0f 29 5d a0          movaps %xmm3,-0x60(%rbp)
   2430   1.1  christos    0f 29 65 b0          movaps %xmm4,-0x50(%rbp)
   2431   1.1  christos    0f 29 6d c0          movaps %xmm5,-0x40(%rbp)
   2432   1.1  christos    0f 29 75 d0          movaps %xmm6,-0x30(%rbp)
   2433   1.1  christos    0f 29 7d e0          movaps %xmm7,-0x20(%rbp)
   2434   1.1  christos    after:  */
   2435   1.1  christos 
   2436   1.1  christos static CORE_ADDR
   2437   1.1  christos amd64_skip_xmm_prologue (CORE_ADDR pc, CORE_ADDR start_pc)
   2438   1.1  christos {
   2439   1.1  christos   struct symtab_and_line start_pc_sal, next_sal;
   2440   1.1  christos   gdb_byte buf[4 + 8 * 7];
   2441   1.1  christos   int offset, xmmreg;
   2442   1.1  christos 
   2443   1.1  christos   if (pc == start_pc)
   2444  1.10  christos     return pc;
   2445  1.10  christos 
   2446   1.1  christos   start_pc_sal = find_pc_sect_line (start_pc, NULL, 0);
   2447   1.1  christos   if (start_pc_sal.symtab == NULL
   2448   1.1  christos       || producer_is_gcc_ge_4 (start_pc_sal.symtab->compunit ()
   2449   1.1  christos 			       ->producer ()) < 6
   2450   1.1  christos       || start_pc_sal.pc != start_pc || pc >= start_pc_sal.end)
   2451   1.1  christos     return pc;
   2452   1.1  christos 
   2453   1.1  christos   next_sal = find_pc_sect_line (start_pc_sal.end, NULL, 0);
   2454   1.1  christos   if (next_sal.line != start_pc_sal.line)
   2455   1.1  christos     return pc;
   2456   1.1  christos 
   2457   1.1  christos   /* START_PC can be from overlayed memory, ignored here.  */
   2458   1.1  christos   if (target_read_code (next_sal.pc - 4, buf, sizeof (buf)) != 0)
   2459   1.1  christos     return pc;
   2460   1.1  christos 
   2461   1.1  christos   /* test %al,%al */
   2462   1.1  christos   if (buf[0] != 0x84 || buf[1] != 0xc0)
   2463   1.1  christos     return pc;
   2464   1.1  christos   /* je AFTER */
   2465   1.1  christos   if (buf[2] != 0x74)
   2466   1.1  christos     return pc;
   2467   1.1  christos 
   2468   1.1  christos   offset = 4;
   2469  1.10  christos   for (xmmreg = 0; xmmreg < 8; xmmreg++)
   2470   1.1  christos     {
   2471   1.1  christos       /* 0x0f 0x29 0b??000101 movaps %xmmreg?,-0x??(%rbp) */
   2472   1.1  christos       if (buf[offset] != 0x0f || buf[offset + 1] != 0x29
   2473   1.1  christos 	  || (buf[offset + 2] & 0x3f) != (xmmreg << 3 | 0x5))
   2474   1.1  christos 	return pc;
   2475   1.1  christos 
   2476   1.1  christos       /* 0b01?????? */
   2477   1.1  christos       if ((buf[offset + 2] & 0xc0) == 0x40)
   2478   1.1  christos 	{
   2479   1.1  christos 	  /* 8-bit displacement.  */
   2480   1.1  christos 	  offset += 4;
   2481   1.1  christos 	}
   2482   1.1  christos       /* 0b10?????? */
   2483   1.1  christos       else if ((buf[offset + 2] & 0xc0) == 0x80)
   2484   1.1  christos 	{
   2485   1.1  christos 	  /* 32-bit displacement.  */
   2486   1.1  christos 	  offset += 7;
   2487   1.1  christos 	}
   2488   1.1  christos       else
   2489   1.1  christos 	return pc;
   2490   1.1  christos     }
   2491   1.1  christos 
   2492   1.1  christos   /* je AFTER */
   2493   1.1  christos   if (offset - 4 != buf[3])
   2494   1.1  christos     return pc;
   2495   1.1  christos 
   2496   1.1  christos   return next_sal.end;
   2497   1.1  christos }
   2498   1.1  christos 
   2499   1.1  christos /* Return PC of first real instruction.  */
   2500   1.1  christos 
   2501   1.1  christos static CORE_ADDR
   2502   1.1  christos amd64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
   2503   1.1  christos {
   2504   1.1  christos   struct amd64_frame_cache cache;
   2505   1.1  christos   CORE_ADDR pc;
   2506   1.1  christos   CORE_ADDR func_addr;
   2507   1.1  christos 
   2508   1.3  christos   if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
   2509   1.1  christos     {
   2510   1.9  christos       CORE_ADDR post_prologue_pc
   2511  1.10  christos 	= skip_prologue_using_sal (gdbarch, func_addr);
   2512  1.10  christos       struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
   2513   1.1  christos 
   2514   1.3  christos       /* LLVM backend (Clang/Flang) always emits a line note before the
   2515  1.10  christos 	 prologue and another one after.  We trust clang and newer Intel
   2516  1.10  christos 	 compilers to emit usable line notes.  */
   2517  1.10  christos       if (post_prologue_pc
   2518  1.11  christos 	  && (cust != NULL
   2519   1.1  christos 	      && cust->producer () != nullptr
   2520   1.1  christos 	      && (producer_is_llvm (cust->producer ())
   2521   1.1  christos 	      || producer_is_icc_ge_19 (cust->producer ()))))
   2522   1.1  christos 	return std::max (start_pc, post_prologue_pc);
   2523   1.1  christos     }
   2524   1.1  christos 
   2525   1.1  christos   amd64_init_frame_cache (&cache);
   2526   1.1  christos   pc = amd64_analyze_prologue (gdbarch, start_pc, 0xffffffffffffffffLL,
   2527   1.1  christos 			       &cache);
   2528   1.1  christos   if (cache.frameless_p)
   2529   1.1  christos     return start_pc;
   2530   1.1  christos 
   2531   1.1  christos   return amd64_skip_xmm_prologue (pc, start_pc);
   2532   1.1  christos }
   2533   1.1  christos 
   2534  1.11  christos 
   2536   1.1  christos /* Normal frames.  */
   2537   1.1  christos 
   2538   1.1  christos static void
   2539   1.1  christos amd64_frame_cache_1 (const frame_info_ptr &this_frame,
   2540   1.1  christos 		     struct amd64_frame_cache *cache)
   2541   1.1  christos {
   2542   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   2543   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   2544   1.1  christos   gdb_byte buf[8];
   2545   1.1  christos   int i;
   2546   1.1  christos 
   2547   1.1  christos   cache->pc = get_frame_func (this_frame);
   2548   1.1  christos   if (cache->pc != 0)
   2549   1.1  christos     amd64_analyze_prologue (gdbarch, cache->pc, get_frame_pc (this_frame),
   2550   1.1  christos 			    cache);
   2551   1.1  christos 
   2552   1.1  christos   if (cache->frameless_p)
   2553   1.1  christos     {
   2554   1.1  christos       /* We didn't find a valid frame.  If we're at the start of a
   2555   1.1  christos 	 function, or somewhere half-way its prologue, the function's
   2556   1.1  christos 	 frame probably hasn't been fully setup yet.  Try to
   2557   1.1  christos 	 reconstruct the base address for the stack frame by looking
   2558   1.1  christos 	 at the stack pointer.  For truly "frameless" functions this
   2559   1.1  christos 	 might work too.  */
   2560   1.1  christos 
   2561   1.1  christos       if (cache->saved_sp_reg != -1)
   2562   1.1  christos 	{
   2563   1.1  christos 	  /* Stack pointer has been saved.  */
   2564   1.1  christos 	  get_frame_register (this_frame, cache->saved_sp_reg, buf);
   2565   1.1  christos 	  cache->saved_sp = extract_unsigned_integer (buf, 8, byte_order);
   2566   1.1  christos 
   2567   1.1  christos 	  /* We're halfway aligning the stack.  */
   2568   1.1  christos 	  cache->base = ((cache->saved_sp - 8) & 0xfffffffffffffff0LL) - 8;
   2569   1.1  christos 	  cache->saved_regs[AMD64_RIP_REGNUM] = cache->saved_sp - 8;
   2570   1.1  christos 
   2571   1.1  christos 	  /* This will be added back below.  */
   2572   1.1  christos 	  cache->saved_regs[AMD64_RIP_REGNUM] -= cache->base;
   2573   1.1  christos 	}
   2574   1.1  christos       else
   2575   1.1  christos 	{
   2576   1.1  christos 	  get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
   2577   1.1  christos 	  cache->base = extract_unsigned_integer (buf, 8, byte_order)
   2578   1.1  christos 			+ cache->sp_offset;
   2579   1.1  christos 	}
   2580   1.1  christos     }
   2581   1.1  christos   else
   2582   1.1  christos     {
   2583   1.1  christos       get_frame_register (this_frame, AMD64_RBP_REGNUM, buf);
   2584   1.1  christos       cache->base = extract_unsigned_integer (buf, 8, byte_order);
   2585   1.1  christos     }
   2586   1.1  christos 
   2587   1.1  christos   /* Now that we have the base address for the stack frame we can
   2588   1.1  christos      calculate the value of %rsp in the calling frame.  */
   2589   1.1  christos   cache->saved_sp = cache->base + 16;
   2590   1.1  christos 
   2591   1.1  christos   /* For normal frames, %rip is stored at 8(%rbp).  If we don't have a
   2592   1.1  christos      frame we find it at the same offset from the reconstructed base
   2593   1.1  christos      address.  If we're halfway aligning the stack, %rip is handled
   2594   1.1  christos      differently (see above).  */
   2595   1.1  christos   if (!cache->frameless_p || cache->saved_sp_reg == -1)
   2596   1.1  christos     cache->saved_regs[AMD64_RIP_REGNUM] = 8;
   2597   1.1  christos 
   2598   1.1  christos   /* Adjust all the saved registers such that they contain addresses
   2599   1.1  christos      instead of offsets.  */
   2600   1.1  christos   for (i = 0; i < AMD64_NUM_SAVED_REGS; i++)
   2601   1.1  christos     if (cache->saved_regs[i] != -1)
   2602   1.1  christos       cache->saved_regs[i] += cache->base;
   2603  1.11  christos 
   2604   1.1  christos   cache->base_p = 1;
   2605   1.1  christos }
   2606   1.1  christos 
   2607   1.1  christos static struct amd64_frame_cache *
   2608   1.6  christos amd64_frame_cache (const frame_info_ptr &this_frame, void **this_cache)
   2609   1.1  christos {
   2610   1.1  christos   struct amd64_frame_cache *cache;
   2611   1.1  christos 
   2612   1.1  christos   if (*this_cache)
   2613   1.9  christos     return (struct amd64_frame_cache *) *this_cache;
   2614   1.1  christos 
   2615   1.1  christos   cache = amd64_alloc_frame_cache ();
   2616   1.1  christos   *this_cache = cache;
   2617   1.9  christos 
   2618   1.5  christos   try
   2619   1.5  christos     {
   2620   1.9  christos       amd64_frame_cache_1 (this_frame, cache);
   2621   1.5  christos     }
   2622   1.1  christos   catch (const gdb_exception_error &ex)
   2623   1.1  christos     {
   2624   1.1  christos       if (ex.error != NOT_AVAILABLE_ERROR)
   2625   1.1  christos 	throw;
   2626   1.1  christos     }
   2627  1.11  christos 
   2628   1.1  christos   return cache;
   2629   1.1  christos }
   2630   1.1  christos 
   2631   1.1  christos static enum unwind_stop_reason
   2632   1.1  christos amd64_frame_unwind_stop_reason (const frame_info_ptr &this_frame,
   2633   1.1  christos 				void **this_cache)
   2634   1.1  christos {
   2635   1.1  christos   struct amd64_frame_cache *cache =
   2636   1.1  christos     amd64_frame_cache (this_frame, this_cache);
   2637   1.1  christos 
   2638   1.1  christos   if (!cache->base_p)
   2639   1.1  christos     return UNWIND_UNAVAILABLE;
   2640   1.1  christos 
   2641   1.1  christos   /* This marks the outermost frame.  */
   2642   1.1  christos   if (cache->base == 0)
   2643   1.1  christos     return UNWIND_OUTERMOST;
   2644  1.11  christos 
   2645   1.1  christos   return UNWIND_NO_REASON;
   2646   1.1  christos }
   2647   1.1  christos 
   2648   1.1  christos static void
   2649   1.1  christos amd64_frame_this_id (const frame_info_ptr &this_frame, void **this_cache,
   2650   1.1  christos 		     struct frame_id *this_id)
   2651   1.1  christos {
   2652   1.1  christos   struct amd64_frame_cache *cache =
   2653   1.1  christos     amd64_frame_cache (this_frame, this_cache);
   2654   1.1  christos 
   2655   1.1  christos   if (!cache->base_p)
   2656   1.1  christos     (*this_id) = frame_id_build_unavailable_stack (cache->pc);
   2657   1.1  christos   else if (cache->base == 0)
   2658   1.1  christos     {
   2659   1.1  christos       /* This marks the outermost frame.  */
   2660   1.1  christos       return;
   2661   1.1  christos     }
   2662  1.11  christos   else
   2663   1.1  christos     (*this_id) = frame_id_build (cache->base + 16, cache->pc);
   2664   1.1  christos }
   2665   1.1  christos 
   2666   1.1  christos static struct value *
   2667   1.1  christos amd64_frame_prev_register (const frame_info_ptr &this_frame, void **this_cache,
   2668   1.1  christos 			   int regnum)
   2669   1.1  christos {
   2670   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   2671   1.1  christos   struct amd64_frame_cache *cache =
   2672   1.1  christos     amd64_frame_cache (this_frame, this_cache);
   2673   1.1  christos 
   2674   1.1  christos   gdb_assert (regnum >= 0);
   2675   1.1  christos 
   2676   1.1  christos   if (regnum == gdbarch_sp_regnum (gdbarch) && cache->saved_sp)
   2677   1.1  christos     return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
   2678   1.1  christos 
   2679   1.1  christos   if (regnum < AMD64_NUM_SAVED_REGS && cache->saved_regs[regnum] != -1)
   2680   1.1  christos     return frame_unwind_got_memory (this_frame, regnum,
   2681   1.1  christos 				    cache->saved_regs[regnum]);
   2682   1.1  christos 
   2683  1.10  christos   return frame_unwind_got_register (this_frame, regnum, regnum);
   2684   1.1  christos }
   2685   1.1  christos 
   2686   1.1  christos static const struct frame_unwind amd64_frame_unwind =
   2687   1.1  christos {
   2688   1.1  christos   "amd64 prologue",
   2689   1.1  christos   NORMAL_FRAME,
   2690   1.1  christos   amd64_frame_unwind_stop_reason,
   2691   1.1  christos   amd64_frame_this_id,
   2692   1.1  christos   amd64_frame_prev_register,
   2693   1.1  christos   NULL,
   2694   1.1  christos   default_frame_sniffer
   2695   1.1  christos };
   2696   1.1  christos 
   2697   1.1  christos /* Generate a bytecode expression to get the value of the saved PC.  */
   2699   1.1  christos 
   2700   1.1  christos static void
   2701   1.1  christos amd64_gen_return_address (struct gdbarch *gdbarch,
   2702   1.1  christos 			  struct agent_expr *ax, struct axs_value *value,
   2703   1.1  christos 			  CORE_ADDR scope)
   2704   1.1  christos {
   2705   1.1  christos   /* The following sequence assumes the traditional use of the base
   2706   1.1  christos      register.  */
   2707   1.1  christos   ax_reg (ax, AMD64_RBP_REGNUM);
   2708   1.1  christos   ax_const_l (ax, 8);
   2709   1.1  christos   ax_simple (ax, aop_add);
   2710   1.1  christos   value->type = register_type (gdbarch, AMD64_RIP_REGNUM);
   2711   1.1  christos   value->kind = axs_lvalue_memory;
   2712   1.1  christos }
   2713   1.1  christos 
   2714   1.1  christos 
   2716  1.11  christos /* Signal trampolines.  */
   2717   1.1  christos 
   2718   1.1  christos /* FIXME: kettenis/20030419: Perhaps, we can unify the 32-bit and
   2719  1.10  christos    64-bit variants.  This would require using identical frame caches
   2720   1.1  christos    on both platforms.  */
   2721   1.1  christos 
   2722   1.1  christos static struct amd64_frame_cache *
   2723   1.1  christos amd64_sigtramp_frame_cache (const frame_info_ptr &this_frame, void **this_cache)
   2724   1.1  christos {
   2725   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   2726   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   2727   1.6  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   2728   1.1  christos   struct amd64_frame_cache *cache;
   2729   1.1  christos   CORE_ADDR addr;
   2730   1.1  christos   gdb_byte buf[8];
   2731   1.9  christos   int i;
   2732   1.1  christos 
   2733   1.1  christos   if (*this_cache)
   2734   1.1  christos     return (struct amd64_frame_cache *) *this_cache;
   2735   1.1  christos 
   2736   1.1  christos   cache = amd64_alloc_frame_cache ();
   2737   1.1  christos 
   2738   1.1  christos   try
   2739   1.1  christos     {
   2740   1.1  christos       get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
   2741   1.1  christos       cache->base = extract_unsigned_integer (buf, 8, byte_order) - 8;
   2742   1.1  christos 
   2743   1.1  christos       addr = tdep->sigcontext_addr (this_frame);
   2744   1.1  christos       gdb_assert (tdep->sc_reg_offset);
   2745   1.9  christos       gdb_assert (tdep->sc_num_regs <= AMD64_NUM_SAVED_REGS);
   2746   1.5  christos       for (i = 0; i < tdep->sc_num_regs; i++)
   2747   1.5  christos 	if (tdep->sc_reg_offset[i] != -1)
   2748   1.9  christos 	  cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
   2749   1.5  christos 
   2750   1.1  christos       cache->base_p = 1;
   2751   1.1  christos     }
   2752   1.1  christos   catch (const gdb_exception_error &ex)
   2753   1.1  christos     {
   2754   1.1  christos       if (ex.error != NOT_AVAILABLE_ERROR)
   2755   1.1  christos 	throw;
   2756  1.11  christos     }
   2757   1.1  christos 
   2758   1.1  christos   *this_cache = cache;
   2759   1.1  christos   return cache;
   2760   1.1  christos }
   2761   1.1  christos 
   2762   1.1  christos static enum unwind_stop_reason
   2763   1.1  christos amd64_sigtramp_frame_unwind_stop_reason (const frame_info_ptr &this_frame,
   2764   1.1  christos 					 void **this_cache)
   2765   1.1  christos {
   2766   1.1  christos   struct amd64_frame_cache *cache =
   2767   1.1  christos     amd64_sigtramp_frame_cache (this_frame, this_cache);
   2768   1.1  christos 
   2769  1.11  christos   if (!cache->base_p)
   2770   1.1  christos     return UNWIND_UNAVAILABLE;
   2771   1.1  christos 
   2772   1.1  christos   return UNWIND_NO_REASON;
   2773   1.1  christos }
   2774   1.1  christos 
   2775   1.1  christos static void
   2776   1.1  christos amd64_sigtramp_frame_this_id (const frame_info_ptr &this_frame,
   2777   1.1  christos 			      void **this_cache, struct frame_id *this_id)
   2778   1.1  christos {
   2779   1.1  christos   struct amd64_frame_cache *cache =
   2780   1.1  christos     amd64_sigtramp_frame_cache (this_frame, this_cache);
   2781   1.1  christos 
   2782   1.1  christos   if (!cache->base_p)
   2783   1.1  christos     (*this_id) = frame_id_build_unavailable_stack (get_frame_pc (this_frame));
   2784   1.1  christos   else if (cache->base == 0)
   2785   1.1  christos     {
   2786   1.1  christos       /* This marks the outermost frame.  */
   2787  1.11  christos       return;
   2788   1.1  christos     }
   2789   1.1  christos   else
   2790   1.1  christos     (*this_id) = frame_id_build (cache->base + 16, get_frame_pc (this_frame));
   2791   1.1  christos }
   2792   1.1  christos 
   2793   1.1  christos static struct value *
   2794   1.1  christos amd64_sigtramp_frame_prev_register (const frame_info_ptr &this_frame,
   2795   1.1  christos 				    void **this_cache, int regnum)
   2796   1.1  christos {
   2797   1.1  christos   /* Make sure we've initialized the cache.  */
   2798  1.11  christos   amd64_sigtramp_frame_cache (this_frame, this_cache);
   2799   1.1  christos 
   2800   1.1  christos   return amd64_frame_prev_register (this_frame, this_cache, regnum);
   2801  1.10  christos }
   2802  1.10  christos 
   2803   1.1  christos static int
   2804   1.1  christos amd64_sigtramp_frame_sniffer (const struct frame_unwind *self,
   2805   1.1  christos 			      const frame_info_ptr &this_frame,
   2806   1.1  christos 			      void **this_cache)
   2807   1.1  christos {
   2808   1.1  christos   gdbarch *arch = get_frame_arch (this_frame);
   2809   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (arch);
   2810   1.1  christos 
   2811   1.1  christos   /* We shouldn't even bother if we don't have a sigcontext_addr
   2812   1.1  christos      handler.  */
   2813   1.1  christos   if (tdep->sigcontext_addr == NULL)
   2814   1.1  christos     return 0;
   2815   1.1  christos 
   2816   1.1  christos   if (tdep->sigtramp_p != NULL)
   2817   1.1  christos     {
   2818   1.1  christos       if (tdep->sigtramp_p (this_frame))
   2819   1.1  christos 	return 1;
   2820   1.1  christos     }
   2821   1.1  christos 
   2822   1.1  christos   if (tdep->sigtramp_start != 0)
   2823   1.1  christos     {
   2824   1.1  christos       CORE_ADDR pc = get_frame_pc (this_frame);
   2825   1.1  christos 
   2826   1.1  christos       gdb_assert (tdep->sigtramp_end != 0);
   2827   1.1  christos       if (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end)
   2828   1.1  christos 	return 1;
   2829  1.10  christos     }
   2830   1.1  christos 
   2831   1.1  christos   return 0;
   2832   1.1  christos }
   2833   1.1  christos 
   2834   1.1  christos static const struct frame_unwind amd64_sigtramp_frame_unwind =
   2835   1.1  christos {
   2836   1.1  christos   "amd64 sigtramp",
   2837   1.1  christos   SIGTRAMP_FRAME,
   2838   1.1  christos   amd64_sigtramp_frame_unwind_stop_reason,
   2839   1.1  christos   amd64_sigtramp_frame_this_id,
   2840  1.11  christos   amd64_sigtramp_frame_prev_register,
   2841   1.1  christos   NULL,
   2842   1.1  christos   amd64_sigtramp_frame_sniffer
   2843   1.1  christos };
   2844   1.1  christos 
   2845   1.1  christos 
   2847   1.1  christos static CORE_ADDR
   2848   1.1  christos amd64_frame_base_address (const frame_info_ptr &this_frame, void **this_cache)
   2849   1.1  christos {
   2850   1.1  christos   struct amd64_frame_cache *cache =
   2851   1.1  christos     amd64_frame_cache (this_frame, this_cache);
   2852   1.1  christos 
   2853   1.1  christos   return cache->base;
   2854   1.1  christos }
   2855   1.1  christos 
   2856  1.11  christos static const struct frame_base amd64_frame_base =
   2857  1.11  christos {
   2858  1.11  christos   &amd64_frame_unwind,
   2859  1.11  christos   amd64_frame_base_address,
   2860  1.11  christos   amd64_frame_base_address,
   2861  1.11  christos   amd64_frame_base_address
   2862  1.11  christos };
   2863  1.11  christos 
   2864  1.11  christos /* Implement core of the stack_frame_destroyed_p gdbarch method.  */
   2865  1.11  christos 
   2866  1.11  christos static int
   2867  1.11  christos amd64_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch, CORE_ADDR pc)
   2868  1.11  christos {
   2869  1.11  christos   gdb_byte insn;
   2870  1.11  christos 
   2871  1.11  christos   std::optional<CORE_ADDR> epilogue = find_epilogue_using_linetable (pc);
   2872  1.11  christos 
   2873  1.11  christos   /* PC is pointing at the next instruction to be executed. If it is
   2874  1.11  christos      equal to the epilogue start, it means we're right before it starts,
   2875  1.11  christos      so the stack is still valid.  */
   2876  1.11  christos   if (epilogue)
   2877  1.11  christos     return pc > epilogue;
   2878  1.11  christos 
   2879  1.11  christos   if (target_read_memory (pc, &insn, 1))
   2880   1.1  christos     return 0;   /* Can't read memory at pc.  */
   2881   1.1  christos 
   2882   1.5  christos   if (insn != 0xc3)     /* 'ret' instruction.  */
   2883   1.5  christos     return 0;
   2884   1.5  christos 
   2885   1.1  christos   return 1;
   2886   1.1  christos }
   2887   1.1  christos 
   2888   1.1  christos /* Normal frames, but in a function epilogue.  */
   2889   1.5  christos 
   2890   1.1  christos /* Implement the stack_frame_destroyed_p gdbarch method.
   2891  1.11  christos 
   2892  1.11  christos    The epilogue is defined here as the 'ret' instruction, which will
   2893  1.11  christos    follow any instruction such as 'leave' or 'pop %ebp' that destroys
   2894  1.11  christos    the function's stack frame.  */
   2895  1.11  christos 
   2896  1.11  christos static int
   2897  1.11  christos amd64_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
   2898  1.11  christos {
   2899  1.11  christos   struct compunit_symtab *cust = find_pc_compunit_symtab (pc);
   2900  1.11  christos 
   2901  1.11  christos   if (cust != nullptr && cust->producer () != nullptr
   2902  1.11  christos       && producer_is_llvm (cust->producer ()))
   2903  1.11  christos     return amd64_stack_frame_destroyed_p_1 (gdbarch, pc);
   2904  1.11  christos 
   2905  1.11  christos   return 0;
   2906  1.11  christos }
   2907   1.1  christos 
   2908  1.11  christos static int
   2909  1.11  christos amd64_epilogue_frame_sniffer_1 (const struct frame_unwind *self,
   2910   1.1  christos 				const frame_info_ptr &this_frame,
   2911   1.1  christos 				void **this_prologue_cache, bool override_p)
   2912  1.11  christos {
   2913  1.11  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   2914  1.11  christos   CORE_ADDR pc = get_frame_pc (this_frame);
   2915  1.11  christos 
   2916  1.11  christos   if (frame_relative_level (this_frame) != 0)
   2917  1.11  christos     /* We're not in the inner frame, so assume we're not in an epilogue.  */
   2918  1.11  christos     return 0;
   2919  1.11  christos 
   2920  1.11  christos   bool unwind_valid_p
   2921  1.11  christos     = compunit_epilogue_unwind_valid (find_pc_compunit_symtab (pc));
   2922  1.11  christos   if (override_p)
   2923  1.11  christos     {
   2924  1.11  christos       if (unwind_valid_p)
   2925  1.11  christos 	/* Don't override the symtab unwinders, skip
   2926  1.11  christos 	   "amd64 epilogue override".  */
   2927  1.11  christos 	return 0;
   2928   1.1  christos     }
   2929  1.11  christos   else
   2930  1.11  christos     {
   2931  1.11  christos       if (!unwind_valid_p)
   2932   1.1  christos 	/* "amd64 epilogue override" unwinder already ran, skip
   2933  1.11  christos 	   "amd64 epilogue".  */
   2934  1.11  christos 	return 0;
   2935  1.11  christos     }
   2936  1.11  christos 
   2937  1.11  christos   /* Check whether we're in an epilogue.  */
   2938  1.11  christos   return amd64_stack_frame_destroyed_p_1 (gdbarch, pc);
   2939  1.11  christos }
   2940   1.1  christos 
   2941   1.1  christos static int
   2942   1.1  christos amd64_epilogue_override_frame_sniffer (const struct frame_unwind *self,
   2943   1.1  christos 				       const frame_info_ptr &this_frame,
   2944  1.11  christos 				       void **this_prologue_cache)
   2945   1.1  christos {
   2946   1.1  christos   return amd64_epilogue_frame_sniffer_1 (self, this_frame, this_prologue_cache,
   2947  1.11  christos 					 true);
   2948  1.11  christos }
   2949   1.1  christos 
   2950   1.1  christos static int
   2951   1.1  christos amd64_epilogue_frame_sniffer (const struct frame_unwind *self,
   2952  1.11  christos 			      const frame_info_ptr &this_frame,
   2953   1.1  christos 			      void **this_prologue_cache)
   2954   1.1  christos {
   2955   1.1  christos   return amd64_epilogue_frame_sniffer_1 (self, this_frame, this_prologue_cache,
   2956   1.1  christos 					 false);
   2957   1.1  christos }
   2958   1.1  christos 
   2959   1.1  christos static struct amd64_frame_cache *
   2960   1.6  christos amd64_epilogue_frame_cache (const frame_info_ptr &this_frame, void **this_cache)
   2961   1.1  christos {
   2962   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
   2963   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   2964   1.1  christos   struct amd64_frame_cache *cache;
   2965   1.9  christos   gdb_byte buf[8];
   2966   1.1  christos 
   2967  1.10  christos   if (*this_cache)
   2968   1.1  christos     return (struct amd64_frame_cache *) *this_cache;
   2969   1.1  christos 
   2970   1.1  christos   cache = amd64_alloc_frame_cache ();
   2971   1.1  christos   *this_cache = cache;
   2972   1.1  christos 
   2973  1.10  christos   try
   2974   1.1  christos     {
   2975  1.10  christos       /* Cache base will be %rsp plus cache->sp_offset (-8).  */
   2976   1.1  christos       get_frame_register (this_frame, AMD64_RSP_REGNUM, buf);
   2977   1.1  christos       cache->base = extract_unsigned_integer (buf, 8,
   2978  1.10  christos 					      byte_order) + cache->sp_offset;
   2979   1.1  christos 
   2980   1.1  christos       /* Cache pc will be the frame func.  */
   2981   1.1  christos       cache->pc = get_frame_func (this_frame);
   2982   1.1  christos 
   2983   1.9  christos       /* The previous value of %rsp is cache->base plus 16.  */
   2984   1.5  christos       cache->saved_sp = cache->base + 16;
   2985   1.5  christos 
   2986   1.9  christos       /* The saved %rip will be at cache->base plus 8.  */
   2987   1.5  christos       cache->saved_regs[AMD64_RIP_REGNUM] = cache->base + 8;
   2988   1.1  christos 
   2989   1.1  christos       cache->base_p = 1;
   2990   1.1  christos     }
   2991   1.1  christos   catch (const gdb_exception_error &ex)
   2992   1.1  christos     {
   2993  1.11  christos       if (ex.error != NOT_AVAILABLE_ERROR)
   2994   1.1  christos 	throw;
   2995   1.1  christos     }
   2996   1.1  christos 
   2997   1.1  christos   return cache;
   2998   1.1  christos }
   2999   1.1  christos 
   3000   1.1  christos static enum unwind_stop_reason
   3001   1.1  christos amd64_epilogue_frame_unwind_stop_reason (const frame_info_ptr &this_frame,
   3002   1.1  christos 					 void **this_cache)
   3003   1.1  christos {
   3004   1.1  christos   struct amd64_frame_cache *cache
   3005   1.1  christos     = amd64_epilogue_frame_cache (this_frame, this_cache);
   3006  1.11  christos 
   3007   1.1  christos   if (!cache->base_p)
   3008   1.1  christos     return UNWIND_UNAVAILABLE;
   3009   1.1  christos 
   3010   1.1  christos   return UNWIND_NO_REASON;
   3011   1.1  christos }
   3012   1.1  christos 
   3013   1.1  christos static void
   3014   1.1  christos amd64_epilogue_frame_this_id (const frame_info_ptr &this_frame,
   3015   1.1  christos 			      void **this_cache,
   3016  1.10  christos 			      struct frame_id *this_id)
   3017   1.1  christos {
   3018   1.1  christos   struct amd64_frame_cache *cache = amd64_epilogue_frame_cache (this_frame,
   3019  1.11  christos 							       this_cache);
   3020  1.11  christos 
   3021  1.11  christos   if (!cache->base_p)
   3022  1.11  christos     (*this_id) = frame_id_build_unavailable_stack (cache->pc);
   3023  1.11  christos   else
   3024  1.11  christos     (*this_id) = frame_id_build (cache->base + 16, cache->pc);
   3025  1.11  christos }
   3026  1.11  christos 
   3027  1.11  christos static const struct frame_unwind amd64_epilogue_override_frame_unwind =
   3028  1.11  christos {
   3029  1.11  christos   "amd64 epilogue override",
   3030   1.1  christos   NORMAL_FRAME,
   3031   1.1  christos   amd64_epilogue_frame_unwind_stop_reason,
   3032  1.10  christos   amd64_epilogue_frame_this_id,
   3033   1.1  christos   amd64_frame_prev_register,
   3034   1.1  christos   NULL,
   3035   1.1  christos   amd64_epilogue_override_frame_sniffer
   3036   1.1  christos };
   3037   1.1  christos 
   3038   1.1  christos static const struct frame_unwind amd64_epilogue_frame_unwind =
   3039   1.1  christos {
   3040   1.1  christos   "amd64 epilogue",
   3041   1.1  christos   NORMAL_FRAME,
   3042  1.11  christos   amd64_epilogue_frame_unwind_stop_reason,
   3043   1.1  christos   amd64_epilogue_frame_this_id,
   3044   1.1  christos   amd64_frame_prev_register,
   3045   1.1  christos   NULL,
   3046   1.1  christos   amd64_epilogue_frame_sniffer
   3047   1.1  christos };
   3048   1.1  christos 
   3049   1.1  christos static struct frame_id
   3050   1.1  christos amd64_dummy_id (struct gdbarch *gdbarch, const frame_info_ptr &this_frame)
   3051   1.1  christos {
   3052   1.1  christos   CORE_ADDR fp;
   3053   1.1  christos 
   3054   1.1  christos   fp = get_frame_register_unsigned (this_frame, AMD64_RBP_REGNUM);
   3055   1.1  christos 
   3056   1.1  christos   return frame_id_build (fp + 16, get_frame_pc (this_frame));
   3057   1.1  christos }
   3058   1.1  christos 
   3059   1.1  christos /* 16 byte align the SP per frame requirements.  */
   3060   1.1  christos 
   3061   1.1  christos static CORE_ADDR
   3062   1.1  christos amd64_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
   3063   1.1  christos {
   3064   1.1  christos   return sp & -(CORE_ADDR)16;
   3065   1.1  christos }
   3066   1.1  christos 
   3067   1.1  christos 
   3069  1.10  christos /* Supply register REGNUM from the buffer specified by FPREGS and LEN
   3070   1.1  christos    in the floating-point register set REGSET to register cache
   3071   1.3  christos    REGCACHE.  If REGNUM is -1, do this for all registers in REGSET.  */
   3072   1.1  christos 
   3073   1.1  christos static void
   3074   1.1  christos amd64_supply_fpregset (const struct regset *regset, struct regcache *regcache,
   3075   1.1  christos 		       int regnum, const void *fpregs, size_t len)
   3076   1.1  christos {
   3077   1.1  christos   struct gdbarch *gdbarch = regcache->arch ();
   3078   1.1  christos   const i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3079   1.1  christos 
   3080   1.1  christos   gdb_assert (len >= tdep->sizeof_fpregset);
   3081   1.1  christos   amd64_supply_fxsave (regcache, regnum, fpregs);
   3082   1.1  christos }
   3083   1.1  christos 
   3084   1.1  christos /* Collect register REGNUM from the register cache REGCACHE and store
   3085   1.8  christos    it in the buffer specified by FPREGS and LEN as described by the
   3086  1.10  christos    floating-point register set REGSET.  If REGNUM is -1, do this for
   3087   1.1  christos    all registers in REGSET.  */
   3088   1.3  christos 
   3089   1.1  christos static void
   3090   1.1  christos amd64_collect_fpregset (const struct regset *regset,
   3091   1.1  christos 			const struct regcache *regcache,
   3092   1.3  christos 			int regnum, void *fpregs, size_t len)
   3093   1.3  christos {
   3094   1.3  christos   struct gdbarch *gdbarch = regcache->arch ();
   3095   1.3  christos   const i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3096   1.1  christos 
   3097   1.1  christos   gdb_assert (len >= tdep->sizeof_fpregset);
   3098   1.1  christos   amd64_collect_fxsave (regcache, regnum, fpregs);
   3099   1.1  christos }
   3100   1.1  christos 
   3101   1.1  christos const struct regset amd64_fpregset =
   3102   1.1  christos   {
   3103   1.1  christos     NULL, amd64_supply_fpregset, amd64_collect_fpregset
   3104   1.1  christos   };
   3105  1.11  christos 
   3106   1.1  christos 
   3108   1.1  christos /* Figure out where the longjmp will land.  Slurp the jmp_buf out of
   3109   1.1  christos    %rdi.  We expect its value to be a pointer to the jmp_buf structure
   3110  1.10  christos    from which we extract the address that we will land at.  This
   3111  1.10  christos    address is copied into PC.  This routine returns non-zero on
   3112  1.10  christos    success.  */
   3113   1.1  christos 
   3114   1.1  christos static int
   3115   1.1  christos amd64_get_longjmp_target (const frame_info_ptr &frame, CORE_ADDR *pc)
   3116   1.1  christos {
   3117   1.1  christos   gdb_byte buf[8];
   3118   1.1  christos   CORE_ADDR jb_addr;
   3119   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (frame);
   3120   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3121   1.1  christos   int jb_pc_offset = tdep->jb_pc_offset;
   3122   1.1  christos   int len = builtin_type (gdbarch)->builtin_func_ptr->length ();
   3123   1.1  christos 
   3124   1.1  christos   /* If JB_PC_OFFSET is -1, we have no way to find out where the
   3125   1.1  christos      longjmp will land.	 */
   3126   1.1  christos   if (jb_pc_offset == -1)
   3127   1.1  christos     return 0;
   3128   1.1  christos 
   3129   1.1  christos   get_frame_register (frame, AMD64_RDI_REGNUM, buf);
   3130   1.1  christos   jb_addr= extract_typed_address
   3131   1.1  christos 	    (buf, builtin_type (gdbarch)->builtin_data_ptr);
   3132   1.1  christos   if (target_read_memory (jb_addr + jb_pc_offset, buf, len))
   3133   1.1  christos     return 0;
   3134   1.1  christos 
   3135   1.1  christos   *pc = extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
   3136   1.1  christos 
   3137   1.1  christos   return 1;
   3138   1.1  christos }
   3139   1.1  christos 
   3140   1.8  christos static const int amd64_record_regmap[] =
   3141   1.8  christos {
   3142   1.8  christos   AMD64_RAX_REGNUM, AMD64_RCX_REGNUM, AMD64_RDX_REGNUM, AMD64_RBX_REGNUM,
   3143   1.8  christos   AMD64_RSP_REGNUM, AMD64_RBP_REGNUM, AMD64_RSI_REGNUM, AMD64_RDI_REGNUM,
   3144   1.8  christos   AMD64_R8_REGNUM, AMD64_R9_REGNUM, AMD64_R10_REGNUM, AMD64_R11_REGNUM,
   3145   1.8  christos   AMD64_R12_REGNUM, AMD64_R13_REGNUM, AMD64_R14_REGNUM, AMD64_R15_REGNUM,
   3146   1.8  christos   AMD64_RIP_REGNUM, AMD64_EFLAGS_REGNUM, AMD64_CS_REGNUM, AMD64_SS_REGNUM,
   3147   1.8  christos   AMD64_DS_REGNUM, AMD64_ES_REGNUM, AMD64_FS_REGNUM, AMD64_GS_REGNUM
   3148   1.8  christos };
   3149   1.8  christos 
   3150   1.1  christos /* Implement the "in_indirect_branch_thunk" gdbarch function.  */
   3151   1.8  christos 
   3152   1.8  christos static bool
   3153   1.1  christos amd64_in_indirect_branch_thunk (struct gdbarch *gdbarch, CORE_ADDR pc)
   3154  1.10  christos {
   3155   1.1  christos   return x86_in_indirect_branch_thunk (pc, amd64_register_names,
   3156   1.1  christos 				       AMD64_RAX_REGNUM,
   3157   1.1  christos 				       AMD64_RIP_REGNUM);
   3158   1.1  christos }
   3159   1.1  christos 
   3160   1.1  christos void
   3161   1.1  christos amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
   3162   1.1  christos 		const target_desc *default_tdesc)
   3163   1.1  christos {
   3164   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3165   1.1  christos   const struct target_desc *tdesc = info.target_desc;
   3166   1.3  christos   static const char *const stap_integer_prefixes[] = { "$", NULL };
   3167   1.1  christos   static const char *const stap_register_prefixes[] = { "%", NULL };
   3168   1.1  christos   static const char *const stap_register_indirection_prefixes[] = { "(",
   3169   1.8  christos 								    NULL };
   3170   1.1  christos   static const char *const stap_register_indirection_suffixes[] = { ")",
   3171   1.1  christos 								    NULL };
   3172   1.1  christos 
   3173   1.1  christos   /* AMD64 generally uses `fxsave' instead of `fsave' for saving its
   3174   1.1  christos      floating-point registers.  */
   3175   1.3  christos   tdep->sizeof_fpregset = I387_SIZEOF_FXSAVE;
   3176   1.3  christos   tdep->fpregset = &amd64_fpregset;
   3177   1.3  christos 
   3178   1.3  christos   if (! tdesc_has_registers (tdesc))
   3179   1.3  christos     tdesc = default_tdesc;
   3180   1.3  christos   tdep->tdesc = tdesc;
   3181   1.3  christos 
   3182   1.3  christos   tdep->num_core_regs = AMD64_NUM_GREGS + I387_NUM_REGS;
   3183   1.3  christos   tdep->register_names = amd64_register_names;
   3184   1.3  christos 
   3185   1.3  christos   if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx512") != NULL)
   3186   1.3  christos     {
   3187   1.3  christos       tdep->zmmh_register_names = amd64_zmmh_names;
   3188   1.3  christos       tdep->k_register_names = amd64_k_names;
   3189   1.3  christos       tdep->xmm_avx512_register_names = amd64_xmm_avx512_names;
   3190   1.3  christos       tdep->ymm16h_register_names = amd64_ymmh_avx512_names;
   3191   1.3  christos 
   3192   1.1  christos       tdep->num_zmm_regs = 32;
   3193   1.1  christos       tdep->num_xmm_avx512_regs = 16;
   3194   1.1  christos       tdep->num_ymm_avx512_regs = 16;
   3195   1.1  christos 
   3196   1.1  christos       tdep->zmm0h_regnum = AMD64_ZMM0H_REGNUM;
   3197   1.1  christos       tdep->k0_regnum = AMD64_K0_REGNUM;
   3198   1.1  christos       tdep->xmm16_regnum = AMD64_XMM16_REGNUM;
   3199   1.1  christos       tdep->ymm16h_regnum = AMD64_YMM16H_REGNUM;
   3200   1.1  christos     }
   3201   1.1  christos 
   3202   1.1  christos   if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx") != NULL)
   3203   1.1  christos     {
   3204   1.1  christos       tdep->ymmh_register_names = amd64_ymmh_names;
   3205   1.1  christos       tdep->num_ymm_regs = 16;
   3206   1.7  christos       tdep->ymm0h_regnum = AMD64_YMM0H_REGNUM;
   3207   1.7  christos     }
   3208   1.9  christos 
   3209   1.7  christos   if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.mpx") != NULL)
   3210   1.7  christos     {
   3211   1.7  christos       tdep->mpx_register_names = amd64_mpx_names;
   3212   1.7  christos       tdep->bndcfgu_regnum = AMD64_BNDCFGU_REGNUM;
   3213   1.7  christos       tdep->bnd0r_regnum = AMD64_BND0R_REGNUM;
   3214   1.7  christos     }
   3215   1.7  christos 
   3216   1.7  christos   if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments") != NULL)
   3217   1.7  christos     {
   3218   1.1  christos       tdep->fsbase_regnum = AMD64_FSBASE_REGNUM;
   3219   1.1  christos     }
   3220   1.1  christos 
   3221   1.1  christos   if (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys") != NULL)
   3222   1.1  christos     {
   3223   1.1  christos       tdep->pkeys_register_names = amd64_pkeys_names;
   3224   1.1  christos       tdep->pkru_regnum = AMD64_PKRU_REGNUM;
   3225   1.1  christos       tdep->num_pkeys_regs = 1;
   3226  1.11  christos     }
   3227   1.6  christos 
   3228   1.6  christos   tdep->num_byte_regs = 20;
   3229   1.1  christos   tdep->num_word_regs = 16;
   3230   1.1  christos   tdep->num_dword_regs = 16;
   3231   1.1  christos   /* Avoid wiring in the MMX registers for now.  */
   3232   1.1  christos   tdep->num_mmx_regs = 0;
   3233   1.1  christos 
   3234   1.1  christos   set_gdbarch_pseudo_register_read_value (gdbarch,
   3235   1.1  christos 					  amd64_pseudo_register_read_value);
   3236   1.1  christos   set_gdbarch_pseudo_register_write (gdbarch, amd64_pseudo_register_write);
   3237   1.1  christos   set_gdbarch_ax_pseudo_register_collect (gdbarch,
   3238   1.1  christos 					  amd64_ax_pseudo_register_collect);
   3239   1.1  christos 
   3240   1.1  christos   set_tdesc_pseudo_register_name (gdbarch, amd64_pseudo_register_name);
   3241   1.1  christos 
   3242   1.1  christos   /* AMD64 has an FPU and 16 SSE registers.  */
   3243   1.1  christos   tdep->st0_regnum = AMD64_ST0_REGNUM;
   3244   1.1  christos   tdep->num_xmm_regs = 16;
   3245   1.1  christos 
   3246   1.1  christos   /* This is what all the fuss is about.  */
   3247   1.1  christos   set_gdbarch_long_bit (gdbarch, 64);
   3248   1.1  christos   set_gdbarch_long_long_bit (gdbarch, 64);
   3249   1.1  christos   set_gdbarch_ptr_bit (gdbarch, 64);
   3250   1.1  christos 
   3251   1.1  christos   /* In contrast to the i386, on AMD64 a `long double' actually takes
   3252   1.1  christos      up 128 bits, even though it's still based on the i387 extended
   3253   1.1  christos      floating-point format which has only 80 significant bits.  */
   3254   1.1  christos   set_gdbarch_long_double_bit (gdbarch, 128);
   3255   1.1  christos 
   3256   1.1  christos   set_gdbarch_num_regs (gdbarch, AMD64_NUM_REGS);
   3257   1.1  christos 
   3258   1.1  christos   /* Register numbers of various important registers.  */
   3259   1.1  christos   set_gdbarch_sp_regnum (gdbarch, AMD64_RSP_REGNUM); /* %rsp */
   3260   1.1  christos   set_gdbarch_pc_regnum (gdbarch, AMD64_RIP_REGNUM); /* %rip */
   3261   1.1  christos   set_gdbarch_ps_regnum (gdbarch, AMD64_EFLAGS_REGNUM); /* %eflags */
   3262   1.1  christos   set_gdbarch_fp0_regnum (gdbarch, AMD64_ST0_REGNUM); /* %st(0) */
   3263   1.1  christos 
   3264   1.1  christos   /* The "default" register numbering scheme for AMD64 is referred to
   3265   1.1  christos      as the "DWARF Register Number Mapping" in the System V psABI.
   3266   1.1  christos      The preferred debugging format for all known AMD64 targets is
   3267   1.1  christos      actually DWARF2, and GCC doesn't seem to support DWARF (that is
   3268   1.1  christos      DWARF-1), but we provide the same mapping just in case.  This
   3269   1.1  christos      mapping is also used for stabs, which GCC does support.  */
   3270   1.1  christos   set_gdbarch_stab_reg_to_regnum (gdbarch, amd64_dwarf_reg_to_regnum);
   3271   1.1  christos   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, amd64_dwarf_reg_to_regnum);
   3272   1.1  christos 
   3273   1.1  christos   /* We don't override SDB_REG_RO_REGNUM, since COFF doesn't seem to
   3274   1.1  christos      be in use on any of the supported AMD64 targets.  */
   3275  1.11  christos 
   3276   1.1  christos   /* Call dummy code.  */
   3277   1.1  christos   set_gdbarch_push_dummy_call (gdbarch, amd64_push_dummy_call);
   3278   1.1  christos   set_gdbarch_frame_align (gdbarch, amd64_frame_align);
   3279   1.1  christos   set_gdbarch_frame_red_zone_size (gdbarch, 128);
   3280   1.1  christos 
   3281   1.1  christos   set_gdbarch_convert_register_p (gdbarch, i387_convert_register_p);
   3282   1.1  christos   set_gdbarch_register_to_value (gdbarch, i387_register_to_value);
   3283   1.1  christos   set_gdbarch_value_to_register (gdbarch, i387_value_to_register);
   3284  1.11  christos 
   3285   1.1  christos   set_gdbarch_return_value_as_value (gdbarch, amd64_return_value);
   3286  1.11  christos 
   3287  1.11  christos   set_gdbarch_skip_prologue (gdbarch, amd64_skip_prologue);
   3288  1.11  christos 
   3289   1.1  christos   tdep->record_regmap = amd64_record_regmap;
   3290   1.1  christos 
   3291   1.1  christos   set_gdbarch_dummy_id (gdbarch, amd64_dummy_id);
   3292   1.1  christos 
   3293   1.1  christos   /* Hook the function epilogue frame unwinder.  This unwinder is
   3294   1.1  christos      appended to the list first, so that it supersedes the other
   3295   1.1  christos      unwinders in function epilogues.  */
   3296   1.1  christos   frame_unwind_prepend_unwinder (gdbarch, &amd64_epilogue_override_frame_unwind);
   3297   1.1  christos 
   3298   1.1  christos   frame_unwind_append_unwinder (gdbarch, &amd64_epilogue_frame_unwind);
   3299   1.1  christos 
   3300   1.1  christos   /* Hook the prologue-based frame unwinders.  */
   3301  1.11  christos   frame_unwind_append_unwinder (gdbarch, &amd64_sigtramp_frame_unwind);
   3302  1.11  christos   frame_unwind_append_unwinder (gdbarch, &amd64_frame_unwind);
   3303   1.1  christos   frame_base_set_default (gdbarch, &amd64_frame_base);
   3304   1.1  christos 
   3305   1.1  christos   set_gdbarch_get_longjmp_target (gdbarch, amd64_get_longjmp_target);
   3306   1.1  christos 
   3307   1.1  christos   set_gdbarch_relocate_instruction (gdbarch, amd64_relocate_instruction);
   3308   1.1  christos 
   3309   1.1  christos   set_gdbarch_gen_return_address (gdbarch, amd64_gen_return_address);
   3310   1.1  christos 
   3311   1.1  christos   set_gdbarch_stack_frame_destroyed_p (gdbarch, amd64_stack_frame_destroyed_p);
   3312   1.1  christos 
   3313   1.1  christos   /* SystemTap variables and functions.  */
   3314   1.3  christos   set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
   3315   1.3  christos   set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
   3316   1.3  christos   set_gdbarch_stap_register_indirection_prefixes (gdbarch,
   3317   1.8  christos 					  stap_register_indirection_prefixes);
   3318   1.8  christos   set_gdbarch_stap_register_indirection_suffixes (gdbarch,
   3319   1.8  christos 					  stap_register_indirection_suffixes);
   3320  1.10  christos   set_gdbarch_stap_is_single_operand (gdbarch,
   3321  1.10  christos 				      i386_stap_is_single_operand);
   3322   1.8  christos   set_gdbarch_stap_parse_special_token (gdbarch,
   3323   1.8  christos 					i386_stap_parse_special_token);
   3324   1.8  christos   set_gdbarch_insn_is_call (gdbarch, amd64_insn_is_call);
   3325   1.8  christos   set_gdbarch_insn_is_ret (gdbarch, amd64_insn_is_ret);
   3326   1.8  christos   set_gdbarch_insn_is_jump (gdbarch, amd64_insn_is_jump);
   3327   1.8  christos 
   3328   1.8  christos   set_gdbarch_in_indirect_branch_thunk (gdbarch,
   3329   1.8  christos 					amd64_in_indirect_branch_thunk);
   3330   1.8  christos 
   3331   1.1  christos   register_amd64_ravenscar_ops (gdbarch);
   3332   1.1  christos }
   3333   1.1  christos 
   3334   1.1  christos /* Initialize ARCH for x86-64, no osabi.  */
   3335   1.1  christos 
   3336  1.10  christos static void
   3337   1.1  christos amd64_none_init_abi (gdbarch_info info, gdbarch *arch)
   3338   1.1  christos {
   3339   1.1  christos   amd64_init_abi (info, arch, amd64_target_description (X86_XSTATE_SSE_MASK,
   3340   1.1  christos 							true));
   3341   1.1  christos }
   3342   1.1  christos 
   3343   1.1  christos static struct type *
   3344   1.1  christos amd64_x32_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
   3345   1.1  christos {
   3346   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3347   1.1  christos 
   3348   1.1  christos   switch (regnum - tdep->eax_regnum)
   3349   1.1  christos     {
   3350   1.1  christos     case AMD64_RBP_REGNUM:	/* %ebp */
   3351   1.8  christos     case AMD64_RSP_REGNUM:	/* %esp */
   3352   1.8  christos       return builtin_type (gdbarch)->builtin_data_ptr;
   3353   1.1  christos     case AMD64_RIP_REGNUM:	/* %eip */
   3354  1.10  christos       return builtin_type (gdbarch)->builtin_func_ptr;
   3355   1.1  christos     }
   3356   1.8  christos 
   3357   1.1  christos   return i386_pseudo_register_type (gdbarch, regnum);
   3358   1.1  christos }
   3359   1.1  christos 
   3360   1.1  christos void
   3361   1.1  christos amd64_x32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch,
   3362   1.1  christos 		    const target_desc *default_tdesc)
   3363   1.1  christos {
   3364   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3365   1.8  christos 
   3366   1.8  christos   amd64_init_abi (info, gdbarch, default_tdesc);
   3367   1.8  christos 
   3368   1.8  christos   tdep->num_dword_regs = 17;
   3369   1.8  christos   set_tdesc_pseudo_register_type (gdbarch, amd64_x32_pseudo_register_type);
   3370   1.8  christos 
   3371   1.8  christos   set_gdbarch_long_bit (gdbarch, 32);
   3372   1.8  christos   set_gdbarch_ptr_bit (gdbarch, 32);
   3373   1.8  christos }
   3374   1.5  christos 
   3375   1.5  christos /* Initialize ARCH for x64-32, no osabi.  */
   3376   1.5  christos 
   3377   1.8  christos static void
   3378   1.5  christos amd64_x32_none_init_abi (gdbarch_info info, gdbarch *arch)
   3379   1.8  christos {
   3380   1.8  christos   amd64_x32_init_abi (info, arch,
   3381   1.8  christos 		      amd64_target_description (X86_XSTATE_SSE_MASK, true));
   3382   1.8  christos }
   3383   1.8  christos 
   3384   1.8  christos /* Return the target description for a specified XSAVE feature mask.  */
   3385   1.8  christos 
   3386   1.8  christos const struct target_desc *
   3387   1.8  christos amd64_target_description (uint64_t xcr0, bool segments)
   3388   1.8  christos {
   3389   1.8  christos   static target_desc *amd64_tdescs \
   3390   1.8  christos     [2/*AVX*/][2/*MPX*/][2/*AVX512*/][2/*PKRU*/][2/*segments*/] = {};
   3391   1.8  christos   target_desc **tdesc;
   3392   1.8  christos 
   3393   1.8  christos   tdesc = &amd64_tdescs[(xcr0 & X86_XSTATE_AVX) ? 1 : 0]
   3394   1.5  christos     [(xcr0 & X86_XSTATE_MPX) ? 1 : 0]
   3395   1.5  christos     [(xcr0 & X86_XSTATE_AVX512) ? 1 : 0]
   3396   1.9  christos     [(xcr0 & X86_XSTATE_PKRU) ? 1 : 0]
   3397   1.1  christos     [segments ? 1 : 0];
   3398   1.9  christos 
   3399   1.1  christos   if (*tdesc == NULL)
   3400   1.8  christos     *tdesc = amd64_create_target_description (xcr0, false, false,
   3401  1.10  christos 					      segments);
   3402   1.8  christos 
   3403  1.10  christos   return *tdesc;
   3404   1.1  christos }
   3405   1.1  christos 
   3406   1.1  christos void _initialize_amd64_tdep ();
   3407   1.1  christos void
   3408   1.1  christos _initialize_amd64_tdep ()
   3409   1.1  christos {
   3410   1.1  christos   gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, GDB_OSABI_NONE,
   3411   1.1  christos 			  amd64_none_init_abi);
   3412   1.1  christos   gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x64_32, GDB_OSABI_NONE,
   3413   1.1  christos 			  amd64_x32_none_init_abi);
   3414   1.1  christos }
   3415   1.1  christos 
   3416   1.1  christos 
   3418   1.1  christos /* The 64-bit FXSAVE format differs from the 32-bit format in the
   3419   1.1  christos    sense that the instruction pointer and data pointer are simply
   3420   1.1  christos    64-bit offsets into the code segment and the data segment instead
   3421   1.1  christos    of a selector offset pair.  The functions below store the upper 32
   3422   1.1  christos    bits of these pointers (instead of just the 16-bits of the segment
   3423   1.8  christos    selector).  */
   3424  1.10  christos 
   3425   1.1  christos /* Fill register REGNUM in REGCACHE with the appropriate
   3426   1.1  christos    floating-point or SSE register value from *FXSAVE.  If REGNUM is
   3427   1.1  christos    -1, do this for all registers.  This function masks off any of the
   3428   1.1  christos    reserved bits in *FXSAVE.  */
   3429   1.1  christos 
   3430   1.1  christos void
   3431   1.6  christos amd64_supply_fxsave (struct regcache *regcache, int regnum,
   3432   1.1  christos 		     const void *fxsave)
   3433   1.1  christos {
   3434   1.8  christos   struct gdbarch *gdbarch = regcache->arch ();
   3435   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3436   1.8  christos 
   3437   1.1  christos   i387_supply_fxsave (regcache, regnum, fxsave);
   3438   1.1  christos 
   3439   1.1  christos   if (fxsave
   3440   1.1  christos       && gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 64)
   3441   1.1  christos     {
   3442   1.1  christos       const gdb_byte *regs = (const gdb_byte *) fxsave;
   3443   1.1  christos 
   3444   1.1  christos       if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep))
   3445   1.1  christos 	regcache->raw_supply (I387_FISEG_REGNUM (tdep), regs + 12);
   3446   1.8  christos       if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep))
   3447  1.10  christos 	regcache->raw_supply (I387_FOSEG_REGNUM (tdep), regs + 20);
   3448   1.1  christos     }
   3449   1.1  christos }
   3450   1.1  christos 
   3451   1.1  christos /* Similar to amd64_supply_fxsave, but use XSAVE extended state.  */
   3452   1.1  christos 
   3453   1.1  christos void
   3454   1.6  christos amd64_supply_xsave (struct regcache *regcache, int regnum,
   3455   1.8  christos 		    const void *xsave)
   3456   1.8  christos {
   3457   1.8  christos   struct gdbarch *gdbarch = regcache->arch ();
   3458   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3459   1.8  christos 
   3460   1.8  christos   i387_supply_xsave (regcache, regnum, xsave);
   3461   1.8  christos 
   3462   1.8  christos   if (xsave
   3463   1.8  christos       && gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 64)
   3464   1.8  christos     {
   3465   1.8  christos       const gdb_byte *regs = (const gdb_byte *) xsave;
   3466   1.8  christos       ULONGEST clear_bv;
   3467   1.8  christos 
   3468   1.8  christos       clear_bv = i387_xsave_get_clear_bv (gdbarch, xsave);
   3469   1.1  christos 
   3470   1.1  christos       /* If the FISEG and FOSEG registers have not been initialised yet
   3471   1.1  christos 	 (their CLEAR_BV bit is set) then their default values of zero will
   3472   1.1  christos 	 have already been setup by I387_SUPPLY_XSAVE.  */
   3473   1.1  christos       if (!(clear_bv & X86_XSTATE_X87))
   3474   1.1  christos 	{
   3475   1.1  christos 	  if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep))
   3476   1.1  christos 	    regcache->raw_supply (I387_FISEG_REGNUM (tdep), regs + 12);
   3477   1.1  christos 	  if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep))
   3478   1.1  christos 	    regcache->raw_supply (I387_FOSEG_REGNUM (tdep), regs + 20);
   3479   1.1  christos 	}
   3480   1.1  christos     }
   3481   1.8  christos }
   3482  1.10  christos 
   3483   1.6  christos /* Fill register REGNUM (if it is a floating-point or SSE register) in
   3484   1.1  christos    *FXSAVE with the value from REGCACHE.  If REGNUM is -1, do this for
   3485   1.1  christos    all registers.  This function doesn't touch any of the reserved
   3486   1.1  christos    bits in *FXSAVE.  */
   3487   1.1  christos 
   3488   1.1  christos void
   3489   1.1  christos amd64_collect_fxsave (const struct regcache *regcache, int regnum,
   3490   1.8  christos 		      void *fxsave)
   3491   1.1  christos {
   3492   1.8  christos   struct gdbarch *gdbarch = regcache->arch ();
   3493   1.1  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3494   1.1  christos   gdb_byte *regs = (gdb_byte *) fxsave;
   3495   1.1  christos 
   3496   1.1  christos   i387_collect_fxsave (regcache, regnum, fxsave);
   3497   1.1  christos 
   3498   1.1  christos   if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 64)
   3499   1.1  christos     {
   3500   1.1  christos       if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep))
   3501   1.1  christos 	regcache->raw_collect (I387_FISEG_REGNUM (tdep), regs + 12);
   3502   1.8  christos       if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep))
   3503  1.10  christos 	regcache->raw_collect (I387_FOSEG_REGNUM (tdep), regs + 20);
   3504   1.6  christos     }
   3505   1.1  christos }
   3506   1.1  christos 
   3507   1.1  christos /* Similar to amd64_collect_fxsave, but use XSAVE extended state.  */
   3508   1.1  christos 
   3509   1.1  christos void
   3510   1.1  christos amd64_collect_xsave (const struct regcache *regcache, int regnum,
   3511   1.8  christos 		     void *xsave, int gcore)
   3512   1.1  christos {
   3513   1.1  christos   struct gdbarch *gdbarch = regcache->arch ();
   3514   1.8  christos   i386_gdbarch_tdep *tdep = gdbarch_tdep<i386_gdbarch_tdep> (gdbarch);
   3515   1.1  christos   gdb_byte *regs = (gdb_byte *) xsave;
   3516   1.1  christos 
   3517   1.1  christos   i387_collect_xsave (regcache, regnum, xsave, gcore);
   3518                 
   3519                   if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 64)
   3520                     {
   3521                       if (regnum == -1 || regnum == I387_FISEG_REGNUM (tdep))
   3522                 	regcache->raw_collect (I387_FISEG_REGNUM (tdep),
   3523                 			      regs + 12);
   3524                       if (regnum == -1 || regnum == I387_FOSEG_REGNUM (tdep))
   3525                 	regcache->raw_collect (I387_FOSEG_REGNUM (tdep),
   3526                 			      regs + 20);
   3527                     }
   3528                 }
   3529