gdb: rs6000_dwarf2_reg_to_regnum return -1 for unknown register number
[deliverable/binutils-gdb.git] / gdb / i386-tdep.c
CommitLineData
c906108c 1/* Intel 386 target-dependent stuff.
349c5d5f 2
b811d2c2 3 Copyright (C) 1988-2020 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
1903f0e6 21#include "opcode/i386.h"
acd5c798
MK
22#include "arch-utils.h"
23#include "command.h"
24#include "dummy-frame.h"
82ca8957 25#include "dwarf2/frame.h"
c906108c 26#include "frame.h"
acd5c798
MK
27#include "frame-base.h"
28#include "frame-unwind.h"
c906108c 29#include "inferior.h"
45741a9c 30#include "infrun.h"
acd5c798 31#include "gdbcmd.h"
c906108c 32#include "gdbcore.h"
e6bb342a 33#include "gdbtypes.h"
dfe01d39 34#include "objfiles.h"
acd5c798
MK
35#include "osabi.h"
36#include "regcache.h"
37#include "reggroups.h"
473f17b0 38#include "regset.h"
c0d1d883 39#include "symfile.h"
c906108c 40#include "symtab.h"
acd5c798 41#include "target.h"
3b2ca824 42#include "target-float.h"
fd0407d6 43#include "value.h"
a89aa300 44#include "dis-asm.h"
7a697b8d 45#include "disasm.h"
c8d5aac9 46#include "remote.h"
d2a7c97a 47#include "i386-tdep.h"
61113f8b 48#include "i387-tdep.h"
268a13a5 49#include "gdbsupport/x86-xstate.h"
1d509aa6 50#include "x86-tdep.h"
d2a7c97a 51
7ad10968 52#include "record.h"
d02ed0bb 53#include "record-full.h"
22916b07
YQ
54#include "target-descriptions.h"
55#include "arch/i386.h"
90884b2b 56
6710bf39
SS
57#include "ax.h"
58#include "ax-gdb.h"
59
55aa24fb
SDJ
60#include "stap-probe.h"
61#include "user-regs.h"
62#include "cli/cli-utils.h"
63#include "expression.h"
64#include "parser-defs.h"
65#include <ctype.h>
325fac50 66#include <algorithm>
7d7571f0 67#include <unordered_set>
c2fd7fae 68#include "producer.h"
55aa24fb 69
c4fc7f1b 70/* Register names. */
c40e1eab 71
27087b7f 72static const char * const i386_register_names[] =
fc633446
MK
73{
74 "eax", "ecx", "edx", "ebx",
75 "esp", "ebp", "esi", "edi",
76 "eip", "eflags", "cs", "ss",
77 "ds", "es", "fs", "gs",
78 "st0", "st1", "st2", "st3",
79 "st4", "st5", "st6", "st7",
80 "fctrl", "fstat", "ftag", "fiseg",
81 "fioff", "foseg", "fooff", "fop",
82 "xmm0", "xmm1", "xmm2", "xmm3",
83 "xmm4", "xmm5", "xmm6", "xmm7",
84 "mxcsr"
85};
86
27087b7f 87static const char * const i386_zmm_names[] =
01f9f808
MS
88{
89 "zmm0", "zmm1", "zmm2", "zmm3",
90 "zmm4", "zmm5", "zmm6", "zmm7"
91};
92
27087b7f 93static const char * const i386_zmmh_names[] =
01f9f808
MS
94{
95 "zmm0h", "zmm1h", "zmm2h", "zmm3h",
96 "zmm4h", "zmm5h", "zmm6h", "zmm7h"
97};
98
27087b7f 99static const char * const i386_k_names[] =
01f9f808
MS
100{
101 "k0", "k1", "k2", "k3",
102 "k4", "k5", "k6", "k7"
103};
104
27087b7f 105static const char * const i386_ymm_names[] =
c131fcee
L
106{
107 "ymm0", "ymm1", "ymm2", "ymm3",
108 "ymm4", "ymm5", "ymm6", "ymm7",
109};
110
27087b7f 111static const char * const i386_ymmh_names[] =
c131fcee
L
112{
113 "ymm0h", "ymm1h", "ymm2h", "ymm3h",
114 "ymm4h", "ymm5h", "ymm6h", "ymm7h",
115};
116
27087b7f 117static const char * const i386_mpx_names[] =
1dbcd68c
WT
118{
119 "bnd0raw", "bnd1raw", "bnd2raw", "bnd3raw", "bndcfgu", "bndstatus"
120};
121
27087b7f 122static const char * const i386_pkeys_names[] =
51547df6
MS
123{
124 "pkru"
125};
126
1dbcd68c
WT
127/* Register names for MPX pseudo-registers. */
128
27087b7f 129static const char * const i386_bnd_names[] =
1dbcd68c
WT
130{
131 "bnd0", "bnd1", "bnd2", "bnd3"
132};
133
c4fc7f1b 134/* Register names for MMX pseudo-registers. */
28fc6740 135
27087b7f 136static const char * const i386_mmx_names[] =
28fc6740
AC
137{
138 "mm0", "mm1", "mm2", "mm3",
139 "mm4", "mm5", "mm6", "mm7"
140};
c40e1eab 141
1ba53b71
L
142/* Register names for byte pseudo-registers. */
143
27087b7f 144static const char * const i386_byte_names[] =
1ba53b71
L
145{
146 "al", "cl", "dl", "bl",
147 "ah", "ch", "dh", "bh"
148};
149
150/* Register names for word pseudo-registers. */
151
27087b7f 152static const char * const i386_word_names[] =
1ba53b71
L
153{
154 "ax", "cx", "dx", "bx",
9cad29ac 155 "", "bp", "si", "di"
1ba53b71
L
156};
157
01f9f808
MS
158/* Constant used for reading/writing pseudo registers. In 64-bit mode, we have
159 16 lower ZMM regs that extend corresponding xmm/ymm registers. In addition,
160 we have 16 upper ZMM regs that have to be handled differently. */
161
162const int num_lower_zmm_regs = 16;
163
1ba53b71 164/* MMX register? */
c40e1eab 165
28fc6740 166static int
5716833c 167i386_mmx_regnum_p (struct gdbarch *gdbarch, int regnum)
28fc6740 168{
1ba53b71
L
169 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
170 int mm0_regnum = tdep->mm0_regnum;
5716833c
MK
171
172 if (mm0_regnum < 0)
173 return 0;
174
1ba53b71
L
175 regnum -= mm0_regnum;
176 return regnum >= 0 && regnum < tdep->num_mmx_regs;
177}
178
179/* Byte register? */
180
181int
182i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum)
183{
184 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
185
186 regnum -= tdep->al_regnum;
187 return regnum >= 0 && regnum < tdep->num_byte_regs;
188}
189
190/* Word register? */
191
192int
193i386_word_regnum_p (struct gdbarch *gdbarch, int regnum)
194{
195 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
196
197 regnum -= tdep->ax_regnum;
198 return regnum >= 0 && regnum < tdep->num_word_regs;
199}
200
201/* Dword register? */
202
203int
204i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum)
205{
206 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
207 int eax_regnum = tdep->eax_regnum;
208
209 if (eax_regnum < 0)
210 return 0;
211
212 regnum -= eax_regnum;
213 return regnum >= 0 && regnum < tdep->num_dword_regs;
28fc6740
AC
214}
215
01f9f808
MS
216/* AVX512 register? */
217
218int
219i386_zmmh_regnum_p (struct gdbarch *gdbarch, int regnum)
220{
221 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
222 int zmm0h_regnum = tdep->zmm0h_regnum;
223
224 if (zmm0h_regnum < 0)
225 return 0;
226
227 regnum -= zmm0h_regnum;
228 return regnum >= 0 && regnum < tdep->num_zmm_regs;
229}
230
231int
232i386_zmm_regnum_p (struct gdbarch *gdbarch, int regnum)
233{
234 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
235 int zmm0_regnum = tdep->zmm0_regnum;
236
237 if (zmm0_regnum < 0)
238 return 0;
239
240 regnum -= zmm0_regnum;
241 return regnum >= 0 && regnum < tdep->num_zmm_regs;
242}
243
244int
245i386_k_regnum_p (struct gdbarch *gdbarch, int regnum)
246{
247 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
248 int k0_regnum = tdep->k0_regnum;
249
250 if (k0_regnum < 0)
251 return 0;
252
253 regnum -= k0_regnum;
254 return regnum >= 0 && regnum < I387_NUM_K_REGS;
255}
256
9191d390 257static int
c131fcee
L
258i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum)
259{
260 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
261 int ymm0h_regnum = tdep->ymm0h_regnum;
262
263 if (ymm0h_regnum < 0)
264 return 0;
265
266 regnum -= ymm0h_regnum;
267 return regnum >= 0 && regnum < tdep->num_ymm_regs;
268}
269
270/* AVX register? */
271
272int
273i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
274{
275 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
276 int ymm0_regnum = tdep->ymm0_regnum;
277
278 if (ymm0_regnum < 0)
279 return 0;
280
281 regnum -= ymm0_regnum;
282 return regnum >= 0 && regnum < tdep->num_ymm_regs;
283}
284
01f9f808
MS
285static int
286i386_ymmh_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
287{
288 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
289 int ymm16h_regnum = tdep->ymm16h_regnum;
290
291 if (ymm16h_regnum < 0)
292 return 0;
293
294 regnum -= ymm16h_regnum;
295 return regnum >= 0 && regnum < tdep->num_ymm_avx512_regs;
296}
297
298int
299i386_ymm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
300{
301 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
302 int ymm16_regnum = tdep->ymm16_regnum;
303
304 if (ymm16_regnum < 0)
305 return 0;
306
307 regnum -= ymm16_regnum;
308 return regnum >= 0 && regnum < tdep->num_ymm_avx512_regs;
309}
310
1dbcd68c
WT
311/* BND register? */
312
313int
314i386_bnd_regnum_p (struct gdbarch *gdbarch, int regnum)
315{
316 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
317 int bnd0_regnum = tdep->bnd0_regnum;
318
319 if (bnd0_regnum < 0)
320 return 0;
321
322 regnum -= bnd0_regnum;
323 return regnum >= 0 && regnum < I387_NUM_BND_REGS;
324}
325
5716833c 326/* SSE register? */
23a34459 327
c131fcee
L
328int
329i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 330{
5716833c 331 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
c131fcee 332 int num_xmm_regs = I387_NUM_XMM_REGS (tdep);
5716833c 333
c131fcee 334 if (num_xmm_regs == 0)
5716833c
MK
335 return 0;
336
c131fcee
L
337 regnum -= I387_XMM0_REGNUM (tdep);
338 return regnum >= 0 && regnum < num_xmm_regs;
23a34459
AC
339}
340
01f9f808
MS
341/* XMM_512 register? */
342
343int
344i386_xmm_avx512_regnum_p (struct gdbarch *gdbarch, int regnum)
345{
346 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
347 int num_xmm_avx512_regs = I387_NUM_XMM_AVX512_REGS (tdep);
348
349 if (num_xmm_avx512_regs == 0)
350 return 0;
351
352 regnum -= I387_XMM16_REGNUM (tdep);
353 return regnum >= 0 && regnum < num_xmm_avx512_regs;
354}
355
5716833c
MK
356static int
357i386_mxcsr_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 358{
5716833c
MK
359 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
360
20a6ec49 361 if (I387_NUM_XMM_REGS (tdep) == 0)
5716833c
MK
362 return 0;
363
20a6ec49 364 return (regnum == I387_MXCSR_REGNUM (tdep));
23a34459
AC
365}
366
5716833c 367/* FP register? */
23a34459
AC
368
369int
20a6ec49 370i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 371{
20a6ec49
MD
372 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
373
374 if (I387_ST0_REGNUM (tdep) < 0)
5716833c
MK
375 return 0;
376
20a6ec49
MD
377 return (I387_ST0_REGNUM (tdep) <= regnum
378 && regnum < I387_FCTRL_REGNUM (tdep));
23a34459
AC
379}
380
381int
20a6ec49 382i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 383{
20a6ec49
MD
384 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
385
386 if (I387_ST0_REGNUM (tdep) < 0)
5716833c
MK
387 return 0;
388
20a6ec49
MD
389 return (I387_FCTRL_REGNUM (tdep) <= regnum
390 && regnum < I387_XMM0_REGNUM (tdep));
23a34459
AC
391}
392
1dbcd68c
WT
393/* BNDr (raw) register? */
394
395static int
396i386_bndr_regnum_p (struct gdbarch *gdbarch, int regnum)
397{
398 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
399
400 if (I387_BND0R_REGNUM (tdep) < 0)
401 return 0;
402
403 regnum -= tdep->bnd0r_regnum;
404 return regnum >= 0 && regnum < I387_NUM_BND_REGS;
405}
406
407/* BND control register? */
408
409static int
410i386_mpx_ctrl_regnum_p (struct gdbarch *gdbarch, int regnum)
411{
412 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
413
414 if (I387_BNDCFGU_REGNUM (tdep) < 0)
415 return 0;
416
417 regnum -= I387_BNDCFGU_REGNUM (tdep);
418 return regnum >= 0 && regnum < I387_NUM_MPX_CTRL_REGS;
419}
420
51547df6
MS
421/* PKRU register? */
422
423bool
424i386_pkru_regnum_p (struct gdbarch *gdbarch, int regnum)
425{
426 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
427 int pkru_regnum = tdep->pkru_regnum;
428
429 if (pkru_regnum < 0)
430 return false;
431
432 regnum -= pkru_regnum;
433 return regnum >= 0 && regnum < I387_NUM_PKEYS_REGS;
434}
435
c131fcee
L
436/* Return the name of register REGNUM, or the empty string if it is
437 an anonymous register. */
438
439static const char *
440i386_register_name (struct gdbarch *gdbarch, int regnum)
441{
442 /* Hide the upper YMM registers. */
443 if (i386_ymmh_regnum_p (gdbarch, regnum))
444 return "";
445
01f9f808
MS
446 /* Hide the upper YMM16-31 registers. */
447 if (i386_ymmh_avx512_regnum_p (gdbarch, regnum))
448 return "";
449
450 /* Hide the upper ZMM registers. */
451 if (i386_zmmh_regnum_p (gdbarch, regnum))
452 return "";
453
c131fcee
L
454 return tdesc_register_name (gdbarch, regnum);
455}
456
30b0e2d8 457/* Return the name of register REGNUM. */
fc633446 458
1ba53b71 459const char *
90884b2b 460i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
fc633446 461{
1ba53b71 462 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1dbcd68c
WT
463 if (i386_bnd_regnum_p (gdbarch, regnum))
464 return i386_bnd_names[regnum - tdep->bnd0_regnum];
1ba53b71
L
465 if (i386_mmx_regnum_p (gdbarch, regnum))
466 return i386_mmx_names[regnum - I387_MM0_REGNUM (tdep)];
c131fcee
L
467 else if (i386_ymm_regnum_p (gdbarch, regnum))
468 return i386_ymm_names[regnum - tdep->ymm0_regnum];
01f9f808
MS
469 else if (i386_zmm_regnum_p (gdbarch, regnum))
470 return i386_zmm_names[regnum - tdep->zmm0_regnum];
1ba53b71
L
471 else if (i386_byte_regnum_p (gdbarch, regnum))
472 return i386_byte_names[regnum - tdep->al_regnum];
473 else if (i386_word_regnum_p (gdbarch, regnum))
474 return i386_word_names[regnum - tdep->ax_regnum];
475
476 internal_error (__FILE__, __LINE__, _("invalid regnum"));
fc633446
MK
477}
478
c4fc7f1b 479/* Convert a dbx register number REG to the appropriate register
85540d8c
MK
480 number used by GDB. */
481
8201327c 482static int
d3f73121 483i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
85540d8c 484{
20a6ec49
MD
485 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
486
c4fc7f1b
MK
487 /* This implements what GCC calls the "default" register map
488 (dbx_register_map[]). */
489
85540d8c
MK
490 if (reg >= 0 && reg <= 7)
491 {
9872ad24
JB
492 /* General-purpose registers. The debug info calls %ebp
493 register 4, and %esp register 5. */
494 if (reg == 4)
495 return 5;
496 else if (reg == 5)
497 return 4;
498 else return reg;
85540d8c
MK
499 }
500 else if (reg >= 12 && reg <= 19)
501 {
502 /* Floating-point registers. */
20a6ec49 503 return reg - 12 + I387_ST0_REGNUM (tdep);
85540d8c
MK
504 }
505 else if (reg >= 21 && reg <= 28)
506 {
507 /* SSE registers. */
c131fcee
L
508 int ymm0_regnum = tdep->ymm0_regnum;
509
510 if (ymm0_regnum >= 0
511 && i386_xmm_regnum_p (gdbarch, reg))
512 return reg - 21 + ymm0_regnum;
513 else
514 return reg - 21 + I387_XMM0_REGNUM (tdep);
85540d8c
MK
515 }
516 else if (reg >= 29 && reg <= 36)
517 {
518 /* MMX registers. */
20a6ec49 519 return reg - 29 + I387_MM0_REGNUM (tdep);
85540d8c
MK
520 }
521
522 /* This will hopefully provoke a warning. */
f6efe3f8 523 return gdbarch_num_cooked_regs (gdbarch);
85540d8c
MK
524}
525
0fde2c53 526/* Convert SVR4 DWARF register number REG to the appropriate register number
c4fc7f1b 527 used by GDB. */
85540d8c 528
8201327c 529static int
0fde2c53 530i386_svr4_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
85540d8c 531{
20a6ec49
MD
532 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
533
c4fc7f1b
MK
534 /* This implements the GCC register map that tries to be compatible
535 with the SVR4 C compiler for DWARF (svr4_dbx_register_map[]). */
536
537 /* The SVR4 register numbering includes %eip and %eflags, and
85540d8c
MK
538 numbers the floating point registers differently. */
539 if (reg >= 0 && reg <= 9)
540 {
acd5c798 541 /* General-purpose registers. */
85540d8c
MK
542 return reg;
543 }
544 else if (reg >= 11 && reg <= 18)
545 {
546 /* Floating-point registers. */
20a6ec49 547 return reg - 11 + I387_ST0_REGNUM (tdep);
85540d8c 548 }
c6f4c129 549 else if (reg >= 21 && reg <= 36)
85540d8c 550 {
c4fc7f1b 551 /* The SSE and MMX registers have the same numbers as with dbx. */
d3f73121 552 return i386_dbx_reg_to_regnum (gdbarch, reg);
85540d8c
MK
553 }
554
c6f4c129
JB
555 switch (reg)
556 {
20a6ec49
MD
557 case 37: return I387_FCTRL_REGNUM (tdep);
558 case 38: return I387_FSTAT_REGNUM (tdep);
559 case 39: return I387_MXCSR_REGNUM (tdep);
c6f4c129
JB
560 case 40: return I386_ES_REGNUM;
561 case 41: return I386_CS_REGNUM;
562 case 42: return I386_SS_REGNUM;
563 case 43: return I386_DS_REGNUM;
564 case 44: return I386_FS_REGNUM;
565 case 45: return I386_GS_REGNUM;
566 }
567
0fde2c53
DE
568 return -1;
569}
570
571/* Wrapper on i386_svr4_dwarf_reg_to_regnum to return
572 num_regs + num_pseudo_regs for other debug formats. */
573
8f10c932 574int
0fde2c53
DE
575i386_svr4_reg_to_regnum (struct gdbarch *gdbarch, int reg)
576{
577 int regnum = i386_svr4_dwarf_reg_to_regnum (gdbarch, reg);
578
579 if (regnum == -1)
f6efe3f8 580 return gdbarch_num_cooked_regs (gdbarch);
0fde2c53 581 return regnum;
85540d8c 582}
5716833c 583
fc338970 584\f
917317f4 585
fc338970
MK
586/* This is the variable that is set with "set disassembly-flavor", and
587 its legitimate values. */
53904c9e
AC
588static const char att_flavor[] = "att";
589static const char intel_flavor[] = "intel";
40478521 590static const char *const valid_flavors[] =
c5aa993b 591{
c906108c
SS
592 att_flavor,
593 intel_flavor,
594 NULL
595};
53904c9e 596static const char *disassembly_flavor = att_flavor;
acd5c798 597\f
c906108c 598
acd5c798
MK
599/* Use the program counter to determine the contents and size of a
600 breakpoint instruction. Return a pointer to a string of bytes that
601 encode a breakpoint instruction, store the length of the string in
602 *LEN and optionally adjust *PC to point to the correct memory
603 location for inserting the breakpoint.
c906108c 604
acd5c798
MK
605 On the i386 we have a single breakpoint that fits in a single byte
606 and can be inserted anywhere.
c906108c 607
acd5c798 608 This function is 64-bit safe. */
63c0089f 609
04180708
YQ
610constexpr gdb_byte i386_break_insn[] = { 0xcc }; /* int 3 */
611
612typedef BP_MANIPULATION (i386_break_insn) i386_breakpoint;
63c0089f 613
237fc4c9
PA
614\f
615/* Displaced instruction handling. */
616
1903f0e6
DE
617/* Skip the legacy instruction prefixes in INSN.
618 Not all prefixes are valid for any particular insn
619 but we needn't care, the insn will fault if it's invalid.
620 The result is a pointer to the first opcode byte,
621 or NULL if we run off the end of the buffer. */
622
623static gdb_byte *
624i386_skip_prefixes (gdb_byte *insn, size_t max_len)
625{
626 gdb_byte *end = insn + max_len;
627
628 while (insn < end)
629 {
630 switch (*insn)
631 {
632 case DATA_PREFIX_OPCODE:
633 case ADDR_PREFIX_OPCODE:
634 case CS_PREFIX_OPCODE:
635 case DS_PREFIX_OPCODE:
636 case ES_PREFIX_OPCODE:
637 case FS_PREFIX_OPCODE:
638 case GS_PREFIX_OPCODE:
639 case SS_PREFIX_OPCODE:
640 case LOCK_PREFIX_OPCODE:
641 case REPE_PREFIX_OPCODE:
642 case REPNE_PREFIX_OPCODE:
643 ++insn;
644 continue;
645 default:
646 return insn;
647 }
648 }
649
650 return NULL;
651}
237fc4c9
PA
652
653static int
1903f0e6 654i386_absolute_jmp_p (const gdb_byte *insn)
237fc4c9 655{
1777feb0 656 /* jmp far (absolute address in operand). */
237fc4c9
PA
657 if (insn[0] == 0xea)
658 return 1;
659
660 if (insn[0] == 0xff)
661 {
1777feb0 662 /* jump near, absolute indirect (/4). */
237fc4c9
PA
663 if ((insn[1] & 0x38) == 0x20)
664 return 1;
665
1777feb0 666 /* jump far, absolute indirect (/5). */
237fc4c9
PA
667 if ((insn[1] & 0x38) == 0x28)
668 return 1;
669 }
670
671 return 0;
672}
673
c2170eef
MM
674/* Return non-zero if INSN is a jump, zero otherwise. */
675
676static int
677i386_jmp_p (const gdb_byte *insn)
678{
679 /* jump short, relative. */
680 if (insn[0] == 0xeb)
681 return 1;
682
683 /* jump near, relative. */
684 if (insn[0] == 0xe9)
685 return 1;
686
687 return i386_absolute_jmp_p (insn);
688}
689
237fc4c9 690static int
1903f0e6 691i386_absolute_call_p (const gdb_byte *insn)
237fc4c9 692{
1777feb0 693 /* call far, absolute. */
237fc4c9
PA
694 if (insn[0] == 0x9a)
695 return 1;
696
697 if (insn[0] == 0xff)
698 {
1777feb0 699 /* Call near, absolute indirect (/2). */
237fc4c9
PA
700 if ((insn[1] & 0x38) == 0x10)
701 return 1;
702
1777feb0 703 /* Call far, absolute indirect (/3). */
237fc4c9
PA
704 if ((insn[1] & 0x38) == 0x18)
705 return 1;
706 }
707
708 return 0;
709}
710
711static int
1903f0e6 712i386_ret_p (const gdb_byte *insn)
237fc4c9
PA
713{
714 switch (insn[0])
715 {
1777feb0 716 case 0xc2: /* ret near, pop N bytes. */
237fc4c9 717 case 0xc3: /* ret near */
1777feb0 718 case 0xca: /* ret far, pop N bytes. */
237fc4c9
PA
719 case 0xcb: /* ret far */
720 case 0xcf: /* iret */
721 return 1;
722
723 default:
724 return 0;
725 }
726}
727
728static int
1903f0e6 729i386_call_p (const gdb_byte *insn)
237fc4c9
PA
730{
731 if (i386_absolute_call_p (insn))
732 return 1;
733
1777feb0 734 /* call near, relative. */
237fc4c9
PA
735 if (insn[0] == 0xe8)
736 return 1;
737
738 return 0;
739}
740
237fc4c9
PA
741/* Return non-zero if INSN is a system call, and set *LENGTHP to its
742 length in bytes. Otherwise, return zero. */
1903f0e6 743
237fc4c9 744static int
b55078be 745i386_syscall_p (const gdb_byte *insn, int *lengthp)
237fc4c9 746{
9a7f938f
JK
747 /* Is it 'int $0x80'? */
748 if ((insn[0] == 0xcd && insn[1] == 0x80)
749 /* Or is it 'sysenter'? */
750 || (insn[0] == 0x0f && insn[1] == 0x34)
751 /* Or is it 'syscall'? */
752 || (insn[0] == 0x0f && insn[1] == 0x05))
237fc4c9
PA
753 {
754 *lengthp = 2;
755 return 1;
756 }
757
758 return 0;
759}
760
c2170eef
MM
761/* The gdbarch insn_is_call method. */
762
763static int
764i386_insn_is_call (struct gdbarch *gdbarch, CORE_ADDR addr)
765{
766 gdb_byte buf[I386_MAX_INSN_LEN], *insn;
767
768 read_code (addr, buf, I386_MAX_INSN_LEN);
769 insn = i386_skip_prefixes (buf, I386_MAX_INSN_LEN);
770
771 return i386_call_p (insn);
772}
773
774/* The gdbarch insn_is_ret method. */
775
776static int
777i386_insn_is_ret (struct gdbarch *gdbarch, CORE_ADDR addr)
778{
779 gdb_byte buf[I386_MAX_INSN_LEN], *insn;
780
781 read_code (addr, buf, I386_MAX_INSN_LEN);
782 insn = i386_skip_prefixes (buf, I386_MAX_INSN_LEN);
783
784 return i386_ret_p (insn);
785}
786
787/* The gdbarch insn_is_jump method. */
788
789static int
790i386_insn_is_jump (struct gdbarch *gdbarch, CORE_ADDR addr)
791{
792 gdb_byte buf[I386_MAX_INSN_LEN], *insn;
793
794 read_code (addr, buf, I386_MAX_INSN_LEN);
795 insn = i386_skip_prefixes (buf, I386_MAX_INSN_LEN);
796
797 return i386_jmp_p (insn);
798}
799
c2508e90 800/* Some kernels may run one past a syscall insn, so we have to cope. */
b55078be 801
fdb61c6c 802displaced_step_closure_up
b55078be
DE
803i386_displaced_step_copy_insn (struct gdbarch *gdbarch,
804 CORE_ADDR from, CORE_ADDR to,
805 struct regcache *regs)
806{
807 size_t len = gdbarch_max_insn_length (gdbarch);
e8217e61
SM
808 std::unique_ptr<i386_displaced_step_closure> closure
809 (new i386_displaced_step_closure (len));
cfba9872 810 gdb_byte *buf = closure->buf.data ();
b55078be
DE
811
812 read_memory (from, buf, len);
813
814 /* GDB may get control back after the insn after the syscall.
815 Presumably this is a kernel bug.
816 If this is a syscall, make sure there's a nop afterwards. */
817 {
818 int syscall_length;
819 gdb_byte *insn;
820
821 insn = i386_skip_prefixes (buf, len);
822 if (insn != NULL && i386_syscall_p (insn, &syscall_length))
823 insn[syscall_length] = NOP_OPCODE;
824 }
825
826 write_memory (to, buf, len);
827
828 if (debug_displaced)
829 {
830 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
831 paddress (gdbarch, from), paddress (gdbarch, to));
832 displaced_step_dump_bytes (gdb_stdlog, buf, len);
833 }
834
6d0cf446
BE
835 /* This is a work around for a problem with g++ 4.8. */
836 return displaced_step_closure_up (closure.release ());
b55078be
DE
837}
838
237fc4c9
PA
839/* Fix up the state of registers and memory after having single-stepped
840 a displaced instruction. */
1903f0e6 841
237fc4c9
PA
842void
843i386_displaced_step_fixup (struct gdbarch *gdbarch,
cfba9872 844 struct displaced_step_closure *closure_,
237fc4c9
PA
845 CORE_ADDR from, CORE_ADDR to,
846 struct regcache *regs)
847{
e17a4113
UW
848 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
849
237fc4c9
PA
850 /* The offset we applied to the instruction's address.
851 This could well be negative (when viewed as a signed 32-bit
852 value), but ULONGEST won't reflect that, so take care when
853 applying it. */
854 ULONGEST insn_offset = to - from;
855
cfba9872
SM
856 i386_displaced_step_closure *closure
857 = (i386_displaced_step_closure *) closure_;
858 gdb_byte *insn = closure->buf.data ();
1903f0e6
DE
859 /* The start of the insn, needed in case we see some prefixes. */
860 gdb_byte *insn_start = insn;
237fc4c9
PA
861
862 if (debug_displaced)
863 fprintf_unfiltered (gdb_stdlog,
5af949e3 864 "displaced: fixup (%s, %s), "
237fc4c9 865 "insn = 0x%02x 0x%02x ...\n",
5af949e3
UW
866 paddress (gdbarch, from), paddress (gdbarch, to),
867 insn[0], insn[1]);
237fc4c9
PA
868
869 /* The list of issues to contend with here is taken from
870 resume_execution in arch/i386/kernel/kprobes.c, Linux 2.6.20.
871 Yay for Free Software! */
872
873 /* Relocate the %eip, if necessary. */
874
1903f0e6
DE
875 /* The instruction recognizers we use assume any leading prefixes
876 have been skipped. */
877 {
878 /* This is the size of the buffer in closure. */
879 size_t max_insn_len = gdbarch_max_insn_length (gdbarch);
880 gdb_byte *opcode = i386_skip_prefixes (insn, max_insn_len);
881 /* If there are too many prefixes, just ignore the insn.
882 It will fault when run. */
883 if (opcode != NULL)
884 insn = opcode;
885 }
886
237fc4c9
PA
887 /* Except in the case of absolute or indirect jump or call
888 instructions, or a return instruction, the new eip is relative to
889 the displaced instruction; make it relative. Well, signal
890 handler returns don't need relocation either, but we use the
891 value of %eip to recognize those; see below. */
892 if (! i386_absolute_jmp_p (insn)
893 && ! i386_absolute_call_p (insn)
894 && ! i386_ret_p (insn))
895 {
896 ULONGEST orig_eip;
b55078be 897 int insn_len;
237fc4c9
PA
898
899 regcache_cooked_read_unsigned (regs, I386_EIP_REGNUM, &orig_eip);
900
901 /* A signal trampoline system call changes the %eip, resuming
902 execution of the main program after the signal handler has
903 returned. That makes them like 'return' instructions; we
904 shouldn't relocate %eip.
905
906 But most system calls don't, and we do need to relocate %eip.
907
908 Our heuristic for distinguishing these cases: if stepping
909 over the system call instruction left control directly after
910 the instruction, the we relocate --- control almost certainly
911 doesn't belong in the displaced copy. Otherwise, we assume
912 the instruction has put control where it belongs, and leave
913 it unrelocated. Goodness help us if there are PC-relative
914 system calls. */
915 if (i386_syscall_p (insn, &insn_len)
b55078be
DE
916 && orig_eip != to + (insn - insn_start) + insn_len
917 /* GDB can get control back after the insn after the syscall.
918 Presumably this is a kernel bug.
919 i386_displaced_step_copy_insn ensures its a nop,
920 we add one to the length for it. */
921 && orig_eip != to + (insn - insn_start) + insn_len + 1)
237fc4c9
PA
922 {
923 if (debug_displaced)
924 fprintf_unfiltered (gdb_stdlog,
925 "displaced: syscall changed %%eip; "
926 "not relocating\n");
927 }
928 else
929 {
930 ULONGEST eip = (orig_eip - insn_offset) & 0xffffffffUL;
931
1903f0e6
DE
932 /* If we just stepped over a breakpoint insn, we don't backup
933 the pc on purpose; this is to match behaviour without
934 stepping. */
237fc4c9
PA
935
936 regcache_cooked_write_unsigned (regs, I386_EIP_REGNUM, eip);
937
938 if (debug_displaced)
939 fprintf_unfiltered (gdb_stdlog,
940 "displaced: "
5af949e3
UW
941 "relocated %%eip from %s to %s\n",
942 paddress (gdbarch, orig_eip),
943 paddress (gdbarch, eip));
237fc4c9
PA
944 }
945 }
946
947 /* If the instruction was PUSHFL, then the TF bit will be set in the
948 pushed value, and should be cleared. We'll leave this for later,
949 since GDB already messes up the TF flag when stepping over a
950 pushfl. */
951
952 /* If the instruction was a call, the return address now atop the
953 stack is the address following the copied instruction. We need
954 to make it the address following the original instruction. */
955 if (i386_call_p (insn))
956 {
957 ULONGEST esp;
958 ULONGEST retaddr;
959 const ULONGEST retaddr_len = 4;
960
961 regcache_cooked_read_unsigned (regs, I386_ESP_REGNUM, &esp);
b75f0b83 962 retaddr = read_memory_unsigned_integer (esp, retaddr_len, byte_order);
237fc4c9 963 retaddr = (retaddr - insn_offset) & 0xffffffffUL;
e17a4113 964 write_memory_unsigned_integer (esp, retaddr_len, byte_order, retaddr);
237fc4c9
PA
965
966 if (debug_displaced)
967 fprintf_unfiltered (gdb_stdlog,
5af949e3
UW
968 "displaced: relocated return addr at %s to %s\n",
969 paddress (gdbarch, esp),
970 paddress (gdbarch, retaddr));
237fc4c9
PA
971 }
972}
dde08ee1
PA
973
974static void
975append_insns (CORE_ADDR *to, ULONGEST len, const gdb_byte *buf)
976{
977 target_write_memory (*to, buf, len);
978 *to += len;
979}
980
981static void
982i386_relocate_instruction (struct gdbarch *gdbarch,
983 CORE_ADDR *to, CORE_ADDR oldloc)
984{
985 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
986 gdb_byte buf[I386_MAX_INSN_LEN];
987 int offset = 0, rel32, newrel;
988 int insn_length;
989 gdb_byte *insn = buf;
990
991 read_memory (oldloc, buf, I386_MAX_INSN_LEN);
992
993 insn_length = gdb_buffered_insn_length (gdbarch, insn,
994 I386_MAX_INSN_LEN, oldloc);
995
996 /* Get past the prefixes. */
997 insn = i386_skip_prefixes (insn, I386_MAX_INSN_LEN);
998
999 /* Adjust calls with 32-bit relative addresses as push/jump, with
1000 the address pushed being the location where the original call in
1001 the user program would return to. */
1002 if (insn[0] == 0xe8)
1003 {
1004 gdb_byte push_buf[16];
1005 unsigned int ret_addr;
1006
1007 /* Where "ret" in the original code will return to. */
1008 ret_addr = oldloc + insn_length;
1777feb0 1009 push_buf[0] = 0x68; /* pushq $... */
144db827 1010 store_unsigned_integer (&push_buf[1], 4, byte_order, ret_addr);
dde08ee1
PA
1011 /* Push the push. */
1012 append_insns (to, 5, push_buf);
1013
1014 /* Convert the relative call to a relative jump. */
1015 insn[0] = 0xe9;
1016
1017 /* Adjust the destination offset. */
1018 rel32 = extract_signed_integer (insn + 1, 4, byte_order);
1019 newrel = (oldloc - *to) + rel32;
f4a1794a
KY
1020 store_signed_integer (insn + 1, 4, byte_order, newrel);
1021
1022 if (debug_displaced)
1023 fprintf_unfiltered (gdb_stdlog,
1024 "Adjusted insn rel32=%s at %s to"
1025 " rel32=%s at %s\n",
1026 hex_string (rel32), paddress (gdbarch, oldloc),
1027 hex_string (newrel), paddress (gdbarch, *to));
dde08ee1
PA
1028
1029 /* Write the adjusted jump into its displaced location. */
1030 append_insns (to, 5, insn);
1031 return;
1032 }
1033
1034 /* Adjust jumps with 32-bit relative addresses. Calls are already
1035 handled above. */
1036 if (insn[0] == 0xe9)
1037 offset = 1;
1038 /* Adjust conditional jumps. */
1039 else if (insn[0] == 0x0f && (insn[1] & 0xf0) == 0x80)
1040 offset = 2;
1041
1042 if (offset)
1043 {
1044 rel32 = extract_signed_integer (insn + offset, 4, byte_order);
1045 newrel = (oldloc - *to) + rel32;
f4a1794a 1046 store_signed_integer (insn + offset, 4, byte_order, newrel);
dde08ee1
PA
1047 if (debug_displaced)
1048 fprintf_unfiltered (gdb_stdlog,
f4a1794a
KY
1049 "Adjusted insn rel32=%s at %s to"
1050 " rel32=%s at %s\n",
dde08ee1
PA
1051 hex_string (rel32), paddress (gdbarch, oldloc),
1052 hex_string (newrel), paddress (gdbarch, *to));
1053 }
1054
1055 /* Write the adjusted instructions into their displaced
1056 location. */
1057 append_insns (to, insn_length, buf);
1058}
1059
fc338970 1060\f
acd5c798
MK
1061#ifdef I386_REGNO_TO_SYMMETRY
1062#error "The Sequent Symmetry is no longer supported."
1063#endif
c906108c 1064
acd5c798
MK
1065/* According to the System V ABI, the registers %ebp, %ebx, %edi, %esi
1066 and %esp "belong" to the calling function. Therefore these
1067 registers should be saved if they're going to be modified. */
c906108c 1068
acd5c798
MK
1069/* The maximum number of saved registers. This should include all
1070 registers mentioned above, and %eip. */
a3386186 1071#define I386_NUM_SAVED_REGS I386_NUM_GREGS
acd5c798
MK
1072
1073struct i386_frame_cache
c906108c 1074{
acd5c798
MK
1075 /* Base address. */
1076 CORE_ADDR base;
8fbca658 1077 int base_p;
772562f8 1078 LONGEST sp_offset;
acd5c798
MK
1079 CORE_ADDR pc;
1080
fd13a04a
AC
1081 /* Saved registers. */
1082 CORE_ADDR saved_regs[I386_NUM_SAVED_REGS];
acd5c798 1083 CORE_ADDR saved_sp;
e0c62198 1084 int saved_sp_reg;
acd5c798
MK
1085 int pc_in_eax;
1086
1087 /* Stack space reserved for local variables. */
1088 long locals;
1089};
1090
1091/* Allocate and initialize a frame cache. */
1092
1093static struct i386_frame_cache *
fd13a04a 1094i386_alloc_frame_cache (void)
acd5c798
MK
1095{
1096 struct i386_frame_cache *cache;
1097 int i;
1098
1099 cache = FRAME_OBSTACK_ZALLOC (struct i386_frame_cache);
1100
1101 /* Base address. */
8fbca658 1102 cache->base_p = 0;
acd5c798
MK
1103 cache->base = 0;
1104 cache->sp_offset = -4;
1105 cache->pc = 0;
1106
fd13a04a
AC
1107 /* Saved registers. We initialize these to -1 since zero is a valid
1108 offset (that's where %ebp is supposed to be stored). */
1109 for (i = 0; i < I386_NUM_SAVED_REGS; i++)
1110 cache->saved_regs[i] = -1;
acd5c798 1111 cache->saved_sp = 0;
e0c62198 1112 cache->saved_sp_reg = -1;
acd5c798
MK
1113 cache->pc_in_eax = 0;
1114
1115 /* Frameless until proven otherwise. */
1116 cache->locals = -1;
1117
1118 return cache;
1119}
c906108c 1120
acd5c798
MK
1121/* If the instruction at PC is a jump, return the address of its
1122 target. Otherwise, return PC. */
c906108c 1123
acd5c798 1124static CORE_ADDR
e17a4113 1125i386_follow_jump (struct gdbarch *gdbarch, CORE_ADDR pc)
acd5c798 1126{
e17a4113 1127 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 1128 gdb_byte op;
acd5c798
MK
1129 long delta = 0;
1130 int data16 = 0;
c906108c 1131
0865b04a 1132 if (target_read_code (pc, &op, 1))
3dcabaa8
MS
1133 return pc;
1134
acd5c798 1135 if (op == 0x66)
c906108c 1136 {
c906108c 1137 data16 = 1;
0865b04a
YQ
1138
1139 op = read_code_unsigned_integer (pc + 1, 1, byte_order);
c906108c
SS
1140 }
1141
acd5c798 1142 switch (op)
c906108c
SS
1143 {
1144 case 0xe9:
fc338970 1145 /* Relative jump: if data16 == 0, disp32, else disp16. */
c906108c
SS
1146 if (data16)
1147 {
e17a4113 1148 delta = read_memory_integer (pc + 2, 2, byte_order);
c906108c 1149
fc338970
MK
1150 /* Include the size of the jmp instruction (including the
1151 0x66 prefix). */
acd5c798 1152 delta += 4;
c906108c
SS
1153 }
1154 else
1155 {
e17a4113 1156 delta = read_memory_integer (pc + 1, 4, byte_order);
c906108c 1157
acd5c798
MK
1158 /* Include the size of the jmp instruction. */
1159 delta += 5;
c906108c
SS
1160 }
1161 break;
1162 case 0xeb:
fc338970 1163 /* Relative jump, disp8 (ignore data16). */
e17a4113 1164 delta = read_memory_integer (pc + data16 + 1, 1, byte_order);
c906108c 1165
acd5c798 1166 delta += data16 + 2;
c906108c
SS
1167 break;
1168 }
c906108c 1169
acd5c798
MK
1170 return pc + delta;
1171}
fc338970 1172
acd5c798
MK
1173/* Check whether PC points at a prologue for a function returning a
1174 structure or union. If so, it updates CACHE and returns the
1175 address of the first instruction after the code sequence that
1176 removes the "hidden" argument from the stack or CURRENT_PC,
1177 whichever is smaller. Otherwise, return PC. */
c906108c 1178
acd5c798
MK
1179static CORE_ADDR
1180i386_analyze_struct_return (CORE_ADDR pc, CORE_ADDR current_pc,
1181 struct i386_frame_cache *cache)
c906108c 1182{
acd5c798
MK
1183 /* Functions that return a structure or union start with:
1184
1185 popl %eax 0x58
1186 xchgl %eax, (%esp) 0x87 0x04 0x24
1187 or xchgl %eax, 0(%esp) 0x87 0x44 0x24 0x00
1188
1189 (the System V compiler puts out the second `xchg' instruction,
1190 and the assembler doesn't try to optimize it, so the 'sib' form
1191 gets generated). This sequence is used to get the address of the
1192 return buffer for a function that returns a structure. */
63c0089f
MK
1193 static gdb_byte proto1[3] = { 0x87, 0x04, 0x24 };
1194 static gdb_byte proto2[4] = { 0x87, 0x44, 0x24, 0x00 };
1195 gdb_byte buf[4];
1196 gdb_byte op;
c906108c 1197
acd5c798
MK
1198 if (current_pc <= pc)
1199 return pc;
1200
0865b04a 1201 if (target_read_code (pc, &op, 1))
3dcabaa8 1202 return pc;
c906108c 1203
acd5c798
MK
1204 if (op != 0x58) /* popl %eax */
1205 return pc;
c906108c 1206
0865b04a 1207 if (target_read_code (pc + 1, buf, 4))
3dcabaa8
MS
1208 return pc;
1209
acd5c798
MK
1210 if (memcmp (buf, proto1, 3) != 0 && memcmp (buf, proto2, 4) != 0)
1211 return pc;
c906108c 1212
acd5c798 1213 if (current_pc == pc)
c906108c 1214 {
acd5c798
MK
1215 cache->sp_offset += 4;
1216 return current_pc;
c906108c
SS
1217 }
1218
acd5c798 1219 if (current_pc == pc + 1)
c906108c 1220 {
acd5c798
MK
1221 cache->pc_in_eax = 1;
1222 return current_pc;
1223 }
1224
1225 if (buf[1] == proto1[1])
1226 return pc + 4;
1227 else
1228 return pc + 5;
1229}
1230
1231static CORE_ADDR
1232i386_skip_probe (CORE_ADDR pc)
1233{
1234 /* A function may start with
fc338970 1235
acd5c798
MK
1236 pushl constant
1237 call _probe
1238 addl $4, %esp
fc338970 1239
acd5c798
MK
1240 followed by
1241
1242 pushl %ebp
fc338970 1243
acd5c798 1244 etc. */
63c0089f
MK
1245 gdb_byte buf[8];
1246 gdb_byte op;
fc338970 1247
0865b04a 1248 if (target_read_code (pc, &op, 1))
3dcabaa8 1249 return pc;
acd5c798
MK
1250
1251 if (op == 0x68 || op == 0x6a)
1252 {
1253 int delta;
c906108c 1254
acd5c798
MK
1255 /* Skip past the `pushl' instruction; it has either a one-byte or a
1256 four-byte operand, depending on the opcode. */
c906108c 1257 if (op == 0x68)
acd5c798 1258 delta = 5;
c906108c 1259 else
acd5c798 1260 delta = 2;
c906108c 1261
acd5c798
MK
1262 /* Read the following 8 bytes, which should be `call _probe' (6
1263 bytes) followed by `addl $4,%esp' (2 bytes). */
1264 read_memory (pc + delta, buf, sizeof (buf));
c906108c 1265 if (buf[0] == 0xe8 && buf[6] == 0xc4 && buf[7] == 0x4)
acd5c798 1266 pc += delta + sizeof (buf);
c906108c
SS
1267 }
1268
acd5c798
MK
1269 return pc;
1270}
1271
92dd43fa
MK
1272/* GCC 4.1 and later, can put code in the prologue to realign the
1273 stack pointer. Check whether PC points to such code, and update
1274 CACHE accordingly. Return the first instruction after the code
1275 sequence or CURRENT_PC, whichever is smaller. If we don't
1276 recognize the code, return PC. */
1277
1278static CORE_ADDR
1279i386_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
1280 struct i386_frame_cache *cache)
1281{
e0c62198
L
1282 /* There are 2 code sequences to re-align stack before the frame
1283 gets set up:
1284
1285 1. Use a caller-saved saved register:
1286
1287 leal 4(%esp), %reg
1288 andl $-XXX, %esp
1289 pushl -4(%reg)
1290
1291 2. Use a callee-saved saved register:
1292
1293 pushl %reg
1294 leal 8(%esp), %reg
1295 andl $-XXX, %esp
1296 pushl -4(%reg)
1297
1298 "andl $-XXX, %esp" can be either 3 bytes or 6 bytes:
1299
1300 0x83 0xe4 0xf0 andl $-16, %esp
1301 0x81 0xe4 0x00 0xff 0xff 0xff andl $-256, %esp
1302 */
1303
1304 gdb_byte buf[14];
1305 int reg;
1306 int offset, offset_and;
1307 static int regnums[8] = {
1308 I386_EAX_REGNUM, /* %eax */
1309 I386_ECX_REGNUM, /* %ecx */
1310 I386_EDX_REGNUM, /* %edx */
1311 I386_EBX_REGNUM, /* %ebx */
1312 I386_ESP_REGNUM, /* %esp */
1313 I386_EBP_REGNUM, /* %ebp */
1314 I386_ESI_REGNUM, /* %esi */
1315 I386_EDI_REGNUM /* %edi */
92dd43fa 1316 };
92dd43fa 1317
0865b04a 1318 if (target_read_code (pc, buf, sizeof buf))
e0c62198
L
1319 return pc;
1320
1321 /* Check caller-saved saved register. The first instruction has
1322 to be "leal 4(%esp), %reg". */
1323 if (buf[0] == 0x8d && buf[2] == 0x24 && buf[3] == 0x4)
1324 {
1325 /* MOD must be binary 10 and R/M must be binary 100. */
1326 if ((buf[1] & 0xc7) != 0x44)
1327 return pc;
1328
1329 /* REG has register number. */
1330 reg = (buf[1] >> 3) & 7;
1331 offset = 4;
1332 }
1333 else
1334 {
1335 /* Check callee-saved saved register. The first instruction
1336 has to be "pushl %reg". */
1337 if ((buf[0] & 0xf8) != 0x50)
1338 return pc;
1339
1340 /* Get register. */
1341 reg = buf[0] & 0x7;
1342
1343 /* The next instruction has to be "leal 8(%esp), %reg". */
1344 if (buf[1] != 0x8d || buf[3] != 0x24 || buf[4] != 0x8)
1345 return pc;
1346
1347 /* MOD must be binary 10 and R/M must be binary 100. */
1348 if ((buf[2] & 0xc7) != 0x44)
1349 return pc;
1350
1351 /* REG has register number. Registers in pushl and leal have to
1352 be the same. */
1353 if (reg != ((buf[2] >> 3) & 7))
1354 return pc;
1355
1356 offset = 5;
1357 }
1358
1359 /* Rigister can't be %esp nor %ebp. */
1360 if (reg == 4 || reg == 5)
1361 return pc;
1362
1363 /* The next instruction has to be "andl $-XXX, %esp". */
1364 if (buf[offset + 1] != 0xe4
1365 || (buf[offset] != 0x81 && buf[offset] != 0x83))
1366 return pc;
1367
1368 offset_and = offset;
1369 offset += buf[offset] == 0x81 ? 6 : 3;
1370
1371 /* The next instruction has to be "pushl -4(%reg)". 8bit -4 is
1372 0xfc. REG must be binary 110 and MOD must be binary 01. */
1373 if (buf[offset] != 0xff
1374 || buf[offset + 2] != 0xfc
1375 || (buf[offset + 1] & 0xf8) != 0x70)
1376 return pc;
1377
1378 /* R/M has register. Registers in leal and pushl have to be the
1379 same. */
1380 if (reg != (buf[offset + 1] & 7))
92dd43fa
MK
1381 return pc;
1382
e0c62198
L
1383 if (current_pc > pc + offset_and)
1384 cache->saved_sp_reg = regnums[reg];
92dd43fa 1385
325fac50 1386 return std::min (pc + offset + 3, current_pc);
92dd43fa
MK
1387}
1388
37bdc87e 1389/* Maximum instruction length we need to handle. */
237fc4c9 1390#define I386_MAX_MATCHED_INSN_LEN 6
37bdc87e
MK
1391
1392/* Instruction description. */
1393struct i386_insn
1394{
1395 size_t len;
237fc4c9
PA
1396 gdb_byte insn[I386_MAX_MATCHED_INSN_LEN];
1397 gdb_byte mask[I386_MAX_MATCHED_INSN_LEN];
37bdc87e
MK
1398};
1399
a3fcb948 1400/* Return whether instruction at PC matches PATTERN. */
37bdc87e 1401
a3fcb948
JG
1402static int
1403i386_match_pattern (CORE_ADDR pc, struct i386_insn pattern)
37bdc87e 1404{
63c0089f 1405 gdb_byte op;
37bdc87e 1406
0865b04a 1407 if (target_read_code (pc, &op, 1))
a3fcb948 1408 return 0;
37bdc87e 1409
a3fcb948 1410 if ((op & pattern.mask[0]) == pattern.insn[0])
37bdc87e 1411 {
a3fcb948
JG
1412 gdb_byte buf[I386_MAX_MATCHED_INSN_LEN - 1];
1413 int insn_matched = 1;
1414 size_t i;
37bdc87e 1415
a3fcb948
JG
1416 gdb_assert (pattern.len > 1);
1417 gdb_assert (pattern.len <= I386_MAX_MATCHED_INSN_LEN);
3dcabaa8 1418
0865b04a 1419 if (target_read_code (pc + 1, buf, pattern.len - 1))
a3fcb948 1420 return 0;
613e8135 1421
a3fcb948
JG
1422 for (i = 1; i < pattern.len; i++)
1423 {
1424 if ((buf[i - 1] & pattern.mask[i]) != pattern.insn[i])
1425 insn_matched = 0;
37bdc87e 1426 }
a3fcb948
JG
1427 return insn_matched;
1428 }
1429 return 0;
1430}
1431
1432/* Search for the instruction at PC in the list INSN_PATTERNS. Return
1433 the first instruction description that matches. Otherwise, return
1434 NULL. */
1435
1436static struct i386_insn *
1437i386_match_insn (CORE_ADDR pc, struct i386_insn *insn_patterns)
1438{
1439 struct i386_insn *pattern;
1440
1441 for (pattern = insn_patterns; pattern->len > 0; pattern++)
1442 {
1443 if (i386_match_pattern (pc, *pattern))
1444 return pattern;
37bdc87e
MK
1445 }
1446
1447 return NULL;
1448}
1449
a3fcb948
JG
1450/* Return whether PC points inside a sequence of instructions that
1451 matches INSN_PATTERNS. */
1452
1453static int
1454i386_match_insn_block (CORE_ADDR pc, struct i386_insn *insn_patterns)
1455{
1456 CORE_ADDR current_pc;
1457 int ix, i;
a3fcb948
JG
1458 struct i386_insn *insn;
1459
1460 insn = i386_match_insn (pc, insn_patterns);
1461 if (insn == NULL)
1462 return 0;
1463
8bbdd3f4 1464 current_pc = pc;
a3fcb948
JG
1465 ix = insn - insn_patterns;
1466 for (i = ix - 1; i >= 0; i--)
1467 {
8bbdd3f4
MK
1468 current_pc -= insn_patterns[i].len;
1469
a3fcb948
JG
1470 if (!i386_match_pattern (current_pc, insn_patterns[i]))
1471 return 0;
a3fcb948
JG
1472 }
1473
1474 current_pc = pc + insn->len;
1475 for (insn = insn_patterns + ix + 1; insn->len > 0; insn++)
1476 {
1477 if (!i386_match_pattern (current_pc, *insn))
1478 return 0;
1479
1480 current_pc += insn->len;
1481 }
1482
1483 return 1;
1484}
1485
37bdc87e
MK
1486/* Some special instructions that might be migrated by GCC into the
1487 part of the prologue that sets up the new stack frame. Because the
1488 stack frame hasn't been setup yet, no registers have been saved
1489 yet, and only the scratch registers %eax, %ecx and %edx can be
1490 touched. */
1491
1492struct i386_insn i386_frame_setup_skip_insns[] =
1493{
1777feb0 1494 /* Check for `movb imm8, r' and `movl imm32, r'.
37bdc87e
MK
1495
1496 ??? Should we handle 16-bit operand-sizes here? */
1497
1498 /* `movb imm8, %al' and `movb imm8, %ah' */
1499 /* `movb imm8, %cl' and `movb imm8, %ch' */
1500 { 2, { 0xb0, 0x00 }, { 0xfa, 0x00 } },
1501 /* `movb imm8, %dl' and `movb imm8, %dh' */
1502 { 2, { 0xb2, 0x00 }, { 0xfb, 0x00 } },
1503 /* `movl imm32, %eax' and `movl imm32, %ecx' */
1504 { 5, { 0xb8 }, { 0xfe } },
1505 /* `movl imm32, %edx' */
1506 { 5, { 0xba }, { 0xff } },
1507
1508 /* Check for `mov imm32, r32'. Note that there is an alternative
1509 encoding for `mov m32, %eax'.
1510
85102364 1511 ??? Should we handle SIB addressing here?
37bdc87e
MK
1512 ??? Should we handle 16-bit operand-sizes here? */
1513
1514 /* `movl m32, %eax' */
1515 { 5, { 0xa1 }, { 0xff } },
1516 /* `movl m32, %eax' and `mov; m32, %ecx' */
1517 { 6, { 0x89, 0x05 }, {0xff, 0xf7 } },
1518 /* `movl m32, %edx' */
1519 { 6, { 0x89, 0x15 }, {0xff, 0xff } },
1520
1521 /* Check for `xorl r32, r32' and the equivalent `subl r32, r32'.
1522 Because of the symmetry, there are actually two ways to encode
1523 these instructions; opcode bytes 0x29 and 0x2b for `subl' and
1524 opcode bytes 0x31 and 0x33 for `xorl'. */
1525
1526 /* `subl %eax, %eax' */
1527 { 2, { 0x29, 0xc0 }, { 0xfd, 0xff } },
1528 /* `subl %ecx, %ecx' */
1529 { 2, { 0x29, 0xc9 }, { 0xfd, 0xff } },
1530 /* `subl %edx, %edx' */
1531 { 2, { 0x29, 0xd2 }, { 0xfd, 0xff } },
1532 /* `xorl %eax, %eax' */
1533 { 2, { 0x31, 0xc0 }, { 0xfd, 0xff } },
1534 /* `xorl %ecx, %ecx' */
1535 { 2, { 0x31, 0xc9 }, { 0xfd, 0xff } },
1536 /* `xorl %edx, %edx' */
1537 { 2, { 0x31, 0xd2 }, { 0xfd, 0xff } },
1538 { 0 }
1539};
1540
14f9473c
VC
1541/* Check whether PC points to an endbr32 instruction. */
1542static CORE_ADDR
1543i386_skip_endbr (CORE_ADDR pc)
1544{
1545 static const gdb_byte endbr32[] = { 0xf3, 0x0f, 0x1e, 0xfb };
1546
1547 gdb_byte buf[sizeof (endbr32)];
1548
1549 /* Stop there if we can't read the code */
1550 if (target_read_code (pc, buf, sizeof (endbr32)))
1551 return pc;
1552
1553 /* If the instruction isn't an endbr32, stop */
1554 if (memcmp (buf, endbr32, sizeof (endbr32)) != 0)
1555 return pc;
1556
1557 return pc + sizeof (endbr32);
1558}
e11481da
PM
1559
1560/* Check whether PC points to a no-op instruction. */
1561static CORE_ADDR
1562i386_skip_noop (CORE_ADDR pc)
1563{
1564 gdb_byte op;
1565 int check = 1;
1566
0865b04a 1567 if (target_read_code (pc, &op, 1))
3dcabaa8 1568 return pc;
e11481da
PM
1569
1570 while (check)
1571 {
1572 check = 0;
1573 /* Ignore `nop' instruction. */
1574 if (op == 0x90)
1575 {
1576 pc += 1;
0865b04a 1577 if (target_read_code (pc, &op, 1))
3dcabaa8 1578 return pc;
e11481da
PM
1579 check = 1;
1580 }
1581 /* Ignore no-op instruction `mov %edi, %edi'.
1582 Microsoft system dlls often start with
1583 a `mov %edi,%edi' instruction.
1584 The 5 bytes before the function start are
1585 filled with `nop' instructions.
1586 This pattern can be used for hot-patching:
1587 The `mov %edi, %edi' instruction can be replaced by a
1588 near jump to the location of the 5 `nop' instructions
1589 which can be replaced by a 32-bit jump to anywhere
1590 in the 32-bit address space. */
1591
1592 else if (op == 0x8b)
1593 {
0865b04a 1594 if (target_read_code (pc + 1, &op, 1))
3dcabaa8
MS
1595 return pc;
1596
e11481da
PM
1597 if (op == 0xff)
1598 {
1599 pc += 2;
0865b04a 1600 if (target_read_code (pc, &op, 1))
3dcabaa8
MS
1601 return pc;
1602
e11481da
PM
1603 check = 1;
1604 }
1605 }
1606 }
1607 return pc;
1608}
1609
acd5c798
MK
1610/* Check whether PC points at a code that sets up a new stack frame.
1611 If so, it updates CACHE and returns the address of the first
37bdc87e
MK
1612 instruction after the sequence that sets up the frame or LIMIT,
1613 whichever is smaller. If we don't recognize the code, return PC. */
acd5c798
MK
1614
1615static CORE_ADDR
e17a4113
UW
1616i386_analyze_frame_setup (struct gdbarch *gdbarch,
1617 CORE_ADDR pc, CORE_ADDR limit,
acd5c798
MK
1618 struct i386_frame_cache *cache)
1619{
e17a4113 1620 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
37bdc87e 1621 struct i386_insn *insn;
63c0089f 1622 gdb_byte op;
26604a34 1623 int skip = 0;
acd5c798 1624
37bdc87e
MK
1625 if (limit <= pc)
1626 return limit;
acd5c798 1627
0865b04a 1628 if (target_read_code (pc, &op, 1))
3dcabaa8 1629 return pc;
acd5c798 1630
c906108c 1631 if (op == 0x55) /* pushl %ebp */
c5aa993b 1632 {
acd5c798
MK
1633 /* Take into account that we've executed the `pushl %ebp' that
1634 starts this instruction sequence. */
fd13a04a 1635 cache->saved_regs[I386_EBP_REGNUM] = 0;
acd5c798 1636 cache->sp_offset += 4;
37bdc87e 1637 pc++;
acd5c798
MK
1638
1639 /* If that's all, return now. */
37bdc87e
MK
1640 if (limit <= pc)
1641 return limit;
26604a34 1642
b4632131 1643 /* Check for some special instructions that might be migrated by
37bdc87e
MK
1644 GCC into the prologue and skip them. At this point in the
1645 prologue, code should only touch the scratch registers %eax,
30baf67b 1646 %ecx and %edx, so while the number of possibilities is sheer,
37bdc87e 1647 it is limited.
5daa5b4e 1648
26604a34
MK
1649 Make sure we only skip these instructions if we later see the
1650 `movl %esp, %ebp' that actually sets up the frame. */
37bdc87e 1651 while (pc + skip < limit)
26604a34 1652 {
37bdc87e
MK
1653 insn = i386_match_insn (pc + skip, i386_frame_setup_skip_insns);
1654 if (insn == NULL)
1655 break;
b4632131 1656
37bdc87e 1657 skip += insn->len;
26604a34
MK
1658 }
1659
37bdc87e
MK
1660 /* If that's all, return now. */
1661 if (limit <= pc + skip)
1662 return limit;
1663
0865b04a 1664 if (target_read_code (pc + skip, &op, 1))
3dcabaa8 1665 return pc + skip;
37bdc87e 1666
30f8135b
YQ
1667 /* The i386 prologue looks like
1668
1669 push %ebp
1670 mov %esp,%ebp
1671 sub $0x10,%esp
1672
1673 and a different prologue can be generated for atom.
1674
1675 push %ebp
1676 lea (%esp),%ebp
1677 lea -0x10(%esp),%esp
1678
1679 We handle both of them here. */
1680
acd5c798 1681 switch (op)
c906108c 1682 {
30f8135b 1683 /* Check for `movl %esp, %ebp' -- can be written in two ways. */
c906108c 1684 case 0x8b:
0865b04a 1685 if (read_code_unsigned_integer (pc + skip + 1, 1, byte_order)
e17a4113 1686 != 0xec)
37bdc87e 1687 return pc;
30f8135b 1688 pc += (skip + 2);
c906108c
SS
1689 break;
1690 case 0x89:
0865b04a 1691 if (read_code_unsigned_integer (pc + skip + 1, 1, byte_order)
e17a4113 1692 != 0xe5)
37bdc87e 1693 return pc;
30f8135b
YQ
1694 pc += (skip + 2);
1695 break;
1696 case 0x8d: /* Check for 'lea (%ebp), %ebp'. */
0865b04a 1697 if (read_code_unsigned_integer (pc + skip + 1, 2, byte_order)
30f8135b
YQ
1698 != 0x242c)
1699 return pc;
1700 pc += (skip + 3);
c906108c
SS
1701 break;
1702 default:
37bdc87e 1703 return pc;
c906108c 1704 }
acd5c798 1705
26604a34
MK
1706 /* OK, we actually have a frame. We just don't know how large
1707 it is yet. Set its size to zero. We'll adjust it if
1708 necessary. We also now commit to skipping the special
1709 instructions mentioned before. */
acd5c798
MK
1710 cache->locals = 0;
1711
1712 /* If that's all, return now. */
37bdc87e
MK
1713 if (limit <= pc)
1714 return limit;
acd5c798 1715
fc338970
MK
1716 /* Check for stack adjustment
1717
acd5c798 1718 subl $XXX, %esp
30f8135b
YQ
1719 or
1720 lea -XXX(%esp),%esp
fc338970 1721
fd35795f 1722 NOTE: You can't subtract a 16-bit immediate from a 32-bit
fc338970 1723 reg, so we don't have to worry about a data16 prefix. */
0865b04a 1724 if (target_read_code (pc, &op, 1))
3dcabaa8 1725 return pc;
c906108c
SS
1726 if (op == 0x83)
1727 {
fd35795f 1728 /* `subl' with 8-bit immediate. */
0865b04a 1729 if (read_code_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
fc338970 1730 /* Some instruction starting with 0x83 other than `subl'. */
37bdc87e 1731 return pc;
acd5c798 1732
37bdc87e
MK
1733 /* `subl' with signed 8-bit immediate (though it wouldn't
1734 make sense to be negative). */
0865b04a 1735 cache->locals = read_code_integer (pc + 2, 1, byte_order);
37bdc87e 1736 return pc + 3;
c906108c
SS
1737 }
1738 else if (op == 0x81)
1739 {
fd35795f 1740 /* Maybe it is `subl' with a 32-bit immediate. */
0865b04a 1741 if (read_code_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
fc338970 1742 /* Some instruction starting with 0x81 other than `subl'. */
37bdc87e 1743 return pc;
acd5c798 1744
fd35795f 1745 /* It is `subl' with a 32-bit immediate. */
0865b04a 1746 cache->locals = read_code_integer (pc + 2, 4, byte_order);
37bdc87e 1747 return pc + 6;
c906108c 1748 }
30f8135b
YQ
1749 else if (op == 0x8d)
1750 {
1751 /* The ModR/M byte is 0x64. */
0865b04a 1752 if (read_code_unsigned_integer (pc + 1, 1, byte_order) != 0x64)
30f8135b
YQ
1753 return pc;
1754 /* 'lea' with 8-bit displacement. */
0865b04a 1755 cache->locals = -1 * read_code_integer (pc + 3, 1, byte_order);
30f8135b
YQ
1756 return pc + 4;
1757 }
c906108c
SS
1758 else
1759 {
30f8135b 1760 /* Some instruction other than `subl' nor 'lea'. */
37bdc87e 1761 return pc;
c906108c
SS
1762 }
1763 }
37bdc87e 1764 else if (op == 0xc8) /* enter */
c906108c 1765 {
0865b04a 1766 cache->locals = read_code_unsigned_integer (pc + 1, 2, byte_order);
acd5c798 1767 return pc + 4;
c906108c 1768 }
21d0e8a4 1769
acd5c798 1770 return pc;
21d0e8a4
MK
1771}
1772
acd5c798
MK
1773/* Check whether PC points at code that saves registers on the stack.
1774 If so, it updates CACHE and returns the address of the first
1775 instruction after the register saves or CURRENT_PC, whichever is
1776 smaller. Otherwise, return PC. */
6bff26de
MK
1777
1778static CORE_ADDR
acd5c798
MK
1779i386_analyze_register_saves (CORE_ADDR pc, CORE_ADDR current_pc,
1780 struct i386_frame_cache *cache)
6bff26de 1781{
99ab4326 1782 CORE_ADDR offset = 0;
63c0089f 1783 gdb_byte op;
99ab4326 1784 int i;
c0d1d883 1785
99ab4326
MK
1786 if (cache->locals > 0)
1787 offset -= cache->locals;
1788 for (i = 0; i < 8 && pc < current_pc; i++)
1789 {
0865b04a 1790 if (target_read_code (pc, &op, 1))
3dcabaa8 1791 return pc;
99ab4326
MK
1792 if (op < 0x50 || op > 0x57)
1793 break;
0d17c81d 1794
99ab4326
MK
1795 offset -= 4;
1796 cache->saved_regs[op - 0x50] = offset;
1797 cache->sp_offset += 4;
1798 pc++;
6bff26de
MK
1799 }
1800
acd5c798 1801 return pc;
22797942
AC
1802}
1803
acd5c798
MK
1804/* Do a full analysis of the prologue at PC and update CACHE
1805 accordingly. Bail out early if CURRENT_PC is reached. Return the
1806 address where the analysis stopped.
ed84f6c1 1807
fc338970
MK
1808 We handle these cases:
1809
1810 The startup sequence can be at the start of the function, or the
1811 function can start with a branch to startup code at the end.
1812
1813 %ebp can be set up with either the 'enter' instruction, or "pushl
1814 %ebp, movl %esp, %ebp" (`enter' is too slow to be useful, but was
1815 once used in the System V compiler).
1816
1817 Local space is allocated just below the saved %ebp by either the
fd35795f
MK
1818 'enter' instruction, or by "subl $<size>, %esp". 'enter' has a
1819 16-bit unsigned argument for space to allocate, and the 'addl'
1820 instruction could have either a signed byte, or 32-bit immediate.
fc338970
MK
1821
1822 Next, the registers used by this function are pushed. With the
1823 System V compiler they will always be in the order: %edi, %esi,
1824 %ebx (and sometimes a harmless bug causes it to also save but not
1825 restore %eax); however, the code below is willing to see the pushes
1826 in any order, and will handle up to 8 of them.
1827
1828 If the setup sequence is at the end of the function, then the next
1829 instruction will be a branch back to the start. */
c906108c 1830
acd5c798 1831static CORE_ADDR
e17a4113
UW
1832i386_analyze_prologue (struct gdbarch *gdbarch,
1833 CORE_ADDR pc, CORE_ADDR current_pc,
acd5c798 1834 struct i386_frame_cache *cache)
c906108c 1835{
14f9473c 1836 pc = i386_skip_endbr (pc);
e11481da 1837 pc = i386_skip_noop (pc);
e17a4113 1838 pc = i386_follow_jump (gdbarch, pc);
acd5c798
MK
1839 pc = i386_analyze_struct_return (pc, current_pc, cache);
1840 pc = i386_skip_probe (pc);
92dd43fa 1841 pc = i386_analyze_stack_align (pc, current_pc, cache);
e17a4113 1842 pc = i386_analyze_frame_setup (gdbarch, pc, current_pc, cache);
acd5c798 1843 return i386_analyze_register_saves (pc, current_pc, cache);
c906108c
SS
1844}
1845
fc338970 1846/* Return PC of first real instruction. */
c906108c 1847
3a1e71e3 1848static CORE_ADDR
6093d2eb 1849i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
c906108c 1850{
e17a4113
UW
1851 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1852
63c0089f 1853 static gdb_byte pic_pat[6] =
acd5c798
MK
1854 {
1855 0xe8, 0, 0, 0, 0, /* call 0x0 */
1856 0x5b, /* popl %ebx */
c5aa993b 1857 };
acd5c798
MK
1858 struct i386_frame_cache cache;
1859 CORE_ADDR pc;
63c0089f 1860 gdb_byte op;
acd5c798 1861 int i;
56bf0743 1862 CORE_ADDR func_addr;
4e879fc2 1863
56bf0743
KB
1864 if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
1865 {
1866 CORE_ADDR post_prologue_pc
1867 = skip_prologue_using_sal (gdbarch, func_addr);
43f3e411 1868 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
56bf0743 1869
c2fd7fae
AKS
1870 /* LLVM backend (Clang/Flang) always emits a line note before the
1871 prologue and another one after. We trust clang to emit usable
1872 line notes. */
56bf0743 1873 if (post_prologue_pc
43f3e411
DE
1874 && (cust != NULL
1875 && COMPUNIT_PRODUCER (cust) != NULL
c2fd7fae 1876 && producer_is_llvm (COMPUNIT_PRODUCER (cust))))
325fac50 1877 return std::max (start_pc, post_prologue_pc);
56bf0743
KB
1878 }
1879
e0f33b1f 1880 cache.locals = -1;
e17a4113 1881 pc = i386_analyze_prologue (gdbarch, start_pc, 0xffffffff, &cache);
acd5c798
MK
1882 if (cache.locals < 0)
1883 return start_pc;
c5aa993b 1884
acd5c798 1885 /* Found valid frame setup. */
c906108c 1886
fc338970
MK
1887 /* The native cc on SVR4 in -K PIC mode inserts the following code
1888 to get the address of the global offset table (GOT) into register
acd5c798
MK
1889 %ebx:
1890
fc338970
MK
1891 call 0x0
1892 popl %ebx
1893 movl %ebx,x(%ebp) (optional)
1894 addl y,%ebx
1895
c906108c
SS
1896 This code is with the rest of the prologue (at the end of the
1897 function), so we have to skip it to get to the first real
1898 instruction at the start of the function. */
c5aa993b 1899
c906108c
SS
1900 for (i = 0; i < 6; i++)
1901 {
0865b04a 1902 if (target_read_code (pc + i, &op, 1))
3dcabaa8
MS
1903 return pc;
1904
c5aa993b 1905 if (pic_pat[i] != op)
c906108c
SS
1906 break;
1907 }
1908 if (i == 6)
1909 {
acd5c798
MK
1910 int delta = 6;
1911
0865b04a 1912 if (target_read_code (pc + delta, &op, 1))
3dcabaa8 1913 return pc;
c906108c 1914
c5aa993b 1915 if (op == 0x89) /* movl %ebx, x(%ebp) */
c906108c 1916 {
0865b04a 1917 op = read_code_unsigned_integer (pc + delta + 1, 1, byte_order);
acd5c798 1918
fc338970 1919 if (op == 0x5d) /* One byte offset from %ebp. */
acd5c798 1920 delta += 3;
fc338970 1921 else if (op == 0x9d) /* Four byte offset from %ebp. */
acd5c798 1922 delta += 6;
fc338970 1923 else /* Unexpected instruction. */
acd5c798
MK
1924 delta = 0;
1925
0865b04a 1926 if (target_read_code (pc + delta, &op, 1))
3dcabaa8 1927 return pc;
c906108c 1928 }
acd5c798 1929
c5aa993b 1930 /* addl y,%ebx */
acd5c798 1931 if (delta > 0 && op == 0x81
0865b04a 1932 && read_code_unsigned_integer (pc + delta + 1, 1, byte_order)
e17a4113 1933 == 0xc3)
c906108c 1934 {
acd5c798 1935 pc += delta + 6;
c906108c
SS
1936 }
1937 }
c5aa993b 1938
e63bbc88
MK
1939 /* If the function starts with a branch (to startup code at the end)
1940 the last instruction should bring us back to the first
1941 instruction of the real code. */
e17a4113
UW
1942 if (i386_follow_jump (gdbarch, start_pc) != start_pc)
1943 pc = i386_follow_jump (gdbarch, pc);
e63bbc88
MK
1944
1945 return pc;
c906108c
SS
1946}
1947
4309257c
PM
1948/* Check that the code pointed to by PC corresponds to a call to
1949 __main, skip it if so. Return PC otherwise. */
1950
1951CORE_ADDR
1952i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1953{
e17a4113 1954 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4309257c
PM
1955 gdb_byte op;
1956
0865b04a 1957 if (target_read_code (pc, &op, 1))
3dcabaa8 1958 return pc;
4309257c
PM
1959 if (op == 0xe8)
1960 {
1961 gdb_byte buf[4];
1962
0865b04a 1963 if (target_read_code (pc + 1, buf, sizeof buf) == 0)
4309257c
PM
1964 {
1965 /* Make sure address is computed correctly as a 32bit
1966 integer even if CORE_ADDR is 64 bit wide. */
7cbd4a93 1967 struct bound_minimal_symbol s;
e17a4113 1968 CORE_ADDR call_dest;
4309257c 1969
e17a4113 1970 call_dest = pc + 5 + extract_signed_integer (buf, 4, byte_order);
4309257c
PM
1971 call_dest = call_dest & 0xffffffffU;
1972 s = lookup_minimal_symbol_by_pc (call_dest);
7cbd4a93 1973 if (s.minsym != NULL
c9d95fa3
CB
1974 && s.minsym->linkage_name () != NULL
1975 && strcmp (s.minsym->linkage_name (), "__main") == 0)
4309257c
PM
1976 pc += 5;
1977 }
1978 }
1979
1980 return pc;
1981}
1982
acd5c798 1983/* This function is 64-bit safe. */
93924b6b 1984
acd5c798
MK
1985static CORE_ADDR
1986i386_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
93924b6b 1987{
63c0089f 1988 gdb_byte buf[8];
acd5c798 1989
875f8d0e 1990 frame_unwind_register (next_frame, gdbarch_pc_regnum (gdbarch), buf);
0dfff4cb 1991 return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
93924b6b 1992}
acd5c798 1993\f
93924b6b 1994
acd5c798 1995/* Normal frames. */
c5aa993b 1996
8fbca658
PA
1997static void
1998i386_frame_cache_1 (struct frame_info *this_frame,
1999 struct i386_frame_cache *cache)
a7769679 2000{
e17a4113
UW
2001 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2002 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 2003 gdb_byte buf[4];
acd5c798
MK
2004 int i;
2005
8fbca658 2006 cache->pc = get_frame_func (this_frame);
acd5c798
MK
2007
2008 /* In principle, for normal frames, %ebp holds the frame pointer,
2009 which holds the base address for the current stack frame.
2010 However, for functions that don't need it, the frame pointer is
2011 optional. For these "frameless" functions the frame pointer is
2012 actually the frame pointer of the calling frame. Signal
2013 trampolines are just a special case of a "frameless" function.
2014 They (usually) share their frame pointer with the frame that was
2015 in progress when the signal occurred. */
2016
10458914 2017 get_frame_register (this_frame, I386_EBP_REGNUM, buf);
e17a4113 2018 cache->base = extract_unsigned_integer (buf, 4, byte_order);
acd5c798 2019 if (cache->base == 0)
620fa63a
PA
2020 {
2021 cache->base_p = 1;
2022 return;
2023 }
acd5c798
MK
2024
2025 /* For normal frames, %eip is stored at 4(%ebp). */
fd13a04a 2026 cache->saved_regs[I386_EIP_REGNUM] = 4;
acd5c798 2027
acd5c798 2028 if (cache->pc != 0)
e17a4113
UW
2029 i386_analyze_prologue (gdbarch, cache->pc, get_frame_pc (this_frame),
2030 cache);
acd5c798
MK
2031
2032 if (cache->locals < 0)
2033 {
2034 /* We didn't find a valid frame, which means that CACHE->base
2035 currently holds the frame pointer for our calling frame. If
2036 we're at the start of a function, or somewhere half-way its
2037 prologue, the function's frame probably hasn't been fully
2038 setup yet. Try to reconstruct the base address for the stack
2039 frame by looking at the stack pointer. For truly "frameless"
2040 functions this might work too. */
2041
e0c62198 2042 if (cache->saved_sp_reg != -1)
92dd43fa 2043 {
8fbca658
PA
2044 /* Saved stack pointer has been saved. */
2045 get_frame_register (this_frame, cache->saved_sp_reg, buf);
2046 cache->saved_sp = extract_unsigned_integer (buf, 4, byte_order);
2047
92dd43fa
MK
2048 /* We're halfway aligning the stack. */
2049 cache->base = ((cache->saved_sp - 4) & 0xfffffff0) - 4;
2050 cache->saved_regs[I386_EIP_REGNUM] = cache->saved_sp - 4;
2051
2052 /* This will be added back below. */
2053 cache->saved_regs[I386_EIP_REGNUM] -= cache->base;
2054 }
7618e12b 2055 else if (cache->pc != 0
0865b04a 2056 || target_read_code (get_frame_pc (this_frame), buf, 1))
92dd43fa 2057 {
7618e12b
DJ
2058 /* We're in a known function, but did not find a frame
2059 setup. Assume that the function does not use %ebp.
2060 Alternatively, we may have jumped to an invalid
2061 address; in that case there is definitely no new
2062 frame in %ebp. */
10458914 2063 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
e17a4113
UW
2064 cache->base = extract_unsigned_integer (buf, 4, byte_order)
2065 + cache->sp_offset;
92dd43fa 2066 }
7618e12b
DJ
2067 else
2068 /* We're in an unknown function. We could not find the start
2069 of the function to analyze the prologue; our best option is
2070 to assume a typical frame layout with the caller's %ebp
2071 saved. */
2072 cache->saved_regs[I386_EBP_REGNUM] = 0;
acd5c798
MK
2073 }
2074
8fbca658
PA
2075 if (cache->saved_sp_reg != -1)
2076 {
2077 /* Saved stack pointer has been saved (but the SAVED_SP_REG
2078 register may be unavailable). */
2079 if (cache->saved_sp == 0
ca9d61b9
JB
2080 && deprecated_frame_register_read (this_frame,
2081 cache->saved_sp_reg, buf))
8fbca658
PA
2082 cache->saved_sp = extract_unsigned_integer (buf, 4, byte_order);
2083 }
acd5c798
MK
2084 /* Now that we have the base address for the stack frame we can
2085 calculate the value of %esp in the calling frame. */
8fbca658 2086 else if (cache->saved_sp == 0)
92dd43fa 2087 cache->saved_sp = cache->base + 8;
a7769679 2088
acd5c798
MK
2089 /* Adjust all the saved registers such that they contain addresses
2090 instead of offsets. */
2091 for (i = 0; i < I386_NUM_SAVED_REGS; i++)
fd13a04a
AC
2092 if (cache->saved_regs[i] != -1)
2093 cache->saved_regs[i] += cache->base;
acd5c798 2094
8fbca658
PA
2095 cache->base_p = 1;
2096}
2097
2098static struct i386_frame_cache *
2099i386_frame_cache (struct frame_info *this_frame, void **this_cache)
2100{
8fbca658
PA
2101 struct i386_frame_cache *cache;
2102
2103 if (*this_cache)
9a3c8263 2104 return (struct i386_frame_cache *) *this_cache;
8fbca658
PA
2105
2106 cache = i386_alloc_frame_cache ();
2107 *this_cache = cache;
2108
a70b8144 2109 try
8fbca658
PA
2110 {
2111 i386_frame_cache_1 (this_frame, cache);
2112 }
230d2906 2113 catch (const gdb_exception_error &ex)
7556d4a4
PA
2114 {
2115 if (ex.error != NOT_AVAILABLE_ERROR)
eedc3f4f 2116 throw;
7556d4a4 2117 }
8fbca658 2118
acd5c798 2119 return cache;
a7769679
MK
2120}
2121
3a1e71e3 2122static void
10458914 2123i386_frame_this_id (struct frame_info *this_frame, void **this_cache,
acd5c798 2124 struct frame_id *this_id)
c906108c 2125{
10458914 2126 struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
acd5c798 2127
5ce0145d
PA
2128 if (!cache->base_p)
2129 (*this_id) = frame_id_build_unavailable_stack (cache->pc);
2130 else if (cache->base == 0)
2131 {
2132 /* This marks the outermost frame. */
2133 }
2134 else
2135 {
2136 /* See the end of i386_push_dummy_call. */
2137 (*this_id) = frame_id_build (cache->base + 8, cache->pc);
2138 }
acd5c798
MK
2139}
2140
8fbca658
PA
2141static enum unwind_stop_reason
2142i386_frame_unwind_stop_reason (struct frame_info *this_frame,
2143 void **this_cache)
2144{
2145 struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
2146
2147 if (!cache->base_p)
2148 return UNWIND_UNAVAILABLE;
2149
2150 /* This marks the outermost frame. */
2151 if (cache->base == 0)
2152 return UNWIND_OUTERMOST;
2153
2154 return UNWIND_NO_REASON;
2155}
2156
10458914
DJ
2157static struct value *
2158i386_frame_prev_register (struct frame_info *this_frame, void **this_cache,
2159 int regnum)
acd5c798 2160{
10458914 2161 struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
acd5c798
MK
2162
2163 gdb_assert (regnum >= 0);
2164
2165 /* The System V ABI says that:
2166
2167 "The flags register contains the system flags, such as the
2168 direction flag and the carry flag. The direction flag must be
2169 set to the forward (that is, zero) direction before entry and
2170 upon exit from a function. Other user flags have no specified
2171 role in the standard calling sequence and are not preserved."
2172
2173 To guarantee the "upon exit" part of that statement we fake a
2174 saved flags register that has its direction flag cleared.
2175
2176 Note that GCC doesn't seem to rely on the fact that the direction
2177 flag is cleared after a function return; it always explicitly
2178 clears the flag before operations where it matters.
2179
2180 FIXME: kettenis/20030316: I'm not quite sure whether this is the
2181 right thing to do. The way we fake the flags register here makes
2182 it impossible to change it. */
2183
2184 if (regnum == I386_EFLAGS_REGNUM)
2185 {
10458914 2186 ULONGEST val;
c5aa993b 2187
10458914
DJ
2188 val = get_frame_register_unsigned (this_frame, regnum);
2189 val &= ~(1 << 10);
2190 return frame_unwind_got_constant (this_frame, regnum, val);
acd5c798 2191 }
1211c4e4 2192
acd5c798 2193 if (regnum == I386_EIP_REGNUM && cache->pc_in_eax)
10458914 2194 return frame_unwind_got_register (this_frame, regnum, I386_EAX_REGNUM);
acd5c798 2195
fcf250e2
UW
2196 if (regnum == I386_ESP_REGNUM
2197 && (cache->saved_sp != 0 || cache->saved_sp_reg != -1))
8fbca658
PA
2198 {
2199 /* If the SP has been saved, but we don't know where, then this
2200 means that SAVED_SP_REG register was found unavailable back
2201 when we built the cache. */
fcf250e2 2202 if (cache->saved_sp == 0)
8fbca658
PA
2203 return frame_unwind_got_register (this_frame, regnum,
2204 cache->saved_sp_reg);
2205 else
2206 return frame_unwind_got_constant (this_frame, regnum,
2207 cache->saved_sp);
2208 }
acd5c798 2209
fd13a04a 2210 if (regnum < I386_NUM_SAVED_REGS && cache->saved_regs[regnum] != -1)
10458914
DJ
2211 return frame_unwind_got_memory (this_frame, regnum,
2212 cache->saved_regs[regnum]);
fd13a04a 2213
10458914 2214 return frame_unwind_got_register (this_frame, regnum, regnum);
acd5c798
MK
2215}
2216
2217static const struct frame_unwind i386_frame_unwind =
2218{
2219 NORMAL_FRAME,
8fbca658 2220 i386_frame_unwind_stop_reason,
acd5c798 2221 i386_frame_this_id,
10458914
DJ
2222 i386_frame_prev_register,
2223 NULL,
2224 default_frame_sniffer
acd5c798 2225};
06da04c6
MS
2226
2227/* Normal frames, but in a function epilogue. */
2228
c9cf6e20
MG
2229/* Implement the stack_frame_destroyed_p gdbarch method.
2230
2231 The epilogue is defined here as the 'ret' instruction, which will
06da04c6
MS
2232 follow any instruction such as 'leave' or 'pop %ebp' that destroys
2233 the function's stack frame. */
2234
2235static int
c9cf6e20 2236i386_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
06da04c6
MS
2237{
2238 gdb_byte insn;
43f3e411 2239 struct compunit_symtab *cust;
e0d00bc7 2240
43f3e411
DE
2241 cust = find_pc_compunit_symtab (pc);
2242 if (cust != NULL && COMPUNIT_EPILOGUE_UNWIND_VALID (cust))
e0d00bc7 2243 return 0;
06da04c6
MS
2244
2245 if (target_read_memory (pc, &insn, 1))
2246 return 0; /* Can't read memory at pc. */
2247
2248 if (insn != 0xc3) /* 'ret' instruction. */
2249 return 0;
2250
2251 return 1;
2252}
2253
2254static int
2255i386_epilogue_frame_sniffer (const struct frame_unwind *self,
2256 struct frame_info *this_frame,
2257 void **this_prologue_cache)
2258{
2259 if (frame_relative_level (this_frame) == 0)
c9cf6e20
MG
2260 return i386_stack_frame_destroyed_p (get_frame_arch (this_frame),
2261 get_frame_pc (this_frame));
06da04c6
MS
2262 else
2263 return 0;
2264}
2265
2266static struct i386_frame_cache *
2267i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
2268{
06da04c6 2269 struct i386_frame_cache *cache;
0d6c2135 2270 CORE_ADDR sp;
06da04c6
MS
2271
2272 if (*this_cache)
9a3c8263 2273 return (struct i386_frame_cache *) *this_cache;
06da04c6
MS
2274
2275 cache = i386_alloc_frame_cache ();
2276 *this_cache = cache;
2277
a70b8144 2278 try
8fbca658 2279 {
0d6c2135 2280 cache->pc = get_frame_func (this_frame);
06da04c6 2281
0d6c2135
MK
2282 /* At this point the stack looks as if we just entered the
2283 function, with the return address at the top of the
2284 stack. */
2285 sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM);
2286 cache->base = sp + cache->sp_offset;
8fbca658 2287 cache->saved_sp = cache->base + 8;
8fbca658 2288 cache->saved_regs[I386_EIP_REGNUM] = cache->base + 4;
06da04c6 2289
8fbca658
PA
2290 cache->base_p = 1;
2291 }
230d2906 2292 catch (const gdb_exception_error &ex)
7556d4a4
PA
2293 {
2294 if (ex.error != NOT_AVAILABLE_ERROR)
eedc3f4f 2295 throw;
7556d4a4 2296 }
06da04c6
MS
2297
2298 return cache;
2299}
2300
8fbca658
PA
2301static enum unwind_stop_reason
2302i386_epilogue_frame_unwind_stop_reason (struct frame_info *this_frame,
2303 void **this_cache)
2304{
0d6c2135
MK
2305 struct i386_frame_cache *cache =
2306 i386_epilogue_frame_cache (this_frame, this_cache);
8fbca658
PA
2307
2308 if (!cache->base_p)
2309 return UNWIND_UNAVAILABLE;
2310
2311 return UNWIND_NO_REASON;
2312}
2313
06da04c6
MS
2314static void
2315i386_epilogue_frame_this_id (struct frame_info *this_frame,
2316 void **this_cache,
2317 struct frame_id *this_id)
2318{
0d6c2135
MK
2319 struct i386_frame_cache *cache =
2320 i386_epilogue_frame_cache (this_frame, this_cache);
06da04c6 2321
8fbca658 2322 if (!cache->base_p)
5ce0145d
PA
2323 (*this_id) = frame_id_build_unavailable_stack (cache->pc);
2324 else
2325 (*this_id) = frame_id_build (cache->base + 8, cache->pc);
06da04c6
MS
2326}
2327
0d6c2135
MK
2328static struct value *
2329i386_epilogue_frame_prev_register (struct frame_info *this_frame,
2330 void **this_cache, int regnum)
2331{
2332 /* Make sure we've initialized the cache. */
2333 i386_epilogue_frame_cache (this_frame, this_cache);
2334
2335 return i386_frame_prev_register (this_frame, this_cache, regnum);
2336}
2337
06da04c6
MS
2338static const struct frame_unwind i386_epilogue_frame_unwind =
2339{
2340 NORMAL_FRAME,
8fbca658 2341 i386_epilogue_frame_unwind_stop_reason,
06da04c6 2342 i386_epilogue_frame_this_id,
0d6c2135 2343 i386_epilogue_frame_prev_register,
06da04c6
MS
2344 NULL,
2345 i386_epilogue_frame_sniffer
2346};
acd5c798
MK
2347\f
2348
a3fcb948
JG
2349/* Stack-based trampolines. */
2350
2351/* These trampolines are used on cross x86 targets, when taking the
2352 address of a nested function. When executing these trampolines,
2353 no stack frame is set up, so we are in a similar situation as in
2354 epilogues and i386_epilogue_frame_this_id can be re-used. */
2355
2356/* Static chain passed in register. */
2357
2358struct i386_insn i386_tramp_chain_in_reg_insns[] =
2359{
2360 /* `movl imm32, %eax' and `movl imm32, %ecx' */
2361 { 5, { 0xb8 }, { 0xfe } },
2362
2363 /* `jmp imm32' */
2364 { 5, { 0xe9 }, { 0xff } },
2365
2366 {0}
2367};
2368
2369/* Static chain passed on stack (when regparm=3). */
2370
2371struct i386_insn i386_tramp_chain_on_stack_insns[] =
2372{
2373 /* `push imm32' */
2374 { 5, { 0x68 }, { 0xff } },
2375
2376 /* `jmp imm32' */
2377 { 5, { 0xe9 }, { 0xff } },
2378
2379 {0}
2380};
2381
2382/* Return whether PC points inside a stack trampoline. */
2383
2384static int
6df81a63 2385i386_in_stack_tramp_p (CORE_ADDR pc)
a3fcb948
JG
2386{
2387 gdb_byte insn;
2c02bd72 2388 const char *name;
a3fcb948
JG
2389
2390 /* A stack trampoline is detected if no name is associated
2391 to the current pc and if it points inside a trampoline
2392 sequence. */
2393
2394 find_pc_partial_function (pc, &name, NULL, NULL);
2395 if (name)
2396 return 0;
2397
2398 if (target_read_memory (pc, &insn, 1))
2399 return 0;
2400
2401 if (!i386_match_insn_block (pc, i386_tramp_chain_in_reg_insns)
2402 && !i386_match_insn_block (pc, i386_tramp_chain_on_stack_insns))
2403 return 0;
2404
2405 return 1;
2406}
2407
2408static int
2409i386_stack_tramp_frame_sniffer (const struct frame_unwind *self,
0d6c2135
MK
2410 struct frame_info *this_frame,
2411 void **this_cache)
a3fcb948
JG
2412{
2413 if (frame_relative_level (this_frame) == 0)
6df81a63 2414 return i386_in_stack_tramp_p (get_frame_pc (this_frame));
a3fcb948
JG
2415 else
2416 return 0;
2417}
2418
2419static const struct frame_unwind i386_stack_tramp_frame_unwind =
2420{
2421 NORMAL_FRAME,
2422 i386_epilogue_frame_unwind_stop_reason,
2423 i386_epilogue_frame_this_id,
0d6c2135 2424 i386_epilogue_frame_prev_register,
a3fcb948
JG
2425 NULL,
2426 i386_stack_tramp_frame_sniffer
2427};
2428\f
6710bf39
SS
2429/* Generate a bytecode expression to get the value of the saved PC. */
2430
2431static void
2432i386_gen_return_address (struct gdbarch *gdbarch,
2433 struct agent_expr *ax, struct axs_value *value,
2434 CORE_ADDR scope)
2435{
2436 /* The following sequence assumes the traditional use of the base
2437 register. */
2438 ax_reg (ax, I386_EBP_REGNUM);
2439 ax_const_l (ax, 4);
2440 ax_simple (ax, aop_add);
2441 value->type = register_type (gdbarch, I386_EIP_REGNUM);
2442 value->kind = axs_lvalue_memory;
2443}
2444\f
a3fcb948 2445
acd5c798
MK
2446/* Signal trampolines. */
2447
2448static struct i386_frame_cache *
10458914 2449i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
acd5c798 2450{
e17a4113
UW
2451 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2452 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2453 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
acd5c798 2454 struct i386_frame_cache *cache;
acd5c798 2455 CORE_ADDR addr;
63c0089f 2456 gdb_byte buf[4];
acd5c798
MK
2457
2458 if (*this_cache)
9a3c8263 2459 return (struct i386_frame_cache *) *this_cache;
acd5c798 2460
fd13a04a 2461 cache = i386_alloc_frame_cache ();
acd5c798 2462
a70b8144 2463 try
a3386186 2464 {
8fbca658
PA
2465 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
2466 cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4;
a3386186 2467
8fbca658
PA
2468 addr = tdep->sigcontext_addr (this_frame);
2469 if (tdep->sc_reg_offset)
2470 {
2471 int i;
a3386186 2472
8fbca658
PA
2473 gdb_assert (tdep->sc_num_regs <= I386_NUM_SAVED_REGS);
2474
2475 for (i = 0; i < tdep->sc_num_regs; i++)
2476 if (tdep->sc_reg_offset[i] != -1)
2477 cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
2478 }
2479 else
2480 {
2481 cache->saved_regs[I386_EIP_REGNUM] = addr + tdep->sc_pc_offset;
2482 cache->saved_regs[I386_ESP_REGNUM] = addr + tdep->sc_sp_offset;
2483 }
2484
2485 cache->base_p = 1;
a3386186 2486 }
230d2906 2487 catch (const gdb_exception_error &ex)
7556d4a4
PA
2488 {
2489 if (ex.error != NOT_AVAILABLE_ERROR)
eedc3f4f 2490 throw;
7556d4a4 2491 }
acd5c798
MK
2492
2493 *this_cache = cache;
2494 return cache;
2495}
2496
8fbca658
PA
2497static enum unwind_stop_reason
2498i386_sigtramp_frame_unwind_stop_reason (struct frame_info *this_frame,
2499 void **this_cache)
2500{
2501 struct i386_frame_cache *cache =
2502 i386_sigtramp_frame_cache (this_frame, this_cache);
2503
2504 if (!cache->base_p)
2505 return UNWIND_UNAVAILABLE;
2506
2507 return UNWIND_NO_REASON;
2508}
2509
acd5c798 2510static void
10458914 2511i386_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
acd5c798
MK
2512 struct frame_id *this_id)
2513{
2514 struct i386_frame_cache *cache =
10458914 2515 i386_sigtramp_frame_cache (this_frame, this_cache);
acd5c798 2516
8fbca658 2517 if (!cache->base_p)
5ce0145d
PA
2518 (*this_id) = frame_id_build_unavailable_stack (get_frame_pc (this_frame));
2519 else
2520 {
2521 /* See the end of i386_push_dummy_call. */
2522 (*this_id) = frame_id_build (cache->base + 8, get_frame_pc (this_frame));
2523 }
acd5c798
MK
2524}
2525
10458914
DJ
2526static struct value *
2527i386_sigtramp_frame_prev_register (struct frame_info *this_frame,
2528 void **this_cache, int regnum)
acd5c798
MK
2529{
2530 /* Make sure we've initialized the cache. */
10458914 2531 i386_sigtramp_frame_cache (this_frame, this_cache);
acd5c798 2532
10458914 2533 return i386_frame_prev_register (this_frame, this_cache, regnum);
c906108c 2534}
c0d1d883 2535
10458914
DJ
2536static int
2537i386_sigtramp_frame_sniffer (const struct frame_unwind *self,
2538 struct frame_info *this_frame,
2539 void **this_prologue_cache)
acd5c798 2540{
10458914 2541 struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
acd5c798 2542
911bc6ee
MK
2543 /* We shouldn't even bother if we don't have a sigcontext_addr
2544 handler. */
2545 if (tdep->sigcontext_addr == NULL)
10458914 2546 return 0;
1c3545ae 2547
911bc6ee
MK
2548 if (tdep->sigtramp_p != NULL)
2549 {
10458914
DJ
2550 if (tdep->sigtramp_p (this_frame))
2551 return 1;
911bc6ee
MK
2552 }
2553
2554 if (tdep->sigtramp_start != 0)
2555 {
10458914 2556 CORE_ADDR pc = get_frame_pc (this_frame);
911bc6ee
MK
2557
2558 gdb_assert (tdep->sigtramp_end != 0);
2559 if (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end)
10458914 2560 return 1;
911bc6ee 2561 }
acd5c798 2562
10458914 2563 return 0;
acd5c798 2564}
10458914
DJ
2565
2566static const struct frame_unwind i386_sigtramp_frame_unwind =
2567{
2568 SIGTRAMP_FRAME,
8fbca658 2569 i386_sigtramp_frame_unwind_stop_reason,
10458914
DJ
2570 i386_sigtramp_frame_this_id,
2571 i386_sigtramp_frame_prev_register,
2572 NULL,
2573 i386_sigtramp_frame_sniffer
2574};
acd5c798
MK
2575\f
2576
2577static CORE_ADDR
10458914 2578i386_frame_base_address (struct frame_info *this_frame, void **this_cache)
acd5c798 2579{
10458914 2580 struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
acd5c798
MK
2581
2582 return cache->base;
2583}
2584
2585static const struct frame_base i386_frame_base =
2586{
2587 &i386_frame_unwind,
2588 i386_frame_base_address,
2589 i386_frame_base_address,
2590 i386_frame_base_address
2591};
2592
acd5c798 2593static struct frame_id
10458914 2594i386_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
acd5c798 2595{
acd5c798
MK
2596 CORE_ADDR fp;
2597
10458914 2598 fp = get_frame_register_unsigned (this_frame, I386_EBP_REGNUM);
acd5c798 2599
3e210248 2600 /* See the end of i386_push_dummy_call. */
10458914 2601 return frame_id_build (fp + 8, get_frame_pc (this_frame));
c0d1d883 2602}
e04e5beb
JM
2603
2604/* _Decimal128 function return values need 16-byte alignment on the
2605 stack. */
2606
2607static CORE_ADDR
2608i386_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
2609{
2610 return sp & -(CORE_ADDR)16;
2611}
fc338970 2612\f
c906108c 2613
fc338970
MK
2614/* Figure out where the longjmp will land. Slurp the args out of the
2615 stack. We expect the first arg to be a pointer to the jmp_buf
8201327c 2616 structure from which we extract the address that we will land at.
28bcfd30 2617 This address is copied into PC. This routine returns non-zero on
436675d3 2618 success. */
c906108c 2619
8201327c 2620static int
60ade65d 2621i386_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
c906108c 2622{
436675d3 2623 gdb_byte buf[4];
c906108c 2624 CORE_ADDR sp, jb_addr;
20a6ec49 2625 struct gdbarch *gdbarch = get_frame_arch (frame);
e17a4113 2626 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
20a6ec49 2627 int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset;
c906108c 2628
8201327c
MK
2629 /* If JB_PC_OFFSET is -1, we have no way to find out where the
2630 longjmp will land. */
2631 if (jb_pc_offset == -1)
c906108c
SS
2632 return 0;
2633
436675d3 2634 get_frame_register (frame, I386_ESP_REGNUM, buf);
e17a4113 2635 sp = extract_unsigned_integer (buf, 4, byte_order);
436675d3 2636 if (target_read_memory (sp + 4, buf, 4))
c906108c
SS
2637 return 0;
2638
e17a4113 2639 jb_addr = extract_unsigned_integer (buf, 4, byte_order);
436675d3 2640 if (target_read_memory (jb_addr + jb_pc_offset, buf, 4))
8201327c 2641 return 0;
c906108c 2642
e17a4113 2643 *pc = extract_unsigned_integer (buf, 4, byte_order);
c906108c
SS
2644 return 1;
2645}
fc338970 2646\f
c906108c 2647
7ccc1c74
JM
2648/* Check whether TYPE must be 16-byte-aligned when passed as a
2649 function argument. 16-byte vectors, _Decimal128 and structures or
2650 unions containing such types must be 16-byte-aligned; other
2651 arguments are 4-byte-aligned. */
2652
2653static int
2654i386_16_byte_align_p (struct type *type)
2655{
2656 type = check_typedef (type);
78134374 2657 if ((type->code () == TYPE_CODE_DECFLOAT
bd63c870 2658 || (type->code () == TYPE_CODE_ARRAY && type->is_vector ()))
7ccc1c74
JM
2659 && TYPE_LENGTH (type) == 16)
2660 return 1;
78134374 2661 if (type->code () == TYPE_CODE_ARRAY)
7ccc1c74 2662 return i386_16_byte_align_p (TYPE_TARGET_TYPE (type));
78134374
SM
2663 if (type->code () == TYPE_CODE_STRUCT
2664 || type->code () == TYPE_CODE_UNION)
7ccc1c74
JM
2665 {
2666 int i;
1f704f76 2667 for (i = 0; i < type->num_fields (); i++)
7ccc1c74 2668 {
940da03e 2669 if (i386_16_byte_align_p (type->field (i).type ()))
7ccc1c74
JM
2670 return 1;
2671 }
2672 }
2673 return 0;
2674}
2675
a9b8d892
JK
2676/* Implementation for set_gdbarch_push_dummy_code. */
2677
2678static CORE_ADDR
2679i386_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, CORE_ADDR funaddr,
2680 struct value **args, int nargs, struct type *value_type,
2681 CORE_ADDR *real_pc, CORE_ADDR *bp_addr,
2682 struct regcache *regcache)
2683{
2684 /* Use 0xcc breakpoint - 1 byte. */
2685 *bp_addr = sp - 1;
2686 *real_pc = funaddr;
2687
2688 /* Keep the stack aligned. */
2689 return sp - 16;
2690}
2691
627c7fb8
HD
2692/* The "push_dummy_call" gdbarch method, optionally with the thiscall
2693 calling convention. */
2694
2695CORE_ADDR
2696i386_thiscall_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
2697 struct regcache *regcache, CORE_ADDR bp_addr,
2698 int nargs, struct value **args, CORE_ADDR sp,
2699 function_call_return_method return_method,
2700 CORE_ADDR struct_addr, bool thiscall)
22f8ba57 2701{
e17a4113 2702 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 2703 gdb_byte buf[4];
acd5c798 2704 int i;
7ccc1c74
JM
2705 int write_pass;
2706 int args_space = 0;
acd5c798 2707
4a612d6f
WT
2708 /* BND registers can be in arbitrary values at the moment of the
2709 inferior call. This can cause boundary violations that are not
2710 due to a real bug or even desired by the user. The best to be done
2711 is set the BND registers to allow access to the whole memory, INIT
2712 state, before pushing the inferior call. */
2713 i387_reset_bnd_regs (gdbarch, regcache);
2714
7ccc1c74
JM
2715 /* Determine the total space required for arguments and struct
2716 return address in a first pass (allowing for 16-byte-aligned
2717 arguments), then push arguments in a second pass. */
2718
2719 for (write_pass = 0; write_pass < 2; write_pass++)
22f8ba57 2720 {
7ccc1c74 2721 int args_space_used = 0;
7ccc1c74 2722
cf84fa6b 2723 if (return_method == return_method_struct)
7ccc1c74
JM
2724 {
2725 if (write_pass)
2726 {
2727 /* Push value address. */
e17a4113 2728 store_unsigned_integer (buf, 4, byte_order, struct_addr);
7ccc1c74
JM
2729 write_memory (sp, buf, 4);
2730 args_space_used += 4;
2731 }
2732 else
2733 args_space += 4;
2734 }
2735
627c7fb8 2736 for (i = thiscall ? 1 : 0; i < nargs; i++)
7ccc1c74
JM
2737 {
2738 int len = TYPE_LENGTH (value_enclosing_type (args[i]));
acd5c798 2739
7ccc1c74
JM
2740 if (write_pass)
2741 {
2742 if (i386_16_byte_align_p (value_enclosing_type (args[i])))
2743 args_space_used = align_up (args_space_used, 16);
acd5c798 2744
7ccc1c74
JM
2745 write_memory (sp + args_space_used,
2746 value_contents_all (args[i]), len);
2747 /* The System V ABI says that:
acd5c798 2748
7ccc1c74
JM
2749 "An argument's size is increased, if necessary, to make it a
2750 multiple of [32-bit] words. This may require tail padding,
2751 depending on the size of the argument."
22f8ba57 2752
7ccc1c74
JM
2753 This makes sure the stack stays word-aligned. */
2754 args_space_used += align_up (len, 4);
2755 }
2756 else
2757 {
2758 if (i386_16_byte_align_p (value_enclosing_type (args[i])))
284c5a60 2759 args_space = align_up (args_space, 16);
7ccc1c74
JM
2760 args_space += align_up (len, 4);
2761 }
2762 }
2763
2764 if (!write_pass)
2765 {
7ccc1c74 2766 sp -= args_space;
284c5a60
MK
2767
2768 /* The original System V ABI only requires word alignment,
2769 but modern incarnations need 16-byte alignment in order
2770 to support SSE. Since wasting a few bytes here isn't
2771 harmful we unconditionally enforce 16-byte alignment. */
2772 sp &= ~0xf;
7ccc1c74 2773 }
22f8ba57
MK
2774 }
2775
acd5c798
MK
2776 /* Store return address. */
2777 sp -= 4;
e17a4113 2778 store_unsigned_integer (buf, 4, byte_order, bp_addr);
acd5c798
MK
2779 write_memory (sp, buf, 4);
2780
2781 /* Finally, update the stack pointer... */
e17a4113 2782 store_unsigned_integer (buf, 4, byte_order, sp);
b66f5587 2783 regcache->cooked_write (I386_ESP_REGNUM, buf);
acd5c798
MK
2784
2785 /* ...and fake a frame pointer. */
b66f5587 2786 regcache->cooked_write (I386_EBP_REGNUM, buf);
acd5c798 2787
627c7fb8
HD
2788 /* The 'this' pointer needs to be in ECX. */
2789 if (thiscall)
2790 regcache->cooked_write (I386_ECX_REGNUM, value_contents_all (args[0]));
2791
3e210248
AC
2792 /* MarkK wrote: This "+ 8" is all over the place:
2793 (i386_frame_this_id, i386_sigtramp_frame_this_id,
10458914 2794 i386_dummy_id). It's there, since all frame unwinders for
3e210248 2795 a given target have to agree (within a certain margin) on the
a45ae3ed
UW
2796 definition of the stack address of a frame. Otherwise frame id
2797 comparison might not work correctly. Since DWARF2/GCC uses the
3e210248
AC
2798 stack address *before* the function call as a frame's CFA. On
2799 the i386, when %ebp is used as a frame pointer, the offset
2800 between the contents %ebp and the CFA as defined by GCC. */
2801 return sp + 8;
22f8ba57
MK
2802}
2803
627c7fb8
HD
2804/* Implement the "push_dummy_call" gdbarch method. */
2805
2806static CORE_ADDR
2807i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
2808 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
2809 struct value **args, CORE_ADDR sp,
2810 function_call_return_method return_method,
2811 CORE_ADDR struct_addr)
2812{
2813 return i386_thiscall_push_dummy_call (gdbarch, function, regcache, bp_addr,
2814 nargs, args, sp, return_method,
2815 struct_addr, false);
2816}
2817
1a309862
MK
2818/* These registers are used for returning integers (and on some
2819 targets also for returning `struct' and `union' values when their
ef9dff19 2820 size and alignment match an integer type). */
acd5c798
MK
2821#define LOW_RETURN_REGNUM I386_EAX_REGNUM /* %eax */
2822#define HIGH_RETURN_REGNUM I386_EDX_REGNUM /* %edx */
1a309862 2823
c5e656c1
MK
2824/* Read, for architecture GDBARCH, a function return value of TYPE
2825 from REGCACHE, and copy that into VALBUF. */
1a309862 2826
3a1e71e3 2827static void
c5e656c1 2828i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
63c0089f 2829 struct regcache *regcache, gdb_byte *valbuf)
c906108c 2830{
c5e656c1 2831 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1a309862 2832 int len = TYPE_LENGTH (type);
63c0089f 2833 gdb_byte buf[I386_MAX_REGISTER_SIZE];
1a309862 2834
78134374 2835 if (type->code () == TYPE_CODE_FLT)
c906108c 2836 {
5716833c 2837 if (tdep->st0_regnum < 0)
1a309862 2838 {
8a3fe4f8 2839 warning (_("Cannot find floating-point return value."));
1a309862 2840 memset (valbuf, 0, len);
ef9dff19 2841 return;
1a309862
MK
2842 }
2843
c6ba6f0d
MK
2844 /* Floating-point return values can be found in %st(0). Convert
2845 its contents to the desired type. This is probably not
2846 exactly how it would happen on the target itself, but it is
2847 the best we can do. */
0b883586 2848 regcache->raw_read (I386_ST0_REGNUM, buf);
3b2ca824 2849 target_float_convert (buf, i387_ext_type (gdbarch), valbuf, type);
c906108c
SS
2850 }
2851 else
c5aa993b 2852 {
875f8d0e
UW
2853 int low_size = register_size (gdbarch, LOW_RETURN_REGNUM);
2854 int high_size = register_size (gdbarch, HIGH_RETURN_REGNUM);
d4f3574e
SS
2855
2856 if (len <= low_size)
00f8375e 2857 {
0b883586 2858 regcache->raw_read (LOW_RETURN_REGNUM, buf);
00f8375e
MK
2859 memcpy (valbuf, buf, len);
2860 }
d4f3574e
SS
2861 else if (len <= (low_size + high_size))
2862 {
0b883586 2863 regcache->raw_read (LOW_RETURN_REGNUM, buf);
00f8375e 2864 memcpy (valbuf, buf, low_size);
0b883586 2865 regcache->raw_read (HIGH_RETURN_REGNUM, buf);
63c0089f 2866 memcpy (valbuf + low_size, buf, len - low_size);
d4f3574e
SS
2867 }
2868 else
8e65ff28 2869 internal_error (__FILE__, __LINE__,
1777feb0
MS
2870 _("Cannot extract return value of %d bytes long."),
2871 len);
c906108c
SS
2872 }
2873}
2874
c5e656c1
MK
2875/* Write, for architecture GDBARCH, a function return value of TYPE
2876 from VALBUF into REGCACHE. */
ef9dff19 2877
3a1e71e3 2878static void
c5e656c1 2879i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
63c0089f 2880 struct regcache *regcache, const gdb_byte *valbuf)
ef9dff19 2881{
c5e656c1 2882 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
ef9dff19
MK
2883 int len = TYPE_LENGTH (type);
2884
78134374 2885 if (type->code () == TYPE_CODE_FLT)
ef9dff19 2886 {
3d7f4f49 2887 ULONGEST fstat;
63c0089f 2888 gdb_byte buf[I386_MAX_REGISTER_SIZE];
ccb945b8 2889
5716833c 2890 if (tdep->st0_regnum < 0)
ef9dff19 2891 {
8a3fe4f8 2892 warning (_("Cannot set floating-point return value."));
ef9dff19
MK
2893 return;
2894 }
2895
635b0cc1
MK
2896 /* Returning floating-point values is a bit tricky. Apart from
2897 storing the return value in %st(0), we have to simulate the
2898 state of the FPU at function return point. */
2899
c6ba6f0d
MK
2900 /* Convert the value found in VALBUF to the extended
2901 floating-point format used by the FPU. This is probably
2902 not exactly how it would happen on the target itself, but
2903 it is the best we can do. */
3b2ca824 2904 target_float_convert (valbuf, type, buf, i387_ext_type (gdbarch));
10eaee5f 2905 regcache->raw_write (I386_ST0_REGNUM, buf);
ccb945b8 2906
635b0cc1
MK
2907 /* Set the top of the floating-point register stack to 7. The
2908 actual value doesn't really matter, but 7 is what a normal
2909 function return would end up with if the program started out
2910 with a freshly initialized FPU. */
20a6ec49 2911 regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
ccb945b8 2912 fstat |= (7 << 11);
20a6ec49 2913 regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat);
ccb945b8 2914
635b0cc1
MK
2915 /* Mark %st(1) through %st(7) as empty. Since we set the top of
2916 the floating-point register stack to 7, the appropriate value
2917 for the tag word is 0x3fff. */
20a6ec49 2918 regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff);
ef9dff19
MK
2919 }
2920 else
2921 {
875f8d0e
UW
2922 int low_size = register_size (gdbarch, LOW_RETURN_REGNUM);
2923 int high_size = register_size (gdbarch, HIGH_RETURN_REGNUM);
ef9dff19
MK
2924
2925 if (len <= low_size)
4f0420fd 2926 regcache->raw_write_part (LOW_RETURN_REGNUM, 0, len, valbuf);
ef9dff19
MK
2927 else if (len <= (low_size + high_size))
2928 {
10eaee5f 2929 regcache->raw_write (LOW_RETURN_REGNUM, valbuf);
4f0420fd
SM
2930 regcache->raw_write_part (HIGH_RETURN_REGNUM, 0, len - low_size,
2931 valbuf + low_size);
ef9dff19
MK
2932 }
2933 else
8e65ff28 2934 internal_error (__FILE__, __LINE__,
e2e0b3e5 2935 _("Cannot store return value of %d bytes long."), len);
ef9dff19
MK
2936 }
2937}
fc338970 2938\f
ef9dff19 2939
8201327c
MK
2940/* This is the variable that is set with "set struct-convention", and
2941 its legitimate values. */
2942static const char default_struct_convention[] = "default";
2943static const char pcc_struct_convention[] = "pcc";
2944static const char reg_struct_convention[] = "reg";
40478521 2945static const char *const valid_conventions[] =
8201327c
MK
2946{
2947 default_struct_convention,
2948 pcc_struct_convention,
2949 reg_struct_convention,
2950 NULL
2951};
2952static const char *struct_convention = default_struct_convention;
2953
0e4377e1
JB
2954/* Return non-zero if TYPE, which is assumed to be a structure,
2955 a union type, or an array type, should be returned in registers
2956 for architecture GDBARCH. */
c5e656c1 2957
8201327c 2958static int
c5e656c1 2959i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
8201327c 2960{
c5e656c1 2961 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
78134374 2962 enum type_code code = type->code ();
c5e656c1 2963 int len = TYPE_LENGTH (type);
8201327c 2964
0e4377e1
JB
2965 gdb_assert (code == TYPE_CODE_STRUCT
2966 || code == TYPE_CODE_UNION
2967 || code == TYPE_CODE_ARRAY);
c5e656c1
MK
2968
2969 if (struct_convention == pcc_struct_convention
2970 || (struct_convention == default_struct_convention
2971 && tdep->struct_return == pcc_struct_return))
2972 return 0;
2973
9edde48e
MK
2974 /* Structures consisting of a single `float', `double' or 'long
2975 double' member are returned in %st(0). */
1f704f76 2976 if (code == TYPE_CODE_STRUCT && type->num_fields () == 1)
9edde48e 2977 {
940da03e 2978 type = check_typedef (type->field (0).type ());
78134374 2979 if (type->code () == TYPE_CODE_FLT)
9edde48e
MK
2980 return (len == 4 || len == 8 || len == 12);
2981 }
2982
c5e656c1
MK
2983 return (len == 1 || len == 2 || len == 4 || len == 8);
2984}
2985
2986/* Determine, for architecture GDBARCH, how a return value of TYPE
2987 should be returned. If it is supposed to be returned in registers,
2988 and READBUF is non-zero, read the appropriate value from REGCACHE,
2989 and copy it into READBUF. If WRITEBUF is non-zero, write the value
2990 from WRITEBUF into REGCACHE. */
2991
2992static enum return_value_convention
6a3a010b 2993i386_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
2994 struct type *type, struct regcache *regcache,
2995 gdb_byte *readbuf, const gdb_byte *writebuf)
c5e656c1 2996{
78134374 2997 enum type_code code = type->code ();
c5e656c1 2998
5daa78cc
TJB
2999 if (((code == TYPE_CODE_STRUCT
3000 || code == TYPE_CODE_UNION
3001 || code == TYPE_CODE_ARRAY)
3002 && !i386_reg_struct_return_p (gdbarch, type))
405feb71 3003 /* Complex double and long double uses the struct return convention. */
2445fd7b
MK
3004 || (code == TYPE_CODE_COMPLEX && TYPE_LENGTH (type) == 16)
3005 || (code == TYPE_CODE_COMPLEX && TYPE_LENGTH (type) == 24)
5daa78cc
TJB
3006 /* 128-bit decimal float uses the struct return convention. */
3007 || (code == TYPE_CODE_DECFLOAT && TYPE_LENGTH (type) == 16))
31db7b6c
MK
3008 {
3009 /* The System V ABI says that:
3010
3011 "A function that returns a structure or union also sets %eax
3012 to the value of the original address of the caller's area
3013 before it returns. Thus when the caller receives control
3014 again, the address of the returned object resides in register
3015 %eax and can be used to access the object."
3016
3017 So the ABI guarantees that we can always find the return
3018 value just after the function has returned. */
3019
0e4377e1
JB
3020 /* Note that the ABI doesn't mention functions returning arrays,
3021 which is something possible in certain languages such as Ada.
3022 In this case, the value is returned as if it was wrapped in
3023 a record, so the convention applied to records also applies
3024 to arrays. */
3025
31db7b6c
MK
3026 if (readbuf)
3027 {
3028 ULONGEST addr;
3029
3030 regcache_raw_read_unsigned (regcache, I386_EAX_REGNUM, &addr);
3031 read_memory (addr, readbuf, TYPE_LENGTH (type));
3032 }
3033
3034 return RETURN_VALUE_ABI_RETURNS_ADDRESS;
3035 }
c5e656c1
MK
3036
3037 /* This special case is for structures consisting of a single
9edde48e
MK
3038 `float', `double' or 'long double' member. These structures are
3039 returned in %st(0). For these structures, we call ourselves
3040 recursively, changing TYPE into the type of the first member of
3041 the structure. Since that should work for all structures that
3042 have only one member, we don't bother to check the member's type
3043 here. */
1f704f76 3044 if (code == TYPE_CODE_STRUCT && type->num_fields () == 1)
c5e656c1 3045 {
940da03e 3046 type = check_typedef (type->field (0).type ());
6a3a010b 3047 return i386_return_value (gdbarch, function, type, regcache,
c055b101 3048 readbuf, writebuf);
c5e656c1
MK
3049 }
3050
3051 if (readbuf)
3052 i386_extract_return_value (gdbarch, type, regcache, readbuf);
3053 if (writebuf)
3054 i386_store_return_value (gdbarch, type, regcache, writebuf);
8201327c 3055
c5e656c1 3056 return RETURN_VALUE_REGISTER_CONVENTION;
8201327c
MK
3057}
3058\f
3059
27067745
UW
3060struct type *
3061i387_ext_type (struct gdbarch *gdbarch)
3062{
3063 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3064
3065 if (!tdep->i387_ext_type)
90884b2b
L
3066 {
3067 tdep->i387_ext_type = tdesc_find_type (gdbarch, "i387_ext");
3068 gdb_assert (tdep->i387_ext_type != NULL);
3069 }
27067745
UW
3070
3071 return tdep->i387_ext_type;
3072}
3073
1dbcd68c
WT
3074/* Construct type for pseudo BND registers. We can't use
3075 tdesc_find_type since a complement of one value has to be used
3076 to describe the upper bound. */
3077
3078static struct type *
3079i386_bnd_type (struct gdbarch *gdbarch)
3080{
3081 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3082
3083
3084 if (!tdep->i386_bnd_type)
3085 {
870f88f7 3086 struct type *t;
1dbcd68c
WT
3087 const struct builtin_type *bt = builtin_type (gdbarch);
3088
3089 /* The type we're building is described bellow: */
3090#if 0
3091 struct __bound128
3092 {
3093 void *lbound;
3094 void *ubound; /* One complement of raw ubound field. */
3095 };
3096#endif
3097
3098 t = arch_composite_type (gdbarch,
3099 "__gdb_builtin_type_bound128", TYPE_CODE_STRUCT);
3100
3101 append_composite_type_field (t, "lbound", bt->builtin_data_ptr);
3102 append_composite_type_field (t, "ubound", bt->builtin_data_ptr);
3103
d0e39ea2 3104 t->set_name ("builtin_type_bound128");
1dbcd68c
WT
3105 tdep->i386_bnd_type = t;
3106 }
3107
3108 return tdep->i386_bnd_type;
3109}
3110
01f9f808
MS
3111/* Construct vector type for pseudo ZMM registers. We can't use
3112 tdesc_find_type since ZMM isn't described in target description. */
3113
3114static struct type *
3115i386_zmm_type (struct gdbarch *gdbarch)
3116{
3117 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3118
3119 if (!tdep->i386_zmm_type)
3120 {
3121 const struct builtin_type *bt = builtin_type (gdbarch);
3122
3123 /* The type we're building is this: */
3124#if 0
3125 union __gdb_builtin_type_vec512i
3126 {
1347d111
FW
3127 int128_t v4_int128[4];
3128 int64_t v8_int64[8];
3129 int32_t v16_int32[16];
3130 int16_t v32_int16[32];
3131 int8_t v64_int8[64];
3132 double v8_double[8];
3133 float v16_float[16];
2a67f09d 3134 bfloat16_t v32_bfloat16[32];
01f9f808
MS
3135 };
3136#endif
3137
3138 struct type *t;
3139
3140 t = arch_composite_type (gdbarch,
3141 "__gdb_builtin_type_vec512i", TYPE_CODE_UNION);
2a67f09d
FW
3142 append_composite_type_field (t, "v32_bfloat16",
3143 init_vector_type (bt->builtin_bfloat16, 32));
01f9f808
MS
3144 append_composite_type_field (t, "v16_float",
3145 init_vector_type (bt->builtin_float, 16));
3146 append_composite_type_field (t, "v8_double",
3147 init_vector_type (bt->builtin_double, 8));
3148 append_composite_type_field (t, "v64_int8",
3149 init_vector_type (bt->builtin_int8, 64));
3150 append_composite_type_field (t, "v32_int16",
3151 init_vector_type (bt->builtin_int16, 32));
3152 append_composite_type_field (t, "v16_int32",
3153 init_vector_type (bt->builtin_int32, 16));
3154 append_composite_type_field (t, "v8_int64",
3155 init_vector_type (bt->builtin_int64, 8));
3156 append_composite_type_field (t, "v4_int128",
3157 init_vector_type (bt->builtin_int128, 4));
3158
2062087b 3159 t->set_is_vector (true);
d0e39ea2 3160 t->set_name ("builtin_type_vec512i");
01f9f808
MS
3161 tdep->i386_zmm_type = t;
3162 }
3163
3164 return tdep->i386_zmm_type;
3165}
3166
c131fcee
L
3167/* Construct vector type for pseudo YMM registers. We can't use
3168 tdesc_find_type since YMM isn't described in target description. */
3169
3170static struct type *
3171i386_ymm_type (struct gdbarch *gdbarch)
3172{
3173 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3174
3175 if (!tdep->i386_ymm_type)
3176 {
3177 const struct builtin_type *bt = builtin_type (gdbarch);
3178
3179 /* The type we're building is this: */
3180#if 0
3181 union __gdb_builtin_type_vec256i
3182 {
1347d111
FW
3183 int128_t v2_int128[2];
3184 int64_t v4_int64[4];
3185 int32_t v8_int32[8];
3186 int16_t v16_int16[16];
3187 int8_t v32_int8[32];
3188 double v4_double[4];
3189 float v8_float[8];
2a67f09d 3190 bfloat16_t v16_bfloat16[16];
c131fcee
L
3191 };
3192#endif
3193
3194 struct type *t;
3195
3196 t = arch_composite_type (gdbarch,
3197 "__gdb_builtin_type_vec256i", TYPE_CODE_UNION);
2a67f09d
FW
3198 append_composite_type_field (t, "v16_bfloat16",
3199 init_vector_type (bt->builtin_bfloat16, 16));
c131fcee
L
3200 append_composite_type_field (t, "v8_float",
3201 init_vector_type (bt->builtin_float, 8));
3202 append_composite_type_field (t, "v4_double",
3203 init_vector_type (bt->builtin_double, 4));
3204 append_composite_type_field (t, "v32_int8",
3205 init_vector_type (bt->builtin_int8, 32));
3206 append_composite_type_field (t, "v16_int16",
3207 init_vector_type (bt->builtin_int16, 16));
3208 append_composite_type_field (t, "v8_int32",
3209 init_vector_type (bt->builtin_int32, 8));
3210 append_composite_type_field (t, "v4_int64",
3211 init_vector_type (bt->builtin_int64, 4));
3212 append_composite_type_field (t, "v2_int128",
3213 init_vector_type (bt->builtin_int128, 2));
3214
2062087b 3215 t->set_is_vector (true);
d0e39ea2 3216 t->set_name ("builtin_type_vec256i");
c131fcee
L
3217 tdep->i386_ymm_type = t;
3218 }
3219
3220 return tdep->i386_ymm_type;
3221}
3222
794ac428 3223/* Construct vector type for MMX registers. */
90884b2b 3224static struct type *
794ac428
UW
3225i386_mmx_type (struct gdbarch *gdbarch)
3226{
3227 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3228
3229 if (!tdep->i386_mmx_type)
3230 {
df4df182
UW
3231 const struct builtin_type *bt = builtin_type (gdbarch);
3232
794ac428
UW
3233 /* The type we're building is this: */
3234#if 0
3235 union __gdb_builtin_type_vec64i
3236 {
3237 int64_t uint64;
3238 int32_t v2_int32[2];
3239 int16_t v4_int16[4];
3240 int8_t v8_int8[8];
3241 };
3242#endif
3243
3244 struct type *t;
3245
e9bb382b
UW
3246 t = arch_composite_type (gdbarch,
3247 "__gdb_builtin_type_vec64i", TYPE_CODE_UNION);
df4df182
UW
3248
3249 append_composite_type_field (t, "uint64", bt->builtin_int64);
794ac428 3250 append_composite_type_field (t, "v2_int32",
df4df182 3251 init_vector_type (bt->builtin_int32, 2));
794ac428 3252 append_composite_type_field (t, "v4_int16",
df4df182 3253 init_vector_type (bt->builtin_int16, 4));
794ac428 3254 append_composite_type_field (t, "v8_int8",
df4df182 3255 init_vector_type (bt->builtin_int8, 8));
794ac428 3256
2062087b 3257 t->set_is_vector (true);
d0e39ea2 3258 t->set_name ("builtin_type_vec64i");
794ac428
UW
3259 tdep->i386_mmx_type = t;
3260 }
3261
3262 return tdep->i386_mmx_type;
3263}
3264
d7a0d72c 3265/* Return the GDB type object for the "standard" data type of data in
1777feb0 3266 register REGNUM. */
d7a0d72c 3267
fff4548b 3268struct type *
90884b2b 3269i386_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
d7a0d72c 3270{
1dbcd68c
WT
3271 if (i386_bnd_regnum_p (gdbarch, regnum))
3272 return i386_bnd_type (gdbarch);
1ba53b71
L
3273 if (i386_mmx_regnum_p (gdbarch, regnum))
3274 return i386_mmx_type (gdbarch);
c131fcee
L
3275 else if (i386_ymm_regnum_p (gdbarch, regnum))
3276 return i386_ymm_type (gdbarch);
01f9f808
MS
3277 else if (i386_ymm_avx512_regnum_p (gdbarch, regnum))
3278 return i386_ymm_type (gdbarch);
3279 else if (i386_zmm_regnum_p (gdbarch, regnum))
3280 return i386_zmm_type (gdbarch);
1ba53b71
L
3281 else
3282 {
3283 const struct builtin_type *bt = builtin_type (gdbarch);
3284 if (i386_byte_regnum_p (gdbarch, regnum))
3285 return bt->builtin_int8;
3286 else if (i386_word_regnum_p (gdbarch, regnum))
3287 return bt->builtin_int16;
3288 else if (i386_dword_regnum_p (gdbarch, regnum))
3289 return bt->builtin_int32;
01f9f808
MS
3290 else if (i386_k_regnum_p (gdbarch, regnum))
3291 return bt->builtin_int64;
1ba53b71
L
3292 }
3293
3294 internal_error (__FILE__, __LINE__, _("invalid regnum"));
d7a0d72c
MK
3295}
3296
28fc6740 3297/* Map a cooked register onto a raw register or memory. For the i386,
acd5c798 3298 the MMX registers need to be mapped onto floating point registers. */
28fc6740
AC
3299
3300static int
849d0ba8 3301i386_mmx_regnum_to_fp_regnum (readable_regcache *regcache, int regnum)
28fc6740 3302{
ac7936df 3303 struct gdbarch_tdep *tdep = gdbarch_tdep (regcache->arch ());
5716833c 3304 int mmxreg, fpreg;
28fc6740
AC
3305 ULONGEST fstat;
3306 int tos;
c86c27af 3307
5716833c 3308 mmxreg = regnum - tdep->mm0_regnum;
03f50fc8 3309 regcache->raw_read (I387_FSTAT_REGNUM (tdep), &fstat);
28fc6740 3310 tos = (fstat >> 11) & 0x7;
5716833c
MK
3311 fpreg = (mmxreg + tos) % 8;
3312
20a6ec49 3313 return (I387_ST0_REGNUM (tdep) + fpreg);
28fc6740
AC
3314}
3315
3543a589
TT
3316/* A helper function for us by i386_pseudo_register_read_value and
3317 amd64_pseudo_register_read_value. It does all the work but reads
3318 the data into an already-allocated value. */
3319
3320void
3321i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
849d0ba8 3322 readable_regcache *regcache,
3543a589
TT
3323 int regnum,
3324 struct value *result_value)
28fc6740 3325{
975c21ab 3326 gdb_byte raw_buf[I386_MAX_REGISTER_SIZE];
05d1431c 3327 enum register_status status;
3543a589 3328 gdb_byte *buf = value_contents_raw (result_value);
1ba53b71 3329
5716833c 3330 if (i386_mmx_regnum_p (gdbarch, regnum))
28fc6740 3331 {
c86c27af
MK
3332 int fpnum = i386_mmx_regnum_to_fp_regnum (regcache, regnum);
3333
28fc6740 3334 /* Extract (always little endian). */
03f50fc8 3335 status = regcache->raw_read (fpnum, raw_buf);
05d1431c 3336 if (status != REG_VALID)
3543a589
TT
3337 mark_value_bytes_unavailable (result_value, 0,
3338 TYPE_LENGTH (value_type (result_value)));
3339 else
3340 memcpy (buf, raw_buf, register_size (gdbarch, regnum));
28fc6740
AC
3341 }
3342 else
1ba53b71
L
3343 {
3344 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1dbcd68c
WT
3345 if (i386_bnd_regnum_p (gdbarch, regnum))
3346 {
3347 regnum -= tdep->bnd0_regnum;
1ba53b71 3348
1dbcd68c 3349 /* Extract (always little endian). Read lower 128bits. */
03f50fc8
YQ
3350 status = regcache->raw_read (I387_BND0R_REGNUM (tdep) + regnum,
3351 raw_buf);
1dbcd68c
WT
3352 if (status != REG_VALID)
3353 mark_value_bytes_unavailable (result_value, 0, 16);
3354 else
3355 {
3356 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
3357 LONGEST upper, lower;
3358 int size = TYPE_LENGTH (builtin_type (gdbarch)->builtin_data_ptr);
3359
3360 lower = extract_unsigned_integer (raw_buf, 8, byte_order);
3361 upper = extract_unsigned_integer (raw_buf + 8, 8, byte_order);
3362 upper = ~upper;
3363
3364 memcpy (buf, &lower, size);
3365 memcpy (buf + size, &upper, size);
3366 }
3367 }
01f9f808
MS
3368 else if (i386_k_regnum_p (gdbarch, regnum))
3369 {
3370 regnum -= tdep->k0_regnum;
3371
3372 /* Extract (always little endian). */
03f50fc8 3373 status = regcache->raw_read (tdep->k0_regnum + regnum, raw_buf);
01f9f808
MS
3374 if (status != REG_VALID)
3375 mark_value_bytes_unavailable (result_value, 0, 8);
3376 else
3377 memcpy (buf, raw_buf, 8);
3378 }
3379 else if (i386_zmm_regnum_p (gdbarch, regnum))
3380 {
3381 regnum -= tdep->zmm0_regnum;
3382
3383 if (regnum < num_lower_zmm_regs)
3384 {
3385 /* Extract (always little endian). Read lower 128bits. */
03f50fc8
YQ
3386 status = regcache->raw_read (I387_XMM0_REGNUM (tdep) + regnum,
3387 raw_buf);
01f9f808
MS
3388 if (status != REG_VALID)
3389 mark_value_bytes_unavailable (result_value, 0, 16);
3390 else
3391 memcpy (buf, raw_buf, 16);
3392
3393 /* Extract (always little endian). Read upper 128bits. */
03f50fc8
YQ
3394 status = regcache->raw_read (tdep->ymm0h_regnum + regnum,
3395 raw_buf);
01f9f808
MS
3396 if (status != REG_VALID)
3397 mark_value_bytes_unavailable (result_value, 16, 16);
3398 else
3399 memcpy (buf + 16, raw_buf, 16);
3400 }
3401 else
3402 {
3403 /* Extract (always little endian). Read lower 128bits. */
03f50fc8
YQ
3404 status = regcache->raw_read (I387_XMM16_REGNUM (tdep) + regnum
3405 - num_lower_zmm_regs,
3406 raw_buf);
01f9f808
MS
3407 if (status != REG_VALID)
3408 mark_value_bytes_unavailable (result_value, 0, 16);
3409 else
3410 memcpy (buf, raw_buf, 16);
3411
3412 /* Extract (always little endian). Read upper 128bits. */
03f50fc8
YQ
3413 status = regcache->raw_read (I387_YMM16H_REGNUM (tdep) + regnum
3414 - num_lower_zmm_regs,
3415 raw_buf);
01f9f808
MS
3416 if (status != REG_VALID)
3417 mark_value_bytes_unavailable (result_value, 16, 16);
3418 else
3419 memcpy (buf + 16, raw_buf, 16);
3420 }
3421
3422 /* Read upper 256bits. */
03f50fc8
YQ
3423 status = regcache->raw_read (tdep->zmm0h_regnum + regnum,
3424 raw_buf);
01f9f808
MS
3425 if (status != REG_VALID)
3426 mark_value_bytes_unavailable (result_value, 32, 32);
3427 else
3428 memcpy (buf + 32, raw_buf, 32);
3429 }
1dbcd68c 3430 else if (i386_ymm_regnum_p (gdbarch, regnum))
c131fcee
L
3431 {
3432 regnum -= tdep->ymm0_regnum;
3433
1777feb0 3434 /* Extract (always little endian). Read lower 128bits. */
03f50fc8
YQ
3435 status = regcache->raw_read (I387_XMM0_REGNUM (tdep) + regnum,
3436 raw_buf);
05d1431c 3437 if (status != REG_VALID)
3543a589
TT
3438 mark_value_bytes_unavailable (result_value, 0, 16);
3439 else
3440 memcpy (buf, raw_buf, 16);
c131fcee 3441 /* Read upper 128bits. */
03f50fc8
YQ
3442 status = regcache->raw_read (tdep->ymm0h_regnum + regnum,
3443 raw_buf);
05d1431c 3444 if (status != REG_VALID)
3543a589
TT
3445 mark_value_bytes_unavailable (result_value, 16, 32);
3446 else
3447 memcpy (buf + 16, raw_buf, 16);
c131fcee 3448 }
01f9f808
MS
3449 else if (i386_ymm_avx512_regnum_p (gdbarch, regnum))
3450 {
3451 regnum -= tdep->ymm16_regnum;
3452 /* Extract (always little endian). Read lower 128bits. */
03f50fc8
YQ
3453 status = regcache->raw_read (I387_XMM16_REGNUM (tdep) + regnum,
3454 raw_buf);
01f9f808
MS
3455 if (status != REG_VALID)
3456 mark_value_bytes_unavailable (result_value, 0, 16);
3457 else
3458 memcpy (buf, raw_buf, 16);
3459 /* Read upper 128bits. */
03f50fc8
YQ
3460 status = regcache->raw_read (tdep->ymm16h_regnum + regnum,
3461 raw_buf);
01f9f808
MS
3462 if (status != REG_VALID)
3463 mark_value_bytes_unavailable (result_value, 16, 16);
3464 else
3465 memcpy (buf + 16, raw_buf, 16);
3466 }
c131fcee 3467 else if (i386_word_regnum_p (gdbarch, regnum))
1ba53b71
L
3468 {
3469 int gpnum = regnum - tdep->ax_regnum;
3470
3471 /* Extract (always little endian). */
03f50fc8 3472 status = regcache->raw_read (gpnum, raw_buf);
05d1431c 3473 if (status != REG_VALID)
3543a589
TT
3474 mark_value_bytes_unavailable (result_value, 0,
3475 TYPE_LENGTH (value_type (result_value)));
3476 else
3477 memcpy (buf, raw_buf, 2);
1ba53b71
L
3478 }
3479 else if (i386_byte_regnum_p (gdbarch, regnum))
3480 {
1ba53b71
L
3481 int gpnum = regnum - tdep->al_regnum;
3482
3483 /* Extract (always little endian). We read both lower and
3484 upper registers. */
03f50fc8 3485 status = regcache->raw_read (gpnum % 4, raw_buf);
05d1431c 3486 if (status != REG_VALID)
3543a589
TT
3487 mark_value_bytes_unavailable (result_value, 0,
3488 TYPE_LENGTH (value_type (result_value)));
3489 else if (gpnum >= 4)
1ba53b71
L
3490 memcpy (buf, raw_buf + 1, 1);
3491 else
3492 memcpy (buf, raw_buf, 1);
3493 }
3494 else
3495 internal_error (__FILE__, __LINE__, _("invalid regnum"));
3496 }
3543a589
TT
3497}
3498
3499static struct value *
3500i386_pseudo_register_read_value (struct gdbarch *gdbarch,
849d0ba8 3501 readable_regcache *regcache,
3543a589
TT
3502 int regnum)
3503{
3504 struct value *result;
3505
3506 result = allocate_value (register_type (gdbarch, regnum));
3507 VALUE_LVAL (result) = lval_register;
3508 VALUE_REGNUM (result) = regnum;
3509
3510 i386_pseudo_register_read_into_value (gdbarch, regcache, regnum, result);
05d1431c 3511
3543a589 3512 return result;
28fc6740
AC
3513}
3514
1ba53b71 3515void
28fc6740 3516i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
42835c2b 3517 int regnum, const gdb_byte *buf)
28fc6740 3518{
975c21ab 3519 gdb_byte raw_buf[I386_MAX_REGISTER_SIZE];
1ba53b71 3520
5716833c 3521 if (i386_mmx_regnum_p (gdbarch, regnum))
28fc6740 3522 {
c86c27af
MK
3523 int fpnum = i386_mmx_regnum_to_fp_regnum (regcache, regnum);
3524
28fc6740 3525 /* Read ... */
0b883586 3526 regcache->raw_read (fpnum, raw_buf);
28fc6740 3527 /* ... Modify ... (always little endian). */
1ba53b71 3528 memcpy (raw_buf, buf, register_size (gdbarch, regnum));
28fc6740 3529 /* ... Write. */
10eaee5f 3530 regcache->raw_write (fpnum, raw_buf);
28fc6740
AC
3531 }
3532 else
1ba53b71
L
3533 {
3534 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3535
1dbcd68c
WT
3536 if (i386_bnd_regnum_p (gdbarch, regnum))
3537 {
3538 ULONGEST upper, lower;
3539 int size = TYPE_LENGTH (builtin_type (gdbarch)->builtin_data_ptr);
3540 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
3541
3542 /* New values from input value. */
3543 regnum -= tdep->bnd0_regnum;
3544 lower = extract_unsigned_integer (buf, size, byte_order);
3545 upper = extract_unsigned_integer (buf + size, size, byte_order);
3546
3547 /* Fetching register buffer. */
0b883586
SM
3548 regcache->raw_read (I387_BND0R_REGNUM (tdep) + regnum,
3549 raw_buf);
1dbcd68c
WT
3550
3551 upper = ~upper;
3552
3553 /* Set register bits. */
3554 memcpy (raw_buf, &lower, 8);
3555 memcpy (raw_buf + 8, &upper, 8);
3556
10eaee5f 3557 regcache->raw_write (I387_BND0R_REGNUM (tdep) + regnum, raw_buf);
1dbcd68c 3558 }
01f9f808
MS
3559 else if (i386_k_regnum_p (gdbarch, regnum))
3560 {
3561 regnum -= tdep->k0_regnum;
3562
10eaee5f 3563 regcache->raw_write (tdep->k0_regnum + regnum, buf);
01f9f808
MS
3564 }
3565 else if (i386_zmm_regnum_p (gdbarch, regnum))
3566 {
3567 regnum -= tdep->zmm0_regnum;
3568
3569 if (regnum < num_lower_zmm_regs)
3570 {
3571 /* Write lower 128bits. */
10eaee5f 3572 regcache->raw_write (I387_XMM0_REGNUM (tdep) + regnum, buf);
01f9f808 3573 /* Write upper 128bits. */
10eaee5f 3574 regcache->raw_write (I387_YMM0_REGNUM (tdep) + regnum, buf + 16);
01f9f808
MS
3575 }
3576 else
3577 {
3578 /* Write lower 128bits. */
10eaee5f
SM
3579 regcache->raw_write (I387_XMM16_REGNUM (tdep) + regnum
3580 - num_lower_zmm_regs, buf);
01f9f808 3581 /* Write upper 128bits. */
10eaee5f
SM
3582 regcache->raw_write (I387_YMM16H_REGNUM (tdep) + regnum
3583 - num_lower_zmm_regs, buf + 16);
01f9f808
MS
3584 }
3585 /* Write upper 256bits. */
10eaee5f 3586 regcache->raw_write (tdep->zmm0h_regnum + regnum, buf + 32);
01f9f808 3587 }
1dbcd68c 3588 else if (i386_ymm_regnum_p (gdbarch, regnum))
c131fcee
L
3589 {
3590 regnum -= tdep->ymm0_regnum;
3591
3592 /* ... Write lower 128bits. */
10eaee5f 3593 regcache->raw_write (I387_XMM0_REGNUM (tdep) + regnum, buf);
c131fcee 3594 /* ... Write upper 128bits. */
10eaee5f 3595 regcache->raw_write (tdep->ymm0h_regnum + regnum, buf + 16);
c131fcee 3596 }
01f9f808
MS
3597 else if (i386_ymm_avx512_regnum_p (gdbarch, regnum))
3598 {
3599 regnum -= tdep->ymm16_regnum;
3600
3601 /* ... Write lower 128bits. */
10eaee5f 3602 regcache->raw_write (I387_XMM16_REGNUM (tdep) + regnum, buf);
01f9f808 3603 /* ... Write upper 128bits. */
10eaee5f 3604 regcache->raw_write (tdep->ymm16h_regnum + regnum, buf + 16);
01f9f808 3605 }
c131fcee 3606 else if (i386_word_regnum_p (gdbarch, regnum))
1ba53b71
L
3607 {
3608 int gpnum = regnum - tdep->ax_regnum;
3609
3610 /* Read ... */
0b883586 3611 regcache->raw_read (gpnum, raw_buf);
1ba53b71
L
3612 /* ... Modify ... (always little endian). */
3613 memcpy (raw_buf, buf, 2);
3614 /* ... Write. */
10eaee5f 3615 regcache->raw_write (gpnum, raw_buf);
1ba53b71
L
3616 }
3617 else if (i386_byte_regnum_p (gdbarch, regnum))
3618 {
1ba53b71
L
3619 int gpnum = regnum - tdep->al_regnum;
3620
3621 /* Read ... We read both lower and upper registers. */
0b883586 3622 regcache->raw_read (gpnum % 4, raw_buf);
1ba53b71
L
3623 /* ... Modify ... (always little endian). */
3624 if (gpnum >= 4)
3625 memcpy (raw_buf + 1, buf, 1);
3626 else
3627 memcpy (raw_buf, buf, 1);
3628 /* ... Write. */
10eaee5f 3629 regcache->raw_write (gpnum % 4, raw_buf);
1ba53b71
L
3630 }
3631 else
3632 internal_error (__FILE__, __LINE__, _("invalid regnum"));
3633 }
28fc6740 3634}
62e5fd57
MK
3635
3636/* Implement the 'ax_pseudo_register_collect' gdbarch method. */
3637
3638int
3639i386_ax_pseudo_register_collect (struct gdbarch *gdbarch,
3640 struct agent_expr *ax, int regnum)
3641{
3642 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3643
3644 if (i386_mmx_regnum_p (gdbarch, regnum))
3645 {
3646 /* MMX to FPU register mapping depends on current TOS. Let's just
3647 not care and collect everything... */
3648 int i;
3649
3650 ax_reg_mask (ax, I387_FSTAT_REGNUM (tdep));
3651 for (i = 0; i < 8; i++)
3652 ax_reg_mask (ax, I387_ST0_REGNUM (tdep) + i);
3653 return 0;
3654 }
3655 else if (i386_bnd_regnum_p (gdbarch, regnum))
3656 {
3657 regnum -= tdep->bnd0_regnum;
3658 ax_reg_mask (ax, I387_BND0R_REGNUM (tdep) + regnum);
3659 return 0;
3660 }
3661 else if (i386_k_regnum_p (gdbarch, regnum))
3662 {
3663 regnum -= tdep->k0_regnum;
3664 ax_reg_mask (ax, tdep->k0_regnum + regnum);
3665 return 0;
3666 }
3667 else if (i386_zmm_regnum_p (gdbarch, regnum))
3668 {
3669 regnum -= tdep->zmm0_regnum;
3670 if (regnum < num_lower_zmm_regs)
3671 {
3672 ax_reg_mask (ax, I387_XMM0_REGNUM (tdep) + regnum);
3673 ax_reg_mask (ax, tdep->ymm0h_regnum + regnum);
3674 }
3675 else
3676 {
3677 ax_reg_mask (ax, I387_XMM16_REGNUM (tdep) + regnum
3678 - num_lower_zmm_regs);
3679 ax_reg_mask (ax, I387_YMM16H_REGNUM (tdep) + regnum
3680 - num_lower_zmm_regs);
3681 }
3682 ax_reg_mask (ax, tdep->zmm0h_regnum + regnum);
3683 return 0;
3684 }
3685 else if (i386_ymm_regnum_p (gdbarch, regnum))
3686 {
3687 regnum -= tdep->ymm0_regnum;
3688 ax_reg_mask (ax, I387_XMM0_REGNUM (tdep) + regnum);
3689 ax_reg_mask (ax, tdep->ymm0h_regnum + regnum);
3690 return 0;
3691 }
3692 else if (i386_ymm_avx512_regnum_p (gdbarch, regnum))
3693 {
3694 regnum -= tdep->ymm16_regnum;
3695 ax_reg_mask (ax, I387_XMM16_REGNUM (tdep) + regnum);
3696 ax_reg_mask (ax, tdep->ymm16h_regnum + regnum);
3697 return 0;
3698 }
3699 else if (i386_word_regnum_p (gdbarch, regnum))
3700 {
3701 int gpnum = regnum - tdep->ax_regnum;
3702
3703 ax_reg_mask (ax, gpnum);
3704 return 0;
3705 }
3706 else if (i386_byte_regnum_p (gdbarch, regnum))
3707 {
3708 int gpnum = regnum - tdep->al_regnum;
3709
3710 ax_reg_mask (ax, gpnum % 4);
3711 return 0;
3712 }
3713 else
3714 internal_error (__FILE__, __LINE__, _("invalid regnum"));
3715 return 1;
3716}
ff2e87ac
AC
3717\f
3718
ff2e87ac
AC
3719/* Return the register number of the register allocated by GCC after
3720 REGNUM, or -1 if there is no such register. */
3721
3722static int
3723i386_next_regnum (int regnum)
3724{
3725 /* GCC allocates the registers in the order:
3726
3727 %eax, %edx, %ecx, %ebx, %esi, %edi, %ebp, %esp, ...
3728
3729 Since storing a variable in %esp doesn't make any sense we return
3730 -1 for %ebp and for %esp itself. */
3731 static int next_regnum[] =
3732 {
3733 I386_EDX_REGNUM, /* Slot for %eax. */
3734 I386_EBX_REGNUM, /* Slot for %ecx. */
3735 I386_ECX_REGNUM, /* Slot for %edx. */
3736 I386_ESI_REGNUM, /* Slot for %ebx. */
3737 -1, -1, /* Slots for %esp and %ebp. */
3738 I386_EDI_REGNUM, /* Slot for %esi. */
3739 I386_EBP_REGNUM /* Slot for %edi. */
3740 };
3741
de5b9bb9 3742 if (regnum >= 0 && regnum < sizeof (next_regnum) / sizeof (next_regnum[0]))
ff2e87ac 3743 return next_regnum[regnum];
28fc6740 3744
ff2e87ac
AC
3745 return -1;
3746}
3747
3748/* Return nonzero if a value of type TYPE stored in register REGNUM
3749 needs any special handling. */
d7a0d72c 3750
3a1e71e3 3751static int
1777feb0
MS
3752i386_convert_register_p (struct gdbarch *gdbarch,
3753 int regnum, struct type *type)
d7a0d72c 3754{
de5b9bb9
MK
3755 int len = TYPE_LENGTH (type);
3756
ff2e87ac
AC
3757 /* Values may be spread across multiple registers. Most debugging
3758 formats aren't expressive enough to specify the locations, so
3759 some heuristics is involved. Right now we only handle types that
de5b9bb9
MK
3760 have a length that is a multiple of the word size, since GCC
3761 doesn't seem to put any other types into registers. */
3762 if (len > 4 && len % 4 == 0)
3763 {
3764 int last_regnum = regnum;
3765
3766 while (len > 4)
3767 {
3768 last_regnum = i386_next_regnum (last_regnum);
3769 len -= 4;
3770 }
3771
3772 if (last_regnum != -1)
3773 return 1;
3774 }
ff2e87ac 3775
0abe36f5 3776 return i387_convert_register_p (gdbarch, regnum, type);
d7a0d72c
MK
3777}
3778
ff2e87ac
AC
3779/* Read a value of type TYPE from register REGNUM in frame FRAME, and
3780 return its contents in TO. */
ac27f131 3781
8dccd430 3782static int
ff2e87ac 3783i386_register_to_value (struct frame_info *frame, int regnum,
8dccd430
PA
3784 struct type *type, gdb_byte *to,
3785 int *optimizedp, int *unavailablep)
ac27f131 3786{
20a6ec49 3787 struct gdbarch *gdbarch = get_frame_arch (frame);
de5b9bb9 3788 int len = TYPE_LENGTH (type);
de5b9bb9 3789
20a6ec49 3790 if (i386_fp_regnum_p (gdbarch, regnum))
8dccd430
PA
3791 return i387_register_to_value (frame, regnum, type, to,
3792 optimizedp, unavailablep);
ff2e87ac 3793
fd35795f 3794 /* Read a value spread across multiple registers. */
de5b9bb9
MK
3795
3796 gdb_assert (len > 4 && len % 4 == 0);
3d261580 3797
de5b9bb9
MK
3798 while (len > 0)
3799 {
3800 gdb_assert (regnum != -1);
20a6ec49 3801 gdb_assert (register_size (gdbarch, regnum) == 4);
d532c08f 3802
8dccd430
PA
3803 if (!get_frame_register_bytes (frame, regnum, 0,
3804 register_size (gdbarch, regnum),
3805 to, optimizedp, unavailablep))
3806 return 0;
3807
de5b9bb9
MK
3808 regnum = i386_next_regnum (regnum);
3809 len -= 4;
42835c2b 3810 to += 4;
de5b9bb9 3811 }
8dccd430
PA
3812
3813 *optimizedp = *unavailablep = 0;
3814 return 1;
ac27f131
MK
3815}
3816
ff2e87ac
AC
3817/* Write the contents FROM of a value of type TYPE into register
3818 REGNUM in frame FRAME. */
ac27f131 3819
3a1e71e3 3820static void
ff2e87ac 3821i386_value_to_register (struct frame_info *frame, int regnum,
42835c2b 3822 struct type *type, const gdb_byte *from)
ac27f131 3823{
de5b9bb9 3824 int len = TYPE_LENGTH (type);
de5b9bb9 3825
20a6ec49 3826 if (i386_fp_regnum_p (get_frame_arch (frame), regnum))
c6ba6f0d 3827 {
d532c08f
MK
3828 i387_value_to_register (frame, regnum, type, from);
3829 return;
3830 }
3d261580 3831
fd35795f 3832 /* Write a value spread across multiple registers. */
de5b9bb9
MK
3833
3834 gdb_assert (len > 4 && len % 4 == 0);
ff2e87ac 3835
de5b9bb9
MK
3836 while (len > 0)
3837 {
3838 gdb_assert (regnum != -1);
875f8d0e 3839 gdb_assert (register_size (get_frame_arch (frame), regnum) == 4);
d532c08f 3840
42835c2b 3841 put_frame_register (frame, regnum, from);
de5b9bb9
MK
3842 regnum = i386_next_regnum (regnum);
3843 len -= 4;
42835c2b 3844 from += 4;
de5b9bb9 3845 }
ac27f131 3846}
ff2e87ac 3847\f
7fdafb5a
MK
3848/* Supply register REGNUM from the buffer specified by GREGS and LEN
3849 in the general-purpose register set REGSET to register cache
3850 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
ff2e87ac 3851
20187ed5 3852void
473f17b0
MK
3853i386_supply_gregset (const struct regset *regset, struct regcache *regcache,
3854 int regnum, const void *gregs, size_t len)
3855{
ac7936df 3856 struct gdbarch *gdbarch = regcache->arch ();
09424cff 3857 const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9a3c8263 3858 const gdb_byte *regs = (const gdb_byte *) gregs;
473f17b0
MK
3859 int i;
3860
1528345d 3861 gdb_assert (len >= tdep->sizeof_gregset);
473f17b0
MK
3862
3863 for (i = 0; i < tdep->gregset_num_regs; i++)
3864 {
3865 if ((regnum == i || regnum == -1)
3866 && tdep->gregset_reg_offset[i] != -1)
73e1c03f 3867 regcache->raw_supply (i, regs + tdep->gregset_reg_offset[i]);
473f17b0
MK
3868 }
3869}
3870
7fdafb5a
MK
3871/* Collect register REGNUM from the register cache REGCACHE and store
3872 it in the buffer specified by GREGS and LEN as described by the
3873 general-purpose register set REGSET. If REGNUM is -1, do this for
3874 all registers in REGSET. */
3875
ecc37a5a 3876static void
7fdafb5a
MK
3877i386_collect_gregset (const struct regset *regset,
3878 const struct regcache *regcache,
3879 int regnum, void *gregs, size_t len)
3880{
ac7936df 3881 struct gdbarch *gdbarch = regcache->arch ();
09424cff 3882 const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9a3c8263 3883 gdb_byte *regs = (gdb_byte *) gregs;
7fdafb5a
MK
3884 int i;
3885
1528345d 3886 gdb_assert (len >= tdep->sizeof_gregset);
7fdafb5a
MK
3887
3888 for (i = 0; i < tdep->gregset_num_regs; i++)
3889 {
3890 if ((regnum == i || regnum == -1)
3891 && tdep->gregset_reg_offset[i] != -1)
34a79281 3892 regcache->raw_collect (i, regs + tdep->gregset_reg_offset[i]);
7fdafb5a
MK
3893 }
3894}
3895
3896/* Supply register REGNUM from the buffer specified by FPREGS and LEN
3897 in the floating-point register set REGSET to register cache
3898 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
473f17b0
MK
3899
3900static void
3901i386_supply_fpregset (const struct regset *regset, struct regcache *regcache,
3902 int regnum, const void *fpregs, size_t len)
3903{
ac7936df 3904 struct gdbarch *gdbarch = regcache->arch ();
09424cff 3905 const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
473f17b0 3906
66a72d25
MK
3907 if (len == I387_SIZEOF_FXSAVE)
3908 {
3909 i387_supply_fxsave (regcache, regnum, fpregs);
3910 return;
3911 }
3912
1528345d 3913 gdb_assert (len >= tdep->sizeof_fpregset);
473f17b0
MK
3914 i387_supply_fsave (regcache, regnum, fpregs);
3915}
8446b36a 3916
2f305df1
MK
3917/* Collect register REGNUM from the register cache REGCACHE and store
3918 it in the buffer specified by FPREGS and LEN as described by the
3919 floating-point register set REGSET. If REGNUM is -1, do this for
3920 all registers in REGSET. */
7fdafb5a
MK
3921
3922static void
3923i386_collect_fpregset (const struct regset *regset,
3924 const struct regcache *regcache,
3925 int regnum, void *fpregs, size_t len)
3926{
ac7936df 3927 struct gdbarch *gdbarch = regcache->arch ();
09424cff 3928 const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7fdafb5a
MK
3929
3930 if (len == I387_SIZEOF_FXSAVE)
3931 {
3932 i387_collect_fxsave (regcache, regnum, fpregs);
3933 return;
3934 }
3935
1528345d 3936 gdb_assert (len >= tdep->sizeof_fpregset);
7fdafb5a
MK
3937 i387_collect_fsave (regcache, regnum, fpregs);
3938}
3939
ecc37a5a
AA
3940/* Register set definitions. */
3941
3942const struct regset i386_gregset =
3943 {
3944 NULL, i386_supply_gregset, i386_collect_gregset
3945 };
3946
8f0435f7 3947const struct regset i386_fpregset =
ecc37a5a
AA
3948 {
3949 NULL, i386_supply_fpregset, i386_collect_fpregset
3950 };
3951
490496c3 3952/* Default iterator over core file register note sections. */
8446b36a 3953
490496c3
AA
3954void
3955i386_iterate_over_regset_sections (struct gdbarch *gdbarch,
3956 iterate_over_regset_sections_cb *cb,
3957 void *cb_data,
3958 const struct regcache *regcache)
8446b36a
MK
3959{
3960 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3961
a616bb94
AH
3962 cb (".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, &i386_gregset, NULL,
3963 cb_data);
490496c3 3964 if (tdep->sizeof_fpregset)
a616bb94
AH
3965 cb (".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, tdep->fpregset,
3966 NULL, cb_data);
8446b36a 3967}
473f17b0 3968\f
fc338970 3969
fc338970 3970/* Stuff for WIN32 PE style DLL's but is pretty generic really. */
c906108c
SS
3971
3972CORE_ADDR
e17a4113
UW
3973i386_pe_skip_trampoline_code (struct frame_info *frame,
3974 CORE_ADDR pc, char *name)
c906108c 3975{
e17a4113
UW
3976 struct gdbarch *gdbarch = get_frame_arch (frame);
3977 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3978
3979 /* jmp *(dest) */
3980 if (pc && read_memory_unsigned_integer (pc, 2, byte_order) == 0x25ff)
c906108c 3981 {
e17a4113
UW
3982 unsigned long indirect =
3983 read_memory_unsigned_integer (pc + 2, 4, byte_order);
c906108c 3984 struct minimal_symbol *indsym =
7cbd4a93 3985 indirect ? lookup_minimal_symbol_by_pc (indirect).minsym : 0;
c9d95fa3 3986 const char *symname = indsym ? indsym->linkage_name () : 0;
c906108c 3987
c5aa993b 3988 if (symname)
c906108c 3989 {
61012eef
GB
3990 if (startswith (symname, "__imp_")
3991 || startswith (symname, "_imp_"))
e17a4113
UW
3992 return name ? 1 :
3993 read_memory_unsigned_integer (indirect, 4, byte_order);
c906108c
SS
3994 }
3995 }
fc338970 3996 return 0; /* Not a trampoline. */
c906108c 3997}
fc338970
MK
3998\f
3999
10458914
DJ
4000/* Return whether the THIS_FRAME corresponds to a sigtramp
4001 routine. */
8201327c 4002
4bd207ef 4003int
10458914 4004i386_sigtramp_p (struct frame_info *this_frame)
8201327c 4005{
10458914 4006 CORE_ADDR pc = get_frame_pc (this_frame);
2c02bd72 4007 const char *name;
911bc6ee
MK
4008
4009 find_pc_partial_function (pc, &name, NULL, NULL);
8201327c
MK
4010 return (name && strcmp ("_sigtramp", name) == 0);
4011}
4012\f
4013
fc338970
MK
4014/* We have two flavours of disassembly. The machinery on this page
4015 deals with switching between those. */
c906108c
SS
4016
4017static int
a89aa300 4018i386_print_insn (bfd_vma pc, struct disassemble_info *info)
c906108c 4019{
5e3397bb
MK
4020 gdb_assert (disassembly_flavor == att_flavor
4021 || disassembly_flavor == intel_flavor);
4022
f995bbe8 4023 info->disassembler_options = disassembly_flavor;
5e3397bb 4024
6394c606 4025 return default_print_insn (pc, info);
7a292a7a 4026}
fc338970 4027\f
3ce1502b 4028
8201327c
MK
4029/* There are a few i386 architecture variants that differ only
4030 slightly from the generic i386 target. For now, we don't give them
4031 their own source file, but include them here. As a consequence,
4032 they'll always be included. */
3ce1502b 4033
8201327c 4034/* System V Release 4 (SVR4). */
3ce1502b 4035
10458914
DJ
4036/* Return whether THIS_FRAME corresponds to a SVR4 sigtramp
4037 routine. */
911bc6ee 4038
8201327c 4039static int
10458914 4040i386_svr4_sigtramp_p (struct frame_info *this_frame)
d2a7c97a 4041{
10458914 4042 CORE_ADDR pc = get_frame_pc (this_frame);
2c02bd72 4043 const char *name;
911bc6ee 4044
05b4bd79 4045 /* The origin of these symbols is currently unknown. */
911bc6ee 4046 find_pc_partial_function (pc, &name, NULL, NULL);
8201327c 4047 return (name && (strcmp ("_sigreturn", name) == 0
8201327c
MK
4048 || strcmp ("sigvechandler", name) == 0));
4049}
d2a7c97a 4050
10458914
DJ
4051/* Assuming THIS_FRAME is for a SVR4 sigtramp routine, return the
4052 address of the associated sigcontext (ucontext) structure. */
3ce1502b 4053
3a1e71e3 4054static CORE_ADDR
10458914 4055i386_svr4_sigcontext_addr (struct frame_info *this_frame)
8201327c 4056{
e17a4113
UW
4057 struct gdbarch *gdbarch = get_frame_arch (this_frame);
4058 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 4059 gdb_byte buf[4];
acd5c798 4060 CORE_ADDR sp;
3ce1502b 4061
10458914 4062 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
e17a4113 4063 sp = extract_unsigned_integer (buf, 4, byte_order);
21d0e8a4 4064
e17a4113 4065 return read_memory_unsigned_integer (sp + 8, 4, byte_order);
8201327c 4066}
55aa24fb
SDJ
4067
4068\f
4069
4070/* Implementation of `gdbarch_stap_is_single_operand', as defined in
4071 gdbarch.h. */
4072
4073int
4074i386_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
4075{
4076 return (*s == '$' /* Literal number. */
4077 || (isdigit (*s) && s[1] == '(' && s[2] == '%') /* Displacement. */
4078 || (*s == '(' && s[1] == '%') /* Register indirection. */
4079 || (*s == '%' && isalpha (s[1]))); /* Register access. */
4080}
4081
5acfdbae
SDJ
4082/* Helper function for i386_stap_parse_special_token.
4083
4084 This function parses operands of the form `-8+3+1(%rbp)', which
4085 must be interpreted as `*(-8 + 3 - 1 + (void *) $eax)'.
4086
af2d9bee 4087 Return true if the operand was parsed successfully, false
5acfdbae
SDJ
4088 otherwise. */
4089
af2d9bee 4090static bool
5acfdbae
SDJ
4091i386_stap_parse_special_token_triplet (struct gdbarch *gdbarch,
4092 struct stap_parse_info *p)
4093{
4094 const char *s = p->arg;
4095
4096 if (isdigit (*s) || *s == '-' || *s == '+')
4097 {
af2d9bee 4098 bool got_minus[3];
5acfdbae
SDJ
4099 int i;
4100 long displacements[3];
4101 const char *start;
4102 char *regname;
4103 int len;
4104 struct stoken str;
4105 char *endp;
4106
af2d9bee 4107 got_minus[0] = false;
5acfdbae
SDJ
4108 if (*s == '+')
4109 ++s;
4110 else if (*s == '-')
4111 {
4112 ++s;
af2d9bee 4113 got_minus[0] = true;
5acfdbae
SDJ
4114 }
4115
d7b30f67 4116 if (!isdigit ((unsigned char) *s))
af2d9bee 4117 return false;
d7b30f67 4118
5acfdbae
SDJ
4119 displacements[0] = strtol (s, &endp, 10);
4120 s = endp;
4121
4122 if (*s != '+' && *s != '-')
4123 {
4124 /* We are not dealing with a triplet. */
af2d9bee 4125 return false;
5acfdbae
SDJ
4126 }
4127
af2d9bee 4128 got_minus[1] = false;
5acfdbae
SDJ
4129 if (*s == '+')
4130 ++s;
4131 else
4132 {
4133 ++s;
af2d9bee 4134 got_minus[1] = true;
5acfdbae
SDJ
4135 }
4136
d7b30f67 4137 if (!isdigit ((unsigned char) *s))
af2d9bee 4138 return false;
d7b30f67 4139
5acfdbae
SDJ
4140 displacements[1] = strtol (s, &endp, 10);
4141 s = endp;
4142
4143 if (*s != '+' && *s != '-')
4144 {
4145 /* We are not dealing with a triplet. */
af2d9bee 4146 return false;
5acfdbae
SDJ
4147 }
4148
af2d9bee 4149 got_minus[2] = false;
5acfdbae
SDJ
4150 if (*s == '+')
4151 ++s;
4152 else
4153 {
4154 ++s;
af2d9bee 4155 got_minus[2] = true;
5acfdbae
SDJ
4156 }
4157
d7b30f67 4158 if (!isdigit ((unsigned char) *s))
af2d9bee 4159 return false;
d7b30f67 4160
5acfdbae
SDJ
4161 displacements[2] = strtol (s, &endp, 10);
4162 s = endp;
4163
4164 if (*s != '(' || s[1] != '%')
af2d9bee 4165 return false;
5acfdbae
SDJ
4166
4167 s += 2;
4168 start = s;
4169
4170 while (isalnum (*s))
4171 ++s;
4172
4173 if (*s++ != ')')
af2d9bee 4174 return false;
5acfdbae 4175
d7b30f67 4176 len = s - start - 1;
224c3ddb 4177 regname = (char *) alloca (len + 1);
5acfdbae
SDJ
4178
4179 strncpy (regname, start, len);
4180 regname[len] = '\0';
4181
4182 if (user_reg_map_name_to_regnum (gdbarch, regname, len) == -1)
4183 error (_("Invalid register name `%s' on expression `%s'."),
4184 regname, p->saved_arg);
4185
4186 for (i = 0; i < 3; i++)
4187 {
410a0ff2
SDJ
4188 write_exp_elt_opcode (&p->pstate, OP_LONG);
4189 write_exp_elt_type
4190 (&p->pstate, builtin_type (gdbarch)->builtin_long);
4191 write_exp_elt_longcst (&p->pstate, displacements[i]);
4192 write_exp_elt_opcode (&p->pstate, OP_LONG);
5acfdbae 4193 if (got_minus[i])
410a0ff2 4194 write_exp_elt_opcode (&p->pstate, UNOP_NEG);
5acfdbae
SDJ
4195 }
4196
410a0ff2 4197 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
5acfdbae
SDJ
4198 str.ptr = regname;
4199 str.length = len;
410a0ff2
SDJ
4200 write_exp_string (&p->pstate, str);
4201 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
5acfdbae 4202
410a0ff2
SDJ
4203 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
4204 write_exp_elt_type (&p->pstate,
4205 builtin_type (gdbarch)->builtin_data_ptr);
4206 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
5acfdbae 4207
410a0ff2
SDJ
4208 write_exp_elt_opcode (&p->pstate, BINOP_ADD);
4209 write_exp_elt_opcode (&p->pstate, BINOP_ADD);
4210 write_exp_elt_opcode (&p->pstate, BINOP_ADD);
5acfdbae 4211
410a0ff2
SDJ
4212 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
4213 write_exp_elt_type (&p->pstate,
4214 lookup_pointer_type (p->arg_type));
4215 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
5acfdbae 4216
410a0ff2 4217 write_exp_elt_opcode (&p->pstate, UNOP_IND);
5acfdbae
SDJ
4218
4219 p->arg = s;
4220
af2d9bee 4221 return true;
5acfdbae
SDJ
4222 }
4223
af2d9bee 4224 return false;
5acfdbae
SDJ
4225}
4226
4227/* Helper function for i386_stap_parse_special_token.
4228
4229 This function parses operands of the form `register base +
4230 (register index * size) + offset', as represented in
4231 `(%rcx,%rax,8)', or `[OFFSET](BASE_REG,INDEX_REG[,SIZE])'.
4232
af2d9bee 4233 Return true if the operand was parsed successfully, false
5acfdbae
SDJ
4234 otherwise. */
4235
af2d9bee 4236static bool
5acfdbae
SDJ
4237i386_stap_parse_special_token_three_arg_disp (struct gdbarch *gdbarch,
4238 struct stap_parse_info *p)
4239{
4240 const char *s = p->arg;
4241
4242 if (isdigit (*s) || *s == '(' || *s == '-' || *s == '+')
4243 {
af2d9bee 4244 bool offset_minus = false;
5acfdbae 4245 long offset = 0;
af2d9bee 4246 bool size_minus = false;
5acfdbae
SDJ
4247 long size = 0;
4248 const char *start;
4249 char *base;
4250 int len_base;
4251 char *index;
4252 int len_index;
4253 struct stoken base_token, index_token;
4254
4255 if (*s == '+')
4256 ++s;
4257 else if (*s == '-')
4258 {
4259 ++s;
af2d9bee 4260 offset_minus = true;
5acfdbae
SDJ
4261 }
4262
4263 if (offset_minus && !isdigit (*s))
af2d9bee 4264 return false;
5acfdbae
SDJ
4265
4266 if (isdigit (*s))
4267 {
4268 char *endp;
4269
4270 offset = strtol (s, &endp, 10);
4271 s = endp;
4272 }
4273
4274 if (*s != '(' || s[1] != '%')
af2d9bee 4275 return false;
5acfdbae
SDJ
4276
4277 s += 2;
4278 start = s;
4279
4280 while (isalnum (*s))
4281 ++s;
4282
4283 if (*s != ',' || s[1] != '%')
af2d9bee 4284 return false;
5acfdbae
SDJ
4285
4286 len_base = s - start;
224c3ddb 4287 base = (char *) alloca (len_base + 1);
5acfdbae
SDJ
4288 strncpy (base, start, len_base);
4289 base[len_base] = '\0';
4290
4291 if (user_reg_map_name_to_regnum (gdbarch, base, len_base) == -1)
4292 error (_("Invalid register name `%s' on expression `%s'."),
4293 base, p->saved_arg);
4294
4295 s += 2;
4296 start = s;
4297
4298 while (isalnum (*s))
4299 ++s;
4300
4301 len_index = s - start;
224c3ddb 4302 index = (char *) alloca (len_index + 1);
5acfdbae
SDJ
4303 strncpy (index, start, len_index);
4304 index[len_index] = '\0';
4305
4306 if (user_reg_map_name_to_regnum (gdbarch, index, len_index) == -1)
4307 error (_("Invalid register name `%s' on expression `%s'."),
4308 index, p->saved_arg);
4309
4310 if (*s != ',' && *s != ')')
af2d9bee 4311 return false;
5acfdbae
SDJ
4312
4313 if (*s == ',')
4314 {
4315 char *endp;
4316
4317 ++s;
4318 if (*s == '+')
4319 ++s;
4320 else if (*s == '-')
4321 {
4322 ++s;
af2d9bee 4323 size_minus = true;
5acfdbae
SDJ
4324 }
4325
4326 size = strtol (s, &endp, 10);
4327 s = endp;
4328
4329 if (*s != ')')
af2d9bee 4330 return false;
5acfdbae
SDJ
4331 }
4332
4333 ++s;
4334
4335 if (offset)
4336 {
410a0ff2
SDJ
4337 write_exp_elt_opcode (&p->pstate, OP_LONG);
4338 write_exp_elt_type (&p->pstate,
4339 builtin_type (gdbarch)->builtin_long);
4340 write_exp_elt_longcst (&p->pstate, offset);
4341 write_exp_elt_opcode (&p->pstate, OP_LONG);
5acfdbae 4342 if (offset_minus)
410a0ff2 4343 write_exp_elt_opcode (&p->pstate, UNOP_NEG);
5acfdbae
SDJ
4344 }
4345
410a0ff2 4346 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
5acfdbae
SDJ
4347 base_token.ptr = base;
4348 base_token.length = len_base;
410a0ff2
SDJ
4349 write_exp_string (&p->pstate, base_token);
4350 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
5acfdbae
SDJ
4351
4352 if (offset)
410a0ff2 4353 write_exp_elt_opcode (&p->pstate, BINOP_ADD);
5acfdbae 4354
410a0ff2 4355 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
5acfdbae
SDJ
4356 index_token.ptr = index;
4357 index_token.length = len_index;
410a0ff2
SDJ
4358 write_exp_string (&p->pstate, index_token);
4359 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
5acfdbae
SDJ
4360
4361 if (size)
4362 {
410a0ff2
SDJ
4363 write_exp_elt_opcode (&p->pstate, OP_LONG);
4364 write_exp_elt_type (&p->pstate,
4365 builtin_type (gdbarch)->builtin_long);
4366 write_exp_elt_longcst (&p->pstate, size);
4367 write_exp_elt_opcode (&p->pstate, OP_LONG);
5acfdbae 4368 if (size_minus)
410a0ff2
SDJ
4369 write_exp_elt_opcode (&p->pstate, UNOP_NEG);
4370 write_exp_elt_opcode (&p->pstate, BINOP_MUL);
5acfdbae
SDJ
4371 }
4372
410a0ff2 4373 write_exp_elt_opcode (&p->pstate, BINOP_ADD);
5acfdbae 4374
410a0ff2
SDJ
4375 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
4376 write_exp_elt_type (&p->pstate,
4377 lookup_pointer_type (p->arg_type));
4378 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
5acfdbae 4379
410a0ff2 4380 write_exp_elt_opcode (&p->pstate, UNOP_IND);
5acfdbae
SDJ
4381
4382 p->arg = s;
4383
af2d9bee 4384 return true;
5acfdbae
SDJ
4385 }
4386
af2d9bee 4387 return false;
5acfdbae
SDJ
4388}
4389
55aa24fb
SDJ
4390/* Implementation of `gdbarch_stap_parse_special_token', as defined in
4391 gdbarch.h. */
4392
4393int
4394i386_stap_parse_special_token (struct gdbarch *gdbarch,
4395 struct stap_parse_info *p)
4396{
55aa24fb
SDJ
4397 /* In order to parse special tokens, we use a state-machine that go
4398 through every known token and try to get a match. */
4399 enum
4400 {
4401 TRIPLET,
4402 THREE_ARG_DISPLACEMENT,
4403 DONE
570dc176
TT
4404 };
4405 int current_state;
55aa24fb
SDJ
4406
4407 current_state = TRIPLET;
4408
4409 /* The special tokens to be parsed here are:
4410
4411 - `register base + (register index * size) + offset', as represented
4412 in `(%rcx,%rax,8)', or `[OFFSET](BASE_REG,INDEX_REG[,SIZE])'.
4413
4414 - Operands of the form `-8+3+1(%rbp)', which must be interpreted as
4415 `*(-8 + 3 - 1 + (void *) $eax)'. */
4416
4417 while (current_state != DONE)
4418 {
55aa24fb
SDJ
4419 switch (current_state)
4420 {
4421 case TRIPLET:
5acfdbae
SDJ
4422 if (i386_stap_parse_special_token_triplet (gdbarch, p))
4423 return 1;
4424 break;
4425
55aa24fb 4426 case THREE_ARG_DISPLACEMENT:
5acfdbae
SDJ
4427 if (i386_stap_parse_special_token_three_arg_disp (gdbarch, p))
4428 return 1;
4429 break;
55aa24fb
SDJ
4430 }
4431
4432 /* Advancing to the next state. */
4433 ++current_state;
4434 }
4435
4436 return 0;
4437}
4438
7d7571f0
SDJ
4439/* Implementation of 'gdbarch_stap_adjust_register', as defined in
4440 gdbarch.h. */
4441
6b78c3f8 4442static std::string
7d7571f0 4443i386_stap_adjust_register (struct gdbarch *gdbarch, struct stap_parse_info *p,
6b78c3f8 4444 const std::string &regname, int regnum)
7d7571f0
SDJ
4445{
4446 static const std::unordered_set<std::string> reg_assoc
4447 = { "ax", "bx", "cx", "dx",
4448 "si", "di", "bp", "sp" };
4449
6b78c3f8
AB
4450 /* If we are dealing with a register whose size is less than the size
4451 specified by the "[-]N@" prefix, and it is one of the registers that
4452 we know has an extended variant available, then use the extended
4453 version of the register instead. */
4454 if (register_size (gdbarch, regnum) < TYPE_LENGTH (p->arg_type)
4455 && reg_assoc.find (regname) != reg_assoc.end ())
4456 return "e" + regname;
7d7571f0 4457
6b78c3f8
AB
4458 /* Otherwise, just use the requested register. */
4459 return regname;
7d7571f0
SDJ
4460}
4461
8201327c 4462\f
3ce1502b 4463
ac04f72b
TT
4464/* gdbarch gnu_triplet_regexp method. Both arches are acceptable as GDB always
4465 also supplies -m64 or -m32 by gdbarch_gcc_target_options. */
4466
4467static const char *
4468i386_gnu_triplet_regexp (struct gdbarch *gdbarch)
4469{
4470 return "(x86_64|i.86)";
4471}
4472
4473\f
4474
1d509aa6
MM
4475/* Implement the "in_indirect_branch_thunk" gdbarch function. */
4476
4477static bool
4478i386_in_indirect_branch_thunk (struct gdbarch *gdbarch, CORE_ADDR pc)
4479{
4480 return x86_in_indirect_branch_thunk (pc, i386_register_names,
4481 I386_EAX_REGNUM, I386_EIP_REGNUM);
4482}
4483
8201327c 4484/* Generic ELF. */
d2a7c97a 4485
8201327c
MK
4486void
4487i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
4488{
05c0465e
SDJ
4489 static const char *const stap_integer_prefixes[] = { "$", NULL };
4490 static const char *const stap_register_prefixes[] = { "%", NULL };
4491 static const char *const stap_register_indirection_prefixes[] = { "(",
4492 NULL };
4493 static const char *const stap_register_indirection_suffixes[] = { ")",
4494 NULL };
4495
c4fc7f1b
MK
4496 /* We typically use stabs-in-ELF with the SVR4 register numbering. */
4497 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
55aa24fb
SDJ
4498
4499 /* Registering SystemTap handlers. */
05c0465e
SDJ
4500 set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
4501 set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
4502 set_gdbarch_stap_register_indirection_prefixes (gdbarch,
4503 stap_register_indirection_prefixes);
4504 set_gdbarch_stap_register_indirection_suffixes (gdbarch,
4505 stap_register_indirection_suffixes);
55aa24fb
SDJ
4506 set_gdbarch_stap_is_single_operand (gdbarch,
4507 i386_stap_is_single_operand);
4508 set_gdbarch_stap_parse_special_token (gdbarch,
4509 i386_stap_parse_special_token);
7d7571f0
SDJ
4510 set_gdbarch_stap_adjust_register (gdbarch,
4511 i386_stap_adjust_register);
1d509aa6
MM
4512
4513 set_gdbarch_in_indirect_branch_thunk (gdbarch,
4514 i386_in_indirect_branch_thunk);
8201327c 4515}
3ce1502b 4516
8201327c 4517/* System V Release 4 (SVR4). */
3ce1502b 4518
8201327c
MK
4519void
4520i386_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
4521{
4522 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3ce1502b 4523
8201327c
MK
4524 /* System V Release 4 uses ELF. */
4525 i386_elf_init_abi (info, gdbarch);
3ce1502b 4526
dfe01d39 4527 /* System V Release 4 has shared libraries. */
dfe01d39
MK
4528 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
4529
911bc6ee 4530 tdep->sigtramp_p = i386_svr4_sigtramp_p;
21d0e8a4 4531 tdep->sigcontext_addr = i386_svr4_sigcontext_addr;
acd5c798
MK
4532 tdep->sc_pc_offset = 36 + 14 * 4;
4533 tdep->sc_sp_offset = 36 + 17 * 4;
3ce1502b 4534
8201327c 4535 tdep->jb_pc_offset = 20;
3ce1502b
MK
4536}
4537
8201327c 4538\f
2acceee2 4539
38c968cf
AC
4540/* i386 register groups. In addition to the normal groups, add "mmx"
4541 and "sse". */
4542
4543static struct reggroup *i386_sse_reggroup;
4544static struct reggroup *i386_mmx_reggroup;
4545
4546static void
4547i386_init_reggroups (void)
4548{
4549 i386_sse_reggroup = reggroup_new ("sse", USER_REGGROUP);
4550 i386_mmx_reggroup = reggroup_new ("mmx", USER_REGGROUP);
4551}
4552
4553static void
4554i386_add_reggroups (struct gdbarch *gdbarch)
4555{
4556 reggroup_add (gdbarch, i386_sse_reggroup);
4557 reggroup_add (gdbarch, i386_mmx_reggroup);
4558 reggroup_add (gdbarch, general_reggroup);
4559 reggroup_add (gdbarch, float_reggroup);
4560 reggroup_add (gdbarch, all_reggroup);
4561 reggroup_add (gdbarch, save_reggroup);
4562 reggroup_add (gdbarch, restore_reggroup);
4563 reggroup_add (gdbarch, vector_reggroup);
4564 reggroup_add (gdbarch, system_reggroup);
4565}
4566
4567int
4568i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
4569 struct reggroup *group)
4570{
c131fcee
L
4571 const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4572 int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
01f9f808 4573 ymm_regnum_p, ymmh_regnum_p, ymm_avx512_regnum_p, ymmh_avx512_regnum_p,
798a7429
SM
4574 bndr_regnum_p, bnd_regnum_p, zmm_regnum_p, zmmh_regnum_p,
4575 mpx_ctrl_regnum_p, xmm_avx512_regnum_p,
51547df6 4576 avx512_p, avx_p, sse_p, pkru_regnum_p;
acd5c798 4577
1ba53b71
L
4578 /* Don't include pseudo registers, except for MMX, in any register
4579 groups. */
c131fcee 4580 if (i386_byte_regnum_p (gdbarch, regnum))
1ba53b71
L
4581 return 0;
4582
c131fcee 4583 if (i386_word_regnum_p (gdbarch, regnum))
1ba53b71
L
4584 return 0;
4585
c131fcee 4586 if (i386_dword_regnum_p (gdbarch, regnum))
1ba53b71
L
4587 return 0;
4588
4589 mmx_regnum_p = i386_mmx_regnum_p (gdbarch, regnum);
38c968cf
AC
4590 if (group == i386_mmx_reggroup)
4591 return mmx_regnum_p;
1ba53b71 4592
51547df6 4593 pkru_regnum_p = i386_pkru_regnum_p(gdbarch, regnum);
c131fcee 4594 xmm_regnum_p = i386_xmm_regnum_p (gdbarch, regnum);
01f9f808 4595 xmm_avx512_regnum_p = i386_xmm_avx512_regnum_p (gdbarch, regnum);
c131fcee 4596 mxcsr_regnum_p = i386_mxcsr_regnum_p (gdbarch, regnum);
38c968cf 4597 if (group == i386_sse_reggroup)
01f9f808 4598 return xmm_regnum_p || xmm_avx512_regnum_p || mxcsr_regnum_p;
c131fcee
L
4599
4600 ymm_regnum_p = i386_ymm_regnum_p (gdbarch, regnum);
01f9f808
MS
4601 ymm_avx512_regnum_p = i386_ymm_avx512_regnum_p (gdbarch, regnum);
4602 zmm_regnum_p = i386_zmm_regnum_p (gdbarch, regnum);
4603
22049425
MS
4604 avx512_p = ((tdep->xcr0 & X86_XSTATE_AVX_AVX512_MASK)
4605 == X86_XSTATE_AVX_AVX512_MASK);
4606 avx_p = ((tdep->xcr0 & X86_XSTATE_AVX_AVX512_MASK)
df7e5265 4607 == X86_XSTATE_AVX_MASK) && !avx512_p;
22049425 4608 sse_p = ((tdep->xcr0 & X86_XSTATE_AVX_AVX512_MASK)
df7e5265 4609 == X86_XSTATE_SSE_MASK) && !avx512_p && ! avx_p;
01f9f808 4610
38c968cf 4611 if (group == vector_reggroup)
c131fcee 4612 return (mmx_regnum_p
01f9f808
MS
4613 || (zmm_regnum_p && avx512_p)
4614 || ((ymm_regnum_p || ymm_avx512_regnum_p) && avx_p)
4615 || ((xmm_regnum_p || xmm_avx512_regnum_p) && sse_p)
4616 || mxcsr_regnum_p);
1ba53b71
L
4617
4618 fp_regnum_p = (i386_fp_regnum_p (gdbarch, regnum)
4619 || i386_fpc_regnum_p (gdbarch, regnum));
38c968cf
AC
4620 if (group == float_reggroup)
4621 return fp_regnum_p;
1ba53b71 4622
c131fcee
L
4623 /* For "info reg all", don't include upper YMM registers nor XMM
4624 registers when AVX is supported. */
4625 ymmh_regnum_p = i386_ymmh_regnum_p (gdbarch, regnum);
01f9f808
MS
4626 ymmh_avx512_regnum_p = i386_ymmh_avx512_regnum_p (gdbarch, regnum);
4627 zmmh_regnum_p = i386_zmmh_regnum_p (gdbarch, regnum);
c131fcee 4628 if (group == all_reggroup
01f9f808
MS
4629 && (((xmm_regnum_p || xmm_avx512_regnum_p) && !sse_p)
4630 || ((ymm_regnum_p || ymm_avx512_regnum_p) && !avx_p)
4631 || ymmh_regnum_p
4632 || ymmh_avx512_regnum_p
4633 || zmmh_regnum_p))
c131fcee
L
4634 return 0;
4635
1dbcd68c
WT
4636 bnd_regnum_p = i386_bnd_regnum_p (gdbarch, regnum);
4637 if (group == all_reggroup
df7e5265 4638 && ((bnd_regnum_p && (tdep->xcr0 & X86_XSTATE_MPX_MASK))))
1dbcd68c
WT
4639 return bnd_regnum_p;
4640
4641 bndr_regnum_p = i386_bndr_regnum_p (gdbarch, regnum);
4642 if (group == all_reggroup
df7e5265 4643 && ((bndr_regnum_p && (tdep->xcr0 & X86_XSTATE_MPX_MASK))))
1dbcd68c
WT
4644 return 0;
4645
4646 mpx_ctrl_regnum_p = i386_mpx_ctrl_regnum_p (gdbarch, regnum);
4647 if (group == all_reggroup
df7e5265 4648 && ((mpx_ctrl_regnum_p && (tdep->xcr0 & X86_XSTATE_MPX_MASK))))
1dbcd68c
WT
4649 return mpx_ctrl_regnum_p;
4650
38c968cf 4651 if (group == general_reggroup)
1ba53b71
L
4652 return (!fp_regnum_p
4653 && !mmx_regnum_p
c131fcee
L
4654 && !mxcsr_regnum_p
4655 && !xmm_regnum_p
01f9f808 4656 && !xmm_avx512_regnum_p
c131fcee 4657 && !ymm_regnum_p
1dbcd68c 4658 && !ymmh_regnum_p
01f9f808
MS
4659 && !ymm_avx512_regnum_p
4660 && !ymmh_avx512_regnum_p
1dbcd68c
WT
4661 && !bndr_regnum_p
4662 && !bnd_regnum_p
01f9f808
MS
4663 && !mpx_ctrl_regnum_p
4664 && !zmm_regnum_p
51547df6
MS
4665 && !zmmh_regnum_p
4666 && !pkru_regnum_p);
acd5c798 4667
38c968cf
AC
4668 return default_register_reggroup_p (gdbarch, regnum, group);
4669}
38c968cf 4670\f
acd5c798 4671
f837910f
MK
4672/* Get the ARGIth function argument for the current function. */
4673
42c466d7 4674static CORE_ADDR
143985b7
AF
4675i386_fetch_pointer_argument (struct frame_info *frame, int argi,
4676 struct type *type)
4677{
e17a4113
UW
4678 struct gdbarch *gdbarch = get_frame_arch (frame);
4679 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
f4644a3f 4680 CORE_ADDR sp = get_frame_register_unsigned (frame, I386_ESP_REGNUM);
e17a4113 4681 return read_memory_unsigned_integer (sp + (4 * (argi + 1)), 4, byte_order);
143985b7
AF
4682}
4683
7ad10968
HZ
4684#define PREFIX_REPZ 0x01
4685#define PREFIX_REPNZ 0x02
4686#define PREFIX_LOCK 0x04
4687#define PREFIX_DATA 0x08
4688#define PREFIX_ADDR 0x10
473f17b0 4689
7ad10968
HZ
4690/* operand size */
4691enum
4692{
4693 OT_BYTE = 0,
4694 OT_WORD,
4695 OT_LONG,
cf648174 4696 OT_QUAD,
a3c4230a 4697 OT_DQUAD,
7ad10968 4698};
473f17b0 4699
7ad10968
HZ
4700/* i386 arith/logic operations */
4701enum
4702{
4703 OP_ADDL,
4704 OP_ORL,
4705 OP_ADCL,
4706 OP_SBBL,
4707 OP_ANDL,
4708 OP_SUBL,
4709 OP_XORL,
4710 OP_CMPL,
4711};
5716833c 4712
7ad10968
HZ
4713struct i386_record_s
4714{
cf648174 4715 struct gdbarch *gdbarch;
7ad10968 4716 struct regcache *regcache;
df61f520 4717 CORE_ADDR orig_addr;
7ad10968
HZ
4718 CORE_ADDR addr;
4719 int aflag;
4720 int dflag;
4721 int override;
4722 uint8_t modrm;
4723 uint8_t mod, reg, rm;
4724 int ot;
cf648174
HZ
4725 uint8_t rex_x;
4726 uint8_t rex_b;
4727 int rip_offset;
4728 int popl_esp_hack;
4729 const int *regmap;
7ad10968 4730};
5716833c 4731
99c1624c
PA
4732/* Parse the "modrm" part of the memory address irp->addr points at.
4733 Returns -1 if something goes wrong, 0 otherwise. */
5716833c 4734
7ad10968
HZ
4735static int
4736i386_record_modrm (struct i386_record_s *irp)
4737{
cf648174 4738 struct gdbarch *gdbarch = irp->gdbarch;
5af949e3 4739
4ffa4fc7
PA
4740 if (record_read_memory (gdbarch, irp->addr, &irp->modrm, 1))
4741 return -1;
4742
7ad10968
HZ
4743 irp->addr++;
4744 irp->mod = (irp->modrm >> 6) & 3;
4745 irp->reg = (irp->modrm >> 3) & 7;
4746 irp->rm = irp->modrm & 7;
5716833c 4747
7ad10968
HZ
4748 return 0;
4749}
d2a7c97a 4750
99c1624c
PA
4751/* Extract the memory address that the current instruction writes to,
4752 and return it in *ADDR. Return -1 if something goes wrong. */
8201327c 4753
7ad10968 4754static int
cf648174 4755i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
7ad10968 4756{
cf648174 4757 struct gdbarch *gdbarch = irp->gdbarch;
60a1502a
MS
4758 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4759 gdb_byte buf[4];
4760 ULONGEST offset64;
21d0e8a4 4761
7ad10968 4762 *addr = 0;
1e87984a 4763 if (irp->aflag || irp->regmap[X86_RECORD_R8_REGNUM])
7ad10968 4764 {
1e87984a 4765 /* 32/64 bits */
7ad10968
HZ
4766 int havesib = 0;
4767 uint8_t scale = 0;
648d0c8b 4768 uint8_t byte;
7ad10968
HZ
4769 uint8_t index = 0;
4770 uint8_t base = irp->rm;
896fb97d 4771
7ad10968
HZ
4772 if (base == 4)
4773 {
4774 havesib = 1;
4ffa4fc7
PA
4775 if (record_read_memory (gdbarch, irp->addr, &byte, 1))
4776 return -1;
7ad10968 4777 irp->addr++;
648d0c8b
MS
4778 scale = (byte >> 6) & 3;
4779 index = ((byte >> 3) & 7) | irp->rex_x;
4780 base = (byte & 7);
7ad10968 4781 }
cf648174 4782 base |= irp->rex_b;
21d0e8a4 4783
7ad10968
HZ
4784 switch (irp->mod)
4785 {
4786 case 0:
4787 if ((base & 7) == 5)
4788 {
4789 base = 0xff;
4ffa4fc7
PA
4790 if (record_read_memory (gdbarch, irp->addr, buf, 4))
4791 return -1;
7ad10968 4792 irp->addr += 4;
60a1502a 4793 *addr = extract_signed_integer (buf, 4, byte_order);
cf648174
HZ
4794 if (irp->regmap[X86_RECORD_R8_REGNUM] && !havesib)
4795 *addr += irp->addr + irp->rip_offset;
7ad10968 4796 }
7ad10968
HZ
4797 break;
4798 case 1:
4ffa4fc7
PA
4799 if (record_read_memory (gdbarch, irp->addr, buf, 1))
4800 return -1;
7ad10968 4801 irp->addr++;
60a1502a 4802 *addr = (int8_t) buf[0];
7ad10968
HZ
4803 break;
4804 case 2:
4ffa4fc7
PA
4805 if (record_read_memory (gdbarch, irp->addr, buf, 4))
4806 return -1;
60a1502a 4807 *addr = extract_signed_integer (buf, 4, byte_order);
7ad10968
HZ
4808 irp->addr += 4;
4809 break;
4810 }
356a6b3e 4811
60a1502a 4812 offset64 = 0;
7ad10968 4813 if (base != 0xff)
cf648174
HZ
4814 {
4815 if (base == 4 && irp->popl_esp_hack)
4816 *addr += irp->popl_esp_hack;
4817 regcache_raw_read_unsigned (irp->regcache, irp->regmap[base],
60a1502a 4818 &offset64);
7ad10968 4819 }
cf648174
HZ
4820 if (irp->aflag == 2)
4821 {
60a1502a 4822 *addr += offset64;
cf648174
HZ
4823 }
4824 else
60a1502a 4825 *addr = (uint32_t) (offset64 + *addr);
c4fc7f1b 4826
7ad10968
HZ
4827 if (havesib && (index != 4 || scale != 0))
4828 {
cf648174 4829 regcache_raw_read_unsigned (irp->regcache, irp->regmap[index],
60a1502a 4830 &offset64);
cf648174 4831 if (irp->aflag == 2)
60a1502a 4832 *addr += offset64 << scale;
cf648174 4833 else
60a1502a 4834 *addr = (uint32_t) (*addr + (offset64 << scale));
7ad10968 4835 }
e85596e0
L
4836
4837 if (!irp->aflag)
4838 {
4839 /* Since we are in 64-bit mode with ADDR32 prefix, zero-extend
4840 address from 32-bit to 64-bit. */
4841 *addr = (uint32_t) *addr;
4842 }
7ad10968
HZ
4843 }
4844 else
4845 {
4846 /* 16 bits */
4847 switch (irp->mod)
4848 {
4849 case 0:
4850 if (irp->rm == 6)
4851 {
4ffa4fc7
PA
4852 if (record_read_memory (gdbarch, irp->addr, buf, 2))
4853 return -1;
7ad10968 4854 irp->addr += 2;
60a1502a 4855 *addr = extract_signed_integer (buf, 2, byte_order);
7ad10968
HZ
4856 irp->rm = 0;
4857 goto no_rm;
4858 }
7ad10968
HZ
4859 break;
4860 case 1:
4ffa4fc7
PA
4861 if (record_read_memory (gdbarch, irp->addr, buf, 1))
4862 return -1;
7ad10968 4863 irp->addr++;
60a1502a 4864 *addr = (int8_t) buf[0];
7ad10968
HZ
4865 break;
4866 case 2:
4ffa4fc7
PA
4867 if (record_read_memory (gdbarch, irp->addr, buf, 2))
4868 return -1;
7ad10968 4869 irp->addr += 2;
60a1502a 4870 *addr = extract_signed_integer (buf, 2, byte_order);
7ad10968
HZ
4871 break;
4872 }
c4fc7f1b 4873
7ad10968
HZ
4874 switch (irp->rm)
4875 {
4876 case 0:
cf648174
HZ
4877 regcache_raw_read_unsigned (irp->regcache,
4878 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
4879 &offset64);
4880 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
4881 regcache_raw_read_unsigned (irp->regcache,
4882 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
4883 &offset64);
4884 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4885 break;
4886 case 1:
cf648174
HZ
4887 regcache_raw_read_unsigned (irp->regcache,
4888 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
4889 &offset64);
4890 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
4891 regcache_raw_read_unsigned (irp->regcache,
4892 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
4893 &offset64);
4894 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4895 break;
4896 case 2:
cf648174
HZ
4897 regcache_raw_read_unsigned (irp->regcache,
4898 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
4899 &offset64);
4900 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
4901 regcache_raw_read_unsigned (irp->regcache,
4902 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
4903 &offset64);
4904 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4905 break;
4906 case 3:
cf648174
HZ
4907 regcache_raw_read_unsigned (irp->regcache,
4908 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
4909 &offset64);
4910 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
4911 regcache_raw_read_unsigned (irp->regcache,
4912 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
4913 &offset64);
4914 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4915 break;
4916 case 4:
cf648174
HZ
4917 regcache_raw_read_unsigned (irp->regcache,
4918 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
4919 &offset64);
4920 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4921 break;
4922 case 5:
cf648174
HZ
4923 regcache_raw_read_unsigned (irp->regcache,
4924 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
4925 &offset64);
4926 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4927 break;
4928 case 6:
cf648174
HZ
4929 regcache_raw_read_unsigned (irp->regcache,
4930 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
4931 &offset64);
4932 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4933 break;
4934 case 7:
cf648174
HZ
4935 regcache_raw_read_unsigned (irp->regcache,
4936 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
4937 &offset64);
4938 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
4939 break;
4940 }
4941 *addr &= 0xffff;
4942 }
c4fc7f1b 4943
01fe1b41 4944 no_rm:
7ad10968
HZ
4945 return 0;
4946}
c4fc7f1b 4947
99c1624c
PA
4948/* Record the address and contents of the memory that will be changed
4949 by the current instruction. Return -1 if something goes wrong, 0
4950 otherwise. */
356a6b3e 4951
7ad10968
HZ
4952static int
4953i386_record_lea_modrm (struct i386_record_s *irp)
4954{
cf648174
HZ
4955 struct gdbarch *gdbarch = irp->gdbarch;
4956 uint64_t addr;
356a6b3e 4957
d7877f7e 4958 if (irp->override >= 0)
7ad10968 4959 {
25ea693b 4960 if (record_full_memory_query)
bb08c432 4961 {
651ce16a 4962 if (yquery (_("\
bb08c432
HZ
4963Process record ignores the memory change of instruction at address %s\n\
4964because it can't get the value of the segment register.\n\
4965Do you want to stop the program?"),
651ce16a
PA
4966 paddress (gdbarch, irp->orig_addr)))
4967 return -1;
bb08c432
HZ
4968 }
4969
7ad10968
HZ
4970 return 0;
4971 }
61113f8b 4972
7ad10968
HZ
4973 if (i386_record_lea_modrm_addr (irp, &addr))
4974 return -1;
96297dab 4975
25ea693b 4976 if (record_full_arch_list_add_mem (addr, 1 << irp->ot))
7ad10968 4977 return -1;
a62cc96e 4978
7ad10968
HZ
4979 return 0;
4980}
b6197528 4981
99c1624c
PA
4982/* Record the effects of a push operation. Return -1 if something
4983 goes wrong, 0 otherwise. */
cf648174
HZ
4984
4985static int
4986i386_record_push (struct i386_record_s *irp, int size)
4987{
648d0c8b 4988 ULONGEST addr;
cf648174 4989
25ea693b
MM
4990 if (record_full_arch_list_add_reg (irp->regcache,
4991 irp->regmap[X86_RECORD_RESP_REGNUM]))
cf648174
HZ
4992 return -1;
4993 regcache_raw_read_unsigned (irp->regcache,
4994 irp->regmap[X86_RECORD_RESP_REGNUM],
648d0c8b 4995 &addr);
25ea693b 4996 if (record_full_arch_list_add_mem ((CORE_ADDR) addr - size, size))
cf648174
HZ
4997 return -1;
4998
4999 return 0;
5000}
5001
0289bdd7
MS
5002
5003/* Defines contents to record. */
5004#define I386_SAVE_FPU_REGS 0xfffd
5005#define I386_SAVE_FPU_ENV 0xfffe
5006#define I386_SAVE_FPU_ENV_REG_STACK 0xffff
5007
99c1624c
PA
5008/* Record the values of the floating point registers which will be
5009 changed by the current instruction. Returns -1 if something is
5010 wrong, 0 otherwise. */
0289bdd7
MS
5011
5012static int i386_record_floats (struct gdbarch *gdbarch,
5013 struct i386_record_s *ir,
5014 uint32_t iregnum)
5015{
5016 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
5017 int i;
5018
5019 /* Oza: Because of floating point insn push/pop of fpu stack is going to
5020 happen. Currently we store st0-st7 registers, but we need not store all
5021 registers all the time, in future we use ftag register and record only
5022 those who are not marked as an empty. */
5023
5024 if (I386_SAVE_FPU_REGS == iregnum)
5025 {
5026 for (i = I387_ST0_REGNUM (tdep); i <= I387_ST0_REGNUM (tdep) + 7; i++)
5027 {
25ea693b 5028 if (record_full_arch_list_add_reg (ir->regcache, i))
0289bdd7
MS
5029 return -1;
5030 }
5031 }
5032 else if (I386_SAVE_FPU_ENV == iregnum)
5033 {
5034 for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
5035 {
25ea693b 5036 if (record_full_arch_list_add_reg (ir->regcache, i))
0289bdd7
MS
5037 return -1;
5038 }
5039 }
5040 else if (I386_SAVE_FPU_ENV_REG_STACK == iregnum)
5041 {
5042 for (i = I387_ST0_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
5043 {
25ea693b 5044 if (record_full_arch_list_add_reg (ir->regcache, i))
0289bdd7
MS
5045 return -1;
5046 }
5047 }
5048 else if ((iregnum >= I387_ST0_REGNUM (tdep)) &&
5049 (iregnum <= I387_FOP_REGNUM (tdep)))
5050 {
25ea693b 5051 if (record_full_arch_list_add_reg (ir->regcache,iregnum))
0289bdd7
MS
5052 return -1;
5053 }
5054 else
5055 {
5056 /* Parameter error. */
5057 return -1;
5058 }
5059 if(I386_SAVE_FPU_ENV != iregnum)
5060 {
5061 for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
5062 {
25ea693b 5063 if (record_full_arch_list_add_reg (ir->regcache, i))
0289bdd7
MS
5064 return -1;
5065 }
5066 }
5067 return 0;
5068}
5069
99c1624c
PA
5070/* Parse the current instruction, and record the values of the
5071 registers and memory that will be changed by the current
5072 instruction. Returns -1 if something goes wrong, 0 otherwise. */
8201327c 5073
25ea693b
MM
5074#define I386_RECORD_FULL_ARCH_LIST_ADD_REG(regnum) \
5075 record_full_arch_list_add_reg (ir.regcache, ir.regmap[(regnum)])
cf648174 5076
a6b808b4 5077int
7ad10968 5078i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
648d0c8b 5079 CORE_ADDR input_addr)
7ad10968 5080{
60a1502a 5081 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7ad10968 5082 int prefixes = 0;
580879fc 5083 int regnum = 0;
425b824a 5084 uint32_t opcode;
f4644a3f 5085 uint8_t opcode8;
648d0c8b 5086 ULONGEST addr;
975c21ab 5087 gdb_byte buf[I386_MAX_REGISTER_SIZE];
7ad10968 5088 struct i386_record_s ir;
0289bdd7 5089 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
cf648174
HZ
5090 uint8_t rex_w = -1;
5091 uint8_t rex_r = 0;
7ad10968 5092
8408d274 5093 memset (&ir, 0, sizeof (struct i386_record_s));
7ad10968 5094 ir.regcache = regcache;
648d0c8b
MS
5095 ir.addr = input_addr;
5096 ir.orig_addr = input_addr;
7ad10968
HZ
5097 ir.aflag = 1;
5098 ir.dflag = 1;
cf648174
HZ
5099 ir.override = -1;
5100 ir.popl_esp_hack = 0;
a3c4230a 5101 ir.regmap = tdep->record_regmap;
cf648174 5102 ir.gdbarch = gdbarch;
7ad10968
HZ
5103
5104 if (record_debug > 1)
5105 fprintf_unfiltered (gdb_stdlog, "Process record: i386_process_record "
5af949e3
UW
5106 "addr = %s\n",
5107 paddress (gdbarch, ir.addr));
7ad10968
HZ
5108
5109 /* prefixes */
5110 while (1)
5111 {
4ffa4fc7
PA
5112 if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
5113 return -1;
7ad10968 5114 ir.addr++;
425b824a 5115 switch (opcode8) /* Instruction prefixes */
7ad10968 5116 {
01fe1b41 5117 case REPE_PREFIX_OPCODE:
7ad10968
HZ
5118 prefixes |= PREFIX_REPZ;
5119 break;
01fe1b41 5120 case REPNE_PREFIX_OPCODE:
7ad10968
HZ
5121 prefixes |= PREFIX_REPNZ;
5122 break;
01fe1b41 5123 case LOCK_PREFIX_OPCODE:
7ad10968
HZ
5124 prefixes |= PREFIX_LOCK;
5125 break;
01fe1b41 5126 case CS_PREFIX_OPCODE:
cf648174 5127 ir.override = X86_RECORD_CS_REGNUM;
7ad10968 5128 break;
01fe1b41 5129 case SS_PREFIX_OPCODE:
cf648174 5130 ir.override = X86_RECORD_SS_REGNUM;
7ad10968 5131 break;
01fe1b41 5132 case DS_PREFIX_OPCODE:
cf648174 5133 ir.override = X86_RECORD_DS_REGNUM;
7ad10968 5134 break;
01fe1b41 5135 case ES_PREFIX_OPCODE:
cf648174 5136 ir.override = X86_RECORD_ES_REGNUM;
7ad10968 5137 break;
01fe1b41 5138 case FS_PREFIX_OPCODE:
cf648174 5139 ir.override = X86_RECORD_FS_REGNUM;
7ad10968 5140 break;
01fe1b41 5141 case GS_PREFIX_OPCODE:
cf648174 5142 ir.override = X86_RECORD_GS_REGNUM;
7ad10968 5143 break;
01fe1b41 5144 case DATA_PREFIX_OPCODE:
7ad10968
HZ
5145 prefixes |= PREFIX_DATA;
5146 break;
01fe1b41 5147 case ADDR_PREFIX_OPCODE:
7ad10968
HZ
5148 prefixes |= PREFIX_ADDR;
5149 break;
d691bec7
MS
5150 case 0x40: /* i386 inc %eax */
5151 case 0x41: /* i386 inc %ecx */
5152 case 0x42: /* i386 inc %edx */
5153 case 0x43: /* i386 inc %ebx */
5154 case 0x44: /* i386 inc %esp */
5155 case 0x45: /* i386 inc %ebp */
5156 case 0x46: /* i386 inc %esi */
5157 case 0x47: /* i386 inc %edi */
5158 case 0x48: /* i386 dec %eax */
5159 case 0x49: /* i386 dec %ecx */
5160 case 0x4a: /* i386 dec %edx */
5161 case 0x4b: /* i386 dec %ebx */
5162 case 0x4c: /* i386 dec %esp */
5163 case 0x4d: /* i386 dec %ebp */
5164 case 0x4e: /* i386 dec %esi */
5165 case 0x4f: /* i386 dec %edi */
5166 if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
cf648174
HZ
5167 {
5168 /* REX */
425b824a
MS
5169 rex_w = (opcode8 >> 3) & 1;
5170 rex_r = (opcode8 & 0x4) << 1;
5171 ir.rex_x = (opcode8 & 0x2) << 2;
5172 ir.rex_b = (opcode8 & 0x1) << 3;
cf648174 5173 }
d691bec7
MS
5174 else /* 32 bit target */
5175 goto out_prefixes;
cf648174 5176 break;
7ad10968
HZ
5177 default:
5178 goto out_prefixes;
5179 break;
5180 }
5181 }
01fe1b41 5182 out_prefixes:
cf648174
HZ
5183 if (ir.regmap[X86_RECORD_R8_REGNUM] && rex_w == 1)
5184 {
5185 ir.dflag = 2;
5186 }
5187 else
5188 {
5189 if (prefixes & PREFIX_DATA)
5190 ir.dflag ^= 1;
5191 }
7ad10968
HZ
5192 if (prefixes & PREFIX_ADDR)
5193 ir.aflag ^= 1;
cf648174
HZ
5194 else if (ir.regmap[X86_RECORD_R8_REGNUM])
5195 ir.aflag = 2;
7ad10968 5196
1777feb0 5197 /* Now check op code. */
425b824a 5198 opcode = (uint32_t) opcode8;
01fe1b41 5199 reswitch:
7ad10968
HZ
5200 switch (opcode)
5201 {
5202 case 0x0f:
4ffa4fc7
PA
5203 if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
5204 return -1;
7ad10968 5205 ir.addr++;
a3c4230a 5206 opcode = (uint32_t) opcode8 | 0x0f00;
7ad10968
HZ
5207 goto reswitch;
5208 break;
93924b6b 5209
a38bba38 5210 case 0x00: /* arith & logic */
7ad10968
HZ
5211 case 0x01:
5212 case 0x02:
5213 case 0x03:
5214 case 0x04:
5215 case 0x05:
5216 case 0x08:
5217 case 0x09:
5218 case 0x0a:
5219 case 0x0b:
5220 case 0x0c:
5221 case 0x0d:
5222 case 0x10:
5223 case 0x11:
5224 case 0x12:
5225 case 0x13:
5226 case 0x14:
5227 case 0x15:
5228 case 0x18:
5229 case 0x19:
5230 case 0x1a:
5231 case 0x1b:
5232 case 0x1c:
5233 case 0x1d:
5234 case 0x20:
5235 case 0x21:
5236 case 0x22:
5237 case 0x23:
5238 case 0x24:
5239 case 0x25:
5240 case 0x28:
5241 case 0x29:
5242 case 0x2a:
5243 case 0x2b:
5244 case 0x2c:
5245 case 0x2d:
5246 case 0x30:
5247 case 0x31:
5248 case 0x32:
5249 case 0x33:
5250 case 0x34:
5251 case 0x35:
5252 case 0x38:
5253 case 0x39:
5254 case 0x3a:
5255 case 0x3b:
5256 case 0x3c:
5257 case 0x3d:
5258 if (((opcode >> 3) & 7) != OP_CMPL)
5259 {
5260 if ((opcode & 1) == 0)
5261 ir.ot = OT_BYTE;
5262 else
5263 ir.ot = ir.dflag + OT_WORD;
93924b6b 5264
7ad10968
HZ
5265 switch ((opcode >> 1) & 3)
5266 {
a38bba38 5267 case 0: /* OP Ev, Gv */
7ad10968
HZ
5268 if (i386_record_modrm (&ir))
5269 return -1;
5270 if (ir.mod != 3)
5271 {
5272 if (i386_record_lea_modrm (&ir))
5273 return -1;
5274 }
5275 else
5276 {
cf648174
HZ
5277 ir.rm |= ir.rex_b;
5278 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5279 ir.rm &= 0x3;
25ea693b 5280 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
5281 }
5282 break;
a38bba38 5283 case 1: /* OP Gv, Ev */
7ad10968
HZ
5284 if (i386_record_modrm (&ir))
5285 return -1;
cf648174
HZ
5286 ir.reg |= rex_r;
5287 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5288 ir.reg &= 0x3;
25ea693b 5289 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
7ad10968 5290 break;
a38bba38 5291 case 2: /* OP A, Iv */
25ea693b 5292 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5293 break;
5294 }
5295 }
25ea693b 5296 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5297 break;
42fdc8df 5298
a38bba38 5299 case 0x80: /* GRP1 */
7ad10968
HZ
5300 case 0x81:
5301 case 0x82:
5302 case 0x83:
5303 if (i386_record_modrm (&ir))
5304 return -1;
8201327c 5305
7ad10968
HZ
5306 if (ir.reg != OP_CMPL)
5307 {
5308 if ((opcode & 1) == 0)
5309 ir.ot = OT_BYTE;
5310 else
5311 ir.ot = ir.dflag + OT_WORD;
28fc6740 5312
7ad10968
HZ
5313 if (ir.mod != 3)
5314 {
cf648174
HZ
5315 if (opcode == 0x83)
5316 ir.rip_offset = 1;
5317 else
5318 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
7ad10968
HZ
5319 if (i386_record_lea_modrm (&ir))
5320 return -1;
5321 }
5322 else
25ea693b 5323 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968 5324 }
25ea693b 5325 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5326 break;
5e3397bb 5327
a38bba38 5328 case 0x40: /* inc */
7ad10968
HZ
5329 case 0x41:
5330 case 0x42:
5331 case 0x43:
5332 case 0x44:
5333 case 0x45:
5334 case 0x46:
5335 case 0x47:
a38bba38
MS
5336
5337 case 0x48: /* dec */
7ad10968
HZ
5338 case 0x49:
5339 case 0x4a:
5340 case 0x4b:
5341 case 0x4c:
5342 case 0x4d:
5343 case 0x4e:
5344 case 0x4f:
a38bba38 5345
25ea693b
MM
5346 I386_RECORD_FULL_ARCH_LIST_ADD_REG (opcode & 7);
5347 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5348 break;
acd5c798 5349
a38bba38 5350 case 0xf6: /* GRP3 */
7ad10968
HZ
5351 case 0xf7:
5352 if ((opcode & 1) == 0)
5353 ir.ot = OT_BYTE;
5354 else
5355 ir.ot = ir.dflag + OT_WORD;
5356 if (i386_record_modrm (&ir))
5357 return -1;
acd5c798 5358
cf648174
HZ
5359 if (ir.mod != 3 && ir.reg == 0)
5360 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
5361
7ad10968
HZ
5362 switch (ir.reg)
5363 {
a38bba38 5364 case 0: /* test */
25ea693b 5365 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5366 break;
a38bba38
MS
5367 case 2: /* not */
5368 case 3: /* neg */
7ad10968
HZ
5369 if (ir.mod != 3)
5370 {
5371 if (i386_record_lea_modrm (&ir))
5372 return -1;
5373 }
5374 else
5375 {
cf648174
HZ
5376 ir.rm |= ir.rex_b;
5377 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5378 ir.rm &= 0x3;
25ea693b 5379 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 5380 }
a38bba38 5381 if (ir.reg == 3) /* neg */
25ea693b 5382 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5383 break;
a38bba38
MS
5384 case 4: /* mul */
5385 case 5: /* imul */
5386 case 6: /* div */
5387 case 7: /* idiv */
25ea693b 5388 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968 5389 if (ir.ot != OT_BYTE)
25ea693b
MM
5390 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
5391 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5392 break;
5393 default:
5394 ir.addr -= 2;
5395 opcode = opcode << 8 | ir.modrm;
5396 goto no_support;
5397 break;
5398 }
5399 break;
5400
a38bba38
MS
5401 case 0xfe: /* GRP4 */
5402 case 0xff: /* GRP5 */
7ad10968
HZ
5403 if (i386_record_modrm (&ir))
5404 return -1;
5405 if (ir.reg >= 2 && opcode == 0xfe)
5406 {
5407 ir.addr -= 2;
5408 opcode = opcode << 8 | ir.modrm;
5409 goto no_support;
5410 }
7ad10968
HZ
5411 switch (ir.reg)
5412 {
a38bba38
MS
5413 case 0: /* inc */
5414 case 1: /* dec */
cf648174
HZ
5415 if ((opcode & 1) == 0)
5416 ir.ot = OT_BYTE;
5417 else
5418 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
5419 if (ir.mod != 3)
5420 {
5421 if (i386_record_lea_modrm (&ir))
5422 return -1;
5423 }
5424 else
5425 {
cf648174
HZ
5426 ir.rm |= ir.rex_b;
5427 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5428 ir.rm &= 0x3;
25ea693b 5429 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 5430 }
25ea693b 5431 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5432 break;
a38bba38 5433 case 2: /* call */
cf648174
HZ
5434 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5435 ir.dflag = 2;
5436 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 5437 return -1;
25ea693b 5438 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5439 break;
a38bba38 5440 case 3: /* lcall */
25ea693b 5441 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
cf648174 5442 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 5443 return -1;
25ea693b 5444 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5445 break;
a38bba38
MS
5446 case 4: /* jmp */
5447 case 5: /* ljmp */
25ea693b 5448 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
cf648174 5449 break;
a38bba38 5450 case 6: /* push */
cf648174
HZ
5451 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5452 ir.dflag = 2;
5453 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5454 return -1;
7ad10968
HZ
5455 break;
5456 default:
5457 ir.addr -= 2;
5458 opcode = opcode << 8 | ir.modrm;
5459 goto no_support;
5460 break;
5461 }
5462 break;
5463
a38bba38 5464 case 0x84: /* test */
7ad10968
HZ
5465 case 0x85:
5466 case 0xa8:
5467 case 0xa9:
25ea693b 5468 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5469 break;
5470
a38bba38 5471 case 0x98: /* CWDE/CBW */
25ea693b 5472 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5473 break;
5474
a38bba38 5475 case 0x99: /* CDQ/CWD */
25ea693b
MM
5476 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5477 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
5478 break;
5479
a38bba38 5480 case 0x0faf: /* imul */
7ad10968
HZ
5481 case 0x69:
5482 case 0x6b:
5483 ir.ot = ir.dflag + OT_WORD;
5484 if (i386_record_modrm (&ir))
5485 return -1;
cf648174
HZ
5486 if (opcode == 0x69)
5487 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
5488 else if (opcode == 0x6b)
5489 ir.rip_offset = 1;
5490 ir.reg |= rex_r;
5491 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5492 ir.reg &= 0x3;
25ea693b
MM
5493 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
5494 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5495 break;
5496
a38bba38 5497 case 0x0fc0: /* xadd */
7ad10968
HZ
5498 case 0x0fc1:
5499 if ((opcode & 1) == 0)
5500 ir.ot = OT_BYTE;
5501 else
5502 ir.ot = ir.dflag + OT_WORD;
5503 if (i386_record_modrm (&ir))
5504 return -1;
cf648174 5505 ir.reg |= rex_r;
7ad10968
HZ
5506 if (ir.mod == 3)
5507 {
cf648174 5508 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5509 ir.reg &= 0x3;
25ea693b 5510 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
cf648174 5511 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5512 ir.rm &= 0x3;
25ea693b 5513 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
5514 }
5515 else
5516 {
5517 if (i386_record_lea_modrm (&ir))
5518 return -1;
cf648174 5519 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5520 ir.reg &= 0x3;
25ea693b 5521 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
7ad10968 5522 }
25ea693b 5523 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5524 break;
5525
a38bba38 5526 case 0x0fb0: /* cmpxchg */
7ad10968
HZ
5527 case 0x0fb1:
5528 if ((opcode & 1) == 0)
5529 ir.ot = OT_BYTE;
5530 else
5531 ir.ot = ir.dflag + OT_WORD;
5532 if (i386_record_modrm (&ir))
5533 return -1;
5534 if (ir.mod == 3)
5535 {
cf648174 5536 ir.reg |= rex_r;
25ea693b 5537 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
cf648174 5538 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5539 ir.reg &= 0x3;
25ea693b 5540 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
5541 }
5542 else
5543 {
25ea693b 5544 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5545 if (i386_record_lea_modrm (&ir))
5546 return -1;
5547 }
25ea693b 5548 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5549 break;
5550
20b477a7 5551 case 0x0fc7: /* cmpxchg8b / rdrand / rdseed */
7ad10968
HZ
5552 if (i386_record_modrm (&ir))
5553 return -1;
5554 if (ir.mod == 3)
5555 {
20b477a7
LM
5556 /* rdrand and rdseed use the 3 bits of the REG field of ModR/M as
5557 an extended opcode. rdrand has bits 110 (/6) and rdseed
5558 has bits 111 (/7). */
5559 if (ir.reg == 6 || ir.reg == 7)
5560 {
5561 /* The storage register is described by the 3 R/M bits, but the
5562 REX.B prefix may be used to give access to registers
5563 R8~R15. In this case ir.rex_b + R/M will give us the register
5564 in the range R8~R15.
5565
5566 REX.W may also be used to access 64-bit registers, but we
5567 already record entire registers and not just partial bits
5568 of them. */
5569 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rex_b + ir.rm);
5570 /* These instructions also set conditional bits. */
5571 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5572 break;
5573 }
5574 else
5575 {
5576 /* We don't handle this particular instruction yet. */
5577 ir.addr -= 2;
5578 opcode = opcode << 8 | ir.modrm;
5579 goto no_support;
5580 }
7ad10968 5581 }
25ea693b
MM
5582 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5583 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
5584 if (i386_record_lea_modrm (&ir))
5585 return -1;
25ea693b 5586 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5587 break;
5588
a38bba38 5589 case 0x50: /* push */
7ad10968
HZ
5590 case 0x51:
5591 case 0x52:
5592 case 0x53:
5593 case 0x54:
5594 case 0x55:
5595 case 0x56:
5596 case 0x57:
5597 case 0x68:
5598 case 0x6a:
cf648174
HZ
5599 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5600 ir.dflag = 2;
5601 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5602 return -1;
5603 break;
5604
a38bba38
MS
5605 case 0x06: /* push es */
5606 case 0x0e: /* push cs */
5607 case 0x16: /* push ss */
5608 case 0x1e: /* push ds */
cf648174
HZ
5609 if (ir.regmap[X86_RECORD_R8_REGNUM])
5610 {
5611 ir.addr -= 1;
5612 goto no_support;
5613 }
5614 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5615 return -1;
5616 break;
5617
a38bba38
MS
5618 case 0x0fa0: /* push fs */
5619 case 0x0fa8: /* push gs */
cf648174
HZ
5620 if (ir.regmap[X86_RECORD_R8_REGNUM])
5621 {
5622 ir.addr -= 2;
5623 goto no_support;
5624 }
5625 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 5626 return -1;
cf648174
HZ
5627 break;
5628
a38bba38 5629 case 0x60: /* pusha */
cf648174
HZ
5630 if (ir.regmap[X86_RECORD_R8_REGNUM])
5631 {
5632 ir.addr -= 1;
5633 goto no_support;
5634 }
5635 if (i386_record_push (&ir, 1 << (ir.dflag + 4)))
7ad10968
HZ
5636 return -1;
5637 break;
5638
a38bba38 5639 case 0x58: /* pop */
7ad10968
HZ
5640 case 0x59:
5641 case 0x5a:
5642 case 0x5b:
5643 case 0x5c:
5644 case 0x5d:
5645 case 0x5e:
5646 case 0x5f:
25ea693b
MM
5647 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5648 I386_RECORD_FULL_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
7ad10968
HZ
5649 break;
5650
a38bba38 5651 case 0x61: /* popa */
cf648174
HZ
5652 if (ir.regmap[X86_RECORD_R8_REGNUM])
5653 {
5654 ir.addr -= 1;
5655 goto no_support;
7ad10968 5656 }
425b824a
MS
5657 for (regnum = X86_RECORD_REAX_REGNUM;
5658 regnum <= X86_RECORD_REDI_REGNUM;
5659 regnum++)
25ea693b 5660 I386_RECORD_FULL_ARCH_LIST_ADD_REG (regnum);
7ad10968
HZ
5661 break;
5662
a38bba38 5663 case 0x8f: /* pop */
cf648174
HZ
5664 if (ir.regmap[X86_RECORD_R8_REGNUM])
5665 ir.ot = ir.dflag ? OT_QUAD : OT_WORD;
5666 else
5667 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
5668 if (i386_record_modrm (&ir))
5669 return -1;
5670 if (ir.mod == 3)
25ea693b 5671 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5672 else
5673 {
cf648174 5674 ir.popl_esp_hack = 1 << ir.ot;
7ad10968
HZ
5675 if (i386_record_lea_modrm (&ir))
5676 return -1;
5677 }
25ea693b 5678 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
7ad10968
HZ
5679 break;
5680
a38bba38 5681 case 0xc8: /* enter */
25ea693b 5682 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
cf648174
HZ
5683 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5684 ir.dflag = 2;
5685 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968
HZ
5686 return -1;
5687 break;
5688
a38bba38 5689 case 0xc9: /* leave */
25ea693b
MM
5690 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5691 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
7ad10968
HZ
5692 break;
5693
a38bba38 5694 case 0x07: /* pop es */
cf648174
HZ
5695 if (ir.regmap[X86_RECORD_R8_REGNUM])
5696 {
5697 ir.addr -= 1;
5698 goto no_support;
5699 }
25ea693b
MM
5700 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5701 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_ES_REGNUM);
5702 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5703 break;
5704
a38bba38 5705 case 0x17: /* pop ss */
cf648174
HZ
5706 if (ir.regmap[X86_RECORD_R8_REGNUM])
5707 {
5708 ir.addr -= 1;
5709 goto no_support;
5710 }
25ea693b
MM
5711 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5712 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_SS_REGNUM);
5713 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5714 break;
5715
a38bba38 5716 case 0x1f: /* pop ds */
cf648174
HZ
5717 if (ir.regmap[X86_RECORD_R8_REGNUM])
5718 {
5719 ir.addr -= 1;
5720 goto no_support;
5721 }
25ea693b
MM
5722 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5723 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_DS_REGNUM);
5724 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5725 break;
5726
a38bba38 5727 case 0x0fa1: /* pop fs */
25ea693b
MM
5728 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5729 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_FS_REGNUM);
5730 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5731 break;
5732
a38bba38 5733 case 0x0fa9: /* pop gs */
25ea693b
MM
5734 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5735 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
5736 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5737 break;
5738
a38bba38 5739 case 0x88: /* mov */
7ad10968
HZ
5740 case 0x89:
5741 case 0xc6:
5742 case 0xc7:
5743 if ((opcode & 1) == 0)
5744 ir.ot = OT_BYTE;
5745 else
5746 ir.ot = ir.dflag + OT_WORD;
5747
5748 if (i386_record_modrm (&ir))
5749 return -1;
5750
5751 if (ir.mod != 3)
5752 {
cf648174
HZ
5753 if (opcode == 0xc6 || opcode == 0xc7)
5754 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
7ad10968
HZ
5755 if (i386_record_lea_modrm (&ir))
5756 return -1;
5757 }
5758 else
5759 {
cf648174
HZ
5760 if (opcode == 0xc6 || opcode == 0xc7)
5761 ir.rm |= ir.rex_b;
5762 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5763 ir.rm &= 0x3;
25ea693b 5764 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 5765 }
7ad10968 5766 break;
cf648174 5767
a38bba38 5768 case 0x8a: /* mov */
7ad10968
HZ
5769 case 0x8b:
5770 if ((opcode & 1) == 0)
5771 ir.ot = OT_BYTE;
5772 else
5773 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
5774 if (i386_record_modrm (&ir))
5775 return -1;
cf648174
HZ
5776 ir.reg |= rex_r;
5777 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5778 ir.reg &= 0x3;
25ea693b 5779 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
cf648174 5780 break;
7ad10968 5781
a38bba38 5782 case 0x8c: /* mov seg */
cf648174 5783 if (i386_record_modrm (&ir))
7ad10968 5784 return -1;
cf648174
HZ
5785 if (ir.reg > 5)
5786 {
5787 ir.addr -= 2;
5788 opcode = opcode << 8 | ir.modrm;
5789 goto no_support;
5790 }
5791
5792 if (ir.mod == 3)
25ea693b 5793 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
cf648174
HZ
5794 else
5795 {
5796 ir.ot = OT_WORD;
5797 if (i386_record_lea_modrm (&ir))
5798 return -1;
5799 }
7ad10968
HZ
5800 break;
5801
a38bba38 5802 case 0x8e: /* mov seg */
7ad10968
HZ
5803 if (i386_record_modrm (&ir))
5804 return -1;
7ad10968
HZ
5805 switch (ir.reg)
5806 {
5807 case 0:
425b824a 5808 regnum = X86_RECORD_ES_REGNUM;
7ad10968
HZ
5809 break;
5810 case 2:
425b824a 5811 regnum = X86_RECORD_SS_REGNUM;
7ad10968
HZ
5812 break;
5813 case 3:
425b824a 5814 regnum = X86_RECORD_DS_REGNUM;
7ad10968
HZ
5815 break;
5816 case 4:
425b824a 5817 regnum = X86_RECORD_FS_REGNUM;
7ad10968
HZ
5818 break;
5819 case 5:
425b824a 5820 regnum = X86_RECORD_GS_REGNUM;
7ad10968
HZ
5821 break;
5822 default:
5823 ir.addr -= 2;
5824 opcode = opcode << 8 | ir.modrm;
5825 goto no_support;
5826 break;
5827 }
25ea693b
MM
5828 I386_RECORD_FULL_ARCH_LIST_ADD_REG (regnum);
5829 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5830 break;
5831
a38bba38
MS
5832 case 0x0fb6: /* movzbS */
5833 case 0x0fb7: /* movzwS */
5834 case 0x0fbe: /* movsbS */
5835 case 0x0fbf: /* movswS */
7ad10968
HZ
5836 if (i386_record_modrm (&ir))
5837 return -1;
25ea693b 5838 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
7ad10968
HZ
5839 break;
5840
a38bba38 5841 case 0x8d: /* lea */
7ad10968
HZ
5842 if (i386_record_modrm (&ir))
5843 return -1;
5844 if (ir.mod == 3)
5845 {
5846 ir.addr -= 2;
5847 opcode = opcode << 8 | ir.modrm;
5848 goto no_support;
5849 }
7ad10968 5850 ir.ot = ir.dflag;
cf648174
HZ
5851 ir.reg |= rex_r;
5852 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5853 ir.reg &= 0x3;
25ea693b 5854 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
5855 break;
5856
a38bba38 5857 case 0xa0: /* mov EAX */
7ad10968 5858 case 0xa1:
a38bba38
MS
5859
5860 case 0xd7: /* xlat */
25ea693b 5861 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5862 break;
5863
a38bba38 5864 case 0xa2: /* mov EAX */
7ad10968 5865 case 0xa3:
d7877f7e 5866 if (ir.override >= 0)
cf648174 5867 {
25ea693b 5868 if (record_full_memory_query)
bb08c432 5869 {
651ce16a 5870 if (yquery (_("\
bb08c432
HZ
5871Process record ignores the memory change of instruction at address %s\n\
5872because it can't get the value of the segment register.\n\
5873Do you want to stop the program?"),
651ce16a 5874 paddress (gdbarch, ir.orig_addr)))
bb08c432
HZ
5875 return -1;
5876 }
cf648174
HZ
5877 }
5878 else
5879 {
5880 if ((opcode & 1) == 0)
5881 ir.ot = OT_BYTE;
5882 else
5883 ir.ot = ir.dflag + OT_WORD;
5884 if (ir.aflag == 2)
5885 {
4ffa4fc7
PA
5886 if (record_read_memory (gdbarch, ir.addr, buf, 8))
5887 return -1;
cf648174 5888 ir.addr += 8;
60a1502a 5889 addr = extract_unsigned_integer (buf, 8, byte_order);
cf648174
HZ
5890 }
5891 else if (ir.aflag)
5892 {
4ffa4fc7
PA
5893 if (record_read_memory (gdbarch, ir.addr, buf, 4))
5894 return -1;
cf648174 5895 ir.addr += 4;
60a1502a 5896 addr = extract_unsigned_integer (buf, 4, byte_order);
cf648174
HZ
5897 }
5898 else
5899 {
4ffa4fc7
PA
5900 if (record_read_memory (gdbarch, ir.addr, buf, 2))
5901 return -1;
cf648174 5902 ir.addr += 2;
60a1502a 5903 addr = extract_unsigned_integer (buf, 2, byte_order);
cf648174 5904 }
25ea693b 5905 if (record_full_arch_list_add_mem (addr, 1 << ir.ot))
cf648174
HZ
5906 return -1;
5907 }
7ad10968
HZ
5908 break;
5909
a38bba38 5910 case 0xb0: /* mov R, Ib */
7ad10968
HZ
5911 case 0xb1:
5912 case 0xb2:
5913 case 0xb3:
5914 case 0xb4:
5915 case 0xb5:
5916 case 0xb6:
5917 case 0xb7:
25ea693b
MM
5918 I386_RECORD_FULL_ARCH_LIST_ADD_REG ((ir.regmap[X86_RECORD_R8_REGNUM])
5919 ? ((opcode & 0x7) | ir.rex_b)
5920 : ((opcode & 0x7) & 0x3));
7ad10968
HZ
5921 break;
5922
a38bba38 5923 case 0xb8: /* mov R, Iv */
7ad10968
HZ
5924 case 0xb9:
5925 case 0xba:
5926 case 0xbb:
5927 case 0xbc:
5928 case 0xbd:
5929 case 0xbe:
5930 case 0xbf:
25ea693b 5931 I386_RECORD_FULL_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
7ad10968
HZ
5932 break;
5933
a38bba38 5934 case 0x91: /* xchg R, EAX */
7ad10968
HZ
5935 case 0x92:
5936 case 0x93:
5937 case 0x94:
5938 case 0x95:
5939 case 0x96:
5940 case 0x97:
25ea693b
MM
5941 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5942 I386_RECORD_FULL_ARCH_LIST_ADD_REG (opcode & 0x7);
7ad10968
HZ
5943 break;
5944
a38bba38 5945 case 0x86: /* xchg Ev, Gv */
7ad10968
HZ
5946 case 0x87:
5947 if ((opcode & 1) == 0)
5948 ir.ot = OT_BYTE;
5949 else
5950 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
5951 if (i386_record_modrm (&ir))
5952 return -1;
7ad10968
HZ
5953 if (ir.mod == 3)
5954 {
86839d38 5955 ir.rm |= ir.rex_b;
cf648174
HZ
5956 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
5957 ir.rm &= 0x3;
25ea693b 5958 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
5959 }
5960 else
5961 {
5962 if (i386_record_lea_modrm (&ir))
5963 return -1;
5964 }
cf648174
HZ
5965 ir.reg |= rex_r;
5966 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 5967 ir.reg &= 0x3;
25ea693b 5968 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
5969 break;
5970
a38bba38
MS
5971 case 0xc4: /* les Gv */
5972 case 0xc5: /* lds Gv */
cf648174
HZ
5973 if (ir.regmap[X86_RECORD_R8_REGNUM])
5974 {
5975 ir.addr -= 1;
5976 goto no_support;
5977 }
d3f323f3 5978 /* FALLTHROUGH */
a38bba38
MS
5979 case 0x0fb2: /* lss Gv */
5980 case 0x0fb4: /* lfs Gv */
5981 case 0x0fb5: /* lgs Gv */
7ad10968
HZ
5982 if (i386_record_modrm (&ir))
5983 return -1;
5984 if (ir.mod == 3)
5985 {
5986 if (opcode > 0xff)
5987 ir.addr -= 3;
5988 else
5989 ir.addr -= 2;
5990 opcode = opcode << 8 | ir.modrm;
5991 goto no_support;
5992 }
7ad10968
HZ
5993 switch (opcode)
5994 {
a38bba38 5995 case 0xc4: /* les Gv */
425b824a 5996 regnum = X86_RECORD_ES_REGNUM;
7ad10968 5997 break;
a38bba38 5998 case 0xc5: /* lds Gv */
425b824a 5999 regnum = X86_RECORD_DS_REGNUM;
7ad10968 6000 break;
a38bba38 6001 case 0x0fb2: /* lss Gv */
425b824a 6002 regnum = X86_RECORD_SS_REGNUM;
7ad10968 6003 break;
a38bba38 6004 case 0x0fb4: /* lfs Gv */
425b824a 6005 regnum = X86_RECORD_FS_REGNUM;
7ad10968 6006 break;
a38bba38 6007 case 0x0fb5: /* lgs Gv */
425b824a 6008 regnum = X86_RECORD_GS_REGNUM;
7ad10968
HZ
6009 break;
6010 }
25ea693b
MM
6011 I386_RECORD_FULL_ARCH_LIST_ADD_REG (regnum);
6012 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
6013 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6014 break;
6015
a38bba38 6016 case 0xc0: /* shifts */
7ad10968
HZ
6017 case 0xc1:
6018 case 0xd0:
6019 case 0xd1:
6020 case 0xd2:
6021 case 0xd3:
6022 if ((opcode & 1) == 0)
6023 ir.ot = OT_BYTE;
6024 else
6025 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
6026 if (i386_record_modrm (&ir))
6027 return -1;
7ad10968
HZ
6028 if (ir.mod != 3 && (opcode == 0xd2 || opcode == 0xd3))
6029 {
6030 if (i386_record_lea_modrm (&ir))
6031 return -1;
6032 }
6033 else
6034 {
cf648174
HZ
6035 ir.rm |= ir.rex_b;
6036 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 6037 ir.rm &= 0x3;
25ea693b 6038 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 6039 }
25ea693b 6040 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6041 break;
6042
6043 case 0x0fa4:
6044 case 0x0fa5:
6045 case 0x0fac:
6046 case 0x0fad:
6047 if (i386_record_modrm (&ir))
6048 return -1;
6049 if (ir.mod == 3)
6050 {
25ea693b 6051 if (record_full_arch_list_add_reg (ir.regcache, ir.rm))
7ad10968
HZ
6052 return -1;
6053 }
6054 else
6055 {
6056 if (i386_record_lea_modrm (&ir))
6057 return -1;
6058 }
6059 break;
6060
a38bba38 6061 case 0xd8: /* Floats. */
7ad10968
HZ
6062 case 0xd9:
6063 case 0xda:
6064 case 0xdb:
6065 case 0xdc:
6066 case 0xdd:
6067 case 0xde:
6068 case 0xdf:
6069 if (i386_record_modrm (&ir))
6070 return -1;
6071 ir.reg |= ((opcode & 7) << 3);
6072 if (ir.mod != 3)
6073 {
1777feb0 6074 /* Memory. */
955db0c0 6075 uint64_t addr64;
7ad10968 6076
955db0c0 6077 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968
HZ
6078 return -1;
6079 switch (ir.reg)
6080 {
7ad10968 6081 case 0x02:
0289bdd7
MS
6082 case 0x12:
6083 case 0x22:
6084 case 0x32:
6085 /* For fcom, ficom nothing to do. */
6086 break;
7ad10968 6087 case 0x03:
0289bdd7
MS
6088 case 0x13:
6089 case 0x23:
6090 case 0x33:
6091 /* For fcomp, ficomp pop FPU stack, store all. */
6092 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
6093 return -1;
6094 break;
6095 case 0x00:
6096 case 0x01:
7ad10968
HZ
6097 case 0x04:
6098 case 0x05:
6099 case 0x06:
6100 case 0x07:
6101 case 0x10:
6102 case 0x11:
7ad10968
HZ
6103 case 0x14:
6104 case 0x15:
6105 case 0x16:
6106 case 0x17:
6107 case 0x20:
6108 case 0x21:
7ad10968
HZ
6109 case 0x24:
6110 case 0x25:
6111 case 0x26:
6112 case 0x27:
6113 case 0x30:
6114 case 0x31:
7ad10968
HZ
6115 case 0x34:
6116 case 0x35:
6117 case 0x36:
6118 case 0x37:
0289bdd7
MS
6119 /* For fadd, fmul, fsub, fsubr, fdiv, fdivr, fiadd, fimul,
6120 fisub, fisubr, fidiv, fidivr, modR/M.reg is an extension
6121 of code, always affects st(0) register. */
6122 if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
6123 return -1;
7ad10968
HZ
6124 break;
6125 case 0x08:
6126 case 0x0a:
6127 case 0x0b:
6128 case 0x18:
6129 case 0x19:
6130 case 0x1a:
6131 case 0x1b:
0289bdd7 6132 case 0x1d:
7ad10968
HZ
6133 case 0x28:
6134 case 0x29:
6135 case 0x2a:
6136 case 0x2b:
6137 case 0x38:
6138 case 0x39:
6139 case 0x3a:
6140 case 0x3b:
0289bdd7
MS
6141 case 0x3c:
6142 case 0x3d:
7ad10968
HZ
6143 switch (ir.reg & 7)
6144 {
6145 case 0:
0289bdd7
MS
6146 /* Handling fld, fild. */
6147 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
6148 return -1;
7ad10968
HZ
6149 break;
6150 case 1:
6151 switch (ir.reg >> 4)
6152 {
6153 case 0:
25ea693b 6154 if (record_full_arch_list_add_mem (addr64, 4))
7ad10968
HZ
6155 return -1;
6156 break;
6157 case 2:
25ea693b 6158 if (record_full_arch_list_add_mem (addr64, 8))
7ad10968
HZ
6159 return -1;
6160 break;
6161 case 3:
0289bdd7 6162 break;
7ad10968 6163 default:
25ea693b 6164 if (record_full_arch_list_add_mem (addr64, 2))
7ad10968
HZ
6165 return -1;
6166 break;
6167 }
6168 break;
6169 default:
6170 switch (ir.reg >> 4)
6171 {
6172 case 0:
25ea693b 6173 if (record_full_arch_list_add_mem (addr64, 4))
0289bdd7
MS
6174 return -1;
6175 if (3 == (ir.reg & 7))
6176 {
6177 /* For fstp m32fp. */
6178 if (i386_record_floats (gdbarch, &ir,
6179 I386_SAVE_FPU_REGS))
6180 return -1;
6181 }
6182 break;
7ad10968 6183 case 1:
25ea693b 6184 if (record_full_arch_list_add_mem (addr64, 4))
7ad10968 6185 return -1;
0289bdd7
MS
6186 if ((3 == (ir.reg & 7))
6187 || (5 == (ir.reg & 7))
6188 || (7 == (ir.reg & 7)))
6189 {
6190 /* For fstp insn. */
6191 if (i386_record_floats (gdbarch, &ir,
6192 I386_SAVE_FPU_REGS))
6193 return -1;
6194 }
7ad10968
HZ
6195 break;
6196 case 2:
25ea693b 6197 if (record_full_arch_list_add_mem (addr64, 8))
7ad10968 6198 return -1;
0289bdd7
MS
6199 if (3 == (ir.reg & 7))
6200 {
6201 /* For fstp m64fp. */
6202 if (i386_record_floats (gdbarch, &ir,
6203 I386_SAVE_FPU_REGS))
6204 return -1;
6205 }
7ad10968
HZ
6206 break;
6207 case 3:
0289bdd7
MS
6208 if ((3 <= (ir.reg & 7)) && (6 <= (ir.reg & 7)))
6209 {
6210 /* For fistp, fbld, fild, fbstp. */
6211 if (i386_record_floats (gdbarch, &ir,
6212 I386_SAVE_FPU_REGS))
6213 return -1;
6214 }
6215 /* Fall through */
7ad10968 6216 default:
25ea693b 6217 if (record_full_arch_list_add_mem (addr64, 2))
7ad10968
HZ
6218 return -1;
6219 break;
6220 }
6221 break;
6222 }
6223 break;
6224 case 0x0c:
0289bdd7
MS
6225 /* Insn fldenv. */
6226 if (i386_record_floats (gdbarch, &ir,
6227 I386_SAVE_FPU_ENV_REG_STACK))
6228 return -1;
6229 break;
7ad10968 6230 case 0x0d:
0289bdd7
MS
6231 /* Insn fldcw. */
6232 if (i386_record_floats (gdbarch, &ir, I387_FCTRL_REGNUM (tdep)))
6233 return -1;
6234 break;
7ad10968 6235 case 0x2c:
0289bdd7
MS
6236 /* Insn frstor. */
6237 if (i386_record_floats (gdbarch, &ir,
6238 I386_SAVE_FPU_ENV_REG_STACK))
6239 return -1;
7ad10968
HZ
6240 break;
6241 case 0x0e:
6242 if (ir.dflag)
6243 {
25ea693b 6244 if (record_full_arch_list_add_mem (addr64, 28))
7ad10968
HZ
6245 return -1;
6246 }
6247 else
6248 {
25ea693b 6249 if (record_full_arch_list_add_mem (addr64, 14))
7ad10968
HZ
6250 return -1;
6251 }
6252 break;
6253 case 0x0f:
6254 case 0x2f:
25ea693b 6255 if (record_full_arch_list_add_mem (addr64, 2))
7ad10968 6256 return -1;
0289bdd7
MS
6257 /* Insn fstp, fbstp. */
6258 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
6259 return -1;
7ad10968
HZ
6260 break;
6261 case 0x1f:
6262 case 0x3e:
25ea693b 6263 if (record_full_arch_list_add_mem (addr64, 10))
7ad10968
HZ
6264 return -1;
6265 break;
6266 case 0x2e:
6267 if (ir.dflag)
6268 {
25ea693b 6269 if (record_full_arch_list_add_mem (addr64, 28))
7ad10968 6270 return -1;
955db0c0 6271 addr64 += 28;
7ad10968
HZ
6272 }
6273 else
6274 {
25ea693b 6275 if (record_full_arch_list_add_mem (addr64, 14))
7ad10968 6276 return -1;
955db0c0 6277 addr64 += 14;
7ad10968 6278 }
25ea693b 6279 if (record_full_arch_list_add_mem (addr64, 80))
7ad10968 6280 return -1;
0289bdd7
MS
6281 /* Insn fsave. */
6282 if (i386_record_floats (gdbarch, &ir,
6283 I386_SAVE_FPU_ENV_REG_STACK))
6284 return -1;
7ad10968
HZ
6285 break;
6286 case 0x3f:
25ea693b 6287 if (record_full_arch_list_add_mem (addr64, 8))
7ad10968 6288 return -1;
0289bdd7
MS
6289 /* Insn fistp. */
6290 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
6291 return -1;
7ad10968
HZ
6292 break;
6293 default:
6294 ir.addr -= 2;
6295 opcode = opcode << 8 | ir.modrm;
6296 goto no_support;
6297 break;
6298 }
6299 }
0289bdd7
MS
6300 /* Opcode is an extension of modR/M byte. */
6301 else
6302 {
6303 switch (opcode)
6304 {
6305 case 0xd8:
6306 if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
6307 return -1;
6308 break;
6309 case 0xd9:
6310 if (0x0c == (ir.modrm >> 4))
6311 {
6312 if ((ir.modrm & 0x0f) <= 7)
6313 {
6314 if (i386_record_floats (gdbarch, &ir,
6315 I386_SAVE_FPU_REGS))
6316 return -1;
6317 }
6318 else
6319 {
6320 if (i386_record_floats (gdbarch, &ir,
6321 I387_ST0_REGNUM (tdep)))
6322 return -1;
6323 /* If only st(0) is changing, then we have already
6324 recorded. */
6325 if ((ir.modrm & 0x0f) - 0x08)
6326 {
6327 if (i386_record_floats (gdbarch, &ir,
6328 I387_ST0_REGNUM (tdep) +
6329 ((ir.modrm & 0x0f) - 0x08)))
6330 return -1;
6331 }
6332 }
6333 }
6334 else
6335 {
6336 switch (ir.modrm)
6337 {
6338 case 0xe0:
6339 case 0xe1:
6340 case 0xf0:
6341 case 0xf5:
6342 case 0xf8:
6343 case 0xfa:
6344 case 0xfc:
6345 case 0xfe:
6346 case 0xff:
6347 if (i386_record_floats (gdbarch, &ir,
6348 I387_ST0_REGNUM (tdep)))
6349 return -1;
6350 break;
6351 case 0xf1:
6352 case 0xf2:
6353 case 0xf3:
6354 case 0xf4:
6355 case 0xf6:
6356 case 0xf7:
6357 case 0xe8:
6358 case 0xe9:
6359 case 0xea:
6360 case 0xeb:
6361 case 0xec:
6362 case 0xed:
6363 case 0xee:
6364 case 0xf9:
6365 case 0xfb:
6366 if (i386_record_floats (gdbarch, &ir,
6367 I386_SAVE_FPU_REGS))
6368 return -1;
6369 break;
6370 case 0xfd:
6371 if (i386_record_floats (gdbarch, &ir,
6372 I387_ST0_REGNUM (tdep)))
6373 return -1;
6374 if (i386_record_floats (gdbarch, &ir,
6375 I387_ST0_REGNUM (tdep) + 1))
6376 return -1;
6377 break;
6378 }
6379 }
6380 break;
6381 case 0xda:
6382 if (0xe9 == ir.modrm)
6383 {
6384 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
6385 return -1;
6386 }
6387 else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
6388 {
6389 if (i386_record_floats (gdbarch, &ir,
6390 I387_ST0_REGNUM (tdep)))
6391 return -1;
6392 if (((ir.modrm & 0x0f) > 0) && ((ir.modrm & 0x0f) <= 7))
6393 {
6394 if (i386_record_floats (gdbarch, &ir,
6395 I387_ST0_REGNUM (tdep) +
6396 (ir.modrm & 0x0f)))
6397 return -1;
6398 }
6399 else if ((ir.modrm & 0x0f) - 0x08)
6400 {
6401 if (i386_record_floats (gdbarch, &ir,
6402 I387_ST0_REGNUM (tdep) +
6403 ((ir.modrm & 0x0f) - 0x08)))
6404 return -1;
6405 }
6406 }
6407 break;
6408 case 0xdb:
6409 if (0xe3 == ir.modrm)
6410 {
6411 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_ENV))
6412 return -1;
6413 }
6414 else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
6415 {
6416 if (i386_record_floats (gdbarch, &ir,
6417 I387_ST0_REGNUM (tdep)))
6418 return -1;
6419 if (((ir.modrm & 0x0f) > 0) && ((ir.modrm & 0x0f) <= 7))
6420 {
6421 if (i386_record_floats (gdbarch, &ir,
6422 I387_ST0_REGNUM (tdep) +
6423 (ir.modrm & 0x0f)))
6424 return -1;
6425 }
6426 else if ((ir.modrm & 0x0f) - 0x08)
6427 {
6428 if (i386_record_floats (gdbarch, &ir,
6429 I387_ST0_REGNUM (tdep) +
6430 ((ir.modrm & 0x0f) - 0x08)))
6431 return -1;
6432 }
6433 }
6434 break;
6435 case 0xdc:
6436 if ((0x0c == ir.modrm >> 4)
6437 || (0x0d == ir.modrm >> 4)
6438 || (0x0f == ir.modrm >> 4))
6439 {
6440 if ((ir.modrm & 0x0f) <= 7)
6441 {
6442 if (i386_record_floats (gdbarch, &ir,
6443 I387_ST0_REGNUM (tdep) +
6444 (ir.modrm & 0x0f)))
6445 return -1;
6446 }
6447 else
6448 {
6449 if (i386_record_floats (gdbarch, &ir,
6450 I387_ST0_REGNUM (tdep) +
6451 ((ir.modrm & 0x0f) - 0x08)))
6452 return -1;
6453 }
6454 }
6455 break;
6456 case 0xdd:
6457 if (0x0c == ir.modrm >> 4)
6458 {
6459 if (i386_record_floats (gdbarch, &ir,
6460 I387_FTAG_REGNUM (tdep)))
6461 return -1;
6462 }
6463 else if ((0x0d == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
6464 {
6465 if ((ir.modrm & 0x0f) <= 7)
6466 {
6467 if (i386_record_floats (gdbarch, &ir,
6468 I387_ST0_REGNUM (tdep) +
6469 (ir.modrm & 0x0f)))
6470 return -1;
6471 }
6472 else
6473 {
6474 if (i386_record_floats (gdbarch, &ir,
6475 I386_SAVE_FPU_REGS))
6476 return -1;
6477 }
6478 }
6479 break;
6480 case 0xde:
6481 if ((0x0c == ir.modrm >> 4)
6482 || (0x0e == ir.modrm >> 4)
6483 || (0x0f == ir.modrm >> 4)
6484 || (0xd9 == ir.modrm))
6485 {
6486 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
6487 return -1;
6488 }
6489 break;
6490 case 0xdf:
6491 if (0xe0 == ir.modrm)
6492 {
25ea693b
MM
6493 if (record_full_arch_list_add_reg (ir.regcache,
6494 I386_EAX_REGNUM))
0289bdd7
MS
6495 return -1;
6496 }
6497 else if ((0x0f == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
6498 {
6499 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
6500 return -1;
6501 }
6502 break;
6503 }
6504 }
7ad10968 6505 break;
7ad10968 6506 /* string ops */
a38bba38 6507 case 0xa4: /* movsS */
7ad10968 6508 case 0xa5:
a38bba38 6509 case 0xaa: /* stosS */
7ad10968 6510 case 0xab:
a38bba38 6511 case 0x6c: /* insS */
7ad10968 6512 case 0x6d:
cf648174 6513 regcache_raw_read_unsigned (ir.regcache,
77d7dc92 6514 ir.regmap[X86_RECORD_RECX_REGNUM],
648d0c8b
MS
6515 &addr);
6516 if (addr)
cf648174 6517 {
77d7dc92
HZ
6518 ULONGEST es, ds;
6519
6520 if ((opcode & 1) == 0)
6521 ir.ot = OT_BYTE;
6522 else
6523 ir.ot = ir.dflag + OT_WORD;
cf648174
HZ
6524 regcache_raw_read_unsigned (ir.regcache,
6525 ir.regmap[X86_RECORD_REDI_REGNUM],
648d0c8b 6526 &addr);
77d7dc92 6527
d7877f7e
HZ
6528 regcache_raw_read_unsigned (ir.regcache,
6529 ir.regmap[X86_RECORD_ES_REGNUM],
6530 &es);
6531 regcache_raw_read_unsigned (ir.regcache,
6532 ir.regmap[X86_RECORD_DS_REGNUM],
6533 &ds);
6534 if (ir.aflag && (es != ds))
77d7dc92
HZ
6535 {
6536 /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
25ea693b 6537 if (record_full_memory_query)
bb08c432 6538 {
651ce16a 6539 if (yquery (_("\
bb08c432
HZ
6540Process record ignores the memory change of instruction at address %s\n\
6541because it can't get the value of the segment register.\n\
6542Do you want to stop the program?"),
651ce16a 6543 paddress (gdbarch, ir.orig_addr)))
bb08c432
HZ
6544 return -1;
6545 }
df61f520
HZ
6546 }
6547 else
6548 {
25ea693b 6549 if (record_full_arch_list_add_mem (addr, 1 << ir.ot))
df61f520 6550 return -1;
77d7dc92
HZ
6551 }
6552
6553 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
25ea693b 6554 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
77d7dc92 6555 if (opcode == 0xa4 || opcode == 0xa5)
25ea693b
MM
6556 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
6557 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
6558 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
77d7dc92 6559 }
cf648174 6560 break;
7ad10968 6561
a38bba38 6562 case 0xa6: /* cmpsS */
cf648174 6563 case 0xa7:
25ea693b
MM
6564 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
6565 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
cf648174 6566 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
25ea693b
MM
6567 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
6568 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6569 break;
6570
a38bba38 6571 case 0xac: /* lodsS */
7ad10968 6572 case 0xad:
25ea693b
MM
6573 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
6574 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
7ad10968 6575 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
25ea693b
MM
6576 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
6577 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6578 break;
6579
a38bba38 6580 case 0xae: /* scasS */
7ad10968 6581 case 0xaf:
25ea693b 6582 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
7ad10968 6583 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
25ea693b
MM
6584 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
6585 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6586 break;
6587
a38bba38 6588 case 0x6e: /* outsS */
cf648174 6589 case 0x6f:
25ea693b 6590 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
7ad10968 6591 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
25ea693b
MM
6592 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
6593 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6594 break;
6595
a38bba38 6596 case 0xe4: /* port I/O */
7ad10968
HZ
6597 case 0xe5:
6598 case 0xec:
6599 case 0xed:
25ea693b
MM
6600 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6601 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
6602 break;
6603
6604 case 0xe6:
6605 case 0xe7:
6606 case 0xee:
6607 case 0xef:
6608 break;
6609
6610 /* control */
a38bba38
MS
6611 case 0xc2: /* ret im */
6612 case 0xc3: /* ret */
25ea693b
MM
6613 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
6614 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
cf648174
HZ
6615 break;
6616
a38bba38
MS
6617 case 0xca: /* lret im */
6618 case 0xcb: /* lret */
6619 case 0xcf: /* iret */
25ea693b
MM
6620 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
6621 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
6622 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6623 break;
6624
a38bba38 6625 case 0xe8: /* call im */
cf648174
HZ
6626 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
6627 ir.dflag = 2;
6628 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
6629 return -1;
7ad10968
HZ
6630 break;
6631
a38bba38 6632 case 0x9a: /* lcall im */
cf648174
HZ
6633 if (ir.regmap[X86_RECORD_R8_REGNUM])
6634 {
6635 ir.addr -= 1;
6636 goto no_support;
6637 }
25ea693b 6638 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
cf648174
HZ
6639 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
6640 return -1;
7ad10968
HZ
6641 break;
6642
a38bba38
MS
6643 case 0xe9: /* jmp im */
6644 case 0xea: /* ljmp im */
6645 case 0xeb: /* jmp Jb */
6646 case 0x70: /* jcc Jb */
7ad10968
HZ
6647 case 0x71:
6648 case 0x72:
6649 case 0x73:
6650 case 0x74:
6651 case 0x75:
6652 case 0x76:
6653 case 0x77:
6654 case 0x78:
6655 case 0x79:
6656 case 0x7a:
6657 case 0x7b:
6658 case 0x7c:
6659 case 0x7d:
6660 case 0x7e:
6661 case 0x7f:
a38bba38 6662 case 0x0f80: /* jcc Jv */
7ad10968
HZ
6663 case 0x0f81:
6664 case 0x0f82:
6665 case 0x0f83:
6666 case 0x0f84:
6667 case 0x0f85:
6668 case 0x0f86:
6669 case 0x0f87:
6670 case 0x0f88:
6671 case 0x0f89:
6672 case 0x0f8a:
6673 case 0x0f8b:
6674 case 0x0f8c:
6675 case 0x0f8d:
6676 case 0x0f8e:
6677 case 0x0f8f:
6678 break;
6679
a38bba38 6680 case 0x0f90: /* setcc Gv */
7ad10968
HZ
6681 case 0x0f91:
6682 case 0x0f92:
6683 case 0x0f93:
6684 case 0x0f94:
6685 case 0x0f95:
6686 case 0x0f96:
6687 case 0x0f97:
6688 case 0x0f98:
6689 case 0x0f99:
6690 case 0x0f9a:
6691 case 0x0f9b:
6692 case 0x0f9c:
6693 case 0x0f9d:
6694 case 0x0f9e:
6695 case 0x0f9f:
25ea693b 6696 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6697 ir.ot = OT_BYTE;
6698 if (i386_record_modrm (&ir))
6699 return -1;
6700 if (ir.mod == 3)
25ea693b
MM
6701 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
6702 : (ir.rm & 0x3));
7ad10968
HZ
6703 else
6704 {
6705 if (i386_record_lea_modrm (&ir))
6706 return -1;
6707 }
6708 break;
6709
a38bba38 6710 case 0x0f40: /* cmov Gv, Ev */
7ad10968
HZ
6711 case 0x0f41:
6712 case 0x0f42:
6713 case 0x0f43:
6714 case 0x0f44:
6715 case 0x0f45:
6716 case 0x0f46:
6717 case 0x0f47:
6718 case 0x0f48:
6719 case 0x0f49:
6720 case 0x0f4a:
6721 case 0x0f4b:
6722 case 0x0f4c:
6723 case 0x0f4d:
6724 case 0x0f4e:
6725 case 0x0f4f:
6726 if (i386_record_modrm (&ir))
6727 return -1;
cf648174 6728 ir.reg |= rex_r;
7ad10968
HZ
6729 if (ir.dflag == OT_BYTE)
6730 ir.reg &= 0x3;
25ea693b 6731 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
6732 break;
6733
6734 /* flags */
a38bba38 6735 case 0x9c: /* pushf */
25ea693b 6736 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
cf648174
HZ
6737 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
6738 ir.dflag = 2;
6739 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
6740 return -1;
7ad10968
HZ
6741 break;
6742
a38bba38 6743 case 0x9d: /* popf */
25ea693b
MM
6744 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
6745 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6746 break;
6747
a38bba38 6748 case 0x9e: /* sahf */
cf648174
HZ
6749 if (ir.regmap[X86_RECORD_R8_REGNUM])
6750 {
6751 ir.addr -= 1;
6752 goto no_support;
6753 }
d3f323f3 6754 /* FALLTHROUGH */
a38bba38
MS
6755 case 0xf5: /* cmc */
6756 case 0xf8: /* clc */
6757 case 0xf9: /* stc */
6758 case 0xfc: /* cld */
6759 case 0xfd: /* std */
25ea693b 6760 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6761 break;
6762
a38bba38 6763 case 0x9f: /* lahf */
cf648174
HZ
6764 if (ir.regmap[X86_RECORD_R8_REGNUM])
6765 {
6766 ir.addr -= 1;
6767 goto no_support;
6768 }
25ea693b
MM
6769 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6770 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
6771 break;
6772
6773 /* bit operations */
a38bba38 6774 case 0x0fba: /* bt/bts/btr/btc Gv, im */
7ad10968
HZ
6775 ir.ot = ir.dflag + OT_WORD;
6776 if (i386_record_modrm (&ir))
6777 return -1;
6778 if (ir.reg < 4)
6779 {
cf648174 6780 ir.addr -= 2;
7ad10968
HZ
6781 opcode = opcode << 8 | ir.modrm;
6782 goto no_support;
6783 }
cf648174 6784 if (ir.reg != 4)
7ad10968 6785 {
cf648174 6786 if (ir.mod == 3)
25ea693b 6787 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
6788 else
6789 {
cf648174 6790 if (i386_record_lea_modrm (&ir))
7ad10968
HZ
6791 return -1;
6792 }
6793 }
25ea693b 6794 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6795 break;
6796
a38bba38 6797 case 0x0fa3: /* bt Gv, Ev */
25ea693b 6798 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
cf648174
HZ
6799 break;
6800
a38bba38
MS
6801 case 0x0fab: /* bts */
6802 case 0x0fb3: /* btr */
6803 case 0x0fbb: /* btc */
cf648174
HZ
6804 ir.ot = ir.dflag + OT_WORD;
6805 if (i386_record_modrm (&ir))
6806 return -1;
6807 if (ir.mod == 3)
25ea693b 6808 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
cf648174
HZ
6809 else
6810 {
955db0c0
MS
6811 uint64_t addr64;
6812 if (i386_record_lea_modrm_addr (&ir, &addr64))
cf648174
HZ
6813 return -1;
6814 regcache_raw_read_unsigned (ir.regcache,
6815 ir.regmap[ir.reg | rex_r],
648d0c8b 6816 &addr);
cf648174
HZ
6817 switch (ir.dflag)
6818 {
6819 case 0:
648d0c8b 6820 addr64 += ((int16_t) addr >> 4) << 4;
cf648174
HZ
6821 break;
6822 case 1:
648d0c8b 6823 addr64 += ((int32_t) addr >> 5) << 5;
cf648174
HZ
6824 break;
6825 case 2:
648d0c8b 6826 addr64 += ((int64_t) addr >> 6) << 6;
cf648174
HZ
6827 break;
6828 }
25ea693b 6829 if (record_full_arch_list_add_mem (addr64, 1 << ir.ot))
cf648174
HZ
6830 return -1;
6831 if (i386_record_lea_modrm (&ir))
6832 return -1;
6833 }
25ea693b 6834 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6835 break;
6836
a38bba38
MS
6837 case 0x0fbc: /* bsf */
6838 case 0x0fbd: /* bsr */
25ea693b
MM
6839 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
6840 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6841 break;
6842
6843 /* bcd */
a38bba38
MS
6844 case 0x27: /* daa */
6845 case 0x2f: /* das */
6846 case 0x37: /* aaa */
6847 case 0x3f: /* aas */
6848 case 0xd4: /* aam */
6849 case 0xd5: /* aad */
cf648174
HZ
6850 if (ir.regmap[X86_RECORD_R8_REGNUM])
6851 {
6852 ir.addr -= 1;
6853 goto no_support;
6854 }
25ea693b
MM
6855 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
6856 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6857 break;
6858
6859 /* misc */
a38bba38 6860 case 0x90: /* nop */
7ad10968
HZ
6861 if (prefixes & PREFIX_LOCK)
6862 {
6863 ir.addr -= 1;
6864 goto no_support;
6865 }
6866 break;
6867
a38bba38 6868 case 0x9b: /* fwait */
4ffa4fc7
PA
6869 if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
6870 return -1;
425b824a 6871 opcode = (uint32_t) opcode8;
0289bdd7
MS
6872 ir.addr++;
6873 goto reswitch;
7ad10968
HZ
6874 break;
6875
7ad10968 6876 /* XXX */
a38bba38 6877 case 0xcc: /* int3 */
a3c4230a 6878 printf_unfiltered (_("Process record does not support instruction "
7ad10968
HZ
6879 "int3.\n"));
6880 ir.addr -= 1;
6881 goto no_support;
6882 break;
6883
7ad10968 6884 /* XXX */
a38bba38 6885 case 0xcd: /* int */
7ad10968
HZ
6886 {
6887 int ret;
425b824a 6888 uint8_t interrupt;
4ffa4fc7
PA
6889 if (record_read_memory (gdbarch, ir.addr, &interrupt, 1))
6890 return -1;
7ad10968 6891 ir.addr++;
425b824a 6892 if (interrupt != 0x80
a3c4230a 6893 || tdep->i386_intx80_record == NULL)
7ad10968 6894 {
a3c4230a 6895 printf_unfiltered (_("Process record does not support "
7ad10968 6896 "instruction int 0x%02x.\n"),
425b824a 6897 interrupt);
7ad10968
HZ
6898 ir.addr -= 2;
6899 goto no_support;
6900 }
a3c4230a 6901 ret = tdep->i386_intx80_record (ir.regcache);
7ad10968
HZ
6902 if (ret)
6903 return ret;
6904 }
6905 break;
6906
7ad10968 6907 /* XXX */
a38bba38 6908 case 0xce: /* into */
a3c4230a 6909 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
6910 "instruction into.\n"));
6911 ir.addr -= 1;
6912 goto no_support;
6913 break;
6914
a38bba38
MS
6915 case 0xfa: /* cli */
6916 case 0xfb: /* sti */
7ad10968
HZ
6917 break;
6918
a38bba38 6919 case 0x62: /* bound */
a3c4230a 6920 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
6921 "instruction bound.\n"));
6922 ir.addr -= 1;
6923 goto no_support;
6924 break;
6925
a38bba38 6926 case 0x0fc8: /* bswap reg */
7ad10968
HZ
6927 case 0x0fc9:
6928 case 0x0fca:
6929 case 0x0fcb:
6930 case 0x0fcc:
6931 case 0x0fcd:
6932 case 0x0fce:
6933 case 0x0fcf:
25ea693b 6934 I386_RECORD_FULL_ARCH_LIST_ADD_REG ((opcode & 7) | ir.rex_b);
7ad10968
HZ
6935 break;
6936
a38bba38 6937 case 0xd6: /* salc */
cf648174
HZ
6938 if (ir.regmap[X86_RECORD_R8_REGNUM])
6939 {
6940 ir.addr -= 1;
6941 goto no_support;
6942 }
25ea693b
MM
6943 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
6944 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6945 break;
6946
a38bba38
MS
6947 case 0xe0: /* loopnz */
6948 case 0xe1: /* loopz */
6949 case 0xe2: /* loop */
6950 case 0xe3: /* jecxz */
25ea693b
MM
6951 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
6952 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
6953 break;
6954
a38bba38 6955 case 0x0f30: /* wrmsr */
a3c4230a 6956 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
6957 "instruction wrmsr.\n"));
6958 ir.addr -= 2;
6959 goto no_support;
6960 break;
6961
a38bba38 6962 case 0x0f32: /* rdmsr */
a3c4230a 6963 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
6964 "instruction rdmsr.\n"));
6965 ir.addr -= 2;
6966 goto no_support;
6967 break;
6968
a38bba38 6969 case 0x0f31: /* rdtsc */
25ea693b
MM
6970 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
6971 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
6972 break;
6973
a38bba38 6974 case 0x0f34: /* sysenter */
7ad10968
HZ
6975 {
6976 int ret;
cf648174
HZ
6977 if (ir.regmap[X86_RECORD_R8_REGNUM])
6978 {
6979 ir.addr -= 2;
6980 goto no_support;
6981 }
a3c4230a 6982 if (tdep->i386_sysenter_record == NULL)
7ad10968 6983 {
a3c4230a 6984 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
6985 "instruction sysenter.\n"));
6986 ir.addr -= 2;
6987 goto no_support;
6988 }
a3c4230a 6989 ret = tdep->i386_sysenter_record (ir.regcache);
7ad10968
HZ
6990 if (ret)
6991 return ret;
6992 }
6993 break;
6994
a38bba38 6995 case 0x0f35: /* sysexit */
a3c4230a 6996 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
6997 "instruction sysexit.\n"));
6998 ir.addr -= 2;
6999 goto no_support;
7000 break;
7001
a38bba38 7002 case 0x0f05: /* syscall */
cf648174
HZ
7003 {
7004 int ret;
a3c4230a 7005 if (tdep->i386_syscall_record == NULL)
cf648174 7006 {
a3c4230a 7007 printf_unfiltered (_("Process record does not support "
cf648174
HZ
7008 "instruction syscall.\n"));
7009 ir.addr -= 2;
7010 goto no_support;
7011 }
a3c4230a 7012 ret = tdep->i386_syscall_record (ir.regcache);
cf648174
HZ
7013 if (ret)
7014 return ret;
7015 }
7016 break;
7017
a38bba38 7018 case 0x0f07: /* sysret */
a3c4230a 7019 printf_unfiltered (_("Process record does not support "
cf648174
HZ
7020 "instruction sysret.\n"));
7021 ir.addr -= 2;
7022 goto no_support;
7023 break;
7024
a38bba38 7025 case 0x0fa2: /* cpuid */
25ea693b
MM
7026 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7027 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
7028 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7029 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
7ad10968
HZ
7030 break;
7031
a38bba38 7032 case 0xf4: /* hlt */
a3c4230a 7033 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
7034 "instruction hlt.\n"));
7035 ir.addr -= 1;
7036 goto no_support;
7037 break;
7038
7039 case 0x0f00:
7040 if (i386_record_modrm (&ir))
7041 return -1;
7042 switch (ir.reg)
7043 {
a38bba38
MS
7044 case 0: /* sldt */
7045 case 1: /* str */
7ad10968 7046 if (ir.mod == 3)
25ea693b 7047 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
7048 else
7049 {
7050 ir.ot = OT_WORD;
7051 if (i386_record_lea_modrm (&ir))
7052 return -1;
7053 }
7054 break;
a38bba38
MS
7055 case 2: /* lldt */
7056 case 3: /* ltr */
7ad10968 7057 break;
a38bba38
MS
7058 case 4: /* verr */
7059 case 5: /* verw */
25ea693b 7060 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
7061 break;
7062 default:
7063 ir.addr -= 3;
7064 opcode = opcode << 8 | ir.modrm;
7065 goto no_support;
7066 break;
7067 }
7068 break;
7069
7070 case 0x0f01:
7071 if (i386_record_modrm (&ir))
7072 return -1;
7073 switch (ir.reg)
7074 {
a38bba38 7075 case 0: /* sgdt */
7ad10968 7076 {
955db0c0 7077 uint64_t addr64;
7ad10968
HZ
7078
7079 if (ir.mod == 3)
7080 {
7081 ir.addr -= 3;
7082 opcode = opcode << 8 | ir.modrm;
7083 goto no_support;
7084 }
d7877f7e 7085 if (ir.override >= 0)
7ad10968 7086 {
25ea693b 7087 if (record_full_memory_query)
bb08c432 7088 {
651ce16a 7089 if (yquery (_("\
bb08c432
HZ
7090Process record ignores the memory change of instruction at address %s\n\
7091because it can't get the value of the segment register.\n\
7092Do you want to stop the program?"),
651ce16a
PA
7093 paddress (gdbarch, ir.orig_addr)))
7094 return -1;
bb08c432 7095 }
7ad10968
HZ
7096 }
7097 else
7098 {
955db0c0 7099 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968 7100 return -1;
25ea693b 7101 if (record_full_arch_list_add_mem (addr64, 2))
7ad10968 7102 return -1;
955db0c0 7103 addr64 += 2;
cf648174
HZ
7104 if (ir.regmap[X86_RECORD_R8_REGNUM])
7105 {
25ea693b 7106 if (record_full_arch_list_add_mem (addr64, 8))
cf648174
HZ
7107 return -1;
7108 }
7109 else
7110 {
25ea693b 7111 if (record_full_arch_list_add_mem (addr64, 4))
cf648174
HZ
7112 return -1;
7113 }
7ad10968
HZ
7114 }
7115 }
7116 break;
7117 case 1:
7118 if (ir.mod == 3)
7119 {
7120 switch (ir.rm)
7121 {
a38bba38 7122 case 0: /* monitor */
7ad10968 7123 break;
a38bba38 7124 case 1: /* mwait */
25ea693b 7125 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
7126 break;
7127 default:
7128 ir.addr -= 3;
7129 opcode = opcode << 8 | ir.modrm;
7130 goto no_support;
7131 break;
7132 }
7133 }
7134 else
7135 {
7136 /* sidt */
d7877f7e 7137 if (ir.override >= 0)
7ad10968 7138 {
25ea693b 7139 if (record_full_memory_query)
bb08c432 7140 {
651ce16a 7141 if (yquery (_("\
bb08c432
HZ
7142Process record ignores the memory change of instruction at address %s\n\
7143because it can't get the value of the segment register.\n\
7144Do you want to stop the program?"),
651ce16a 7145 paddress (gdbarch, ir.orig_addr)))
bb08c432
HZ
7146 return -1;
7147 }
7ad10968
HZ
7148 }
7149 else
7150 {
955db0c0 7151 uint64_t addr64;
7ad10968 7152
955db0c0 7153 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968 7154 return -1;
25ea693b 7155 if (record_full_arch_list_add_mem (addr64, 2))
7ad10968 7156 return -1;
955db0c0 7157 addr64 += 2;
cf648174
HZ
7158 if (ir.regmap[X86_RECORD_R8_REGNUM])
7159 {
25ea693b 7160 if (record_full_arch_list_add_mem (addr64, 8))
cf648174
HZ
7161 return -1;
7162 }
7163 else
7164 {
25ea693b 7165 if (record_full_arch_list_add_mem (addr64, 4))
cf648174
HZ
7166 return -1;
7167 }
7ad10968
HZ
7168 }
7169 }
7170 break;
a38bba38 7171 case 2: /* lgdt */
3800e645
MS
7172 if (ir.mod == 3)
7173 {
7174 /* xgetbv */
7175 if (ir.rm == 0)
7176 {
25ea693b
MM
7177 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7178 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
3800e645
MS
7179 break;
7180 }
7181 /* xsetbv */
7182 else if (ir.rm == 1)
7183 break;
7184 }
da0e1563 7185 /* Fall through. */
a38bba38 7186 case 3: /* lidt */
7ad10968
HZ
7187 if (ir.mod == 3)
7188 {
7189 ir.addr -= 3;
7190 opcode = opcode << 8 | ir.modrm;
7191 goto no_support;
7192 }
7193 break;
a38bba38 7194 case 4: /* smsw */
7ad10968
HZ
7195 if (ir.mod == 3)
7196 {
25ea693b 7197 if (record_full_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b))
7ad10968
HZ
7198 return -1;
7199 }
7200 else
7201 {
7202 ir.ot = OT_WORD;
7203 if (i386_record_lea_modrm (&ir))
7204 return -1;
7205 }
25ea693b 7206 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 7207 break;
a38bba38 7208 case 6: /* lmsw */
25ea693b 7209 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
cf648174 7210 break;
a38bba38 7211 case 7: /* invlpg */
cf648174
HZ
7212 if (ir.mod == 3)
7213 {
7214 if (ir.rm == 0 && ir.regmap[X86_RECORD_R8_REGNUM])
25ea693b 7215 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
cf648174
HZ
7216 else
7217 {
7218 ir.addr -= 3;
7219 opcode = opcode << 8 | ir.modrm;
7220 goto no_support;
7221 }
7222 }
7223 else
25ea693b 7224 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
cf648174
HZ
7225 break;
7226 default:
7227 ir.addr -= 3;
7228 opcode = opcode << 8 | ir.modrm;
7229 goto no_support;
7ad10968
HZ
7230 break;
7231 }
7232 break;
7233
a38bba38
MS
7234 case 0x0f08: /* invd */
7235 case 0x0f09: /* wbinvd */
7ad10968
HZ
7236 break;
7237
a38bba38 7238 case 0x63: /* arpl */
7ad10968
HZ
7239 if (i386_record_modrm (&ir))
7240 return -1;
cf648174
HZ
7241 if (ir.mod == 3 || ir.regmap[X86_RECORD_R8_REGNUM])
7242 {
25ea693b
MM
7243 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
7244 ? (ir.reg | rex_r) : ir.rm);
cf648174 7245 }
7ad10968 7246 else
cf648174
HZ
7247 {
7248 ir.ot = ir.dflag ? OT_LONG : OT_WORD;
7249 if (i386_record_lea_modrm (&ir))
7250 return -1;
7251 }
7252 if (!ir.regmap[X86_RECORD_R8_REGNUM])
25ea693b 7253 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
7254 break;
7255
a38bba38
MS
7256 case 0x0f02: /* lar */
7257 case 0x0f03: /* lsl */
7ad10968
HZ
7258 if (i386_record_modrm (&ir))
7259 return -1;
25ea693b
MM
7260 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
7261 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
7262 break;
7263
7264 case 0x0f18:
cf648174
HZ
7265 if (i386_record_modrm (&ir))
7266 return -1;
7267 if (ir.mod == 3 && ir.reg == 3)
7268 {
7269 ir.addr -= 3;
7270 opcode = opcode << 8 | ir.modrm;
7271 goto no_support;
7272 }
7ad10968
HZ
7273 break;
7274
7ad10968
HZ
7275 case 0x0f19:
7276 case 0x0f1a:
7277 case 0x0f1b:
7278 case 0x0f1c:
7279 case 0x0f1d:
7280 case 0x0f1e:
7281 case 0x0f1f:
a38bba38 7282 /* nop (multi byte) */
7ad10968
HZ
7283 break;
7284
a38bba38
MS
7285 case 0x0f20: /* mov reg, crN */
7286 case 0x0f22: /* mov crN, reg */
7ad10968
HZ
7287 if (i386_record_modrm (&ir))
7288 return -1;
7289 if ((ir.modrm & 0xc0) != 0xc0)
7290 {
cf648174 7291 ir.addr -= 3;
7ad10968
HZ
7292 opcode = opcode << 8 | ir.modrm;
7293 goto no_support;
7294 }
7295 switch (ir.reg)
7296 {
7297 case 0:
7298 case 2:
7299 case 3:
7300 case 4:
7301 case 8:
7302 if (opcode & 2)
25ea693b 7303 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 7304 else
25ea693b 7305 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
7306 break;
7307 default:
cf648174 7308 ir.addr -= 3;
7ad10968
HZ
7309 opcode = opcode << 8 | ir.modrm;
7310 goto no_support;
7311 break;
7312 }
7313 break;
7314
a38bba38
MS
7315 case 0x0f21: /* mov reg, drN */
7316 case 0x0f23: /* mov drN, reg */
7ad10968
HZ
7317 if (i386_record_modrm (&ir))
7318 return -1;
7319 if ((ir.modrm & 0xc0) != 0xc0 || ir.reg == 4
7320 || ir.reg == 5 || ir.reg >= 8)
7321 {
cf648174 7322 ir.addr -= 3;
7ad10968
HZ
7323 opcode = opcode << 8 | ir.modrm;
7324 goto no_support;
7325 }
7326 if (opcode & 2)
25ea693b 7327 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 7328 else
25ea693b 7329 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
7330 break;
7331
a38bba38 7332 case 0x0f06: /* clts */
25ea693b 7333 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
7334 break;
7335
a3c4230a
HZ
7336 /* MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 */
7337
7338 case 0x0f0d: /* 3DNow! prefetch */
7339 break;
7340
7341 case 0x0f0e: /* 3DNow! femms */
7342 case 0x0f77: /* emms */
7343 if (i386_fpc_regnum_p (gdbarch, I387_FTAG_REGNUM(tdep)))
7344 goto no_support;
25ea693b 7345 record_full_arch_list_add_reg (ir.regcache, I387_FTAG_REGNUM(tdep));
a3c4230a
HZ
7346 break;
7347
7348 case 0x0f0f: /* 3DNow! data */
7349 if (i386_record_modrm (&ir))
7350 return -1;
4ffa4fc7
PA
7351 if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
7352 return -1;
a3c4230a
HZ
7353 ir.addr++;
7354 switch (opcode8)
7355 {
7356 case 0x0c: /* 3DNow! pi2fw */
7357 case 0x0d: /* 3DNow! pi2fd */
7358 case 0x1c: /* 3DNow! pf2iw */
7359 case 0x1d: /* 3DNow! pf2id */
7360 case 0x8a: /* 3DNow! pfnacc */
7361 case 0x8e: /* 3DNow! pfpnacc */
7362 case 0x90: /* 3DNow! pfcmpge */
7363 case 0x94: /* 3DNow! pfmin */
7364 case 0x96: /* 3DNow! pfrcp */
7365 case 0x97: /* 3DNow! pfrsqrt */
7366 case 0x9a: /* 3DNow! pfsub */
7367 case 0x9e: /* 3DNow! pfadd */
7368 case 0xa0: /* 3DNow! pfcmpgt */
7369 case 0xa4: /* 3DNow! pfmax */
7370 case 0xa6: /* 3DNow! pfrcpit1 */
7371 case 0xa7: /* 3DNow! pfrsqit1 */
7372 case 0xaa: /* 3DNow! pfsubr */
7373 case 0xae: /* 3DNow! pfacc */
7374 case 0xb0: /* 3DNow! pfcmpeq */
7375 case 0xb4: /* 3DNow! pfmul */
7376 case 0xb6: /* 3DNow! pfrcpit2 */
7377 case 0xb7: /* 3DNow! pmulhrw */
7378 case 0xbb: /* 3DNow! pswapd */
7379 case 0xbf: /* 3DNow! pavgusb */
7380 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
7381 goto no_support_3dnow_data;
25ea693b 7382 record_full_arch_list_add_reg (ir.regcache, ir.reg);
a3c4230a
HZ
7383 break;
7384
7385 default:
7386no_support_3dnow_data:
7387 opcode = (opcode << 8) | opcode8;
7388 goto no_support;
7389 break;
7390 }
7391 break;
7392
7393 case 0x0faa: /* rsm */
25ea693b
MM
7394 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7395 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7396 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
7397 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7398 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
7399 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
7400 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
7401 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
7402 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
a3c4230a
HZ
7403 break;
7404
7405 case 0x0fae:
7406 if (i386_record_modrm (&ir))
7407 return -1;
7408 switch(ir.reg)
7409 {
7410 case 0: /* fxsave */
7411 {
7412 uint64_t tmpu64;
7413
25ea693b 7414 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
a3c4230a
HZ
7415 if (i386_record_lea_modrm_addr (&ir, &tmpu64))
7416 return -1;
25ea693b 7417 if (record_full_arch_list_add_mem (tmpu64, 512))
a3c4230a
HZ
7418 return -1;
7419 }
7420 break;
7421
7422 case 1: /* fxrstor */
7423 {
7424 int i;
7425
25ea693b 7426 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
a3c4230a
HZ
7427
7428 for (i = I387_MM0_REGNUM (tdep);
7429 i386_mmx_regnum_p (gdbarch, i); i++)
25ea693b 7430 record_full_arch_list_add_reg (ir.regcache, i);
a3c4230a
HZ
7431
7432 for (i = I387_XMM0_REGNUM (tdep);
c131fcee 7433 i386_xmm_regnum_p (gdbarch, i); i++)
25ea693b 7434 record_full_arch_list_add_reg (ir.regcache, i);
a3c4230a
HZ
7435
7436 if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
25ea693b
MM
7437 record_full_arch_list_add_reg (ir.regcache,
7438 I387_MXCSR_REGNUM(tdep));
a3c4230a
HZ
7439
7440 for (i = I387_ST0_REGNUM (tdep);
7441 i386_fp_regnum_p (gdbarch, i); i++)
25ea693b 7442 record_full_arch_list_add_reg (ir.regcache, i);
a3c4230a
HZ
7443
7444 for (i = I387_FCTRL_REGNUM (tdep);
7445 i386_fpc_regnum_p (gdbarch, i); i++)
25ea693b 7446 record_full_arch_list_add_reg (ir.regcache, i);
a3c4230a
HZ
7447 }
7448 break;
7449
7450 case 2: /* ldmxcsr */
7451 if (!i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
7452 goto no_support;
25ea693b 7453 record_full_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
a3c4230a
HZ
7454 break;
7455
7456 case 3: /* stmxcsr */
7457 ir.ot = OT_LONG;
7458 if (i386_record_lea_modrm (&ir))
7459 return -1;
7460 break;
7461
7462 case 5: /* lfence */
7463 case 6: /* mfence */
7464 case 7: /* sfence clflush */
7465 break;
7466
7467 default:
7468 opcode = (opcode << 8) | ir.modrm;
7469 goto no_support;
7470 break;
7471 }
7472 break;
7473
7474 case 0x0fc3: /* movnti */
7475 ir.ot = (ir.dflag == 2) ? OT_QUAD : OT_LONG;
7476 if (i386_record_modrm (&ir))
7477 return -1;
7478 if (ir.mod == 3)
7479 goto no_support;
7480 ir.reg |= rex_r;
7481 if (i386_record_lea_modrm (&ir))
7482 return -1;
7483 break;
7484
7485 /* Add prefix to opcode. */
7486 case 0x0f10:
7487 case 0x0f11:
7488 case 0x0f12:
7489 case 0x0f13:
7490 case 0x0f14:
7491 case 0x0f15:
7492 case 0x0f16:
7493 case 0x0f17:
7494 case 0x0f28:
7495 case 0x0f29:
7496 case 0x0f2a:
7497 case 0x0f2b:
7498 case 0x0f2c:
7499 case 0x0f2d:
7500 case 0x0f2e:
7501 case 0x0f2f:
7502 case 0x0f38:
7503 case 0x0f39:
7504 case 0x0f3a:
7505 case 0x0f50:
7506 case 0x0f51:
7507 case 0x0f52:
7508 case 0x0f53:
7509 case 0x0f54:
7510 case 0x0f55:
7511 case 0x0f56:
7512 case 0x0f57:
7513 case 0x0f58:
7514 case 0x0f59:
7515 case 0x0f5a:
7516 case 0x0f5b:
7517 case 0x0f5c:
7518 case 0x0f5d:
7519 case 0x0f5e:
7520 case 0x0f5f:
7521 case 0x0f60:
7522 case 0x0f61:
7523 case 0x0f62:
7524 case 0x0f63:
7525 case 0x0f64:
7526 case 0x0f65:
7527 case 0x0f66:
7528 case 0x0f67:
7529 case 0x0f68:
7530 case 0x0f69:
7531 case 0x0f6a:
7532 case 0x0f6b:
7533 case 0x0f6c:
7534 case 0x0f6d:
7535 case 0x0f6e:
7536 case 0x0f6f:
7537 case 0x0f70:
7538 case 0x0f71:
7539 case 0x0f72:
7540 case 0x0f73:
7541 case 0x0f74:
7542 case 0x0f75:
7543 case 0x0f76:
7544 case 0x0f7c:
7545 case 0x0f7d:
7546 case 0x0f7e:
7547 case 0x0f7f:
7548 case 0x0fb8:
7549 case 0x0fc2:
7550 case 0x0fc4:
7551 case 0x0fc5:
7552 case 0x0fc6:
7553 case 0x0fd0:
7554 case 0x0fd1:
7555 case 0x0fd2:
7556 case 0x0fd3:
7557 case 0x0fd4:
7558 case 0x0fd5:
7559 case 0x0fd6:
7560 case 0x0fd7:
7561 case 0x0fd8:
7562 case 0x0fd9:
7563 case 0x0fda:
7564 case 0x0fdb:
7565 case 0x0fdc:
7566 case 0x0fdd:
7567 case 0x0fde:
7568 case 0x0fdf:
7569 case 0x0fe0:
7570 case 0x0fe1:
7571 case 0x0fe2:
7572 case 0x0fe3:
7573 case 0x0fe4:
7574 case 0x0fe5:
7575 case 0x0fe6:
7576 case 0x0fe7:
7577 case 0x0fe8:
7578 case 0x0fe9:
7579 case 0x0fea:
7580 case 0x0feb:
7581 case 0x0fec:
7582 case 0x0fed:
7583 case 0x0fee:
7584 case 0x0fef:
7585 case 0x0ff0:
7586 case 0x0ff1:
7587 case 0x0ff2:
7588 case 0x0ff3:
7589 case 0x0ff4:
7590 case 0x0ff5:
7591 case 0x0ff6:
7592 case 0x0ff7:
7593 case 0x0ff8:
7594 case 0x0ff9:
7595 case 0x0ffa:
7596 case 0x0ffb:
7597 case 0x0ffc:
7598 case 0x0ffd:
7599 case 0x0ffe:
f9fda3f5
L
7600 /* Mask out PREFIX_ADDR. */
7601 switch ((prefixes & ~PREFIX_ADDR))
a3c4230a
HZ
7602 {
7603 case PREFIX_REPNZ:
7604 opcode |= 0xf20000;
7605 break;
7606 case PREFIX_DATA:
7607 opcode |= 0x660000;
7608 break;
7609 case PREFIX_REPZ:
7610 opcode |= 0xf30000;
7611 break;
7612 }
7613reswitch_prefix_add:
7614 switch (opcode)
7615 {
7616 case 0x0f38:
7617 case 0x660f38:
7618 case 0xf20f38:
7619 case 0x0f3a:
7620 case 0x660f3a:
4ffa4fc7
PA
7621 if (record_read_memory (gdbarch, ir.addr, &opcode8, 1))
7622 return -1;
a3c4230a
HZ
7623 ir.addr++;
7624 opcode = (uint32_t) opcode8 | opcode << 8;
7625 goto reswitch_prefix_add;
7626 break;
7627
7628 case 0x0f10: /* movups */
7629 case 0x660f10: /* movupd */
7630 case 0xf30f10: /* movss */
7631 case 0xf20f10: /* movsd */
7632 case 0x0f12: /* movlps */
7633 case 0x660f12: /* movlpd */
7634 case 0xf30f12: /* movsldup */
7635 case 0xf20f12: /* movddup */
7636 case 0x0f14: /* unpcklps */
7637 case 0x660f14: /* unpcklpd */
7638 case 0x0f15: /* unpckhps */
7639 case 0x660f15: /* unpckhpd */
7640 case 0x0f16: /* movhps */
7641 case 0x660f16: /* movhpd */
7642 case 0xf30f16: /* movshdup */
7643 case 0x0f28: /* movaps */
7644 case 0x660f28: /* movapd */
7645 case 0x0f2a: /* cvtpi2ps */
7646 case 0x660f2a: /* cvtpi2pd */
7647 case 0xf30f2a: /* cvtsi2ss */
7648 case 0xf20f2a: /* cvtsi2sd */
7649 case 0x0f2c: /* cvttps2pi */
7650 case 0x660f2c: /* cvttpd2pi */
7651 case 0x0f2d: /* cvtps2pi */
7652 case 0x660f2d: /* cvtpd2pi */
7653 case 0x660f3800: /* pshufb */
7654 case 0x660f3801: /* phaddw */
7655 case 0x660f3802: /* phaddd */
7656 case 0x660f3803: /* phaddsw */
7657 case 0x660f3804: /* pmaddubsw */
7658 case 0x660f3805: /* phsubw */
7659 case 0x660f3806: /* phsubd */
4f7d61a8 7660 case 0x660f3807: /* phsubsw */
a3c4230a
HZ
7661 case 0x660f3808: /* psignb */
7662 case 0x660f3809: /* psignw */
7663 case 0x660f380a: /* psignd */
7664 case 0x660f380b: /* pmulhrsw */
7665 case 0x660f3810: /* pblendvb */
7666 case 0x660f3814: /* blendvps */
7667 case 0x660f3815: /* blendvpd */
7668 case 0x660f381c: /* pabsb */
7669 case 0x660f381d: /* pabsw */
7670 case 0x660f381e: /* pabsd */
7671 case 0x660f3820: /* pmovsxbw */
7672 case 0x660f3821: /* pmovsxbd */
7673 case 0x660f3822: /* pmovsxbq */
7674 case 0x660f3823: /* pmovsxwd */
7675 case 0x660f3824: /* pmovsxwq */
7676 case 0x660f3825: /* pmovsxdq */
7677 case 0x660f3828: /* pmuldq */
7678 case 0x660f3829: /* pcmpeqq */
7679 case 0x660f382a: /* movntdqa */
7680 case 0x660f3a08: /* roundps */
7681 case 0x660f3a09: /* roundpd */
7682 case 0x660f3a0a: /* roundss */
7683 case 0x660f3a0b: /* roundsd */
7684 case 0x660f3a0c: /* blendps */
7685 case 0x660f3a0d: /* blendpd */
7686 case 0x660f3a0e: /* pblendw */
7687 case 0x660f3a0f: /* palignr */
7688 case 0x660f3a20: /* pinsrb */
7689 case 0x660f3a21: /* insertps */
7690 case 0x660f3a22: /* pinsrd pinsrq */
7691 case 0x660f3a40: /* dpps */
7692 case 0x660f3a41: /* dppd */
7693 case 0x660f3a42: /* mpsadbw */
7694 case 0x660f3a60: /* pcmpestrm */
7695 case 0x660f3a61: /* pcmpestri */
7696 case 0x660f3a62: /* pcmpistrm */
7697 case 0x660f3a63: /* pcmpistri */
7698 case 0x0f51: /* sqrtps */
7699 case 0x660f51: /* sqrtpd */
7700 case 0xf20f51: /* sqrtsd */
7701 case 0xf30f51: /* sqrtss */
7702 case 0x0f52: /* rsqrtps */
7703 case 0xf30f52: /* rsqrtss */
7704 case 0x0f53: /* rcpps */
7705 case 0xf30f53: /* rcpss */
7706 case 0x0f54: /* andps */
7707 case 0x660f54: /* andpd */
7708 case 0x0f55: /* andnps */
7709 case 0x660f55: /* andnpd */
7710 case 0x0f56: /* orps */
7711 case 0x660f56: /* orpd */
7712 case 0x0f57: /* xorps */
7713 case 0x660f57: /* xorpd */
7714 case 0x0f58: /* addps */
7715 case 0x660f58: /* addpd */
7716 case 0xf20f58: /* addsd */
7717 case 0xf30f58: /* addss */
7718 case 0x0f59: /* mulps */
7719 case 0x660f59: /* mulpd */
7720 case 0xf20f59: /* mulsd */
7721 case 0xf30f59: /* mulss */
7722 case 0x0f5a: /* cvtps2pd */
7723 case 0x660f5a: /* cvtpd2ps */
7724 case 0xf20f5a: /* cvtsd2ss */
7725 case 0xf30f5a: /* cvtss2sd */
7726 case 0x0f5b: /* cvtdq2ps */
7727 case 0x660f5b: /* cvtps2dq */
7728 case 0xf30f5b: /* cvttps2dq */
7729 case 0x0f5c: /* subps */
7730 case 0x660f5c: /* subpd */
7731 case 0xf20f5c: /* subsd */
7732 case 0xf30f5c: /* subss */
7733 case 0x0f5d: /* minps */
7734 case 0x660f5d: /* minpd */
7735 case 0xf20f5d: /* minsd */
7736 case 0xf30f5d: /* minss */
7737 case 0x0f5e: /* divps */
7738 case 0x660f5e: /* divpd */
7739 case 0xf20f5e: /* divsd */
7740 case 0xf30f5e: /* divss */
7741 case 0x0f5f: /* maxps */
7742 case 0x660f5f: /* maxpd */
7743 case 0xf20f5f: /* maxsd */
7744 case 0xf30f5f: /* maxss */
7745 case 0x660f60: /* punpcklbw */
7746 case 0x660f61: /* punpcklwd */
7747 case 0x660f62: /* punpckldq */
7748 case 0x660f63: /* packsswb */
7749 case 0x660f64: /* pcmpgtb */
7750 case 0x660f65: /* pcmpgtw */
56d2815c 7751 case 0x660f66: /* pcmpgtd */
a3c4230a
HZ
7752 case 0x660f67: /* packuswb */
7753 case 0x660f68: /* punpckhbw */
7754 case 0x660f69: /* punpckhwd */
7755 case 0x660f6a: /* punpckhdq */
7756 case 0x660f6b: /* packssdw */
7757 case 0x660f6c: /* punpcklqdq */
7758 case 0x660f6d: /* punpckhqdq */
7759 case 0x660f6e: /* movd */
7760 case 0x660f6f: /* movdqa */
7761 case 0xf30f6f: /* movdqu */
7762 case 0x660f70: /* pshufd */
7763 case 0xf20f70: /* pshuflw */
7764 case 0xf30f70: /* pshufhw */
7765 case 0x660f74: /* pcmpeqb */
7766 case 0x660f75: /* pcmpeqw */
56d2815c 7767 case 0x660f76: /* pcmpeqd */
a3c4230a
HZ
7768 case 0x660f7c: /* haddpd */
7769 case 0xf20f7c: /* haddps */
7770 case 0x660f7d: /* hsubpd */
7771 case 0xf20f7d: /* hsubps */
7772 case 0xf30f7e: /* movq */
7773 case 0x0fc2: /* cmpps */
7774 case 0x660fc2: /* cmppd */
7775 case 0xf20fc2: /* cmpsd */
7776 case 0xf30fc2: /* cmpss */
7777 case 0x660fc4: /* pinsrw */
7778 case 0x0fc6: /* shufps */
7779 case 0x660fc6: /* shufpd */
7780 case 0x660fd0: /* addsubpd */
7781 case 0xf20fd0: /* addsubps */
7782 case 0x660fd1: /* psrlw */
7783 case 0x660fd2: /* psrld */
7784 case 0x660fd3: /* psrlq */
7785 case 0x660fd4: /* paddq */
7786 case 0x660fd5: /* pmullw */
7787 case 0xf30fd6: /* movq2dq */
7788 case 0x660fd8: /* psubusb */
7789 case 0x660fd9: /* psubusw */
7790 case 0x660fda: /* pminub */
7791 case 0x660fdb: /* pand */
7792 case 0x660fdc: /* paddusb */
7793 case 0x660fdd: /* paddusw */
7794 case 0x660fde: /* pmaxub */
7795 case 0x660fdf: /* pandn */
7796 case 0x660fe0: /* pavgb */
7797 case 0x660fe1: /* psraw */
7798 case 0x660fe2: /* psrad */
7799 case 0x660fe3: /* pavgw */
7800 case 0x660fe4: /* pmulhuw */
7801 case 0x660fe5: /* pmulhw */
7802 case 0x660fe6: /* cvttpd2dq */
7803 case 0xf20fe6: /* cvtpd2dq */
7804 case 0xf30fe6: /* cvtdq2pd */
7805 case 0x660fe8: /* psubsb */
7806 case 0x660fe9: /* psubsw */
7807 case 0x660fea: /* pminsw */
7808 case 0x660feb: /* por */
7809 case 0x660fec: /* paddsb */
7810 case 0x660fed: /* paddsw */
7811 case 0x660fee: /* pmaxsw */
7812 case 0x660fef: /* pxor */
4f7d61a8 7813 case 0xf20ff0: /* lddqu */
a3c4230a
HZ
7814 case 0x660ff1: /* psllw */
7815 case 0x660ff2: /* pslld */
7816 case 0x660ff3: /* psllq */
7817 case 0x660ff4: /* pmuludq */
7818 case 0x660ff5: /* pmaddwd */
7819 case 0x660ff6: /* psadbw */
7820 case 0x660ff8: /* psubb */
7821 case 0x660ff9: /* psubw */
56d2815c 7822 case 0x660ffa: /* psubd */
a3c4230a
HZ
7823 case 0x660ffb: /* psubq */
7824 case 0x660ffc: /* paddb */
7825 case 0x660ffd: /* paddw */
56d2815c 7826 case 0x660ffe: /* paddd */
a3c4230a
HZ
7827 if (i386_record_modrm (&ir))
7828 return -1;
7829 ir.reg |= rex_r;
c131fcee 7830 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
a3c4230a 7831 goto no_support;
25ea693b
MM
7832 record_full_arch_list_add_reg (ir.regcache,
7833 I387_XMM0_REGNUM (tdep) + ir.reg);
a3c4230a 7834 if ((opcode & 0xfffffffc) == 0x660f3a60)
25ea693b 7835 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
a3c4230a
HZ
7836 break;
7837
7838 case 0x0f11: /* movups */
7839 case 0x660f11: /* movupd */
7840 case 0xf30f11: /* movss */
7841 case 0xf20f11: /* movsd */
7842 case 0x0f13: /* movlps */
7843 case 0x660f13: /* movlpd */
7844 case 0x0f17: /* movhps */
7845 case 0x660f17: /* movhpd */
7846 case 0x0f29: /* movaps */
7847 case 0x660f29: /* movapd */
7848 case 0x660f3a14: /* pextrb */
7849 case 0x660f3a15: /* pextrw */
7850 case 0x660f3a16: /* pextrd pextrq */
7851 case 0x660f3a17: /* extractps */
7852 case 0x660f7f: /* movdqa */
7853 case 0xf30f7f: /* movdqu */
7854 if (i386_record_modrm (&ir))
7855 return -1;
7856 if (ir.mod == 3)
7857 {
7858 if (opcode == 0x0f13 || opcode == 0x660f13
7859 || opcode == 0x0f17 || opcode == 0x660f17)
7860 goto no_support;
7861 ir.rm |= ir.rex_b;
1777feb0
MS
7862 if (!i386_xmm_regnum_p (gdbarch,
7863 I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a 7864 goto no_support;
25ea693b
MM
7865 record_full_arch_list_add_reg (ir.regcache,
7866 I387_XMM0_REGNUM (tdep) + ir.rm);
a3c4230a
HZ
7867 }
7868 else
7869 {
7870 switch (opcode)
7871 {
7872 case 0x660f3a14:
7873 ir.ot = OT_BYTE;
7874 break;
7875 case 0x660f3a15:
7876 ir.ot = OT_WORD;
7877 break;
7878 case 0x660f3a16:
7879 ir.ot = OT_LONG;
7880 break;
7881 case 0x660f3a17:
7882 ir.ot = OT_QUAD;
7883 break;
7884 default:
7885 ir.ot = OT_DQUAD;
7886 break;
7887 }
7888 if (i386_record_lea_modrm (&ir))
7889 return -1;
7890 }
7891 break;
7892
7893 case 0x0f2b: /* movntps */
7894 case 0x660f2b: /* movntpd */
7895 case 0x0fe7: /* movntq */
7896 case 0x660fe7: /* movntdq */
7897 if (ir.mod == 3)
7898 goto no_support;
7899 if (opcode == 0x0fe7)
7900 ir.ot = OT_QUAD;
7901 else
7902 ir.ot = OT_DQUAD;
7903 if (i386_record_lea_modrm (&ir))
7904 return -1;
7905 break;
7906
7907 case 0xf30f2c: /* cvttss2si */
7908 case 0xf20f2c: /* cvttsd2si */
7909 case 0xf30f2d: /* cvtss2si */
7910 case 0xf20f2d: /* cvtsd2si */
7911 case 0xf20f38f0: /* crc32 */
7912 case 0xf20f38f1: /* crc32 */
7913 case 0x0f50: /* movmskps */
7914 case 0x660f50: /* movmskpd */
7915 case 0x0fc5: /* pextrw */
7916 case 0x660fc5: /* pextrw */
7917 case 0x0fd7: /* pmovmskb */
7918 case 0x660fd7: /* pmovmskb */
25ea693b 7919 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg | rex_r);
a3c4230a
HZ
7920 break;
7921
7922 case 0x0f3800: /* pshufb */
7923 case 0x0f3801: /* phaddw */
7924 case 0x0f3802: /* phaddd */
7925 case 0x0f3803: /* phaddsw */
7926 case 0x0f3804: /* pmaddubsw */
7927 case 0x0f3805: /* phsubw */
7928 case 0x0f3806: /* phsubd */
4f7d61a8 7929 case 0x0f3807: /* phsubsw */
a3c4230a
HZ
7930 case 0x0f3808: /* psignb */
7931 case 0x0f3809: /* psignw */
7932 case 0x0f380a: /* psignd */
7933 case 0x0f380b: /* pmulhrsw */
7934 case 0x0f381c: /* pabsb */
7935 case 0x0f381d: /* pabsw */
7936 case 0x0f381e: /* pabsd */
7937 case 0x0f382b: /* packusdw */
7938 case 0x0f3830: /* pmovzxbw */
7939 case 0x0f3831: /* pmovzxbd */
7940 case 0x0f3832: /* pmovzxbq */
7941 case 0x0f3833: /* pmovzxwd */
7942 case 0x0f3834: /* pmovzxwq */
7943 case 0x0f3835: /* pmovzxdq */
7944 case 0x0f3837: /* pcmpgtq */
7945 case 0x0f3838: /* pminsb */
7946 case 0x0f3839: /* pminsd */
7947 case 0x0f383a: /* pminuw */
7948 case 0x0f383b: /* pminud */
7949 case 0x0f383c: /* pmaxsb */
7950 case 0x0f383d: /* pmaxsd */
7951 case 0x0f383e: /* pmaxuw */
7952 case 0x0f383f: /* pmaxud */
7953 case 0x0f3840: /* pmulld */
7954 case 0x0f3841: /* phminposuw */
7955 case 0x0f3a0f: /* palignr */
7956 case 0x0f60: /* punpcklbw */
7957 case 0x0f61: /* punpcklwd */
7958 case 0x0f62: /* punpckldq */
7959 case 0x0f63: /* packsswb */
7960 case 0x0f64: /* pcmpgtb */
7961 case 0x0f65: /* pcmpgtw */
56d2815c 7962 case 0x0f66: /* pcmpgtd */
a3c4230a
HZ
7963 case 0x0f67: /* packuswb */
7964 case 0x0f68: /* punpckhbw */
7965 case 0x0f69: /* punpckhwd */
7966 case 0x0f6a: /* punpckhdq */
7967 case 0x0f6b: /* packssdw */
7968 case 0x0f6e: /* movd */
7969 case 0x0f6f: /* movq */
7970 case 0x0f70: /* pshufw */
7971 case 0x0f74: /* pcmpeqb */
7972 case 0x0f75: /* pcmpeqw */
56d2815c 7973 case 0x0f76: /* pcmpeqd */
a3c4230a
HZ
7974 case 0x0fc4: /* pinsrw */
7975 case 0x0fd1: /* psrlw */
7976 case 0x0fd2: /* psrld */
7977 case 0x0fd3: /* psrlq */
7978 case 0x0fd4: /* paddq */
7979 case 0x0fd5: /* pmullw */
7980 case 0xf20fd6: /* movdq2q */
7981 case 0x0fd8: /* psubusb */
7982 case 0x0fd9: /* psubusw */
7983 case 0x0fda: /* pminub */
7984 case 0x0fdb: /* pand */
7985 case 0x0fdc: /* paddusb */
7986 case 0x0fdd: /* paddusw */
7987 case 0x0fde: /* pmaxub */
7988 case 0x0fdf: /* pandn */
7989 case 0x0fe0: /* pavgb */
7990 case 0x0fe1: /* psraw */
7991 case 0x0fe2: /* psrad */
7992 case 0x0fe3: /* pavgw */
7993 case 0x0fe4: /* pmulhuw */
7994 case 0x0fe5: /* pmulhw */
7995 case 0x0fe8: /* psubsb */
7996 case 0x0fe9: /* psubsw */
7997 case 0x0fea: /* pminsw */
7998 case 0x0feb: /* por */
7999 case 0x0fec: /* paddsb */
8000 case 0x0fed: /* paddsw */
8001 case 0x0fee: /* pmaxsw */
8002 case 0x0fef: /* pxor */
8003 case 0x0ff1: /* psllw */
8004 case 0x0ff2: /* pslld */
8005 case 0x0ff3: /* psllq */
8006 case 0x0ff4: /* pmuludq */
8007 case 0x0ff5: /* pmaddwd */
8008 case 0x0ff6: /* psadbw */
8009 case 0x0ff8: /* psubb */
8010 case 0x0ff9: /* psubw */
56d2815c 8011 case 0x0ffa: /* psubd */
a3c4230a
HZ
8012 case 0x0ffb: /* psubq */
8013 case 0x0ffc: /* paddb */
8014 case 0x0ffd: /* paddw */
56d2815c 8015 case 0x0ffe: /* paddd */
a3c4230a
HZ
8016 if (i386_record_modrm (&ir))
8017 return -1;
8018 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
8019 goto no_support;
25ea693b
MM
8020 record_full_arch_list_add_reg (ir.regcache,
8021 I387_MM0_REGNUM (tdep) + ir.reg);
a3c4230a
HZ
8022 break;
8023
8024 case 0x0f71: /* psllw */
8025 case 0x0f72: /* pslld */
8026 case 0x0f73: /* psllq */
8027 if (i386_record_modrm (&ir))
8028 return -1;
8029 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
8030 goto no_support;
25ea693b
MM
8031 record_full_arch_list_add_reg (ir.regcache,
8032 I387_MM0_REGNUM (tdep) + ir.rm);
a3c4230a
HZ
8033 break;
8034
8035 case 0x660f71: /* psllw */
8036 case 0x660f72: /* pslld */
8037 case 0x660f73: /* psllq */
8038 if (i386_record_modrm (&ir))
8039 return -1;
8040 ir.rm |= ir.rex_b;
c131fcee 8041 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a 8042 goto no_support;
25ea693b
MM
8043 record_full_arch_list_add_reg (ir.regcache,
8044 I387_XMM0_REGNUM (tdep) + ir.rm);
a3c4230a
HZ
8045 break;
8046
8047 case 0x0f7e: /* movd */
8048 case 0x660f7e: /* movd */
8049 if (i386_record_modrm (&ir))
8050 return -1;
8051 if (ir.mod == 3)
25ea693b 8052 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
a3c4230a
HZ
8053 else
8054 {
8055 if (ir.dflag == 2)
8056 ir.ot = OT_QUAD;
8057 else
8058 ir.ot = OT_LONG;
8059 if (i386_record_lea_modrm (&ir))
8060 return -1;
8061 }
8062 break;
8063
8064 case 0x0f7f: /* movq */
8065 if (i386_record_modrm (&ir))
8066 return -1;
8067 if (ir.mod == 3)
8068 {
8069 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
8070 goto no_support;
25ea693b
MM
8071 record_full_arch_list_add_reg (ir.regcache,
8072 I387_MM0_REGNUM (tdep) + ir.rm);
a3c4230a
HZ
8073 }
8074 else
8075 {
8076 ir.ot = OT_QUAD;
8077 if (i386_record_lea_modrm (&ir))
8078 return -1;
8079 }
8080 break;
8081
8082 case 0xf30fb8: /* popcnt */
8083 if (i386_record_modrm (&ir))
8084 return -1;
25ea693b
MM
8085 I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.reg);
8086 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
a3c4230a
HZ
8087 break;
8088
8089 case 0x660fd6: /* movq */
8090 if (i386_record_modrm (&ir))
8091 return -1;
8092 if (ir.mod == 3)
8093 {
8094 ir.rm |= ir.rex_b;
1777feb0
MS
8095 if (!i386_xmm_regnum_p (gdbarch,
8096 I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a 8097 goto no_support;
25ea693b
MM
8098 record_full_arch_list_add_reg (ir.regcache,
8099 I387_XMM0_REGNUM (tdep) + ir.rm);
a3c4230a
HZ
8100 }
8101 else
8102 {
8103 ir.ot = OT_QUAD;
8104 if (i386_record_lea_modrm (&ir))
8105 return -1;
8106 }
8107 break;
8108
8109 case 0x660f3817: /* ptest */
8110 case 0x0f2e: /* ucomiss */
8111 case 0x660f2e: /* ucomisd */
8112 case 0x0f2f: /* comiss */
8113 case 0x660f2f: /* comisd */
25ea693b 8114 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
a3c4230a
HZ
8115 break;
8116
8117 case 0x0ff7: /* maskmovq */
8118 regcache_raw_read_unsigned (ir.regcache,
8119 ir.regmap[X86_RECORD_REDI_REGNUM],
8120 &addr);
25ea693b 8121 if (record_full_arch_list_add_mem (addr, 64))
a3c4230a
HZ
8122 return -1;
8123 break;
8124
8125 case 0x660ff7: /* maskmovdqu */
8126 regcache_raw_read_unsigned (ir.regcache,
8127 ir.regmap[X86_RECORD_REDI_REGNUM],
8128 &addr);
25ea693b 8129 if (record_full_arch_list_add_mem (addr, 128))
a3c4230a
HZ
8130 return -1;
8131 break;
8132
8133 default:
8134 goto no_support;
8135 break;
8136 }
8137 break;
7ad10968
HZ
8138
8139 default:
7ad10968
HZ
8140 goto no_support;
8141 break;
8142 }
8143
cf648174 8144 /* In the future, maybe still need to deal with need_dasm. */
25ea693b
MM
8145 I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_REIP_REGNUM);
8146 if (record_full_arch_list_add_end ())
7ad10968
HZ
8147 return -1;
8148
8149 return 0;
8150
01fe1b41 8151 no_support:
a3c4230a
HZ
8152 printf_unfiltered (_("Process record does not support instruction 0x%02x "
8153 "at address %s.\n"),
8154 (unsigned int) (opcode),
8155 paddress (gdbarch, ir.orig_addr));
7ad10968
HZ
8156 return -1;
8157}
8158
cf648174
HZ
8159static const int i386_record_regmap[] =
8160{
8161 I386_EAX_REGNUM, I386_ECX_REGNUM, I386_EDX_REGNUM, I386_EBX_REGNUM,
8162 I386_ESP_REGNUM, I386_EBP_REGNUM, I386_ESI_REGNUM, I386_EDI_REGNUM,
8163 0, 0, 0, 0, 0, 0, 0, 0,
8164 I386_EIP_REGNUM, I386_EFLAGS_REGNUM, I386_CS_REGNUM, I386_SS_REGNUM,
8165 I386_DS_REGNUM, I386_ES_REGNUM, I386_FS_REGNUM, I386_GS_REGNUM
8166};
8167
7a697b8d 8168/* Check that the given address appears suitable for a fast
405f8e94 8169 tracepoint, which on x86-64 means that we need an instruction of at
7a697b8d
SS
8170 least 5 bytes, so that we can overwrite it with a 4-byte-offset
8171 jump and not have to worry about program jumps to an address in the
405f8e94
SS
8172 middle of the tracepoint jump. On x86, it may be possible to use
8173 4-byte jumps with a 2-byte offset to a trampoline located in the
8174 bottom 64 KiB of memory. Returns 1 if OK, and writes a size
7a697b8d
SS
8175 of instruction to replace, and 0 if not, plus an explanatory
8176 string. */
8177
8178static int
6b940e6a 8179i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch, CORE_ADDR addr,
281d762b 8180 std::string *msg)
7a697b8d
SS
8181{
8182 int len, jumplen;
7a697b8d 8183
405f8e94
SS
8184 /* Ask the target for the minimum instruction length supported. */
8185 jumplen = target_get_min_fast_tracepoint_insn_len ();
8186
8187 if (jumplen < 0)
8188 {
8189 /* If the target does not support the get_min_fast_tracepoint_insn_len
8190 operation, assume that fast tracepoints will always be implemented
8191 using 4-byte relative jumps on both x86 and x86-64. */
8192 jumplen = 5;
8193 }
8194 else if (jumplen == 0)
8195 {
8196 /* If the target does support get_min_fast_tracepoint_insn_len but
8197 returns zero, then the IPA has not loaded yet. In this case,
8198 we optimistically assume that truncated 2-byte relative jumps
8199 will be available on x86, and compensate later if this assumption
8200 turns out to be incorrect. On x86-64 architectures, 4-byte relative
8201 jumps will always be used. */
8202 jumplen = (register_size (gdbarch, 0) == 8) ? 5 : 4;
8203 }
7a697b8d 8204
7a697b8d 8205 /* Check for fit. */
be85ce7d 8206 len = gdb_insn_length (gdbarch, addr);
405f8e94 8207
7a697b8d
SS
8208 if (len < jumplen)
8209 {
8210 /* Return a bit of target-specific detail to add to the caller's
8211 generic failure message. */
8212 if (msg)
281d762b
TT
8213 *msg = string_printf (_("; instruction is only %d bytes long, "
8214 "need at least %d bytes for the jump"),
8215 len, jumplen);
7a697b8d
SS
8216 return 0;
8217 }
405f8e94
SS
8218 else
8219 {
8220 if (msg)
281d762b 8221 msg->clear ();
405f8e94
SS
8222 return 1;
8223 }
7a697b8d
SS
8224}
8225
00d5215e
UW
8226/* Return a floating-point format for a floating-point variable of
8227 length LEN in bits. If non-NULL, NAME is the name of its type.
8228 If no suitable type is found, return NULL. */
8229
cb8c24b6 8230static const struct floatformat **
00d5215e
UW
8231i386_floatformat_for_type (struct gdbarch *gdbarch,
8232 const char *name, int len)
8233{
8234 if (len == 128 && name)
8235 if (strcmp (name, "__float128") == 0
8236 || strcmp (name, "_Float128") == 0
34d11c68
AB
8237 || strcmp (name, "complex _Float128") == 0
8238 || strcmp (name, "complex(kind=16)") == 0
e56798df
AKS
8239 || strcmp (name, "quad complex") == 0
8240 || strcmp (name, "real(kind=16)") == 0
8241 || strcmp (name, "real*16") == 0)
00d5215e
UW
8242 return floatformats_ia64_quad;
8243
8244 return default_floatformat_for_type (gdbarch, name, len);
8245}
8246
90884b2b
L
8247static int
8248i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
8249 struct tdesc_arch_data *tdesc_data)
8250{
8251 const struct target_desc *tdesc = tdep->tdesc;
c131fcee 8252 const struct tdesc_feature *feature_core;
01f9f808
MS
8253
8254 const struct tdesc_feature *feature_sse, *feature_avx, *feature_mpx,
1163a4b7 8255 *feature_avx512, *feature_pkeys, *feature_segments;
90884b2b
L
8256 int i, num_regs, valid_p;
8257
8258 if (! tdesc_has_registers (tdesc))
8259 return 0;
8260
8261 /* Get core registers. */
8262 feature_core = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.core");
3a13a53b
L
8263 if (feature_core == NULL)
8264 return 0;
90884b2b
L
8265
8266 /* Get SSE registers. */
c131fcee 8267 feature_sse = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.sse");
90884b2b 8268
c131fcee
L
8269 /* Try AVX registers. */
8270 feature_avx = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx");
8271
1dbcd68c
WT
8272 /* Try MPX registers. */
8273 feature_mpx = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.mpx");
8274
01f9f808
MS
8275 /* Try AVX512 registers. */
8276 feature_avx512 = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx512");
8277
1163a4b7
JB
8278 /* Try segment base registers. */
8279 feature_segments = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.segments");
8280
51547df6
MS
8281 /* Try PKEYS */
8282 feature_pkeys = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.pkeys");
8283
90884b2b
L
8284 valid_p = 1;
8285
c131fcee 8286 /* The XCR0 bits. */
01f9f808
MS
8287 if (feature_avx512)
8288 {
8289 /* AVX512 register description requires AVX register description. */
8290 if (!feature_avx)
8291 return 0;
8292
a1fa17ee 8293 tdep->xcr0 = X86_XSTATE_AVX_AVX512_MASK;
01f9f808
MS
8294
8295 /* It may have been set by OSABI initialization function. */
8296 if (tdep->k0_regnum < 0)
8297 {
8298 tdep->k_register_names = i386_k_names;
8299 tdep->k0_regnum = I386_K0_REGNUM;
8300 }
8301
8302 for (i = 0; i < I387_NUM_K_REGS; i++)
8303 valid_p &= tdesc_numbered_register (feature_avx512, tdesc_data,
8304 tdep->k0_regnum + i,
8305 i386_k_names[i]);
8306
8307 if (tdep->num_zmm_regs == 0)
8308 {
8309 tdep->zmmh_register_names = i386_zmmh_names;
8310 tdep->num_zmm_regs = 8;
8311 tdep->zmm0h_regnum = I386_ZMM0H_REGNUM;
8312 }
8313
8314 for (i = 0; i < tdep->num_zmm_regs; i++)
8315 valid_p &= tdesc_numbered_register (feature_avx512, tdesc_data,
8316 tdep->zmm0h_regnum + i,
8317 tdep->zmmh_register_names[i]);
8318
8319 for (i = 0; i < tdep->num_xmm_avx512_regs; i++)
8320 valid_p &= tdesc_numbered_register (feature_avx512, tdesc_data,
8321 tdep->xmm16_regnum + i,
8322 tdep->xmm_avx512_register_names[i]);
8323
8324 for (i = 0; i < tdep->num_ymm_avx512_regs; i++)
8325 valid_p &= tdesc_numbered_register (feature_avx512, tdesc_data,
8326 tdep->ymm16h_regnum + i,
8327 tdep->ymm16h_register_names[i]);
8328 }
c131fcee
L
8329 if (feature_avx)
8330 {
3a13a53b
L
8331 /* AVX register description requires SSE register description. */
8332 if (!feature_sse)
8333 return 0;
8334
01f9f808 8335 if (!feature_avx512)
df7e5265 8336 tdep->xcr0 = X86_XSTATE_AVX_MASK;
c131fcee
L
8337
8338 /* It may have been set by OSABI initialization function. */
8339 if (tdep->num_ymm_regs == 0)
8340 {
8341 tdep->ymmh_register_names = i386_ymmh_names;
8342 tdep->num_ymm_regs = 8;
8343 tdep->ymm0h_regnum = I386_YMM0H_REGNUM;
8344 }
8345
8346 for (i = 0; i < tdep->num_ymm_regs; i++)
8347 valid_p &= tdesc_numbered_register (feature_avx, tdesc_data,
8348 tdep->ymm0h_regnum + i,
8349 tdep->ymmh_register_names[i]);
8350 }
3a13a53b 8351 else if (feature_sse)
df7e5265 8352 tdep->xcr0 = X86_XSTATE_SSE_MASK;
3a13a53b
L
8353 else
8354 {
df7e5265 8355 tdep->xcr0 = X86_XSTATE_X87_MASK;
3a13a53b
L
8356 tdep->num_xmm_regs = 0;
8357 }
c131fcee 8358
90884b2b
L
8359 num_regs = tdep->num_core_regs;
8360 for (i = 0; i < num_regs; i++)
8361 valid_p &= tdesc_numbered_register (feature_core, tdesc_data, i,
8362 tdep->register_names[i]);
8363
3a13a53b
L
8364 if (feature_sse)
8365 {
8366 /* Need to include %mxcsr, so add one. */
8367 num_regs += tdep->num_xmm_regs + 1;
8368 for (; i < num_regs; i++)
8369 valid_p &= tdesc_numbered_register (feature_sse, tdesc_data, i,
8370 tdep->register_names[i]);
8371 }
90884b2b 8372
1dbcd68c
WT
8373 if (feature_mpx)
8374 {
df7e5265 8375 tdep->xcr0 |= X86_XSTATE_MPX_MASK;
1dbcd68c
WT
8376
8377 if (tdep->bnd0r_regnum < 0)
8378 {
8379 tdep->mpx_register_names = i386_mpx_names;
8380 tdep->bnd0r_regnum = I386_BND0R_REGNUM;
8381 tdep->bndcfgu_regnum = I386_BNDCFGU_REGNUM;
8382 }
8383
8384 for (i = 0; i < I387_NUM_MPX_REGS; i++)
8385 valid_p &= tdesc_numbered_register (feature_mpx, tdesc_data,
8386 I387_BND0R_REGNUM (tdep) + i,
8387 tdep->mpx_register_names[i]);
8388 }
8389
1163a4b7
JB
8390 if (feature_segments)
8391 {
8392 if (tdep->fsbase_regnum < 0)
8393 tdep->fsbase_regnum = I386_FSBASE_REGNUM;
8394 valid_p &= tdesc_numbered_register (feature_segments, tdesc_data,
8395 tdep->fsbase_regnum, "fs_base");
8396 valid_p &= tdesc_numbered_register (feature_segments, tdesc_data,
8397 tdep->fsbase_regnum + 1, "gs_base");
8398 }
8399
51547df6
MS
8400 if (feature_pkeys)
8401 {
8402 tdep->xcr0 |= X86_XSTATE_PKRU;
8403 if (tdep->pkru_regnum < 0)
8404 {
8405 tdep->pkeys_register_names = i386_pkeys_names;
8406 tdep->pkru_regnum = I386_PKRU_REGNUM;
8407 tdep->num_pkeys_regs = 1;
8408 }
8409
8410 for (i = 0; i < I387_NUM_PKEYS_REGS; i++)
8411 valid_p &= tdesc_numbered_register (feature_pkeys, tdesc_data,
8412 I387_PKRU_REGNUM (tdep) + i,
8413 tdep->pkeys_register_names[i]);
8414 }
8415
90884b2b
L
8416 return valid_p;
8417}
8418
2b4424c3
TT
8419\f
8420
8421/* Implement the type_align gdbarch function. */
8422
8423static ULONGEST
8424i386_type_align (struct gdbarch *gdbarch, struct type *type)
8425{
8426 type = check_typedef (type);
8427
8428 if (gdbarch_ptr_bit (gdbarch) == 32)
8429 {
78134374
SM
8430 if ((type->code () == TYPE_CODE_INT
8431 || type->code () == TYPE_CODE_FLT)
2b4424c3
TT
8432 && TYPE_LENGTH (type) > 4)
8433 return 4;
8434
8435 /* Handle x86's funny long double. */
78134374 8436 if (type->code () == TYPE_CODE_FLT
2b4424c3
TT
8437 && gdbarch_long_double_bit (gdbarch) == TYPE_LENGTH (type) * 8)
8438 return 4;
8439 }
8440
5561fc30 8441 return 0;
2b4424c3
TT
8442}
8443
7ad10968 8444\f
ad9eb1fd
DE
8445/* Note: This is called for both i386 and amd64. */
8446
7ad10968
HZ
8447static struct gdbarch *
8448i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8449{
8450 struct gdbarch_tdep *tdep;
8451 struct gdbarch *gdbarch;
90884b2b 8452 const struct target_desc *tdesc;
1ba53b71 8453 int mm0_regnum;
c131fcee 8454 int ymm0_regnum;
1dbcd68c
WT
8455 int bnd0_regnum;
8456 int num_bnd_cooked;
7ad10968
HZ
8457
8458 /* If there is already a candidate, use it. */
8459 arches = gdbarch_list_lookup_by_info (arches, &info);
8460 if (arches != NULL)
8461 return arches->gdbarch;
8462
ad9eb1fd 8463 /* Allocate space for the new architecture. Assume i386 for now. */
fc270c35 8464 tdep = XCNEW (struct gdbarch_tdep);
7ad10968
HZ
8465 gdbarch = gdbarch_alloc (&info, tdep);
8466
8467 /* General-purpose registers. */
7ad10968
HZ
8468 tdep->gregset_reg_offset = NULL;
8469 tdep->gregset_num_regs = I386_NUM_GREGS;
8470 tdep->sizeof_gregset = 0;
8471
8472 /* Floating-point registers. */
7ad10968 8473 tdep->sizeof_fpregset = I387_SIZEOF_FSAVE;
8f0435f7 8474 tdep->fpregset = &i386_fpregset;
7ad10968
HZ
8475
8476 /* The default settings include the FPU registers, the MMX registers
8477 and the SSE registers. This can be overridden for a specific ABI
8478 by adjusting the members `st0_regnum', `mm0_regnum' and
8479 `num_xmm_regs' of `struct gdbarch_tdep', otherwise the registers
3a13a53b 8480 will show up in the output of "info all-registers". */
7ad10968
HZ
8481
8482 tdep->st0_regnum = I386_ST0_REGNUM;
8483
7ad10968
HZ
8484 /* I386_NUM_XREGS includes %mxcsr, so substract one. */
8485 tdep->num_xmm_regs = I386_NUM_XREGS - 1;
8486
8487 tdep->jb_pc_offset = -1;
8488 tdep->struct_return = pcc_struct_return;
8489 tdep->sigtramp_start = 0;
8490 tdep->sigtramp_end = 0;
8491 tdep->sigtramp_p = i386_sigtramp_p;
8492 tdep->sigcontext_addr = NULL;
8493 tdep->sc_reg_offset = NULL;
8494 tdep->sc_pc_offset = -1;
8495 tdep->sc_sp_offset = -1;
8496
c131fcee
L
8497 tdep->xsave_xcr0_offset = -1;
8498
cf648174
HZ
8499 tdep->record_regmap = i386_record_regmap;
8500
2b4424c3 8501 set_gdbarch_type_align (gdbarch, i386_type_align);
205c306f 8502
7ad10968
HZ
8503 /* The format used for `long double' on almost all i386 targets is
8504 the i387 extended floating-point format. In fact, of all targets
8505 in the GCC 2.95 tree, only OSF/1 does it different, and insists
8506 on having a `long double' that's not `long' at all. */
8507 set_gdbarch_long_double_format (gdbarch, floatformats_i387_ext);
8508
8509 /* Although the i387 extended floating-point has only 80 significant
8510 bits, a `long double' actually takes up 96, probably to enforce
8511 alignment. */
8512 set_gdbarch_long_double_bit (gdbarch, 96);
8513
2a67f09d
FW
8514 /* Support of bfloat16 format. */
8515 set_gdbarch_bfloat16_format (gdbarch, floatformats_bfloat16);
8516
00d5215e
UW
8517 /* Support for floating-point data type variants. */
8518 set_gdbarch_floatformat_for_type (gdbarch, i386_floatformat_for_type);
8519
7ad10968
HZ
8520 /* Register numbers of various important registers. */
8521 set_gdbarch_sp_regnum (gdbarch, I386_ESP_REGNUM); /* %esp */
8522 set_gdbarch_pc_regnum (gdbarch, I386_EIP_REGNUM); /* %eip */
8523 set_gdbarch_ps_regnum (gdbarch, I386_EFLAGS_REGNUM); /* %eflags */
8524 set_gdbarch_fp0_regnum (gdbarch, I386_ST0_REGNUM); /* %st(0) */
8525
8526 /* NOTE: kettenis/20040418: GCC does have two possible register
8527 numbering schemes on the i386: dbx and SVR4. These schemes
8528 differ in how they number %ebp, %esp, %eflags, and the
8529 floating-point registers, and are implemented by the arrays
8530 dbx_register_map[] and svr4_dbx_register_map in
8531 gcc/config/i386.c. GCC also defines a third numbering scheme in
8532 gcc/config/i386.c, which it designates as the "default" register
8533 map used in 64bit mode. This last register numbering scheme is
8534 implemented in dbx64_register_map, and is used for AMD64; see
8535 amd64-tdep.c.
8536
8537 Currently, each GCC i386 target always uses the same register
8538 numbering scheme across all its supported debugging formats
8539 i.e. SDB (COFF), stabs and DWARF 2. This is because
8540 gcc/sdbout.c, gcc/dbxout.c and gcc/dwarf2out.c all use the
8541 DBX_REGISTER_NUMBER macro which is defined by each target's
8542 respective config header in a manner independent of the requested
8543 output debugging format.
8544
8545 This does not match the arrangement below, which presumes that
8546 the SDB and stabs numbering schemes differ from the DWARF and
8547 DWARF 2 ones. The reason for this arrangement is that it is
8548 likely to get the numbering scheme for the target's
8549 default/native debug format right. For targets where GCC is the
8550 native compiler (FreeBSD, NetBSD, OpenBSD, GNU/Linux) or for
8551 targets where the native toolchain uses a different numbering
8552 scheme for a particular debug format (stabs-in-ELF on Solaris)
8553 the defaults below will have to be overridden, like
8554 i386_elf_init_abi() does. */
8555
8556 /* Use the dbx register numbering scheme for stabs and COFF. */
8557 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
8558 set_gdbarch_sdb_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
8559
8560 /* Use the SVR4 register numbering scheme for DWARF 2. */
0fde2c53 8561 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, i386_svr4_dwarf_reg_to_regnum);
7ad10968
HZ
8562
8563 /* We don't set gdbarch_stab_reg_to_regnum, since ECOFF doesn't seem to
8564 be in use on any of the supported i386 targets. */
8565
8566 set_gdbarch_print_float_info (gdbarch, i387_print_float_info);
8567
8568 set_gdbarch_get_longjmp_target (gdbarch, i386_get_longjmp_target);
8569
8570 /* Call dummy code. */
a9b8d892
JK
8571 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
8572 set_gdbarch_push_dummy_code (gdbarch, i386_push_dummy_code);
7ad10968 8573 set_gdbarch_push_dummy_call (gdbarch, i386_push_dummy_call);
e04e5beb 8574 set_gdbarch_frame_align (gdbarch, i386_frame_align);
7ad10968
HZ
8575
8576 set_gdbarch_convert_register_p (gdbarch, i386_convert_register_p);
8577 set_gdbarch_register_to_value (gdbarch, i386_register_to_value);
8578 set_gdbarch_value_to_register (gdbarch, i386_value_to_register);
8579
8580 set_gdbarch_return_value (gdbarch, i386_return_value);
8581
8582 set_gdbarch_skip_prologue (gdbarch, i386_skip_prologue);
8583
8584 /* Stack grows downward. */
8585 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
8586
04180708
YQ
8587 set_gdbarch_breakpoint_kind_from_pc (gdbarch, i386_breakpoint::kind_from_pc);
8588 set_gdbarch_sw_breakpoint_from_kind (gdbarch, i386_breakpoint::bp_from_kind);
8589
7ad10968
HZ
8590 set_gdbarch_decr_pc_after_break (gdbarch, 1);
8591 set_gdbarch_max_insn_length (gdbarch, I386_MAX_INSN_LEN);
8592
8593 set_gdbarch_frame_args_skip (gdbarch, 8);
8594
7ad10968
HZ
8595 set_gdbarch_print_insn (gdbarch, i386_print_insn);
8596
8597 set_gdbarch_dummy_id (gdbarch, i386_dummy_id);
8598
8599 set_gdbarch_unwind_pc (gdbarch, i386_unwind_pc);
8600
8601 /* Add the i386 register groups. */
8602 i386_add_reggroups (gdbarch);
90884b2b 8603 tdep->register_reggroup_p = i386_register_reggroup_p;
38c968cf 8604
143985b7
AF
8605 /* Helper for function argument information. */
8606 set_gdbarch_fetch_pointer_argument (gdbarch, i386_fetch_pointer_argument);
8607
06da04c6 8608 /* Hook the function epilogue frame unwinder. This unwinder is
0d6c2135
MK
8609 appended to the list first, so that it supercedes the DWARF
8610 unwinder in function epilogues (where the DWARF unwinder
06da04c6
MS
8611 currently fails). */
8612 frame_unwind_append_unwinder (gdbarch, &i386_epilogue_frame_unwind);
8613
8614 /* Hook in the DWARF CFI frame unwinder. This unwinder is appended
0d6c2135 8615 to the list before the prologue-based unwinders, so that DWARF
06da04c6 8616 CFI info will be used if it is available. */
10458914 8617 dwarf2_append_unwinders (gdbarch);
6405b0a6 8618
acd5c798 8619 frame_base_set_default (gdbarch, &i386_frame_base);
6c0e89ed 8620
1ba53b71 8621 /* Pseudo registers may be changed by amd64_init_abi. */
3543a589
TT
8622 set_gdbarch_pseudo_register_read_value (gdbarch,
8623 i386_pseudo_register_read_value);
90884b2b 8624 set_gdbarch_pseudo_register_write (gdbarch, i386_pseudo_register_write);
62e5fd57
MK
8625 set_gdbarch_ax_pseudo_register_collect (gdbarch,
8626 i386_ax_pseudo_register_collect);
90884b2b
L
8627
8628 set_tdesc_pseudo_register_type (gdbarch, i386_pseudo_register_type);
8629 set_tdesc_pseudo_register_name (gdbarch, i386_pseudo_register_name);
8630
c131fcee
L
8631 /* Override the normal target description method to make the AVX
8632 upper halves anonymous. */
8633 set_gdbarch_register_name (gdbarch, i386_register_name);
8634
8635 /* Even though the default ABI only includes general-purpose registers,
8636 floating-point registers and the SSE registers, we have to leave a
01f9f808 8637 gap for the upper AVX, MPX and AVX512 registers. */
1163a4b7 8638 set_gdbarch_num_regs (gdbarch, I386_NUM_REGS);
90884b2b 8639
ac04f72b
TT
8640 set_gdbarch_gnu_triplet_regexp (gdbarch, i386_gnu_triplet_regexp);
8641
90884b2b
L
8642 /* Get the x86 target description from INFO. */
8643 tdesc = info.target_desc;
8644 if (! tdesc_has_registers (tdesc))
1163a4b7 8645 tdesc = i386_target_description (X86_XSTATE_SSE_MASK, false);
90884b2b
L
8646 tdep->tdesc = tdesc;
8647
8648 tdep->num_core_regs = I386_NUM_GREGS + I387_NUM_REGS;
8649 tdep->register_names = i386_register_names;
8650
c131fcee
L
8651 /* No upper YMM registers. */
8652 tdep->ymmh_register_names = NULL;
8653 tdep->ymm0h_regnum = -1;
8654
01f9f808
MS
8655 /* No upper ZMM registers. */
8656 tdep->zmmh_register_names = NULL;
8657 tdep->zmm0h_regnum = -1;
8658
8659 /* No high XMM registers. */
8660 tdep->xmm_avx512_register_names = NULL;
8661 tdep->xmm16_regnum = -1;
8662
8663 /* No upper YMM16-31 registers. */
8664 tdep->ymm16h_register_names = NULL;
8665 tdep->ymm16h_regnum = -1;
8666
1ba53b71
L
8667 tdep->num_byte_regs = 8;
8668 tdep->num_word_regs = 8;
8669 tdep->num_dword_regs = 0;
8670 tdep->num_mmx_regs = 8;
c131fcee 8671 tdep->num_ymm_regs = 0;
1ba53b71 8672
1dbcd68c
WT
8673 /* No MPX registers. */
8674 tdep->bnd0r_regnum = -1;
8675 tdep->bndcfgu_regnum = -1;
8676
01f9f808
MS
8677 /* No AVX512 registers. */
8678 tdep->k0_regnum = -1;
8679 tdep->num_zmm_regs = 0;
8680 tdep->num_ymm_avx512_regs = 0;
8681 tdep->num_xmm_avx512_regs = 0;
8682
51547df6
MS
8683 /* No PKEYS registers */
8684 tdep->pkru_regnum = -1;
8685 tdep->num_pkeys_regs = 0;
8686
1163a4b7
JB
8687 /* No segment base registers. */
8688 tdep->fsbase_regnum = -1;
8689
c1e1314d 8690 tdesc_arch_data_up tdesc_data = tdesc_data_alloc ();
90884b2b 8691
dde08ee1
PA
8692 set_gdbarch_relocate_instruction (gdbarch, i386_relocate_instruction);
8693
6710bf39
SS
8694 set_gdbarch_gen_return_address (gdbarch, i386_gen_return_address);
8695
c2170eef
MM
8696 set_gdbarch_insn_is_call (gdbarch, i386_insn_is_call);
8697 set_gdbarch_insn_is_ret (gdbarch, i386_insn_is_ret);
8698 set_gdbarch_insn_is_jump (gdbarch, i386_insn_is_jump);
8699
ad9eb1fd
DE
8700 /* Hook in ABI-specific overrides, if they have been registered.
8701 Note: If INFO specifies a 64 bit arch, this is where we turn
8702 a 32-bit i386 into a 64-bit amd64. */
c1e1314d 8703 info.tdesc_data = tdesc_data.get ();
4be87837 8704 gdbarch_init_osabi (info, gdbarch);
3ce1502b 8705
c1e1314d 8706 if (!i386_validate_tdesc_p (tdep, tdesc_data.get ()))
c131fcee 8707 {
c131fcee
L
8708 xfree (tdep);
8709 gdbarch_free (gdbarch);
8710 return NULL;
8711 }
8712
1dbcd68c
WT
8713 num_bnd_cooked = (tdep->bnd0r_regnum > 0 ? I387_NUM_BND_REGS : 0);
8714
1ba53b71
L
8715 /* Wire in pseudo registers. Number of pseudo registers may be
8716 changed. */
8717 set_gdbarch_num_pseudo_regs (gdbarch, (tdep->num_byte_regs
8718 + tdep->num_word_regs
8719 + tdep->num_dword_regs
c131fcee 8720 + tdep->num_mmx_regs
1dbcd68c 8721 + tdep->num_ymm_regs
01f9f808
MS
8722 + num_bnd_cooked
8723 + tdep->num_ymm_avx512_regs
8724 + tdep->num_zmm_regs));
1ba53b71 8725
90884b2b
L
8726 /* Target description may be changed. */
8727 tdesc = tdep->tdesc;
8728
c1e1314d 8729 tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
90884b2b
L
8730
8731 /* Override gdbarch_register_reggroup_p set in tdesc_use_registers. */
8732 set_gdbarch_register_reggroup_p (gdbarch, tdep->register_reggroup_p);
8733
1ba53b71
L
8734 /* Make %al the first pseudo-register. */
8735 tdep->al_regnum = gdbarch_num_regs (gdbarch);
8736 tdep->ax_regnum = tdep->al_regnum + tdep->num_byte_regs;
8737
c131fcee 8738 ymm0_regnum = tdep->ax_regnum + tdep->num_word_regs;
1ba53b71
L
8739 if (tdep->num_dword_regs)
8740 {
1c6272a6 8741 /* Support dword pseudo-register if it hasn't been disabled. */
c131fcee
L
8742 tdep->eax_regnum = ymm0_regnum;
8743 ymm0_regnum += tdep->num_dword_regs;
1ba53b71
L
8744 }
8745 else
8746 tdep->eax_regnum = -1;
8747
c131fcee
L
8748 mm0_regnum = ymm0_regnum;
8749 if (tdep->num_ymm_regs)
8750 {
1c6272a6 8751 /* Support YMM pseudo-register if it is available. */
c131fcee
L
8752 tdep->ymm0_regnum = ymm0_regnum;
8753 mm0_regnum += tdep->num_ymm_regs;
8754 }
8755 else
8756 tdep->ymm0_regnum = -1;
8757
01f9f808
MS
8758 if (tdep->num_ymm_avx512_regs)
8759 {
8760 /* Support YMM16-31 pseudo registers if available. */
8761 tdep->ymm16_regnum = mm0_regnum;
8762 mm0_regnum += tdep->num_ymm_avx512_regs;
8763 }
8764 else
8765 tdep->ymm16_regnum = -1;
8766
8767 if (tdep->num_zmm_regs)
8768 {
8769 /* Support ZMM pseudo-register if it is available. */
8770 tdep->zmm0_regnum = mm0_regnum;
8771 mm0_regnum += tdep->num_zmm_regs;
8772 }
8773 else
8774 tdep->zmm0_regnum = -1;
8775
1dbcd68c 8776 bnd0_regnum = mm0_regnum;
1ba53b71
L
8777 if (tdep->num_mmx_regs != 0)
8778 {
1c6272a6 8779 /* Support MMX pseudo-register if MMX hasn't been disabled. */
1ba53b71 8780 tdep->mm0_regnum = mm0_regnum;
1dbcd68c 8781 bnd0_regnum += tdep->num_mmx_regs;
1ba53b71
L
8782 }
8783 else
8784 tdep->mm0_regnum = -1;
8785
1dbcd68c
WT
8786 if (tdep->bnd0r_regnum > 0)
8787 tdep->bnd0_regnum = bnd0_regnum;
8788 else
8789 tdep-> bnd0_regnum = -1;
8790
06da04c6 8791 /* Hook in the legacy prologue-based unwinders last (fallback). */
a3fcb948 8792 frame_unwind_append_unwinder (gdbarch, &i386_stack_tramp_frame_unwind);
10458914
DJ
8793 frame_unwind_append_unwinder (gdbarch, &i386_sigtramp_frame_unwind);
8794 frame_unwind_append_unwinder (gdbarch, &i386_frame_unwind);
acd5c798 8795
8446b36a
MK
8796 /* If we have a register mapping, enable the generic core file
8797 support, unless it has already been enabled. */
8798 if (tdep->gregset_reg_offset
8f0435f7 8799 && !gdbarch_iterate_over_regset_sections_p (gdbarch))
490496c3
AA
8800 set_gdbarch_iterate_over_regset_sections
8801 (gdbarch, i386_iterate_over_regset_sections);
8446b36a 8802
7a697b8d
SS
8803 set_gdbarch_fast_tracepoint_valid_at (gdbarch,
8804 i386_fast_tracepoint_valid_at);
8805
a62cc96e
AC
8806 return gdbarch;
8807}
8808
8201327c
MK
8809\f
8810
97de3545
JB
8811/* Return the target description for a specified XSAVE feature mask. */
8812
8813const struct target_desc *
1163a4b7 8814i386_target_description (uint64_t xcr0, bool segments)
97de3545 8815{
22916b07 8816 static target_desc *i386_tdescs \
1163a4b7 8817 [2/*SSE*/][2/*AVX*/][2/*MPX*/][2/*AVX512*/][2/*PKRU*/][2/*segments*/] = {};
22916b07
YQ
8818 target_desc **tdesc;
8819
8820 tdesc = &i386_tdescs[(xcr0 & X86_XSTATE_SSE) ? 1 : 0]
8821 [(xcr0 & X86_XSTATE_AVX) ? 1 : 0]
8822 [(xcr0 & X86_XSTATE_MPX) ? 1 : 0]
8823 [(xcr0 & X86_XSTATE_AVX512) ? 1 : 0]
1163a4b7
JB
8824 [(xcr0 & X86_XSTATE_PKRU) ? 1 : 0]
8825 [segments ? 1 : 0];
22916b07
YQ
8826
8827 if (*tdesc == NULL)
1163a4b7 8828 *tdesc = i386_create_target_description (xcr0, false, segments);
22916b07
YQ
8829
8830 return *tdesc;
97de3545
JB
8831}
8832
29c1c244
WT
8833#define MPX_BASE_MASK (~(ULONGEST) 0xfff)
8834
8835/* Find the bound directory base address. */
8836
8837static unsigned long
8838i386_mpx_bd_base (void)
8839{
8840 struct regcache *rcache;
8841 struct gdbarch_tdep *tdep;
8842 ULONGEST ret;
8843 enum register_status regstatus;
29c1c244
WT
8844
8845 rcache = get_current_regcache ();
ac7936df 8846 tdep = gdbarch_tdep (rcache->arch ());
29c1c244
WT
8847
8848 regstatus = regcache_raw_read_unsigned (rcache, tdep->bndcfgu_regnum, &ret);
8849
8850 if (regstatus != REG_VALID)
8851 error (_("BNDCFGU register invalid, read status %d."), regstatus);
8852
8853 return ret & MPX_BASE_MASK;
8854}
8855
012b3a21 8856int
29c1c244
WT
8857i386_mpx_enabled (void)
8858{
8859 const struct gdbarch_tdep *tdep = gdbarch_tdep (get_current_arch ());
8860 const struct target_desc *tdesc = tdep->tdesc;
8861
8862 return (tdesc_find_feature (tdesc, "org.gnu.gdb.i386.mpx") != NULL);
8863}
8864
8865#define MPX_BD_MASK 0xfffffff00000ULL /* select bits [47:20] */
8866#define MPX_BT_MASK 0x0000000ffff8 /* select bits [19:3] */
8867#define MPX_BD_MASK_32 0xfffff000 /* select bits [31:12] */
8868#define MPX_BT_MASK_32 0x00000ffc /* select bits [11:2] */
8869
8870/* Find the bound table entry given the pointer location and the base
8871 address of the table. */
8872
8873static CORE_ADDR
8874i386_mpx_get_bt_entry (CORE_ADDR ptr, CORE_ADDR bd_base)
8875{
8876 CORE_ADDR offset1;
8877 CORE_ADDR offset2;
8878 CORE_ADDR mpx_bd_mask, bd_ptr_r_shift, bd_ptr_l_shift;
8879 CORE_ADDR bt_mask, bt_select_r_shift, bt_select_l_shift;
8880 CORE_ADDR bd_entry_addr;
8881 CORE_ADDR bt_addr;
8882 CORE_ADDR bd_entry;
8883 struct gdbarch *gdbarch = get_current_arch ();
8884 struct type *data_ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
8885
8886
8887 if (gdbarch_ptr_bit (gdbarch) == 64)
8888 {
966f0aef 8889 mpx_bd_mask = (CORE_ADDR) MPX_BD_MASK;
29c1c244
WT
8890 bd_ptr_r_shift = 20;
8891 bd_ptr_l_shift = 3;
8892 bt_select_r_shift = 3;
8893 bt_select_l_shift = 5;
966f0aef
WT
8894 bt_mask = (CORE_ADDR) MPX_BT_MASK;
8895
8896 if ( sizeof (CORE_ADDR) == 4)
e00b3c9b
WT
8897 error (_("bound table examination not supported\
8898 for 64-bit process with 32-bit GDB"));
29c1c244
WT
8899 }
8900 else
8901 {
8902 mpx_bd_mask = MPX_BD_MASK_32;
8903 bd_ptr_r_shift = 12;
8904 bd_ptr_l_shift = 2;
8905 bt_select_r_shift = 2;
8906 bt_select_l_shift = 4;
8907 bt_mask = MPX_BT_MASK_32;
8908 }
8909
8910 offset1 = ((ptr & mpx_bd_mask) >> bd_ptr_r_shift) << bd_ptr_l_shift;
8911 bd_entry_addr = bd_base + offset1;
8912 bd_entry = read_memory_typed_address (bd_entry_addr, data_ptr_type);
8913
8914 if ((bd_entry & 0x1) == 0)
8915 error (_("Invalid bounds directory entry at %s."),
8916 paddress (get_current_arch (), bd_entry_addr));
8917
8918 /* Clearing status bit. */
8919 bd_entry--;
8920 bt_addr = bd_entry & ~bt_select_r_shift;
8921 offset2 = ((ptr & bt_mask) >> bt_select_r_shift) << bt_select_l_shift;
8922
8923 return bt_addr + offset2;
8924}
8925
8926/* Print routine for the mpx bounds. */
8927
8928static void
8929i386_mpx_print_bounds (const CORE_ADDR bt_entry[4])
8930{
8931 struct ui_out *uiout = current_uiout;
34f8ac9f 8932 LONGEST size;
29c1c244
WT
8933 struct gdbarch *gdbarch = get_current_arch ();
8934 CORE_ADDR onecompl = ~((CORE_ADDR) 0);
8935 int bounds_in_map = ((~bt_entry[1] == 0 && bt_entry[0] == onecompl) ? 1 : 0);
8936
8937 if (bounds_in_map == 1)
8938 {
112e8700
SM
8939 uiout->text ("Null bounds on map:");
8940 uiout->text (" pointer value = ");
8941 uiout->field_core_addr ("pointer-value", gdbarch, bt_entry[2]);
8942 uiout->text (".");
8943 uiout->text ("\n");
29c1c244
WT
8944 }
8945 else
8946 {
112e8700
SM
8947 uiout->text ("{lbound = ");
8948 uiout->field_core_addr ("lower-bound", gdbarch, bt_entry[0]);
8949 uiout->text (", ubound = ");
29c1c244
WT
8950
8951 /* The upper bound is stored in 1's complement. */
112e8700
SM
8952 uiout->field_core_addr ("upper-bound", gdbarch, ~bt_entry[1]);
8953 uiout->text ("}: pointer value = ");
8954 uiout->field_core_addr ("pointer-value", gdbarch, bt_entry[2]);
29c1c244
WT
8955
8956 if (gdbarch_ptr_bit (gdbarch) == 64)
8957 size = ( (~(int64_t) bt_entry[1]) - (int64_t) bt_entry[0]);
8958 else
8959 size = ( ~((int32_t) bt_entry[1]) - (int32_t) bt_entry[0]);
8960
8961 /* In case the bounds are 0x0 and 0xffff... the difference will be -1.
8962 -1 represents in this sense full memory access, and there is no need
8963 one to the size. */
8964
8965 size = (size > -1 ? size + 1 : size);
112e8700 8966 uiout->text (", size = ");
33eca680 8967 uiout->field_string ("size", plongest (size));
29c1c244 8968
112e8700
SM
8969 uiout->text (", metadata = ");
8970 uiout->field_core_addr ("metadata", gdbarch, bt_entry[3]);
8971 uiout->text ("\n");
29c1c244
WT
8972 }
8973}
8974
8975/* Implement the command "show mpx bound". */
8976
8977static void
c4a3e68e 8978i386_mpx_info_bounds (const char *args, int from_tty)
29c1c244
WT
8979{
8980 CORE_ADDR bd_base = 0;
8981 CORE_ADDR addr;
8982 CORE_ADDR bt_entry_addr = 0;
8983 CORE_ADDR bt_entry[4];
8984 int i;
8985 struct gdbarch *gdbarch = get_current_arch ();
8986 struct type *data_ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
8987
ae71e7b5
MR
8988 if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_i386
8989 || !i386_mpx_enabled ())
118ca224 8990 {
bc504a31 8991 printf_unfiltered (_("Intel Memory Protection Extensions not "
118ca224
PP
8992 "supported on this target.\n"));
8993 return;
8994 }
29c1c244
WT
8995
8996 if (args == NULL)
118ca224
PP
8997 {
8998 printf_unfiltered (_("Address of pointer variable expected.\n"));
8999 return;
9000 }
29c1c244
WT
9001
9002 addr = parse_and_eval_address (args);
9003
9004 bd_base = i386_mpx_bd_base ();
9005 bt_entry_addr = i386_mpx_get_bt_entry (addr, bd_base);
9006
9007 memset (bt_entry, 0, sizeof (bt_entry));
9008
9009 for (i = 0; i < 4; i++)
9010 bt_entry[i] = read_memory_typed_address (bt_entry_addr
132874d7 9011 + i * TYPE_LENGTH (data_ptr_type),
29c1c244
WT
9012 data_ptr_type);
9013
9014 i386_mpx_print_bounds (bt_entry);
9015}
9016
9017/* Implement the command "set mpx bound". */
9018
9019static void
c4a3e68e 9020i386_mpx_set_bounds (const char *args, int from_tty)
29c1c244
WT
9021{
9022 CORE_ADDR bd_base = 0;
9023 CORE_ADDR addr, lower, upper;
9024 CORE_ADDR bt_entry_addr = 0;
9025 CORE_ADDR bt_entry[2];
9026 const char *input = args;
9027 int i;
9028 struct gdbarch *gdbarch = get_current_arch ();
9029 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9030 struct type *data_ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
9031
ae71e7b5
MR
9032 if (gdbarch_bfd_arch_info (gdbarch)->arch != bfd_arch_i386
9033 || !i386_mpx_enabled ())
bc504a31 9034 error (_("Intel Memory Protection Extensions not supported\
29c1c244
WT
9035 on this target."));
9036
9037 if (args == NULL)
9038 error (_("Pointer value expected."));
9039
9040 addr = value_as_address (parse_to_comma_and_eval (&input));
9041
9042 if (input[0] == ',')
9043 ++input;
9044 if (input[0] == '\0')
9045 error (_("wrong number of arguments: missing lower and upper bound."));
9046 lower = value_as_address (parse_to_comma_and_eval (&input));
9047
9048 if (input[0] == ',')
9049 ++input;
9050 if (input[0] == '\0')
9051 error (_("Wrong number of arguments; Missing upper bound."));
9052 upper = value_as_address (parse_to_comma_and_eval (&input));
9053
9054 bd_base = i386_mpx_bd_base ();
9055 bt_entry_addr = i386_mpx_get_bt_entry (addr, bd_base);
9056 for (i = 0; i < 2; i++)
9057 bt_entry[i] = read_memory_typed_address (bt_entry_addr
132874d7 9058 + i * TYPE_LENGTH (data_ptr_type),
29c1c244
WT
9059 data_ptr_type);
9060 bt_entry[0] = (uint64_t) lower;
9061 bt_entry[1] = ~(uint64_t) upper;
9062
9063 for (i = 0; i < 2; i++)
132874d7
AB
9064 write_memory_unsigned_integer (bt_entry_addr
9065 + i * TYPE_LENGTH (data_ptr_type),
9066 TYPE_LENGTH (data_ptr_type), byte_order,
29c1c244
WT
9067 bt_entry[i]);
9068}
9069
9070static struct cmd_list_element *mpx_set_cmdlist, *mpx_show_cmdlist;
9071
6c265988 9072void _initialize_i386_tdep ();
c906108c 9073void
6c265988 9074_initialize_i386_tdep ()
c906108c 9075{
a62cc96e
AC
9076 register_gdbarch_init (bfd_arch_i386, i386_gdbarch_init);
9077
fc338970 9078 /* Add the variable that controls the disassembly flavor. */
7ab04401
AC
9079 add_setshow_enum_cmd ("disassembly-flavor", no_class, valid_flavors,
9080 &disassembly_flavor, _("\
9081Set the disassembly flavor."), _("\
9082Show the disassembly flavor."), _("\
9083The valid values are \"att\" and \"intel\", and the default value is \"att\"."),
9084 NULL,
9085 NULL, /* FIXME: i18n: */
9086 &setlist, &showlist);
8201327c
MK
9087
9088 /* Add the variable that controls the convention for returning
9089 structs. */
7ab04401
AC
9090 add_setshow_enum_cmd ("struct-convention", no_class, valid_conventions,
9091 &struct_convention, _("\
9092Set the convention for returning small structs."), _("\
9093Show the convention for returning small structs."), _("\
9094Valid values are \"default\", \"pcc\" and \"reg\", and the default value\n\
9095is \"default\"."),
9096 NULL,
9097 NULL, /* FIXME: i18n: */
9098 &setlist, &showlist);
8201327c 9099
29c1c244
WT
9100 /* Add "mpx" prefix for the set commands. */
9101
0743fc83 9102 add_basic_prefix_cmd ("mpx", class_support, _("\
bc504a31 9103Set Intel Memory Protection Extensions specific variables."),
0743fc83
TT
9104 &mpx_set_cmdlist, "set mpx ",
9105 0 /* allow-unknown */, &setlist);
29c1c244
WT
9106
9107 /* Add "mpx" prefix for the show commands. */
9108
0743fc83 9109 add_show_prefix_cmd ("mpx", class_support, _("\
bc504a31 9110Show Intel Memory Protection Extensions specific variables."),
0743fc83
TT
9111 &mpx_show_cmdlist, "show mpx ",
9112 0 /* allow-unknown */, &showlist);
29c1c244
WT
9113
9114 /* Add "bound" command for the show mpx commands list. */
9115
9116 add_cmd ("bound", no_class, i386_mpx_info_bounds,
9117 "Show the memory bounds for a given array/pointer storage\
9118 in the bound table.",
9119 &mpx_show_cmdlist);
9120
9121 /* Add "bound" command for the set mpx commands list. */
9122
9123 add_cmd ("bound", no_class, i386_mpx_set_bounds,
9124 "Set the memory bounds for a given array/pointer storage\
9125 in the bound table.",
9126 &mpx_set_cmdlist);
9127
05816f70 9128 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_SVR4,
8201327c 9129 i386_svr4_init_abi);
38c968cf 9130
209bd28e 9131 /* Initialize the i386-specific register groups. */
38c968cf 9132 i386_init_reggroups ();
90884b2b 9133
c8d5aac9
L
9134 /* Tell remote stub that we support XML target description. */
9135 register_remote_support_xml ("i386");
c906108c 9136}
This page took 2.367556 seconds and 4 git commands to generate.