* read.c (cons_worker): Detect and reject unexpected string argument.
[deliverable/binutils-gdb.git] / gdb / i386-tdep.c
CommitLineData
c906108c 1/* Intel 386 target-dependent stuff.
349c5d5f 2
6aba47ca 3 Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
4c38e0a4
JB
4 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
5 2010 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
1903f0e6 23#include "opcode/i386.h"
acd5c798
MK
24#include "arch-utils.h"
25#include "command.h"
26#include "dummy-frame.h"
6405b0a6 27#include "dwarf2-frame.h"
acd5c798 28#include "doublest.h"
c906108c 29#include "frame.h"
acd5c798
MK
30#include "frame-base.h"
31#include "frame-unwind.h"
c906108c 32#include "inferior.h"
acd5c798 33#include "gdbcmd.h"
c906108c 34#include "gdbcore.h"
e6bb342a 35#include "gdbtypes.h"
dfe01d39 36#include "objfiles.h"
acd5c798
MK
37#include "osabi.h"
38#include "regcache.h"
39#include "reggroups.h"
473f17b0 40#include "regset.h"
c0d1d883 41#include "symfile.h"
c906108c 42#include "symtab.h"
acd5c798 43#include "target.h"
fd0407d6 44#include "value.h"
a89aa300 45#include "dis-asm.h"
7a697b8d 46#include "disasm.h"
c8d5aac9 47#include "remote.h"
acd5c798 48
3d261580 49#include "gdb_assert.h"
acd5c798 50#include "gdb_string.h"
3d261580 51
d2a7c97a 52#include "i386-tdep.h"
61113f8b 53#include "i387-tdep.h"
c131fcee 54#include "i386-xstate.h"
d2a7c97a 55
7ad10968
HZ
56#include "record.h"
57#include <stdint.h>
58
90884b2b 59#include "features/i386/i386.c"
c131fcee 60#include "features/i386/i386-avx.c"
3a13a53b 61#include "features/i386/i386-mmx.c"
90884b2b 62
c4fc7f1b 63/* Register names. */
c40e1eab 64
90884b2b 65static const char *i386_register_names[] =
fc633446
MK
66{
67 "eax", "ecx", "edx", "ebx",
68 "esp", "ebp", "esi", "edi",
69 "eip", "eflags", "cs", "ss",
70 "ds", "es", "fs", "gs",
71 "st0", "st1", "st2", "st3",
72 "st4", "st5", "st6", "st7",
73 "fctrl", "fstat", "ftag", "fiseg",
74 "fioff", "foseg", "fooff", "fop",
75 "xmm0", "xmm1", "xmm2", "xmm3",
76 "xmm4", "xmm5", "xmm6", "xmm7",
77 "mxcsr"
78};
79
c131fcee
L
80static const char *i386_ymm_names[] =
81{
82 "ymm0", "ymm1", "ymm2", "ymm3",
83 "ymm4", "ymm5", "ymm6", "ymm7",
84};
85
86static const char *i386_ymmh_names[] =
87{
88 "ymm0h", "ymm1h", "ymm2h", "ymm3h",
89 "ymm4h", "ymm5h", "ymm6h", "ymm7h",
90};
91
c4fc7f1b 92/* Register names for MMX pseudo-registers. */
28fc6740 93
90884b2b 94static const char *i386_mmx_names[] =
28fc6740
AC
95{
96 "mm0", "mm1", "mm2", "mm3",
97 "mm4", "mm5", "mm6", "mm7"
98};
c40e1eab 99
1ba53b71
L
100/* Register names for byte pseudo-registers. */
101
102static const char *i386_byte_names[] =
103{
104 "al", "cl", "dl", "bl",
105 "ah", "ch", "dh", "bh"
106};
107
108/* Register names for word pseudo-registers. */
109
110static const char *i386_word_names[] =
111{
112 "ax", "cx", "dx", "bx",
9cad29ac 113 "", "bp", "si", "di"
1ba53b71
L
114};
115
116/* MMX register? */
c40e1eab 117
28fc6740 118static int
5716833c 119i386_mmx_regnum_p (struct gdbarch *gdbarch, int regnum)
28fc6740 120{
1ba53b71
L
121 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
122 int mm0_regnum = tdep->mm0_regnum;
5716833c
MK
123
124 if (mm0_regnum < 0)
125 return 0;
126
1ba53b71
L
127 regnum -= mm0_regnum;
128 return regnum >= 0 && regnum < tdep->num_mmx_regs;
129}
130
131/* Byte register? */
132
133int
134i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum)
135{
136 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
137
138 regnum -= tdep->al_regnum;
139 return regnum >= 0 && regnum < tdep->num_byte_regs;
140}
141
142/* Word register? */
143
144int
145i386_word_regnum_p (struct gdbarch *gdbarch, int regnum)
146{
147 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
148
149 regnum -= tdep->ax_regnum;
150 return regnum >= 0 && regnum < tdep->num_word_regs;
151}
152
153/* Dword register? */
154
155int
156i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum)
157{
158 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
159 int eax_regnum = tdep->eax_regnum;
160
161 if (eax_regnum < 0)
162 return 0;
163
164 regnum -= eax_regnum;
165 return regnum >= 0 && regnum < tdep->num_dword_regs;
28fc6740
AC
166}
167
c131fcee
L
168int
169i386_ymmh_regnum_p (struct gdbarch *gdbarch, int regnum)
170{
171 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
172 int ymm0h_regnum = tdep->ymm0h_regnum;
173
174 if (ymm0h_regnum < 0)
175 return 0;
176
177 regnum -= ymm0h_regnum;
178 return regnum >= 0 && regnum < tdep->num_ymm_regs;
179}
180
181/* AVX register? */
182
183int
184i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum)
185{
186 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
187 int ymm0_regnum = tdep->ymm0_regnum;
188
189 if (ymm0_regnum < 0)
190 return 0;
191
192 regnum -= ymm0_regnum;
193 return regnum >= 0 && regnum < tdep->num_ymm_regs;
194}
195
5716833c 196/* SSE register? */
23a34459 197
c131fcee
L
198int
199i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 200{
5716833c 201 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
c131fcee 202 int num_xmm_regs = I387_NUM_XMM_REGS (tdep);
5716833c 203
c131fcee 204 if (num_xmm_regs == 0)
5716833c
MK
205 return 0;
206
c131fcee
L
207 regnum -= I387_XMM0_REGNUM (tdep);
208 return regnum >= 0 && regnum < num_xmm_regs;
23a34459
AC
209}
210
5716833c
MK
211static int
212i386_mxcsr_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 213{
5716833c
MK
214 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
215
20a6ec49 216 if (I387_NUM_XMM_REGS (tdep) == 0)
5716833c
MK
217 return 0;
218
20a6ec49 219 return (regnum == I387_MXCSR_REGNUM (tdep));
23a34459
AC
220}
221
5716833c 222/* FP register? */
23a34459
AC
223
224int
20a6ec49 225i386_fp_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 226{
20a6ec49
MD
227 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
228
229 if (I387_ST0_REGNUM (tdep) < 0)
5716833c
MK
230 return 0;
231
20a6ec49
MD
232 return (I387_ST0_REGNUM (tdep) <= regnum
233 && regnum < I387_FCTRL_REGNUM (tdep));
23a34459
AC
234}
235
236int
20a6ec49 237i386_fpc_regnum_p (struct gdbarch *gdbarch, int regnum)
23a34459 238{
20a6ec49
MD
239 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
240
241 if (I387_ST0_REGNUM (tdep) < 0)
5716833c
MK
242 return 0;
243
20a6ec49
MD
244 return (I387_FCTRL_REGNUM (tdep) <= regnum
245 && regnum < I387_XMM0_REGNUM (tdep));
23a34459
AC
246}
247
c131fcee
L
248/* Return the name of register REGNUM, or the empty string if it is
249 an anonymous register. */
250
251static const char *
252i386_register_name (struct gdbarch *gdbarch, int regnum)
253{
254 /* Hide the upper YMM registers. */
255 if (i386_ymmh_regnum_p (gdbarch, regnum))
256 return "";
257
258 return tdesc_register_name (gdbarch, regnum);
259}
260
30b0e2d8 261/* Return the name of register REGNUM. */
fc633446 262
1ba53b71 263const char *
90884b2b 264i386_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
fc633446 265{
1ba53b71
L
266 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
267 if (i386_mmx_regnum_p (gdbarch, regnum))
268 return i386_mmx_names[regnum - I387_MM0_REGNUM (tdep)];
c131fcee
L
269 else if (i386_ymm_regnum_p (gdbarch, regnum))
270 return i386_ymm_names[regnum - tdep->ymm0_regnum];
1ba53b71
L
271 else if (i386_byte_regnum_p (gdbarch, regnum))
272 return i386_byte_names[regnum - tdep->al_regnum];
273 else if (i386_word_regnum_p (gdbarch, regnum))
274 return i386_word_names[regnum - tdep->ax_regnum];
275
276 internal_error (__FILE__, __LINE__, _("invalid regnum"));
fc633446
MK
277}
278
c4fc7f1b 279/* Convert a dbx register number REG to the appropriate register
85540d8c
MK
280 number used by GDB. */
281
8201327c 282static int
d3f73121 283i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
85540d8c 284{
20a6ec49
MD
285 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
286
c4fc7f1b
MK
287 /* This implements what GCC calls the "default" register map
288 (dbx_register_map[]). */
289
85540d8c
MK
290 if (reg >= 0 && reg <= 7)
291 {
9872ad24
JB
292 /* General-purpose registers. The debug info calls %ebp
293 register 4, and %esp register 5. */
294 if (reg == 4)
295 return 5;
296 else if (reg == 5)
297 return 4;
298 else return reg;
85540d8c
MK
299 }
300 else if (reg >= 12 && reg <= 19)
301 {
302 /* Floating-point registers. */
20a6ec49 303 return reg - 12 + I387_ST0_REGNUM (tdep);
85540d8c
MK
304 }
305 else if (reg >= 21 && reg <= 28)
306 {
307 /* SSE registers. */
c131fcee
L
308 int ymm0_regnum = tdep->ymm0_regnum;
309
310 if (ymm0_regnum >= 0
311 && i386_xmm_regnum_p (gdbarch, reg))
312 return reg - 21 + ymm0_regnum;
313 else
314 return reg - 21 + I387_XMM0_REGNUM (tdep);
85540d8c
MK
315 }
316 else if (reg >= 29 && reg <= 36)
317 {
318 /* MMX registers. */
20a6ec49 319 return reg - 29 + I387_MM0_REGNUM (tdep);
85540d8c
MK
320 }
321
322 /* This will hopefully provoke a warning. */
d3f73121 323 return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
85540d8c
MK
324}
325
c4fc7f1b
MK
326/* Convert SVR4 register number REG to the appropriate register number
327 used by GDB. */
85540d8c 328
8201327c 329static int
d3f73121 330i386_svr4_reg_to_regnum (struct gdbarch *gdbarch, int reg)
85540d8c 331{
20a6ec49
MD
332 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
333
c4fc7f1b
MK
334 /* This implements the GCC register map that tries to be compatible
335 with the SVR4 C compiler for DWARF (svr4_dbx_register_map[]). */
336
337 /* The SVR4 register numbering includes %eip and %eflags, and
85540d8c
MK
338 numbers the floating point registers differently. */
339 if (reg >= 0 && reg <= 9)
340 {
acd5c798 341 /* General-purpose registers. */
85540d8c
MK
342 return reg;
343 }
344 else if (reg >= 11 && reg <= 18)
345 {
346 /* Floating-point registers. */
20a6ec49 347 return reg - 11 + I387_ST0_REGNUM (tdep);
85540d8c 348 }
c6f4c129 349 else if (reg >= 21 && reg <= 36)
85540d8c 350 {
c4fc7f1b 351 /* The SSE and MMX registers have the same numbers as with dbx. */
d3f73121 352 return i386_dbx_reg_to_regnum (gdbarch, reg);
85540d8c
MK
353 }
354
c6f4c129
JB
355 switch (reg)
356 {
20a6ec49
MD
357 case 37: return I387_FCTRL_REGNUM (tdep);
358 case 38: return I387_FSTAT_REGNUM (tdep);
359 case 39: return I387_MXCSR_REGNUM (tdep);
c6f4c129
JB
360 case 40: return I386_ES_REGNUM;
361 case 41: return I386_CS_REGNUM;
362 case 42: return I386_SS_REGNUM;
363 case 43: return I386_DS_REGNUM;
364 case 44: return I386_FS_REGNUM;
365 case 45: return I386_GS_REGNUM;
366 }
367
85540d8c 368 /* This will hopefully provoke a warning. */
d3f73121 369 return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
85540d8c 370}
5716833c 371
fc338970 372\f
917317f4 373
fc338970
MK
374/* This is the variable that is set with "set disassembly-flavor", and
375 its legitimate values. */
53904c9e
AC
376static const char att_flavor[] = "att";
377static const char intel_flavor[] = "intel";
378static const char *valid_flavors[] =
c5aa993b 379{
c906108c
SS
380 att_flavor,
381 intel_flavor,
382 NULL
383};
53904c9e 384static const char *disassembly_flavor = att_flavor;
acd5c798 385\f
c906108c 386
acd5c798
MK
387/* Use the program counter to determine the contents and size of a
388 breakpoint instruction. Return a pointer to a string of bytes that
389 encode a breakpoint instruction, store the length of the string in
390 *LEN and optionally adjust *PC to point to the correct memory
391 location for inserting the breakpoint.
c906108c 392
acd5c798
MK
393 On the i386 we have a single breakpoint that fits in a single byte
394 and can be inserted anywhere.
c906108c 395
acd5c798 396 This function is 64-bit safe. */
63c0089f
MK
397
398static const gdb_byte *
67d57894 399i386_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pc, int *len)
c906108c 400{
63c0089f
MK
401 static gdb_byte break_insn[] = { 0xcc }; /* int 3 */
402
acd5c798
MK
403 *len = sizeof (break_insn);
404 return break_insn;
c906108c 405}
237fc4c9
PA
406\f
407/* Displaced instruction handling. */
408
1903f0e6
DE
409/* Skip the legacy instruction prefixes in INSN.
410 Not all prefixes are valid for any particular insn
411 but we needn't care, the insn will fault if it's invalid.
412 The result is a pointer to the first opcode byte,
413 or NULL if we run off the end of the buffer. */
414
415static gdb_byte *
416i386_skip_prefixes (gdb_byte *insn, size_t max_len)
417{
418 gdb_byte *end = insn + max_len;
419
420 while (insn < end)
421 {
422 switch (*insn)
423 {
424 case DATA_PREFIX_OPCODE:
425 case ADDR_PREFIX_OPCODE:
426 case CS_PREFIX_OPCODE:
427 case DS_PREFIX_OPCODE:
428 case ES_PREFIX_OPCODE:
429 case FS_PREFIX_OPCODE:
430 case GS_PREFIX_OPCODE:
431 case SS_PREFIX_OPCODE:
432 case LOCK_PREFIX_OPCODE:
433 case REPE_PREFIX_OPCODE:
434 case REPNE_PREFIX_OPCODE:
435 ++insn;
436 continue;
437 default:
438 return insn;
439 }
440 }
441
442 return NULL;
443}
237fc4c9
PA
444
445static int
1903f0e6 446i386_absolute_jmp_p (const gdb_byte *insn)
237fc4c9
PA
447{
448 /* jmp far (absolute address in operand) */
449 if (insn[0] == 0xea)
450 return 1;
451
452 if (insn[0] == 0xff)
453 {
454 /* jump near, absolute indirect (/4) */
455 if ((insn[1] & 0x38) == 0x20)
456 return 1;
457
458 /* jump far, absolute indirect (/5) */
459 if ((insn[1] & 0x38) == 0x28)
460 return 1;
461 }
462
463 return 0;
464}
465
466static int
1903f0e6 467i386_absolute_call_p (const gdb_byte *insn)
237fc4c9
PA
468{
469 /* call far, absolute */
470 if (insn[0] == 0x9a)
471 return 1;
472
473 if (insn[0] == 0xff)
474 {
475 /* Call near, absolute indirect (/2) */
476 if ((insn[1] & 0x38) == 0x10)
477 return 1;
478
479 /* Call far, absolute indirect (/3) */
480 if ((insn[1] & 0x38) == 0x18)
481 return 1;
482 }
483
484 return 0;
485}
486
487static int
1903f0e6 488i386_ret_p (const gdb_byte *insn)
237fc4c9
PA
489{
490 switch (insn[0])
491 {
492 case 0xc2: /* ret near, pop N bytes */
493 case 0xc3: /* ret near */
494 case 0xca: /* ret far, pop N bytes */
495 case 0xcb: /* ret far */
496 case 0xcf: /* iret */
497 return 1;
498
499 default:
500 return 0;
501 }
502}
503
504static int
1903f0e6 505i386_call_p (const gdb_byte *insn)
237fc4c9
PA
506{
507 if (i386_absolute_call_p (insn))
508 return 1;
509
510 /* call near, relative */
511 if (insn[0] == 0xe8)
512 return 1;
513
514 return 0;
515}
516
237fc4c9
PA
517/* Return non-zero if INSN is a system call, and set *LENGTHP to its
518 length in bytes. Otherwise, return zero. */
1903f0e6 519
237fc4c9 520static int
1903f0e6 521i386_syscall_p (const gdb_byte *insn, ULONGEST *lengthp)
237fc4c9
PA
522{
523 if (insn[0] == 0xcd)
524 {
525 *lengthp = 2;
526 return 1;
527 }
528
529 return 0;
530}
531
532/* Fix up the state of registers and memory after having single-stepped
533 a displaced instruction. */
1903f0e6 534
237fc4c9
PA
535void
536i386_displaced_step_fixup (struct gdbarch *gdbarch,
537 struct displaced_step_closure *closure,
538 CORE_ADDR from, CORE_ADDR to,
539 struct regcache *regs)
540{
e17a4113
UW
541 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
542
237fc4c9
PA
543 /* The offset we applied to the instruction's address.
544 This could well be negative (when viewed as a signed 32-bit
545 value), but ULONGEST won't reflect that, so take care when
546 applying it. */
547 ULONGEST insn_offset = to - from;
548
549 /* Since we use simple_displaced_step_copy_insn, our closure is a
550 copy of the instruction. */
551 gdb_byte *insn = (gdb_byte *) closure;
1903f0e6
DE
552 /* The start of the insn, needed in case we see some prefixes. */
553 gdb_byte *insn_start = insn;
237fc4c9
PA
554
555 if (debug_displaced)
556 fprintf_unfiltered (gdb_stdlog,
5af949e3 557 "displaced: fixup (%s, %s), "
237fc4c9 558 "insn = 0x%02x 0x%02x ...\n",
5af949e3
UW
559 paddress (gdbarch, from), paddress (gdbarch, to),
560 insn[0], insn[1]);
237fc4c9
PA
561
562 /* The list of issues to contend with here is taken from
563 resume_execution in arch/i386/kernel/kprobes.c, Linux 2.6.20.
564 Yay for Free Software! */
565
566 /* Relocate the %eip, if necessary. */
567
1903f0e6
DE
568 /* The instruction recognizers we use assume any leading prefixes
569 have been skipped. */
570 {
571 /* This is the size of the buffer in closure. */
572 size_t max_insn_len = gdbarch_max_insn_length (gdbarch);
573 gdb_byte *opcode = i386_skip_prefixes (insn, max_insn_len);
574 /* If there are too many prefixes, just ignore the insn.
575 It will fault when run. */
576 if (opcode != NULL)
577 insn = opcode;
578 }
579
237fc4c9
PA
580 /* Except in the case of absolute or indirect jump or call
581 instructions, or a return instruction, the new eip is relative to
582 the displaced instruction; make it relative. Well, signal
583 handler returns don't need relocation either, but we use the
584 value of %eip to recognize those; see below. */
585 if (! i386_absolute_jmp_p (insn)
586 && ! i386_absolute_call_p (insn)
587 && ! i386_ret_p (insn))
588 {
589 ULONGEST orig_eip;
590 ULONGEST insn_len;
591
592 regcache_cooked_read_unsigned (regs, I386_EIP_REGNUM, &orig_eip);
593
594 /* A signal trampoline system call changes the %eip, resuming
595 execution of the main program after the signal handler has
596 returned. That makes them like 'return' instructions; we
597 shouldn't relocate %eip.
598
599 But most system calls don't, and we do need to relocate %eip.
600
601 Our heuristic for distinguishing these cases: if stepping
602 over the system call instruction left control directly after
603 the instruction, the we relocate --- control almost certainly
604 doesn't belong in the displaced copy. Otherwise, we assume
605 the instruction has put control where it belongs, and leave
606 it unrelocated. Goodness help us if there are PC-relative
607 system calls. */
608 if (i386_syscall_p (insn, &insn_len)
1903f0e6 609 && orig_eip != to + (insn - insn_start) + insn_len)
237fc4c9
PA
610 {
611 if (debug_displaced)
612 fprintf_unfiltered (gdb_stdlog,
613 "displaced: syscall changed %%eip; "
614 "not relocating\n");
615 }
616 else
617 {
618 ULONGEST eip = (orig_eip - insn_offset) & 0xffffffffUL;
619
1903f0e6
DE
620 /* If we just stepped over a breakpoint insn, we don't backup
621 the pc on purpose; this is to match behaviour without
622 stepping. */
237fc4c9
PA
623
624 regcache_cooked_write_unsigned (regs, I386_EIP_REGNUM, eip);
625
626 if (debug_displaced)
627 fprintf_unfiltered (gdb_stdlog,
628 "displaced: "
5af949e3
UW
629 "relocated %%eip from %s to %s\n",
630 paddress (gdbarch, orig_eip),
631 paddress (gdbarch, eip));
237fc4c9
PA
632 }
633 }
634
635 /* If the instruction was PUSHFL, then the TF bit will be set in the
636 pushed value, and should be cleared. We'll leave this for later,
637 since GDB already messes up the TF flag when stepping over a
638 pushfl. */
639
640 /* If the instruction was a call, the return address now atop the
641 stack is the address following the copied instruction. We need
642 to make it the address following the original instruction. */
643 if (i386_call_p (insn))
644 {
645 ULONGEST esp;
646 ULONGEST retaddr;
647 const ULONGEST retaddr_len = 4;
648
649 regcache_cooked_read_unsigned (regs, I386_ESP_REGNUM, &esp);
b75f0b83 650 retaddr = read_memory_unsigned_integer (esp, retaddr_len, byte_order);
237fc4c9 651 retaddr = (retaddr - insn_offset) & 0xffffffffUL;
e17a4113 652 write_memory_unsigned_integer (esp, retaddr_len, byte_order, retaddr);
237fc4c9
PA
653
654 if (debug_displaced)
655 fprintf_unfiltered (gdb_stdlog,
5af949e3
UW
656 "displaced: relocated return addr at %s to %s\n",
657 paddress (gdbarch, esp),
658 paddress (gdbarch, retaddr));
237fc4c9
PA
659 }
660}
fc338970 661\f
acd5c798
MK
662#ifdef I386_REGNO_TO_SYMMETRY
663#error "The Sequent Symmetry is no longer supported."
664#endif
c906108c 665
acd5c798
MK
666/* According to the System V ABI, the registers %ebp, %ebx, %edi, %esi
667 and %esp "belong" to the calling function. Therefore these
668 registers should be saved if they're going to be modified. */
c906108c 669
acd5c798
MK
670/* The maximum number of saved registers. This should include all
671 registers mentioned above, and %eip. */
a3386186 672#define I386_NUM_SAVED_REGS I386_NUM_GREGS
acd5c798
MK
673
674struct i386_frame_cache
c906108c 675{
acd5c798
MK
676 /* Base address. */
677 CORE_ADDR base;
772562f8 678 LONGEST sp_offset;
acd5c798
MK
679 CORE_ADDR pc;
680
fd13a04a
AC
681 /* Saved registers. */
682 CORE_ADDR saved_regs[I386_NUM_SAVED_REGS];
acd5c798 683 CORE_ADDR saved_sp;
e0c62198 684 int saved_sp_reg;
acd5c798
MK
685 int pc_in_eax;
686
687 /* Stack space reserved for local variables. */
688 long locals;
689};
690
691/* Allocate and initialize a frame cache. */
692
693static struct i386_frame_cache *
fd13a04a 694i386_alloc_frame_cache (void)
acd5c798
MK
695{
696 struct i386_frame_cache *cache;
697 int i;
698
699 cache = FRAME_OBSTACK_ZALLOC (struct i386_frame_cache);
700
701 /* Base address. */
702 cache->base = 0;
703 cache->sp_offset = -4;
704 cache->pc = 0;
705
fd13a04a
AC
706 /* Saved registers. We initialize these to -1 since zero is a valid
707 offset (that's where %ebp is supposed to be stored). */
708 for (i = 0; i < I386_NUM_SAVED_REGS; i++)
709 cache->saved_regs[i] = -1;
acd5c798 710 cache->saved_sp = 0;
e0c62198 711 cache->saved_sp_reg = -1;
acd5c798
MK
712 cache->pc_in_eax = 0;
713
714 /* Frameless until proven otherwise. */
715 cache->locals = -1;
716
717 return cache;
718}
c906108c 719
acd5c798
MK
720/* If the instruction at PC is a jump, return the address of its
721 target. Otherwise, return PC. */
c906108c 722
acd5c798 723static CORE_ADDR
e17a4113 724i386_follow_jump (struct gdbarch *gdbarch, CORE_ADDR pc)
acd5c798 725{
e17a4113 726 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 727 gdb_byte op;
acd5c798
MK
728 long delta = 0;
729 int data16 = 0;
c906108c 730
8defab1a 731 target_read_memory (pc, &op, 1);
acd5c798 732 if (op == 0x66)
c906108c 733 {
c906108c 734 data16 = 1;
e17a4113 735 op = read_memory_unsigned_integer (pc + 1, 1, byte_order);
c906108c
SS
736 }
737
acd5c798 738 switch (op)
c906108c
SS
739 {
740 case 0xe9:
fc338970 741 /* Relative jump: if data16 == 0, disp32, else disp16. */
c906108c
SS
742 if (data16)
743 {
e17a4113 744 delta = read_memory_integer (pc + 2, 2, byte_order);
c906108c 745
fc338970
MK
746 /* Include the size of the jmp instruction (including the
747 0x66 prefix). */
acd5c798 748 delta += 4;
c906108c
SS
749 }
750 else
751 {
e17a4113 752 delta = read_memory_integer (pc + 1, 4, byte_order);
c906108c 753
acd5c798
MK
754 /* Include the size of the jmp instruction. */
755 delta += 5;
c906108c
SS
756 }
757 break;
758 case 0xeb:
fc338970 759 /* Relative jump, disp8 (ignore data16). */
e17a4113 760 delta = read_memory_integer (pc + data16 + 1, 1, byte_order);
c906108c 761
acd5c798 762 delta += data16 + 2;
c906108c
SS
763 break;
764 }
c906108c 765
acd5c798
MK
766 return pc + delta;
767}
fc338970 768
acd5c798
MK
769/* Check whether PC points at a prologue for a function returning a
770 structure or union. If so, it updates CACHE and returns the
771 address of the first instruction after the code sequence that
772 removes the "hidden" argument from the stack or CURRENT_PC,
773 whichever is smaller. Otherwise, return PC. */
c906108c 774
acd5c798
MK
775static CORE_ADDR
776i386_analyze_struct_return (CORE_ADDR pc, CORE_ADDR current_pc,
777 struct i386_frame_cache *cache)
c906108c 778{
acd5c798
MK
779 /* Functions that return a structure or union start with:
780
781 popl %eax 0x58
782 xchgl %eax, (%esp) 0x87 0x04 0x24
783 or xchgl %eax, 0(%esp) 0x87 0x44 0x24 0x00
784
785 (the System V compiler puts out the second `xchg' instruction,
786 and the assembler doesn't try to optimize it, so the 'sib' form
787 gets generated). This sequence is used to get the address of the
788 return buffer for a function that returns a structure. */
63c0089f
MK
789 static gdb_byte proto1[3] = { 0x87, 0x04, 0x24 };
790 static gdb_byte proto2[4] = { 0x87, 0x44, 0x24, 0x00 };
791 gdb_byte buf[4];
792 gdb_byte op;
c906108c 793
acd5c798
MK
794 if (current_pc <= pc)
795 return pc;
796
8defab1a 797 target_read_memory (pc, &op, 1);
c906108c 798
acd5c798
MK
799 if (op != 0x58) /* popl %eax */
800 return pc;
c906108c 801
8defab1a 802 target_read_memory (pc + 1, buf, 4);
acd5c798
MK
803 if (memcmp (buf, proto1, 3) != 0 && memcmp (buf, proto2, 4) != 0)
804 return pc;
c906108c 805
acd5c798 806 if (current_pc == pc)
c906108c 807 {
acd5c798
MK
808 cache->sp_offset += 4;
809 return current_pc;
c906108c
SS
810 }
811
acd5c798 812 if (current_pc == pc + 1)
c906108c 813 {
acd5c798
MK
814 cache->pc_in_eax = 1;
815 return current_pc;
816 }
817
818 if (buf[1] == proto1[1])
819 return pc + 4;
820 else
821 return pc + 5;
822}
823
824static CORE_ADDR
825i386_skip_probe (CORE_ADDR pc)
826{
827 /* A function may start with
fc338970 828
acd5c798
MK
829 pushl constant
830 call _probe
831 addl $4, %esp
fc338970 832
acd5c798
MK
833 followed by
834
835 pushl %ebp
fc338970 836
acd5c798 837 etc. */
63c0089f
MK
838 gdb_byte buf[8];
839 gdb_byte op;
fc338970 840
8defab1a 841 target_read_memory (pc, &op, 1);
acd5c798
MK
842
843 if (op == 0x68 || op == 0x6a)
844 {
845 int delta;
c906108c 846
acd5c798
MK
847 /* Skip past the `pushl' instruction; it has either a one-byte or a
848 four-byte operand, depending on the opcode. */
c906108c 849 if (op == 0x68)
acd5c798 850 delta = 5;
c906108c 851 else
acd5c798 852 delta = 2;
c906108c 853
acd5c798
MK
854 /* Read the following 8 bytes, which should be `call _probe' (6
855 bytes) followed by `addl $4,%esp' (2 bytes). */
856 read_memory (pc + delta, buf, sizeof (buf));
c906108c 857 if (buf[0] == 0xe8 && buf[6] == 0xc4 && buf[7] == 0x4)
acd5c798 858 pc += delta + sizeof (buf);
c906108c
SS
859 }
860
acd5c798
MK
861 return pc;
862}
863
92dd43fa
MK
864/* GCC 4.1 and later, can put code in the prologue to realign the
865 stack pointer. Check whether PC points to such code, and update
866 CACHE accordingly. Return the first instruction after the code
867 sequence or CURRENT_PC, whichever is smaller. If we don't
868 recognize the code, return PC. */
869
870static CORE_ADDR
871i386_analyze_stack_align (CORE_ADDR pc, CORE_ADDR current_pc,
872 struct i386_frame_cache *cache)
873{
e0c62198
L
874 /* There are 2 code sequences to re-align stack before the frame
875 gets set up:
876
877 1. Use a caller-saved saved register:
878
879 leal 4(%esp), %reg
880 andl $-XXX, %esp
881 pushl -4(%reg)
882
883 2. Use a callee-saved saved register:
884
885 pushl %reg
886 leal 8(%esp), %reg
887 andl $-XXX, %esp
888 pushl -4(%reg)
889
890 "andl $-XXX, %esp" can be either 3 bytes or 6 bytes:
891
892 0x83 0xe4 0xf0 andl $-16, %esp
893 0x81 0xe4 0x00 0xff 0xff 0xff andl $-256, %esp
894 */
895
896 gdb_byte buf[14];
897 int reg;
898 int offset, offset_and;
899 static int regnums[8] = {
900 I386_EAX_REGNUM, /* %eax */
901 I386_ECX_REGNUM, /* %ecx */
902 I386_EDX_REGNUM, /* %edx */
903 I386_EBX_REGNUM, /* %ebx */
904 I386_ESP_REGNUM, /* %esp */
905 I386_EBP_REGNUM, /* %ebp */
906 I386_ESI_REGNUM, /* %esi */
907 I386_EDI_REGNUM /* %edi */
92dd43fa 908 };
92dd43fa 909
e0c62198
L
910 if (target_read_memory (pc, buf, sizeof buf))
911 return pc;
912
913 /* Check caller-saved saved register. The first instruction has
914 to be "leal 4(%esp), %reg". */
915 if (buf[0] == 0x8d && buf[2] == 0x24 && buf[3] == 0x4)
916 {
917 /* MOD must be binary 10 and R/M must be binary 100. */
918 if ((buf[1] & 0xc7) != 0x44)
919 return pc;
920
921 /* REG has register number. */
922 reg = (buf[1] >> 3) & 7;
923 offset = 4;
924 }
925 else
926 {
927 /* Check callee-saved saved register. The first instruction
928 has to be "pushl %reg". */
929 if ((buf[0] & 0xf8) != 0x50)
930 return pc;
931
932 /* Get register. */
933 reg = buf[0] & 0x7;
934
935 /* The next instruction has to be "leal 8(%esp), %reg". */
936 if (buf[1] != 0x8d || buf[3] != 0x24 || buf[4] != 0x8)
937 return pc;
938
939 /* MOD must be binary 10 and R/M must be binary 100. */
940 if ((buf[2] & 0xc7) != 0x44)
941 return pc;
942
943 /* REG has register number. Registers in pushl and leal have to
944 be the same. */
945 if (reg != ((buf[2] >> 3) & 7))
946 return pc;
947
948 offset = 5;
949 }
950
951 /* Rigister can't be %esp nor %ebp. */
952 if (reg == 4 || reg == 5)
953 return pc;
954
955 /* The next instruction has to be "andl $-XXX, %esp". */
956 if (buf[offset + 1] != 0xe4
957 || (buf[offset] != 0x81 && buf[offset] != 0x83))
958 return pc;
959
960 offset_and = offset;
961 offset += buf[offset] == 0x81 ? 6 : 3;
962
963 /* The next instruction has to be "pushl -4(%reg)". 8bit -4 is
964 0xfc. REG must be binary 110 and MOD must be binary 01. */
965 if (buf[offset] != 0xff
966 || buf[offset + 2] != 0xfc
967 || (buf[offset + 1] & 0xf8) != 0x70)
968 return pc;
969
970 /* R/M has register. Registers in leal and pushl have to be the
971 same. */
972 if (reg != (buf[offset + 1] & 7))
92dd43fa
MK
973 return pc;
974
e0c62198
L
975 if (current_pc > pc + offset_and)
976 cache->saved_sp_reg = regnums[reg];
92dd43fa 977
e0c62198 978 return min (pc + offset + 3, current_pc);
92dd43fa
MK
979}
980
37bdc87e 981/* Maximum instruction length we need to handle. */
237fc4c9 982#define I386_MAX_MATCHED_INSN_LEN 6
37bdc87e
MK
983
984/* Instruction description. */
985struct i386_insn
986{
987 size_t len;
237fc4c9
PA
988 gdb_byte insn[I386_MAX_MATCHED_INSN_LEN];
989 gdb_byte mask[I386_MAX_MATCHED_INSN_LEN];
37bdc87e
MK
990};
991
992/* Search for the instruction at PC in the list SKIP_INSNS. Return
993 the first instruction description that matches. Otherwise, return
994 NULL. */
995
996static struct i386_insn *
997i386_match_insn (CORE_ADDR pc, struct i386_insn *skip_insns)
998{
999 struct i386_insn *insn;
63c0089f 1000 gdb_byte op;
37bdc87e 1001
8defab1a 1002 target_read_memory (pc, &op, 1);
37bdc87e
MK
1003
1004 for (insn = skip_insns; insn->len > 0; insn++)
1005 {
1006 if ((op & insn->mask[0]) == insn->insn[0])
1007 {
237fc4c9 1008 gdb_byte buf[I386_MAX_MATCHED_INSN_LEN - 1];
613e8135 1009 int insn_matched = 1;
37bdc87e
MK
1010 size_t i;
1011
1012 gdb_assert (insn->len > 1);
237fc4c9 1013 gdb_assert (insn->len <= I386_MAX_MATCHED_INSN_LEN);
37bdc87e 1014
8defab1a 1015 target_read_memory (pc + 1, buf, insn->len - 1);
37bdc87e
MK
1016 for (i = 1; i < insn->len; i++)
1017 {
1018 if ((buf[i - 1] & insn->mask[i]) != insn->insn[i])
613e8135 1019 insn_matched = 0;
37bdc87e 1020 }
613e8135
MK
1021
1022 if (insn_matched)
1023 return insn;
37bdc87e
MK
1024 }
1025 }
1026
1027 return NULL;
1028}
1029
1030/* Some special instructions that might be migrated by GCC into the
1031 part of the prologue that sets up the new stack frame. Because the
1032 stack frame hasn't been setup yet, no registers have been saved
1033 yet, and only the scratch registers %eax, %ecx and %edx can be
1034 touched. */
1035
1036struct i386_insn i386_frame_setup_skip_insns[] =
1037{
1038 /* Check for `movb imm8, r' and `movl imm32, r'.
1039
1040 ??? Should we handle 16-bit operand-sizes here? */
1041
1042 /* `movb imm8, %al' and `movb imm8, %ah' */
1043 /* `movb imm8, %cl' and `movb imm8, %ch' */
1044 { 2, { 0xb0, 0x00 }, { 0xfa, 0x00 } },
1045 /* `movb imm8, %dl' and `movb imm8, %dh' */
1046 { 2, { 0xb2, 0x00 }, { 0xfb, 0x00 } },
1047 /* `movl imm32, %eax' and `movl imm32, %ecx' */
1048 { 5, { 0xb8 }, { 0xfe } },
1049 /* `movl imm32, %edx' */
1050 { 5, { 0xba }, { 0xff } },
1051
1052 /* Check for `mov imm32, r32'. Note that there is an alternative
1053 encoding for `mov m32, %eax'.
1054
1055 ??? Should we handle SIB adressing here?
1056 ??? Should we handle 16-bit operand-sizes here? */
1057
1058 /* `movl m32, %eax' */
1059 { 5, { 0xa1 }, { 0xff } },
1060 /* `movl m32, %eax' and `mov; m32, %ecx' */
1061 { 6, { 0x89, 0x05 }, {0xff, 0xf7 } },
1062 /* `movl m32, %edx' */
1063 { 6, { 0x89, 0x15 }, {0xff, 0xff } },
1064
1065 /* Check for `xorl r32, r32' and the equivalent `subl r32, r32'.
1066 Because of the symmetry, there are actually two ways to encode
1067 these instructions; opcode bytes 0x29 and 0x2b for `subl' and
1068 opcode bytes 0x31 and 0x33 for `xorl'. */
1069
1070 /* `subl %eax, %eax' */
1071 { 2, { 0x29, 0xc0 }, { 0xfd, 0xff } },
1072 /* `subl %ecx, %ecx' */
1073 { 2, { 0x29, 0xc9 }, { 0xfd, 0xff } },
1074 /* `subl %edx, %edx' */
1075 { 2, { 0x29, 0xd2 }, { 0xfd, 0xff } },
1076 /* `xorl %eax, %eax' */
1077 { 2, { 0x31, 0xc0 }, { 0xfd, 0xff } },
1078 /* `xorl %ecx, %ecx' */
1079 { 2, { 0x31, 0xc9 }, { 0xfd, 0xff } },
1080 /* `xorl %edx, %edx' */
1081 { 2, { 0x31, 0xd2 }, { 0xfd, 0xff } },
1082 { 0 }
1083};
1084
e11481da
PM
1085
1086/* Check whether PC points to a no-op instruction. */
1087static CORE_ADDR
1088i386_skip_noop (CORE_ADDR pc)
1089{
1090 gdb_byte op;
1091 int check = 1;
1092
8defab1a 1093 target_read_memory (pc, &op, 1);
e11481da
PM
1094
1095 while (check)
1096 {
1097 check = 0;
1098 /* Ignore `nop' instruction. */
1099 if (op == 0x90)
1100 {
1101 pc += 1;
8defab1a 1102 target_read_memory (pc, &op, 1);
e11481da
PM
1103 check = 1;
1104 }
1105 /* Ignore no-op instruction `mov %edi, %edi'.
1106 Microsoft system dlls often start with
1107 a `mov %edi,%edi' instruction.
1108 The 5 bytes before the function start are
1109 filled with `nop' instructions.
1110 This pattern can be used for hot-patching:
1111 The `mov %edi, %edi' instruction can be replaced by a
1112 near jump to the location of the 5 `nop' instructions
1113 which can be replaced by a 32-bit jump to anywhere
1114 in the 32-bit address space. */
1115
1116 else if (op == 0x8b)
1117 {
8defab1a 1118 target_read_memory (pc + 1, &op, 1);
e11481da
PM
1119 if (op == 0xff)
1120 {
1121 pc += 2;
8defab1a 1122 target_read_memory (pc, &op, 1);
e11481da
PM
1123 check = 1;
1124 }
1125 }
1126 }
1127 return pc;
1128}
1129
acd5c798
MK
1130/* Check whether PC points at a code that sets up a new stack frame.
1131 If so, it updates CACHE and returns the address of the first
37bdc87e
MK
1132 instruction after the sequence that sets up the frame or LIMIT,
1133 whichever is smaller. If we don't recognize the code, return PC. */
acd5c798
MK
1134
1135static CORE_ADDR
e17a4113
UW
1136i386_analyze_frame_setup (struct gdbarch *gdbarch,
1137 CORE_ADDR pc, CORE_ADDR limit,
acd5c798
MK
1138 struct i386_frame_cache *cache)
1139{
e17a4113 1140 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
37bdc87e 1141 struct i386_insn *insn;
63c0089f 1142 gdb_byte op;
26604a34 1143 int skip = 0;
acd5c798 1144
37bdc87e
MK
1145 if (limit <= pc)
1146 return limit;
acd5c798 1147
8defab1a 1148 target_read_memory (pc, &op, 1);
acd5c798 1149
c906108c 1150 if (op == 0x55) /* pushl %ebp */
c5aa993b 1151 {
acd5c798
MK
1152 /* Take into account that we've executed the `pushl %ebp' that
1153 starts this instruction sequence. */
fd13a04a 1154 cache->saved_regs[I386_EBP_REGNUM] = 0;
acd5c798 1155 cache->sp_offset += 4;
37bdc87e 1156 pc++;
acd5c798
MK
1157
1158 /* If that's all, return now. */
37bdc87e
MK
1159 if (limit <= pc)
1160 return limit;
26604a34 1161
b4632131 1162 /* Check for some special instructions that might be migrated by
37bdc87e
MK
1163 GCC into the prologue and skip them. At this point in the
1164 prologue, code should only touch the scratch registers %eax,
1165 %ecx and %edx, so while the number of posibilities is sheer,
1166 it is limited.
5daa5b4e 1167
26604a34
MK
1168 Make sure we only skip these instructions if we later see the
1169 `movl %esp, %ebp' that actually sets up the frame. */
37bdc87e 1170 while (pc + skip < limit)
26604a34 1171 {
37bdc87e
MK
1172 insn = i386_match_insn (pc + skip, i386_frame_setup_skip_insns);
1173 if (insn == NULL)
1174 break;
b4632131 1175
37bdc87e 1176 skip += insn->len;
26604a34
MK
1177 }
1178
37bdc87e
MK
1179 /* If that's all, return now. */
1180 if (limit <= pc + skip)
1181 return limit;
1182
8defab1a 1183 target_read_memory (pc + skip, &op, 1);
37bdc87e 1184
26604a34 1185 /* Check for `movl %esp, %ebp' -- can be written in two ways. */
acd5c798 1186 switch (op)
c906108c
SS
1187 {
1188 case 0x8b:
e17a4113
UW
1189 if (read_memory_unsigned_integer (pc + skip + 1, 1, byte_order)
1190 != 0xec)
37bdc87e 1191 return pc;
c906108c
SS
1192 break;
1193 case 0x89:
e17a4113
UW
1194 if (read_memory_unsigned_integer (pc + skip + 1, 1, byte_order)
1195 != 0xe5)
37bdc87e 1196 return pc;
c906108c
SS
1197 break;
1198 default:
37bdc87e 1199 return pc;
c906108c 1200 }
acd5c798 1201
26604a34
MK
1202 /* OK, we actually have a frame. We just don't know how large
1203 it is yet. Set its size to zero. We'll adjust it if
1204 necessary. We also now commit to skipping the special
1205 instructions mentioned before. */
acd5c798 1206 cache->locals = 0;
37bdc87e 1207 pc += (skip + 2);
acd5c798
MK
1208
1209 /* If that's all, return now. */
37bdc87e
MK
1210 if (limit <= pc)
1211 return limit;
acd5c798 1212
fc338970
MK
1213 /* Check for stack adjustment
1214
acd5c798 1215 subl $XXX, %esp
fc338970 1216
fd35795f 1217 NOTE: You can't subtract a 16-bit immediate from a 32-bit
fc338970 1218 reg, so we don't have to worry about a data16 prefix. */
8defab1a 1219 target_read_memory (pc, &op, 1);
c906108c
SS
1220 if (op == 0x83)
1221 {
fd35795f 1222 /* `subl' with 8-bit immediate. */
e17a4113 1223 if (read_memory_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
fc338970 1224 /* Some instruction starting with 0x83 other than `subl'. */
37bdc87e 1225 return pc;
acd5c798 1226
37bdc87e
MK
1227 /* `subl' with signed 8-bit immediate (though it wouldn't
1228 make sense to be negative). */
e17a4113 1229 cache->locals = read_memory_integer (pc + 2, 1, byte_order);
37bdc87e 1230 return pc + 3;
c906108c
SS
1231 }
1232 else if (op == 0x81)
1233 {
fd35795f 1234 /* Maybe it is `subl' with a 32-bit immediate. */
e17a4113 1235 if (read_memory_unsigned_integer (pc + 1, 1, byte_order) != 0xec)
fc338970 1236 /* Some instruction starting with 0x81 other than `subl'. */
37bdc87e 1237 return pc;
acd5c798 1238
fd35795f 1239 /* It is `subl' with a 32-bit immediate. */
e17a4113 1240 cache->locals = read_memory_integer (pc + 2, 4, byte_order);
37bdc87e 1241 return pc + 6;
c906108c
SS
1242 }
1243 else
1244 {
acd5c798 1245 /* Some instruction other than `subl'. */
37bdc87e 1246 return pc;
c906108c
SS
1247 }
1248 }
37bdc87e 1249 else if (op == 0xc8) /* enter */
c906108c 1250 {
e17a4113 1251 cache->locals = read_memory_unsigned_integer (pc + 1, 2, byte_order);
acd5c798 1252 return pc + 4;
c906108c 1253 }
21d0e8a4 1254
acd5c798 1255 return pc;
21d0e8a4
MK
1256}
1257
acd5c798
MK
1258/* Check whether PC points at code that saves registers on the stack.
1259 If so, it updates CACHE and returns the address of the first
1260 instruction after the register saves or CURRENT_PC, whichever is
1261 smaller. Otherwise, return PC. */
6bff26de
MK
1262
1263static CORE_ADDR
acd5c798
MK
1264i386_analyze_register_saves (CORE_ADDR pc, CORE_ADDR current_pc,
1265 struct i386_frame_cache *cache)
6bff26de 1266{
99ab4326 1267 CORE_ADDR offset = 0;
63c0089f 1268 gdb_byte op;
99ab4326 1269 int i;
c0d1d883 1270
99ab4326
MK
1271 if (cache->locals > 0)
1272 offset -= cache->locals;
1273 for (i = 0; i < 8 && pc < current_pc; i++)
1274 {
8defab1a 1275 target_read_memory (pc, &op, 1);
99ab4326
MK
1276 if (op < 0x50 || op > 0x57)
1277 break;
0d17c81d 1278
99ab4326
MK
1279 offset -= 4;
1280 cache->saved_regs[op - 0x50] = offset;
1281 cache->sp_offset += 4;
1282 pc++;
6bff26de
MK
1283 }
1284
acd5c798 1285 return pc;
22797942
AC
1286}
1287
acd5c798
MK
1288/* Do a full analysis of the prologue at PC and update CACHE
1289 accordingly. Bail out early if CURRENT_PC is reached. Return the
1290 address where the analysis stopped.
ed84f6c1 1291
fc338970
MK
1292 We handle these cases:
1293
1294 The startup sequence can be at the start of the function, or the
1295 function can start with a branch to startup code at the end.
1296
1297 %ebp can be set up with either the 'enter' instruction, or "pushl
1298 %ebp, movl %esp, %ebp" (`enter' is too slow to be useful, but was
1299 once used in the System V compiler).
1300
1301 Local space is allocated just below the saved %ebp by either the
fd35795f
MK
1302 'enter' instruction, or by "subl $<size>, %esp". 'enter' has a
1303 16-bit unsigned argument for space to allocate, and the 'addl'
1304 instruction could have either a signed byte, or 32-bit immediate.
fc338970
MK
1305
1306 Next, the registers used by this function are pushed. With the
1307 System V compiler they will always be in the order: %edi, %esi,
1308 %ebx (and sometimes a harmless bug causes it to also save but not
1309 restore %eax); however, the code below is willing to see the pushes
1310 in any order, and will handle up to 8 of them.
1311
1312 If the setup sequence is at the end of the function, then the next
1313 instruction will be a branch back to the start. */
c906108c 1314
acd5c798 1315static CORE_ADDR
e17a4113
UW
1316i386_analyze_prologue (struct gdbarch *gdbarch,
1317 CORE_ADDR pc, CORE_ADDR current_pc,
acd5c798 1318 struct i386_frame_cache *cache)
c906108c 1319{
e11481da 1320 pc = i386_skip_noop (pc);
e17a4113 1321 pc = i386_follow_jump (gdbarch, pc);
acd5c798
MK
1322 pc = i386_analyze_struct_return (pc, current_pc, cache);
1323 pc = i386_skip_probe (pc);
92dd43fa 1324 pc = i386_analyze_stack_align (pc, current_pc, cache);
e17a4113 1325 pc = i386_analyze_frame_setup (gdbarch, pc, current_pc, cache);
acd5c798 1326 return i386_analyze_register_saves (pc, current_pc, cache);
c906108c
SS
1327}
1328
fc338970 1329/* Return PC of first real instruction. */
c906108c 1330
3a1e71e3 1331static CORE_ADDR
6093d2eb 1332i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
c906108c 1333{
e17a4113
UW
1334 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1335
63c0089f 1336 static gdb_byte pic_pat[6] =
acd5c798
MK
1337 {
1338 0xe8, 0, 0, 0, 0, /* call 0x0 */
1339 0x5b, /* popl %ebx */
c5aa993b 1340 };
acd5c798
MK
1341 struct i386_frame_cache cache;
1342 CORE_ADDR pc;
63c0089f 1343 gdb_byte op;
acd5c798 1344 int i;
c5aa993b 1345
acd5c798 1346 cache.locals = -1;
e17a4113 1347 pc = i386_analyze_prologue (gdbarch, start_pc, 0xffffffff, &cache);
acd5c798
MK
1348 if (cache.locals < 0)
1349 return start_pc;
c5aa993b 1350
acd5c798 1351 /* Found valid frame setup. */
c906108c 1352
fc338970
MK
1353 /* The native cc on SVR4 in -K PIC mode inserts the following code
1354 to get the address of the global offset table (GOT) into register
acd5c798
MK
1355 %ebx:
1356
fc338970
MK
1357 call 0x0
1358 popl %ebx
1359 movl %ebx,x(%ebp) (optional)
1360 addl y,%ebx
1361
c906108c
SS
1362 This code is with the rest of the prologue (at the end of the
1363 function), so we have to skip it to get to the first real
1364 instruction at the start of the function. */
c5aa993b 1365
c906108c
SS
1366 for (i = 0; i < 6; i++)
1367 {
8defab1a 1368 target_read_memory (pc + i, &op, 1);
c5aa993b 1369 if (pic_pat[i] != op)
c906108c
SS
1370 break;
1371 }
1372 if (i == 6)
1373 {
acd5c798
MK
1374 int delta = 6;
1375
8defab1a 1376 target_read_memory (pc + delta, &op, 1);
c906108c 1377
c5aa993b 1378 if (op == 0x89) /* movl %ebx, x(%ebp) */
c906108c 1379 {
e17a4113 1380 op = read_memory_unsigned_integer (pc + delta + 1, 1, byte_order);
acd5c798 1381
fc338970 1382 if (op == 0x5d) /* One byte offset from %ebp. */
acd5c798 1383 delta += 3;
fc338970 1384 else if (op == 0x9d) /* Four byte offset from %ebp. */
acd5c798 1385 delta += 6;
fc338970 1386 else /* Unexpected instruction. */
acd5c798
MK
1387 delta = 0;
1388
8defab1a 1389 target_read_memory (pc + delta, &op, 1);
c906108c 1390 }
acd5c798 1391
c5aa993b 1392 /* addl y,%ebx */
acd5c798 1393 if (delta > 0 && op == 0x81
e17a4113
UW
1394 && read_memory_unsigned_integer (pc + delta + 1, 1, byte_order)
1395 == 0xc3)
c906108c 1396 {
acd5c798 1397 pc += delta + 6;
c906108c
SS
1398 }
1399 }
c5aa993b 1400
e63bbc88
MK
1401 /* If the function starts with a branch (to startup code at the end)
1402 the last instruction should bring us back to the first
1403 instruction of the real code. */
e17a4113
UW
1404 if (i386_follow_jump (gdbarch, start_pc) != start_pc)
1405 pc = i386_follow_jump (gdbarch, pc);
e63bbc88
MK
1406
1407 return pc;
c906108c
SS
1408}
1409
4309257c
PM
1410/* Check that the code pointed to by PC corresponds to a call to
1411 __main, skip it if so. Return PC otherwise. */
1412
1413CORE_ADDR
1414i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1415{
e17a4113 1416 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4309257c
PM
1417 gdb_byte op;
1418
1419 target_read_memory (pc, &op, 1);
1420 if (op == 0xe8)
1421 {
1422 gdb_byte buf[4];
1423
1424 if (target_read_memory (pc + 1, buf, sizeof buf) == 0)
1425 {
1426 /* Make sure address is computed correctly as a 32bit
1427 integer even if CORE_ADDR is 64 bit wide. */
1428 struct minimal_symbol *s;
e17a4113 1429 CORE_ADDR call_dest;
4309257c 1430
e17a4113 1431 call_dest = pc + 5 + extract_signed_integer (buf, 4, byte_order);
4309257c
PM
1432 call_dest = call_dest & 0xffffffffU;
1433 s = lookup_minimal_symbol_by_pc (call_dest);
1434 if (s != NULL
1435 && SYMBOL_LINKAGE_NAME (s) != NULL
1436 && strcmp (SYMBOL_LINKAGE_NAME (s), "__main") == 0)
1437 pc += 5;
1438 }
1439 }
1440
1441 return pc;
1442}
1443
acd5c798 1444/* This function is 64-bit safe. */
93924b6b 1445
acd5c798
MK
1446static CORE_ADDR
1447i386_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
93924b6b 1448{
63c0089f 1449 gdb_byte buf[8];
acd5c798 1450
875f8d0e 1451 frame_unwind_register (next_frame, gdbarch_pc_regnum (gdbarch), buf);
0dfff4cb 1452 return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
93924b6b 1453}
acd5c798 1454\f
93924b6b 1455
acd5c798 1456/* Normal frames. */
c5aa993b 1457
acd5c798 1458static struct i386_frame_cache *
10458914 1459i386_frame_cache (struct frame_info *this_frame, void **this_cache)
a7769679 1460{
e17a4113
UW
1461 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1462 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
acd5c798 1463 struct i386_frame_cache *cache;
63c0089f 1464 gdb_byte buf[4];
acd5c798
MK
1465 int i;
1466
1467 if (*this_cache)
1468 return *this_cache;
1469
fd13a04a 1470 cache = i386_alloc_frame_cache ();
acd5c798
MK
1471 *this_cache = cache;
1472
1473 /* In principle, for normal frames, %ebp holds the frame pointer,
1474 which holds the base address for the current stack frame.
1475 However, for functions that don't need it, the frame pointer is
1476 optional. For these "frameless" functions the frame pointer is
1477 actually the frame pointer of the calling frame. Signal
1478 trampolines are just a special case of a "frameless" function.
1479 They (usually) share their frame pointer with the frame that was
1480 in progress when the signal occurred. */
1481
10458914 1482 get_frame_register (this_frame, I386_EBP_REGNUM, buf);
e17a4113 1483 cache->base = extract_unsigned_integer (buf, 4, byte_order);
acd5c798
MK
1484 if (cache->base == 0)
1485 return cache;
1486
1487 /* For normal frames, %eip is stored at 4(%ebp). */
fd13a04a 1488 cache->saved_regs[I386_EIP_REGNUM] = 4;
acd5c798 1489
10458914 1490 cache->pc = get_frame_func (this_frame);
acd5c798 1491 if (cache->pc != 0)
e17a4113
UW
1492 i386_analyze_prologue (gdbarch, cache->pc, get_frame_pc (this_frame),
1493 cache);
acd5c798 1494
e0c62198 1495 if (cache->saved_sp_reg != -1)
92dd43fa 1496 {
e0c62198
L
1497 /* Saved stack pointer has been saved. */
1498 get_frame_register (this_frame, cache->saved_sp_reg, buf);
e17a4113 1499 cache->saved_sp = extract_unsigned_integer (buf, 4, byte_order);
92dd43fa
MK
1500 }
1501
acd5c798
MK
1502 if (cache->locals < 0)
1503 {
1504 /* We didn't find a valid frame, which means that CACHE->base
1505 currently holds the frame pointer for our calling frame. If
1506 we're at the start of a function, or somewhere half-way its
1507 prologue, the function's frame probably hasn't been fully
1508 setup yet. Try to reconstruct the base address for the stack
1509 frame by looking at the stack pointer. For truly "frameless"
1510 functions this might work too. */
1511
e0c62198 1512 if (cache->saved_sp_reg != -1)
92dd43fa
MK
1513 {
1514 /* We're halfway aligning the stack. */
1515 cache->base = ((cache->saved_sp - 4) & 0xfffffff0) - 4;
1516 cache->saved_regs[I386_EIP_REGNUM] = cache->saved_sp - 4;
1517
1518 /* This will be added back below. */
1519 cache->saved_regs[I386_EIP_REGNUM] -= cache->base;
1520 }
7618e12b
DJ
1521 else if (cache->pc != 0
1522 || target_read_memory (get_frame_pc (this_frame), buf, 1))
92dd43fa 1523 {
7618e12b
DJ
1524 /* We're in a known function, but did not find a frame
1525 setup. Assume that the function does not use %ebp.
1526 Alternatively, we may have jumped to an invalid
1527 address; in that case there is definitely no new
1528 frame in %ebp. */
10458914 1529 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
e17a4113
UW
1530 cache->base = extract_unsigned_integer (buf, 4, byte_order)
1531 + cache->sp_offset;
92dd43fa 1532 }
7618e12b
DJ
1533 else
1534 /* We're in an unknown function. We could not find the start
1535 of the function to analyze the prologue; our best option is
1536 to assume a typical frame layout with the caller's %ebp
1537 saved. */
1538 cache->saved_regs[I386_EBP_REGNUM] = 0;
acd5c798
MK
1539 }
1540
1541 /* Now that we have the base address for the stack frame we can
1542 calculate the value of %esp in the calling frame. */
92dd43fa
MK
1543 if (cache->saved_sp == 0)
1544 cache->saved_sp = cache->base + 8;
a7769679 1545
acd5c798
MK
1546 /* Adjust all the saved registers such that they contain addresses
1547 instead of offsets. */
1548 for (i = 0; i < I386_NUM_SAVED_REGS; i++)
fd13a04a
AC
1549 if (cache->saved_regs[i] != -1)
1550 cache->saved_regs[i] += cache->base;
acd5c798
MK
1551
1552 return cache;
a7769679
MK
1553}
1554
3a1e71e3 1555static void
10458914 1556i386_frame_this_id (struct frame_info *this_frame, void **this_cache,
acd5c798 1557 struct frame_id *this_id)
c906108c 1558{
10458914 1559 struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
acd5c798
MK
1560
1561 /* This marks the outermost frame. */
1562 if (cache->base == 0)
1563 return;
1564
3e210248 1565 /* See the end of i386_push_dummy_call. */
acd5c798
MK
1566 (*this_id) = frame_id_build (cache->base + 8, cache->pc);
1567}
1568
10458914
DJ
1569static struct value *
1570i386_frame_prev_register (struct frame_info *this_frame, void **this_cache,
1571 int regnum)
acd5c798 1572{
10458914 1573 struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
acd5c798
MK
1574
1575 gdb_assert (regnum >= 0);
1576
1577 /* The System V ABI says that:
1578
1579 "The flags register contains the system flags, such as the
1580 direction flag and the carry flag. The direction flag must be
1581 set to the forward (that is, zero) direction before entry and
1582 upon exit from a function. Other user flags have no specified
1583 role in the standard calling sequence and are not preserved."
1584
1585 To guarantee the "upon exit" part of that statement we fake a
1586 saved flags register that has its direction flag cleared.
1587
1588 Note that GCC doesn't seem to rely on the fact that the direction
1589 flag is cleared after a function return; it always explicitly
1590 clears the flag before operations where it matters.
1591
1592 FIXME: kettenis/20030316: I'm not quite sure whether this is the
1593 right thing to do. The way we fake the flags register here makes
1594 it impossible to change it. */
1595
1596 if (regnum == I386_EFLAGS_REGNUM)
1597 {
10458914 1598 ULONGEST val;
c5aa993b 1599
10458914
DJ
1600 val = get_frame_register_unsigned (this_frame, regnum);
1601 val &= ~(1 << 10);
1602 return frame_unwind_got_constant (this_frame, regnum, val);
acd5c798 1603 }
1211c4e4 1604
acd5c798 1605 if (regnum == I386_EIP_REGNUM && cache->pc_in_eax)
10458914 1606 return frame_unwind_got_register (this_frame, regnum, I386_EAX_REGNUM);
acd5c798
MK
1607
1608 if (regnum == I386_ESP_REGNUM && cache->saved_sp)
10458914 1609 return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
acd5c798 1610
fd13a04a 1611 if (regnum < I386_NUM_SAVED_REGS && cache->saved_regs[regnum] != -1)
10458914
DJ
1612 return frame_unwind_got_memory (this_frame, regnum,
1613 cache->saved_regs[regnum]);
fd13a04a 1614
10458914 1615 return frame_unwind_got_register (this_frame, regnum, regnum);
acd5c798
MK
1616}
1617
1618static const struct frame_unwind i386_frame_unwind =
1619{
1620 NORMAL_FRAME,
1621 i386_frame_this_id,
10458914
DJ
1622 i386_frame_prev_register,
1623 NULL,
1624 default_frame_sniffer
acd5c798 1625};
06da04c6
MS
1626
1627/* Normal frames, but in a function epilogue. */
1628
1629/* The epilogue is defined here as the 'ret' instruction, which will
1630 follow any instruction such as 'leave' or 'pop %ebp' that destroys
1631 the function's stack frame. */
1632
1633static int
1634i386_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
1635{
1636 gdb_byte insn;
1637
1638 if (target_read_memory (pc, &insn, 1))
1639 return 0; /* Can't read memory at pc. */
1640
1641 if (insn != 0xc3) /* 'ret' instruction. */
1642 return 0;
1643
1644 return 1;
1645}
1646
1647static int
1648i386_epilogue_frame_sniffer (const struct frame_unwind *self,
1649 struct frame_info *this_frame,
1650 void **this_prologue_cache)
1651{
1652 if (frame_relative_level (this_frame) == 0)
1653 return i386_in_function_epilogue_p (get_frame_arch (this_frame),
1654 get_frame_pc (this_frame));
1655 else
1656 return 0;
1657}
1658
1659static struct i386_frame_cache *
1660i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
1661{
1662 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1663 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1664 struct i386_frame_cache *cache;
1665 gdb_byte buf[4];
1666
1667 if (*this_cache)
1668 return *this_cache;
1669
1670 cache = i386_alloc_frame_cache ();
1671 *this_cache = cache;
1672
1673 /* Cache base will be %esp plus cache->sp_offset (-4). */
1674 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
1675 cache->base = extract_unsigned_integer (buf, 4,
1676 byte_order) + cache->sp_offset;
1677
1678 /* Cache pc will be the frame func. */
1679 cache->pc = get_frame_pc (this_frame);
1680
1681 /* The saved %esp will be at cache->base plus 8. */
1682 cache->saved_sp = cache->base + 8;
1683
1684 /* The saved %eip will be at cache->base plus 4. */
1685 cache->saved_regs[I386_EIP_REGNUM] = cache->base + 4;
1686
1687 return cache;
1688}
1689
1690static void
1691i386_epilogue_frame_this_id (struct frame_info *this_frame,
1692 void **this_cache,
1693 struct frame_id *this_id)
1694{
1695 struct i386_frame_cache *cache = i386_epilogue_frame_cache (this_frame,
1696 this_cache);
1697
1698 (*this_id) = frame_id_build (cache->base + 8, cache->pc);
1699}
1700
1701static const struct frame_unwind i386_epilogue_frame_unwind =
1702{
1703 NORMAL_FRAME,
1704 i386_epilogue_frame_this_id,
1705 i386_frame_prev_register,
1706 NULL,
1707 i386_epilogue_frame_sniffer
1708};
acd5c798
MK
1709\f
1710
1711/* Signal trampolines. */
1712
1713static struct i386_frame_cache *
10458914 1714i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
acd5c798 1715{
e17a4113
UW
1716 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1717 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1718 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
acd5c798 1719 struct i386_frame_cache *cache;
acd5c798 1720 CORE_ADDR addr;
63c0089f 1721 gdb_byte buf[4];
acd5c798
MK
1722
1723 if (*this_cache)
1724 return *this_cache;
1725
fd13a04a 1726 cache = i386_alloc_frame_cache ();
acd5c798 1727
10458914 1728 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
e17a4113 1729 cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4;
acd5c798 1730
10458914 1731 addr = tdep->sigcontext_addr (this_frame);
a3386186
MK
1732 if (tdep->sc_reg_offset)
1733 {
1734 int i;
1735
1736 gdb_assert (tdep->sc_num_regs <= I386_NUM_SAVED_REGS);
1737
1738 for (i = 0; i < tdep->sc_num_regs; i++)
1739 if (tdep->sc_reg_offset[i] != -1)
fd13a04a 1740 cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
a3386186
MK
1741 }
1742 else
1743 {
fd13a04a
AC
1744 cache->saved_regs[I386_EIP_REGNUM] = addr + tdep->sc_pc_offset;
1745 cache->saved_regs[I386_ESP_REGNUM] = addr + tdep->sc_sp_offset;
a3386186 1746 }
acd5c798
MK
1747
1748 *this_cache = cache;
1749 return cache;
1750}
1751
1752static void
10458914 1753i386_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
acd5c798
MK
1754 struct frame_id *this_id)
1755{
1756 struct i386_frame_cache *cache =
10458914 1757 i386_sigtramp_frame_cache (this_frame, this_cache);
acd5c798 1758
3e210248 1759 /* See the end of i386_push_dummy_call. */
10458914 1760 (*this_id) = frame_id_build (cache->base + 8, get_frame_pc (this_frame));
acd5c798
MK
1761}
1762
10458914
DJ
1763static struct value *
1764i386_sigtramp_frame_prev_register (struct frame_info *this_frame,
1765 void **this_cache, int regnum)
acd5c798
MK
1766{
1767 /* Make sure we've initialized the cache. */
10458914 1768 i386_sigtramp_frame_cache (this_frame, this_cache);
acd5c798 1769
10458914 1770 return i386_frame_prev_register (this_frame, this_cache, regnum);
c906108c 1771}
c0d1d883 1772
10458914
DJ
1773static int
1774i386_sigtramp_frame_sniffer (const struct frame_unwind *self,
1775 struct frame_info *this_frame,
1776 void **this_prologue_cache)
acd5c798 1777{
10458914 1778 struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
acd5c798 1779
911bc6ee
MK
1780 /* We shouldn't even bother if we don't have a sigcontext_addr
1781 handler. */
1782 if (tdep->sigcontext_addr == NULL)
10458914 1783 return 0;
1c3545ae 1784
911bc6ee
MK
1785 if (tdep->sigtramp_p != NULL)
1786 {
10458914
DJ
1787 if (tdep->sigtramp_p (this_frame))
1788 return 1;
911bc6ee
MK
1789 }
1790
1791 if (tdep->sigtramp_start != 0)
1792 {
10458914 1793 CORE_ADDR pc = get_frame_pc (this_frame);
911bc6ee
MK
1794
1795 gdb_assert (tdep->sigtramp_end != 0);
1796 if (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end)
10458914 1797 return 1;
911bc6ee 1798 }
acd5c798 1799
10458914 1800 return 0;
acd5c798 1801}
10458914
DJ
1802
1803static const struct frame_unwind i386_sigtramp_frame_unwind =
1804{
1805 SIGTRAMP_FRAME,
1806 i386_sigtramp_frame_this_id,
1807 i386_sigtramp_frame_prev_register,
1808 NULL,
1809 i386_sigtramp_frame_sniffer
1810};
acd5c798
MK
1811\f
1812
1813static CORE_ADDR
10458914 1814i386_frame_base_address (struct frame_info *this_frame, void **this_cache)
acd5c798 1815{
10458914 1816 struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
acd5c798
MK
1817
1818 return cache->base;
1819}
1820
1821static const struct frame_base i386_frame_base =
1822{
1823 &i386_frame_unwind,
1824 i386_frame_base_address,
1825 i386_frame_base_address,
1826 i386_frame_base_address
1827};
1828
acd5c798 1829static struct frame_id
10458914 1830i386_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
acd5c798 1831{
acd5c798
MK
1832 CORE_ADDR fp;
1833
10458914 1834 fp = get_frame_register_unsigned (this_frame, I386_EBP_REGNUM);
acd5c798 1835
3e210248 1836 /* See the end of i386_push_dummy_call. */
10458914 1837 return frame_id_build (fp + 8, get_frame_pc (this_frame));
c0d1d883 1838}
fc338970 1839\f
c906108c 1840
fc338970
MK
1841/* Figure out where the longjmp will land. Slurp the args out of the
1842 stack. We expect the first arg to be a pointer to the jmp_buf
8201327c 1843 structure from which we extract the address that we will land at.
28bcfd30 1844 This address is copied into PC. This routine returns non-zero on
436675d3 1845 success. */
c906108c 1846
8201327c 1847static int
60ade65d 1848i386_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
c906108c 1849{
436675d3 1850 gdb_byte buf[4];
c906108c 1851 CORE_ADDR sp, jb_addr;
20a6ec49 1852 struct gdbarch *gdbarch = get_frame_arch (frame);
e17a4113 1853 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
20a6ec49 1854 int jb_pc_offset = gdbarch_tdep (gdbarch)->jb_pc_offset;
c906108c 1855
8201327c
MK
1856 /* If JB_PC_OFFSET is -1, we have no way to find out where the
1857 longjmp will land. */
1858 if (jb_pc_offset == -1)
c906108c
SS
1859 return 0;
1860
436675d3 1861 get_frame_register (frame, I386_ESP_REGNUM, buf);
e17a4113 1862 sp = extract_unsigned_integer (buf, 4, byte_order);
436675d3 1863 if (target_read_memory (sp + 4, buf, 4))
c906108c
SS
1864 return 0;
1865
e17a4113 1866 jb_addr = extract_unsigned_integer (buf, 4, byte_order);
436675d3 1867 if (target_read_memory (jb_addr + jb_pc_offset, buf, 4))
8201327c 1868 return 0;
c906108c 1869
e17a4113 1870 *pc = extract_unsigned_integer (buf, 4, byte_order);
c906108c
SS
1871 return 1;
1872}
fc338970 1873\f
c906108c 1874
7ccc1c74
JM
1875/* Check whether TYPE must be 16-byte-aligned when passed as a
1876 function argument. 16-byte vectors, _Decimal128 and structures or
1877 unions containing such types must be 16-byte-aligned; other
1878 arguments are 4-byte-aligned. */
1879
1880static int
1881i386_16_byte_align_p (struct type *type)
1882{
1883 type = check_typedef (type);
1884 if ((TYPE_CODE (type) == TYPE_CODE_DECFLOAT
1885 || (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type)))
1886 && TYPE_LENGTH (type) == 16)
1887 return 1;
1888 if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
1889 return i386_16_byte_align_p (TYPE_TARGET_TYPE (type));
1890 if (TYPE_CODE (type) == TYPE_CODE_STRUCT
1891 || TYPE_CODE (type) == TYPE_CODE_UNION)
1892 {
1893 int i;
1894 for (i = 0; i < TYPE_NFIELDS (type); i++)
1895 {
1896 if (i386_16_byte_align_p (TYPE_FIELD_TYPE (type, i)))
1897 return 1;
1898 }
1899 }
1900 return 0;
1901}
1902
3a1e71e3 1903static CORE_ADDR
7d9b040b 1904i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a
AC
1905 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
1906 struct value **args, CORE_ADDR sp, int struct_return,
1907 CORE_ADDR struct_addr)
22f8ba57 1908{
e17a4113 1909 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 1910 gdb_byte buf[4];
acd5c798 1911 int i;
7ccc1c74
JM
1912 int write_pass;
1913 int args_space = 0;
acd5c798 1914
7ccc1c74
JM
1915 /* Determine the total space required for arguments and struct
1916 return address in a first pass (allowing for 16-byte-aligned
1917 arguments), then push arguments in a second pass. */
1918
1919 for (write_pass = 0; write_pass < 2; write_pass++)
22f8ba57 1920 {
7ccc1c74
JM
1921 int args_space_used = 0;
1922 int have_16_byte_aligned_arg = 0;
1923
1924 if (struct_return)
1925 {
1926 if (write_pass)
1927 {
1928 /* Push value address. */
e17a4113 1929 store_unsigned_integer (buf, 4, byte_order, struct_addr);
7ccc1c74
JM
1930 write_memory (sp, buf, 4);
1931 args_space_used += 4;
1932 }
1933 else
1934 args_space += 4;
1935 }
1936
1937 for (i = 0; i < nargs; i++)
1938 {
1939 int len = TYPE_LENGTH (value_enclosing_type (args[i]));
acd5c798 1940
7ccc1c74
JM
1941 if (write_pass)
1942 {
1943 if (i386_16_byte_align_p (value_enclosing_type (args[i])))
1944 args_space_used = align_up (args_space_used, 16);
acd5c798 1945
7ccc1c74
JM
1946 write_memory (sp + args_space_used,
1947 value_contents_all (args[i]), len);
1948 /* The System V ABI says that:
acd5c798 1949
7ccc1c74
JM
1950 "An argument's size is increased, if necessary, to make it a
1951 multiple of [32-bit] words. This may require tail padding,
1952 depending on the size of the argument."
22f8ba57 1953
7ccc1c74
JM
1954 This makes sure the stack stays word-aligned. */
1955 args_space_used += align_up (len, 4);
1956 }
1957 else
1958 {
1959 if (i386_16_byte_align_p (value_enclosing_type (args[i])))
1960 {
1961 args_space = align_up (args_space, 16);
1962 have_16_byte_aligned_arg = 1;
1963 }
1964 args_space += align_up (len, 4);
1965 }
1966 }
1967
1968 if (!write_pass)
1969 {
1970 if (have_16_byte_aligned_arg)
1971 args_space = align_up (args_space, 16);
1972 sp -= args_space;
1973 }
22f8ba57
MK
1974 }
1975
acd5c798
MK
1976 /* Store return address. */
1977 sp -= 4;
e17a4113 1978 store_unsigned_integer (buf, 4, byte_order, bp_addr);
acd5c798
MK
1979 write_memory (sp, buf, 4);
1980
1981 /* Finally, update the stack pointer... */
e17a4113 1982 store_unsigned_integer (buf, 4, byte_order, sp);
acd5c798
MK
1983 regcache_cooked_write (regcache, I386_ESP_REGNUM, buf);
1984
1985 /* ...and fake a frame pointer. */
1986 regcache_cooked_write (regcache, I386_EBP_REGNUM, buf);
1987
3e210248
AC
1988 /* MarkK wrote: This "+ 8" is all over the place:
1989 (i386_frame_this_id, i386_sigtramp_frame_this_id,
10458914 1990 i386_dummy_id). It's there, since all frame unwinders for
3e210248 1991 a given target have to agree (within a certain margin) on the
a45ae3ed
UW
1992 definition of the stack address of a frame. Otherwise frame id
1993 comparison might not work correctly. Since DWARF2/GCC uses the
3e210248
AC
1994 stack address *before* the function call as a frame's CFA. On
1995 the i386, when %ebp is used as a frame pointer, the offset
1996 between the contents %ebp and the CFA as defined by GCC. */
1997 return sp + 8;
22f8ba57
MK
1998}
1999
1a309862
MK
2000/* These registers are used for returning integers (and on some
2001 targets also for returning `struct' and `union' values when their
ef9dff19 2002 size and alignment match an integer type). */
acd5c798
MK
2003#define LOW_RETURN_REGNUM I386_EAX_REGNUM /* %eax */
2004#define HIGH_RETURN_REGNUM I386_EDX_REGNUM /* %edx */
1a309862 2005
c5e656c1
MK
2006/* Read, for architecture GDBARCH, a function return value of TYPE
2007 from REGCACHE, and copy that into VALBUF. */
1a309862 2008
3a1e71e3 2009static void
c5e656c1 2010i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
63c0089f 2011 struct regcache *regcache, gdb_byte *valbuf)
c906108c 2012{
c5e656c1 2013 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1a309862 2014 int len = TYPE_LENGTH (type);
63c0089f 2015 gdb_byte buf[I386_MAX_REGISTER_SIZE];
1a309862 2016
1e8d0a7b 2017 if (TYPE_CODE (type) == TYPE_CODE_FLT)
c906108c 2018 {
5716833c 2019 if (tdep->st0_regnum < 0)
1a309862 2020 {
8a3fe4f8 2021 warning (_("Cannot find floating-point return value."));
1a309862 2022 memset (valbuf, 0, len);
ef9dff19 2023 return;
1a309862
MK
2024 }
2025
c6ba6f0d
MK
2026 /* Floating-point return values can be found in %st(0). Convert
2027 its contents to the desired type. This is probably not
2028 exactly how it would happen on the target itself, but it is
2029 the best we can do. */
acd5c798 2030 regcache_raw_read (regcache, I386_ST0_REGNUM, buf);
27067745 2031 convert_typed_floating (buf, i387_ext_type (gdbarch), valbuf, type);
c906108c
SS
2032 }
2033 else
c5aa993b 2034 {
875f8d0e
UW
2035 int low_size = register_size (gdbarch, LOW_RETURN_REGNUM);
2036 int high_size = register_size (gdbarch, HIGH_RETURN_REGNUM);
d4f3574e
SS
2037
2038 if (len <= low_size)
00f8375e 2039 {
0818c12a 2040 regcache_raw_read (regcache, LOW_RETURN_REGNUM, buf);
00f8375e
MK
2041 memcpy (valbuf, buf, len);
2042 }
d4f3574e
SS
2043 else if (len <= (low_size + high_size))
2044 {
0818c12a 2045 regcache_raw_read (regcache, LOW_RETURN_REGNUM, buf);
00f8375e 2046 memcpy (valbuf, buf, low_size);
0818c12a 2047 regcache_raw_read (regcache, HIGH_RETURN_REGNUM, buf);
63c0089f 2048 memcpy (valbuf + low_size, buf, len - low_size);
d4f3574e
SS
2049 }
2050 else
8e65ff28 2051 internal_error (__FILE__, __LINE__,
e2e0b3e5 2052 _("Cannot extract return value of %d bytes long."), len);
c906108c
SS
2053 }
2054}
2055
c5e656c1
MK
2056/* Write, for architecture GDBARCH, a function return value of TYPE
2057 from VALBUF into REGCACHE. */
ef9dff19 2058
3a1e71e3 2059static void
c5e656c1 2060i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
63c0089f 2061 struct regcache *regcache, const gdb_byte *valbuf)
ef9dff19 2062{
c5e656c1 2063 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
ef9dff19
MK
2064 int len = TYPE_LENGTH (type);
2065
1e8d0a7b 2066 if (TYPE_CODE (type) == TYPE_CODE_FLT)
ef9dff19 2067 {
3d7f4f49 2068 ULONGEST fstat;
63c0089f 2069 gdb_byte buf[I386_MAX_REGISTER_SIZE];
ccb945b8 2070
5716833c 2071 if (tdep->st0_regnum < 0)
ef9dff19 2072 {
8a3fe4f8 2073 warning (_("Cannot set floating-point return value."));
ef9dff19
MK
2074 return;
2075 }
2076
635b0cc1
MK
2077 /* Returning floating-point values is a bit tricky. Apart from
2078 storing the return value in %st(0), we have to simulate the
2079 state of the FPU at function return point. */
2080
c6ba6f0d
MK
2081 /* Convert the value found in VALBUF to the extended
2082 floating-point format used by the FPU. This is probably
2083 not exactly how it would happen on the target itself, but
2084 it is the best we can do. */
27067745 2085 convert_typed_floating (valbuf, type, buf, i387_ext_type (gdbarch));
acd5c798 2086 regcache_raw_write (regcache, I386_ST0_REGNUM, buf);
ccb945b8 2087
635b0cc1
MK
2088 /* Set the top of the floating-point register stack to 7. The
2089 actual value doesn't really matter, but 7 is what a normal
2090 function return would end up with if the program started out
2091 with a freshly initialized FPU. */
20a6ec49 2092 regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
ccb945b8 2093 fstat |= (7 << 11);
20a6ec49 2094 regcache_raw_write_unsigned (regcache, I387_FSTAT_REGNUM (tdep), fstat);
ccb945b8 2095
635b0cc1
MK
2096 /* Mark %st(1) through %st(7) as empty. Since we set the top of
2097 the floating-point register stack to 7, the appropriate value
2098 for the tag word is 0x3fff. */
20a6ec49 2099 regcache_raw_write_unsigned (regcache, I387_FTAG_REGNUM (tdep), 0x3fff);
ef9dff19
MK
2100 }
2101 else
2102 {
875f8d0e
UW
2103 int low_size = register_size (gdbarch, LOW_RETURN_REGNUM);
2104 int high_size = register_size (gdbarch, HIGH_RETURN_REGNUM);
ef9dff19
MK
2105
2106 if (len <= low_size)
3d7f4f49 2107 regcache_raw_write_part (regcache, LOW_RETURN_REGNUM, 0, len, valbuf);
ef9dff19
MK
2108 else if (len <= (low_size + high_size))
2109 {
3d7f4f49
MK
2110 regcache_raw_write (regcache, LOW_RETURN_REGNUM, valbuf);
2111 regcache_raw_write_part (regcache, HIGH_RETURN_REGNUM, 0,
63c0089f 2112 len - low_size, valbuf + low_size);
ef9dff19
MK
2113 }
2114 else
8e65ff28 2115 internal_error (__FILE__, __LINE__,
e2e0b3e5 2116 _("Cannot store return value of %d bytes long."), len);
ef9dff19
MK
2117 }
2118}
fc338970 2119\f
ef9dff19 2120
8201327c
MK
2121/* This is the variable that is set with "set struct-convention", and
2122 its legitimate values. */
2123static const char default_struct_convention[] = "default";
2124static const char pcc_struct_convention[] = "pcc";
2125static const char reg_struct_convention[] = "reg";
2126static const char *valid_conventions[] =
2127{
2128 default_struct_convention,
2129 pcc_struct_convention,
2130 reg_struct_convention,
2131 NULL
2132};
2133static const char *struct_convention = default_struct_convention;
2134
0e4377e1
JB
2135/* Return non-zero if TYPE, which is assumed to be a structure,
2136 a union type, or an array type, should be returned in registers
2137 for architecture GDBARCH. */
c5e656c1 2138
8201327c 2139static int
c5e656c1 2140i386_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
8201327c 2141{
c5e656c1
MK
2142 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2143 enum type_code code = TYPE_CODE (type);
2144 int len = TYPE_LENGTH (type);
8201327c 2145
0e4377e1
JB
2146 gdb_assert (code == TYPE_CODE_STRUCT
2147 || code == TYPE_CODE_UNION
2148 || code == TYPE_CODE_ARRAY);
c5e656c1
MK
2149
2150 if (struct_convention == pcc_struct_convention
2151 || (struct_convention == default_struct_convention
2152 && tdep->struct_return == pcc_struct_return))
2153 return 0;
2154
9edde48e
MK
2155 /* Structures consisting of a single `float', `double' or 'long
2156 double' member are returned in %st(0). */
2157 if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
2158 {
2159 type = check_typedef (TYPE_FIELD_TYPE (type, 0));
2160 if (TYPE_CODE (type) == TYPE_CODE_FLT)
2161 return (len == 4 || len == 8 || len == 12);
2162 }
2163
c5e656c1
MK
2164 return (len == 1 || len == 2 || len == 4 || len == 8);
2165}
2166
2167/* Determine, for architecture GDBARCH, how a return value of TYPE
2168 should be returned. If it is supposed to be returned in registers,
2169 and READBUF is non-zero, read the appropriate value from REGCACHE,
2170 and copy it into READBUF. If WRITEBUF is non-zero, write the value
2171 from WRITEBUF into REGCACHE. */
2172
2173static enum return_value_convention
c055b101
CV
2174i386_return_value (struct gdbarch *gdbarch, struct type *func_type,
2175 struct type *type, struct regcache *regcache,
2176 gdb_byte *readbuf, const gdb_byte *writebuf)
c5e656c1
MK
2177{
2178 enum type_code code = TYPE_CODE (type);
2179
5daa78cc
TJB
2180 if (((code == TYPE_CODE_STRUCT
2181 || code == TYPE_CODE_UNION
2182 || code == TYPE_CODE_ARRAY)
2183 && !i386_reg_struct_return_p (gdbarch, type))
2184 /* 128-bit decimal float uses the struct return convention. */
2185 || (code == TYPE_CODE_DECFLOAT && TYPE_LENGTH (type) == 16))
31db7b6c
MK
2186 {
2187 /* The System V ABI says that:
2188
2189 "A function that returns a structure or union also sets %eax
2190 to the value of the original address of the caller's area
2191 before it returns. Thus when the caller receives control
2192 again, the address of the returned object resides in register
2193 %eax and can be used to access the object."
2194
2195 So the ABI guarantees that we can always find the return
2196 value just after the function has returned. */
2197
0e4377e1
JB
2198 /* Note that the ABI doesn't mention functions returning arrays,
2199 which is something possible in certain languages such as Ada.
2200 In this case, the value is returned as if it was wrapped in
2201 a record, so the convention applied to records also applies
2202 to arrays. */
2203
31db7b6c
MK
2204 if (readbuf)
2205 {
2206 ULONGEST addr;
2207
2208 regcache_raw_read_unsigned (regcache, I386_EAX_REGNUM, &addr);
2209 read_memory (addr, readbuf, TYPE_LENGTH (type));
2210 }
2211
2212 return RETURN_VALUE_ABI_RETURNS_ADDRESS;
2213 }
c5e656c1
MK
2214
2215 /* This special case is for structures consisting of a single
9edde48e
MK
2216 `float', `double' or 'long double' member. These structures are
2217 returned in %st(0). For these structures, we call ourselves
2218 recursively, changing TYPE into the type of the first member of
2219 the structure. Since that should work for all structures that
2220 have only one member, we don't bother to check the member's type
2221 here. */
c5e656c1
MK
2222 if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
2223 {
2224 type = check_typedef (TYPE_FIELD_TYPE (type, 0));
c055b101
CV
2225 return i386_return_value (gdbarch, func_type, type, regcache,
2226 readbuf, writebuf);
c5e656c1
MK
2227 }
2228
2229 if (readbuf)
2230 i386_extract_return_value (gdbarch, type, regcache, readbuf);
2231 if (writebuf)
2232 i386_store_return_value (gdbarch, type, regcache, writebuf);
8201327c 2233
c5e656c1 2234 return RETURN_VALUE_REGISTER_CONVENTION;
8201327c
MK
2235}
2236\f
2237
27067745
UW
2238struct type *
2239i387_ext_type (struct gdbarch *gdbarch)
2240{
2241 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2242
2243 if (!tdep->i387_ext_type)
90884b2b
L
2244 {
2245 tdep->i387_ext_type = tdesc_find_type (gdbarch, "i387_ext");
2246 gdb_assert (tdep->i387_ext_type != NULL);
2247 }
27067745
UW
2248
2249 return tdep->i387_ext_type;
2250}
2251
c131fcee
L
2252/* Construct vector type for pseudo YMM registers. We can't use
2253 tdesc_find_type since YMM isn't described in target description. */
2254
2255static struct type *
2256i386_ymm_type (struct gdbarch *gdbarch)
2257{
2258 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2259
2260 if (!tdep->i386_ymm_type)
2261 {
2262 const struct builtin_type *bt = builtin_type (gdbarch);
2263
2264 /* The type we're building is this: */
2265#if 0
2266 union __gdb_builtin_type_vec256i
2267 {
2268 int128_t uint128[2];
2269 int64_t v2_int64[4];
2270 int32_t v4_int32[8];
2271 int16_t v8_int16[16];
2272 int8_t v16_int8[32];
2273 double v2_double[4];
2274 float v4_float[8];
2275 };
2276#endif
2277
2278 struct type *t;
2279
2280 t = arch_composite_type (gdbarch,
2281 "__gdb_builtin_type_vec256i", TYPE_CODE_UNION);
2282 append_composite_type_field (t, "v8_float",
2283 init_vector_type (bt->builtin_float, 8));
2284 append_composite_type_field (t, "v4_double",
2285 init_vector_type (bt->builtin_double, 4));
2286 append_composite_type_field (t, "v32_int8",
2287 init_vector_type (bt->builtin_int8, 32));
2288 append_composite_type_field (t, "v16_int16",
2289 init_vector_type (bt->builtin_int16, 16));
2290 append_composite_type_field (t, "v8_int32",
2291 init_vector_type (bt->builtin_int32, 8));
2292 append_composite_type_field (t, "v4_int64",
2293 init_vector_type (bt->builtin_int64, 4));
2294 append_composite_type_field (t, "v2_int128",
2295 init_vector_type (bt->builtin_int128, 2));
2296
2297 TYPE_VECTOR (t) = 1;
2298 TYPE_NAME (t) = "builtin_type_vec128i";
2299 tdep->i386_ymm_type = t;
2300 }
2301
2302 return tdep->i386_ymm_type;
2303}
2304
794ac428 2305/* Construct vector type for MMX registers. */
90884b2b 2306static struct type *
794ac428
UW
2307i386_mmx_type (struct gdbarch *gdbarch)
2308{
2309 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2310
2311 if (!tdep->i386_mmx_type)
2312 {
df4df182
UW
2313 const struct builtin_type *bt = builtin_type (gdbarch);
2314
794ac428
UW
2315 /* The type we're building is this: */
2316#if 0
2317 union __gdb_builtin_type_vec64i
2318 {
2319 int64_t uint64;
2320 int32_t v2_int32[2];
2321 int16_t v4_int16[4];
2322 int8_t v8_int8[8];
2323 };
2324#endif
2325
2326 struct type *t;
2327
e9bb382b
UW
2328 t = arch_composite_type (gdbarch,
2329 "__gdb_builtin_type_vec64i", TYPE_CODE_UNION);
df4df182
UW
2330
2331 append_composite_type_field (t, "uint64", bt->builtin_int64);
794ac428 2332 append_composite_type_field (t, "v2_int32",
df4df182 2333 init_vector_type (bt->builtin_int32, 2));
794ac428 2334 append_composite_type_field (t, "v4_int16",
df4df182 2335 init_vector_type (bt->builtin_int16, 4));
794ac428 2336 append_composite_type_field (t, "v8_int8",
df4df182 2337 init_vector_type (bt->builtin_int8, 8));
794ac428 2338
876cecd0 2339 TYPE_VECTOR (t) = 1;
794ac428
UW
2340 TYPE_NAME (t) = "builtin_type_vec64i";
2341 tdep->i386_mmx_type = t;
2342 }
2343
2344 return tdep->i386_mmx_type;
2345}
2346
d7a0d72c 2347/* Return the GDB type object for the "standard" data type of data in
90884b2b 2348 register REGNUM. */
d7a0d72c 2349
3a1e71e3 2350static struct type *
90884b2b 2351i386_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
d7a0d72c 2352{
1ba53b71
L
2353 if (i386_mmx_regnum_p (gdbarch, regnum))
2354 return i386_mmx_type (gdbarch);
c131fcee
L
2355 else if (i386_ymm_regnum_p (gdbarch, regnum))
2356 return i386_ymm_type (gdbarch);
1ba53b71
L
2357 else
2358 {
2359 const struct builtin_type *bt = builtin_type (gdbarch);
2360 if (i386_byte_regnum_p (gdbarch, regnum))
2361 return bt->builtin_int8;
2362 else if (i386_word_regnum_p (gdbarch, regnum))
2363 return bt->builtin_int16;
2364 else if (i386_dword_regnum_p (gdbarch, regnum))
2365 return bt->builtin_int32;
2366 }
2367
2368 internal_error (__FILE__, __LINE__, _("invalid regnum"));
d7a0d72c
MK
2369}
2370
28fc6740 2371/* Map a cooked register onto a raw register or memory. For the i386,
acd5c798 2372 the MMX registers need to be mapped onto floating point registers. */
28fc6740
AC
2373
2374static int
c86c27af 2375i386_mmx_regnum_to_fp_regnum (struct regcache *regcache, int regnum)
28fc6740 2376{
5716833c
MK
2377 struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
2378 int mmxreg, fpreg;
28fc6740
AC
2379 ULONGEST fstat;
2380 int tos;
c86c27af 2381
5716833c 2382 mmxreg = regnum - tdep->mm0_regnum;
20a6ec49 2383 regcache_raw_read_unsigned (regcache, I387_FSTAT_REGNUM (tdep), &fstat);
28fc6740 2384 tos = (fstat >> 11) & 0x7;
5716833c
MK
2385 fpreg = (mmxreg + tos) % 8;
2386
20a6ec49 2387 return (I387_ST0_REGNUM (tdep) + fpreg);
28fc6740
AC
2388}
2389
1ba53b71 2390void
28fc6740 2391i386_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
42835c2b 2392 int regnum, gdb_byte *buf)
28fc6740 2393{
1ba53b71
L
2394 gdb_byte raw_buf[MAX_REGISTER_SIZE];
2395
5716833c 2396 if (i386_mmx_regnum_p (gdbarch, regnum))
28fc6740 2397 {
c86c27af
MK
2398 int fpnum = i386_mmx_regnum_to_fp_regnum (regcache, regnum);
2399
28fc6740 2400 /* Extract (always little endian). */
1ba53b71
L
2401 regcache_raw_read (regcache, fpnum, raw_buf);
2402 memcpy (buf, raw_buf, register_size (gdbarch, regnum));
28fc6740
AC
2403 }
2404 else
1ba53b71
L
2405 {
2406 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2407
c131fcee
L
2408 if (i386_ymm_regnum_p (gdbarch, regnum))
2409 {
2410 regnum -= tdep->ymm0_regnum;
2411
2412 /* Extract (always little endian). Read lower 128bits. */
2413 regcache_raw_read (regcache,
2414 I387_XMM0_REGNUM (tdep) + regnum,
2415 raw_buf);
2416 memcpy (buf, raw_buf, 16);
2417 /* Read upper 128bits. */
2418 regcache_raw_read (regcache,
2419 tdep->ymm0h_regnum + regnum,
2420 raw_buf);
2421 memcpy (buf + 16, raw_buf, 16);
2422 }
2423 else if (i386_word_regnum_p (gdbarch, regnum))
1ba53b71
L
2424 {
2425 int gpnum = regnum - tdep->ax_regnum;
2426
2427 /* Extract (always little endian). */
2428 regcache_raw_read (regcache, gpnum, raw_buf);
2429 memcpy (buf, raw_buf, 2);
2430 }
2431 else if (i386_byte_regnum_p (gdbarch, regnum))
2432 {
2433 /* Check byte pseudo registers last since this function will
2434 be called from amd64_pseudo_register_read, which handles
2435 byte pseudo registers differently. */
2436 int gpnum = regnum - tdep->al_regnum;
2437
2438 /* Extract (always little endian). We read both lower and
2439 upper registers. */
2440 regcache_raw_read (regcache, gpnum % 4, raw_buf);
2441 if (gpnum >= 4)
2442 memcpy (buf, raw_buf + 1, 1);
2443 else
2444 memcpy (buf, raw_buf, 1);
2445 }
2446 else
2447 internal_error (__FILE__, __LINE__, _("invalid regnum"));
2448 }
28fc6740
AC
2449}
2450
1ba53b71 2451void
28fc6740 2452i386_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
42835c2b 2453 int regnum, const gdb_byte *buf)
28fc6740 2454{
1ba53b71
L
2455 gdb_byte raw_buf[MAX_REGISTER_SIZE];
2456
5716833c 2457 if (i386_mmx_regnum_p (gdbarch, regnum))
28fc6740 2458 {
c86c27af
MK
2459 int fpnum = i386_mmx_regnum_to_fp_regnum (regcache, regnum);
2460
28fc6740 2461 /* Read ... */
1ba53b71 2462 regcache_raw_read (regcache, fpnum, raw_buf);
28fc6740 2463 /* ... Modify ... (always little endian). */
1ba53b71 2464 memcpy (raw_buf, buf, register_size (gdbarch, regnum));
28fc6740 2465 /* ... Write. */
1ba53b71 2466 regcache_raw_write (regcache, fpnum, raw_buf);
28fc6740
AC
2467 }
2468 else
1ba53b71
L
2469 {
2470 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2471
c131fcee
L
2472 if (i386_ymm_regnum_p (gdbarch, regnum))
2473 {
2474 regnum -= tdep->ymm0_regnum;
2475
2476 /* ... Write lower 128bits. */
2477 regcache_raw_write (regcache,
2478 I387_XMM0_REGNUM (tdep) + regnum,
2479 buf);
2480 /* ... Write upper 128bits. */
2481 regcache_raw_write (regcache,
2482 tdep->ymm0h_regnum + regnum,
2483 buf + 16);
2484 }
2485 else if (i386_word_regnum_p (gdbarch, regnum))
1ba53b71
L
2486 {
2487 int gpnum = regnum - tdep->ax_regnum;
2488
2489 /* Read ... */
2490 regcache_raw_read (regcache, gpnum, raw_buf);
2491 /* ... Modify ... (always little endian). */
2492 memcpy (raw_buf, buf, 2);
2493 /* ... Write. */
2494 regcache_raw_write (regcache, gpnum, raw_buf);
2495 }
2496 else if (i386_byte_regnum_p (gdbarch, regnum))
2497 {
2498 /* Check byte pseudo registers last since this function will
2499 be called from amd64_pseudo_register_read, which handles
2500 byte pseudo registers differently. */
2501 int gpnum = regnum - tdep->al_regnum;
2502
2503 /* Read ... We read both lower and upper registers. */
2504 regcache_raw_read (regcache, gpnum % 4, raw_buf);
2505 /* ... Modify ... (always little endian). */
2506 if (gpnum >= 4)
2507 memcpy (raw_buf + 1, buf, 1);
2508 else
2509 memcpy (raw_buf, buf, 1);
2510 /* ... Write. */
2511 regcache_raw_write (regcache, gpnum % 4, raw_buf);
2512 }
2513 else
2514 internal_error (__FILE__, __LINE__, _("invalid regnum"));
2515 }
28fc6740 2516}
ff2e87ac
AC
2517\f
2518
ff2e87ac
AC
2519/* Return the register number of the register allocated by GCC after
2520 REGNUM, or -1 if there is no such register. */
2521
2522static int
2523i386_next_regnum (int regnum)
2524{
2525 /* GCC allocates the registers in the order:
2526
2527 %eax, %edx, %ecx, %ebx, %esi, %edi, %ebp, %esp, ...
2528
2529 Since storing a variable in %esp doesn't make any sense we return
2530 -1 for %ebp and for %esp itself. */
2531 static int next_regnum[] =
2532 {
2533 I386_EDX_REGNUM, /* Slot for %eax. */
2534 I386_EBX_REGNUM, /* Slot for %ecx. */
2535 I386_ECX_REGNUM, /* Slot for %edx. */
2536 I386_ESI_REGNUM, /* Slot for %ebx. */
2537 -1, -1, /* Slots for %esp and %ebp. */
2538 I386_EDI_REGNUM, /* Slot for %esi. */
2539 I386_EBP_REGNUM /* Slot for %edi. */
2540 };
2541
de5b9bb9 2542 if (regnum >= 0 && regnum < sizeof (next_regnum) / sizeof (next_regnum[0]))
ff2e87ac 2543 return next_regnum[regnum];
28fc6740 2544
ff2e87ac
AC
2545 return -1;
2546}
2547
2548/* Return nonzero if a value of type TYPE stored in register REGNUM
2549 needs any special handling. */
d7a0d72c 2550
3a1e71e3 2551static int
0abe36f5 2552i386_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type)
d7a0d72c 2553{
de5b9bb9
MK
2554 int len = TYPE_LENGTH (type);
2555
ff2e87ac
AC
2556 /* Values may be spread across multiple registers. Most debugging
2557 formats aren't expressive enough to specify the locations, so
2558 some heuristics is involved. Right now we only handle types that
de5b9bb9
MK
2559 have a length that is a multiple of the word size, since GCC
2560 doesn't seem to put any other types into registers. */
2561 if (len > 4 && len % 4 == 0)
2562 {
2563 int last_regnum = regnum;
2564
2565 while (len > 4)
2566 {
2567 last_regnum = i386_next_regnum (last_regnum);
2568 len -= 4;
2569 }
2570
2571 if (last_regnum != -1)
2572 return 1;
2573 }
ff2e87ac 2574
0abe36f5 2575 return i387_convert_register_p (gdbarch, regnum, type);
d7a0d72c
MK
2576}
2577
ff2e87ac
AC
2578/* Read a value of type TYPE from register REGNUM in frame FRAME, and
2579 return its contents in TO. */
ac27f131 2580
3a1e71e3 2581static void
ff2e87ac 2582i386_register_to_value (struct frame_info *frame, int regnum,
42835c2b 2583 struct type *type, gdb_byte *to)
ac27f131 2584{
20a6ec49 2585 struct gdbarch *gdbarch = get_frame_arch (frame);
de5b9bb9 2586 int len = TYPE_LENGTH (type);
de5b9bb9 2587
ff2e87ac
AC
2588 /* FIXME: kettenis/20030609: What should we do if REGNUM isn't
2589 available in FRAME (i.e. if it wasn't saved)? */
3d261580 2590
20a6ec49 2591 if (i386_fp_regnum_p (gdbarch, regnum))
8d7f6b4a 2592 {
d532c08f
MK
2593 i387_register_to_value (frame, regnum, type, to);
2594 return;
8d7f6b4a 2595 }
ff2e87ac 2596
fd35795f 2597 /* Read a value spread across multiple registers. */
de5b9bb9
MK
2598
2599 gdb_assert (len > 4 && len % 4 == 0);
3d261580 2600
de5b9bb9
MK
2601 while (len > 0)
2602 {
2603 gdb_assert (regnum != -1);
20a6ec49 2604 gdb_assert (register_size (gdbarch, regnum) == 4);
d532c08f 2605
42835c2b 2606 get_frame_register (frame, regnum, to);
de5b9bb9
MK
2607 regnum = i386_next_regnum (regnum);
2608 len -= 4;
42835c2b 2609 to += 4;
de5b9bb9 2610 }
ac27f131
MK
2611}
2612
ff2e87ac
AC
2613/* Write the contents FROM of a value of type TYPE into register
2614 REGNUM in frame FRAME. */
ac27f131 2615
3a1e71e3 2616static void
ff2e87ac 2617i386_value_to_register (struct frame_info *frame, int regnum,
42835c2b 2618 struct type *type, const gdb_byte *from)
ac27f131 2619{
de5b9bb9 2620 int len = TYPE_LENGTH (type);
de5b9bb9 2621
20a6ec49 2622 if (i386_fp_regnum_p (get_frame_arch (frame), regnum))
c6ba6f0d 2623 {
d532c08f
MK
2624 i387_value_to_register (frame, regnum, type, from);
2625 return;
2626 }
3d261580 2627
fd35795f 2628 /* Write a value spread across multiple registers. */
de5b9bb9
MK
2629
2630 gdb_assert (len > 4 && len % 4 == 0);
ff2e87ac 2631
de5b9bb9
MK
2632 while (len > 0)
2633 {
2634 gdb_assert (regnum != -1);
875f8d0e 2635 gdb_assert (register_size (get_frame_arch (frame), regnum) == 4);
d532c08f 2636
42835c2b 2637 put_frame_register (frame, regnum, from);
de5b9bb9
MK
2638 regnum = i386_next_regnum (regnum);
2639 len -= 4;
42835c2b 2640 from += 4;
de5b9bb9 2641 }
ac27f131 2642}
ff2e87ac 2643\f
7fdafb5a
MK
2644/* Supply register REGNUM from the buffer specified by GREGS and LEN
2645 in the general-purpose register set REGSET to register cache
2646 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
ff2e87ac 2647
20187ed5 2648void
473f17b0
MK
2649i386_supply_gregset (const struct regset *regset, struct regcache *regcache,
2650 int regnum, const void *gregs, size_t len)
2651{
9ea75c57 2652 const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
156cdbee 2653 const gdb_byte *regs = gregs;
473f17b0
MK
2654 int i;
2655
2656 gdb_assert (len == tdep->sizeof_gregset);
2657
2658 for (i = 0; i < tdep->gregset_num_regs; i++)
2659 {
2660 if ((regnum == i || regnum == -1)
2661 && tdep->gregset_reg_offset[i] != -1)
2662 regcache_raw_supply (regcache, i, regs + tdep->gregset_reg_offset[i]);
2663 }
2664}
2665
7fdafb5a
MK
2666/* Collect register REGNUM from the register cache REGCACHE and store
2667 it in the buffer specified by GREGS and LEN as described by the
2668 general-purpose register set REGSET. If REGNUM is -1, do this for
2669 all registers in REGSET. */
2670
2671void
2672i386_collect_gregset (const struct regset *regset,
2673 const struct regcache *regcache,
2674 int regnum, void *gregs, size_t len)
2675{
2676 const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
156cdbee 2677 gdb_byte *regs = gregs;
7fdafb5a
MK
2678 int i;
2679
2680 gdb_assert (len == tdep->sizeof_gregset);
2681
2682 for (i = 0; i < tdep->gregset_num_regs; i++)
2683 {
2684 if ((regnum == i || regnum == -1)
2685 && tdep->gregset_reg_offset[i] != -1)
2686 regcache_raw_collect (regcache, i, regs + tdep->gregset_reg_offset[i]);
2687 }
2688}
2689
2690/* Supply register REGNUM from the buffer specified by FPREGS and LEN
2691 in the floating-point register set REGSET to register cache
2692 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
473f17b0
MK
2693
2694static void
2695i386_supply_fpregset (const struct regset *regset, struct regcache *regcache,
2696 int regnum, const void *fpregs, size_t len)
2697{
9ea75c57 2698 const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
473f17b0 2699
66a72d25
MK
2700 if (len == I387_SIZEOF_FXSAVE)
2701 {
2702 i387_supply_fxsave (regcache, regnum, fpregs);
2703 return;
2704 }
2705
473f17b0
MK
2706 gdb_assert (len == tdep->sizeof_fpregset);
2707 i387_supply_fsave (regcache, regnum, fpregs);
2708}
8446b36a 2709
2f305df1
MK
2710/* Collect register REGNUM from the register cache REGCACHE and store
2711 it in the buffer specified by FPREGS and LEN as described by the
2712 floating-point register set REGSET. If REGNUM is -1, do this for
2713 all registers in REGSET. */
7fdafb5a
MK
2714
2715static void
2716i386_collect_fpregset (const struct regset *regset,
2717 const struct regcache *regcache,
2718 int regnum, void *fpregs, size_t len)
2719{
2720 const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
2721
2722 if (len == I387_SIZEOF_FXSAVE)
2723 {
2724 i387_collect_fxsave (regcache, regnum, fpregs);
2725 return;
2726 }
2727
2728 gdb_assert (len == tdep->sizeof_fpregset);
2729 i387_collect_fsave (regcache, regnum, fpregs);
2730}
2731
c131fcee
L
2732/* Similar to i386_supply_fpregset, but use XSAVE extended state. */
2733
2734static void
2735i386_supply_xstateregset (const struct regset *regset,
2736 struct regcache *regcache, int regnum,
2737 const void *xstateregs, size_t len)
2738{
2739 const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
2740 i387_supply_xsave (regcache, regnum, xstateregs);
2741}
2742
2743/* Similar to i386_collect_fpregset , but use XSAVE extended state. */
2744
2745static void
2746i386_collect_xstateregset (const struct regset *regset,
2747 const struct regcache *regcache,
2748 int regnum, void *xstateregs, size_t len)
2749{
2750 const struct gdbarch_tdep *tdep = gdbarch_tdep (regset->arch);
2751 i387_collect_xsave (regcache, regnum, xstateregs, 1);
2752}
2753
8446b36a
MK
2754/* Return the appropriate register set for the core section identified
2755 by SECT_NAME and SECT_SIZE. */
2756
2757const struct regset *
2758i386_regset_from_core_section (struct gdbarch *gdbarch,
2759 const char *sect_name, size_t sect_size)
2760{
2761 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2762
2763 if (strcmp (sect_name, ".reg") == 0 && sect_size == tdep->sizeof_gregset)
2764 {
2765 if (tdep->gregset == NULL)
7fdafb5a
MK
2766 tdep->gregset = regset_alloc (gdbarch, i386_supply_gregset,
2767 i386_collect_gregset);
8446b36a
MK
2768 return tdep->gregset;
2769 }
2770
66a72d25
MK
2771 if ((strcmp (sect_name, ".reg2") == 0 && sect_size == tdep->sizeof_fpregset)
2772 || (strcmp (sect_name, ".reg-xfp") == 0
2773 && sect_size == I387_SIZEOF_FXSAVE))
8446b36a
MK
2774 {
2775 if (tdep->fpregset == NULL)
7fdafb5a
MK
2776 tdep->fpregset = regset_alloc (gdbarch, i386_supply_fpregset,
2777 i386_collect_fpregset);
8446b36a
MK
2778 return tdep->fpregset;
2779 }
2780
c131fcee
L
2781 if (strcmp (sect_name, ".reg-xstate") == 0)
2782 {
2783 if (tdep->xstateregset == NULL)
2784 tdep->xstateregset = regset_alloc (gdbarch,
2785 i386_supply_xstateregset,
2786 i386_collect_xstateregset);
2787
2788 return tdep->xstateregset;
2789 }
2790
8446b36a
MK
2791 return NULL;
2792}
473f17b0 2793\f
fc338970 2794
fc338970 2795/* Stuff for WIN32 PE style DLL's but is pretty generic really. */
c906108c
SS
2796
2797CORE_ADDR
e17a4113
UW
2798i386_pe_skip_trampoline_code (struct frame_info *frame,
2799 CORE_ADDR pc, char *name)
c906108c 2800{
e17a4113
UW
2801 struct gdbarch *gdbarch = get_frame_arch (frame);
2802 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2803
2804 /* jmp *(dest) */
2805 if (pc && read_memory_unsigned_integer (pc, 2, byte_order) == 0x25ff)
c906108c 2806 {
e17a4113
UW
2807 unsigned long indirect =
2808 read_memory_unsigned_integer (pc + 2, 4, byte_order);
c906108c 2809 struct minimal_symbol *indsym =
fc338970 2810 indirect ? lookup_minimal_symbol_by_pc (indirect) : 0;
645dd519 2811 char *symname = indsym ? SYMBOL_LINKAGE_NAME (indsym) : 0;
c906108c 2812
c5aa993b 2813 if (symname)
c906108c 2814 {
c5aa993b
JM
2815 if (strncmp (symname, "__imp_", 6) == 0
2816 || strncmp (symname, "_imp_", 5) == 0)
e17a4113
UW
2817 return name ? 1 :
2818 read_memory_unsigned_integer (indirect, 4, byte_order);
c906108c
SS
2819 }
2820 }
fc338970 2821 return 0; /* Not a trampoline. */
c906108c 2822}
fc338970
MK
2823\f
2824
10458914
DJ
2825/* Return whether the THIS_FRAME corresponds to a sigtramp
2826 routine. */
8201327c 2827
4bd207ef 2828int
10458914 2829i386_sigtramp_p (struct frame_info *this_frame)
8201327c 2830{
10458914 2831 CORE_ADDR pc = get_frame_pc (this_frame);
911bc6ee
MK
2832 char *name;
2833
2834 find_pc_partial_function (pc, &name, NULL, NULL);
8201327c
MK
2835 return (name && strcmp ("_sigtramp", name) == 0);
2836}
2837\f
2838
fc338970
MK
2839/* We have two flavours of disassembly. The machinery on this page
2840 deals with switching between those. */
c906108c
SS
2841
2842static int
a89aa300 2843i386_print_insn (bfd_vma pc, struct disassemble_info *info)
c906108c 2844{
5e3397bb
MK
2845 gdb_assert (disassembly_flavor == att_flavor
2846 || disassembly_flavor == intel_flavor);
2847
2848 /* FIXME: kettenis/20020915: Until disassembler_options is properly
2849 constified, cast to prevent a compiler warning. */
2850 info->disassembler_options = (char *) disassembly_flavor;
5e3397bb
MK
2851
2852 return print_insn_i386 (pc, info);
7a292a7a 2853}
fc338970 2854\f
3ce1502b 2855
8201327c
MK
2856/* There are a few i386 architecture variants that differ only
2857 slightly from the generic i386 target. For now, we don't give them
2858 their own source file, but include them here. As a consequence,
2859 they'll always be included. */
3ce1502b 2860
8201327c 2861/* System V Release 4 (SVR4). */
3ce1502b 2862
10458914
DJ
2863/* Return whether THIS_FRAME corresponds to a SVR4 sigtramp
2864 routine. */
911bc6ee 2865
8201327c 2866static int
10458914 2867i386_svr4_sigtramp_p (struct frame_info *this_frame)
d2a7c97a 2868{
10458914 2869 CORE_ADDR pc = get_frame_pc (this_frame);
911bc6ee
MK
2870 char *name;
2871
acd5c798
MK
2872 /* UnixWare uses _sigacthandler. The origin of the other symbols is
2873 currently unknown. */
911bc6ee 2874 find_pc_partial_function (pc, &name, NULL, NULL);
8201327c
MK
2875 return (name && (strcmp ("_sigreturn", name) == 0
2876 || strcmp ("_sigacthandler", name) == 0
2877 || strcmp ("sigvechandler", name) == 0));
2878}
d2a7c97a 2879
10458914
DJ
2880/* Assuming THIS_FRAME is for a SVR4 sigtramp routine, return the
2881 address of the associated sigcontext (ucontext) structure. */
3ce1502b 2882
3a1e71e3 2883static CORE_ADDR
10458914 2884i386_svr4_sigcontext_addr (struct frame_info *this_frame)
8201327c 2885{
e17a4113
UW
2886 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2887 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 2888 gdb_byte buf[4];
acd5c798 2889 CORE_ADDR sp;
3ce1502b 2890
10458914 2891 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
e17a4113 2892 sp = extract_unsigned_integer (buf, 4, byte_order);
21d0e8a4 2893
e17a4113 2894 return read_memory_unsigned_integer (sp + 8, 4, byte_order);
8201327c
MK
2895}
2896\f
3ce1502b 2897
8201327c 2898/* Generic ELF. */
d2a7c97a 2899
8201327c
MK
2900void
2901i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2902{
c4fc7f1b
MK
2903 /* We typically use stabs-in-ELF with the SVR4 register numbering. */
2904 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
8201327c 2905}
3ce1502b 2906
8201327c 2907/* System V Release 4 (SVR4). */
3ce1502b 2908
8201327c
MK
2909void
2910i386_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2911{
2912 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3ce1502b 2913
8201327c
MK
2914 /* System V Release 4 uses ELF. */
2915 i386_elf_init_abi (info, gdbarch);
3ce1502b 2916
dfe01d39 2917 /* System V Release 4 has shared libraries. */
dfe01d39
MK
2918 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
2919
911bc6ee 2920 tdep->sigtramp_p = i386_svr4_sigtramp_p;
21d0e8a4 2921 tdep->sigcontext_addr = i386_svr4_sigcontext_addr;
acd5c798
MK
2922 tdep->sc_pc_offset = 36 + 14 * 4;
2923 tdep->sc_sp_offset = 36 + 17 * 4;
3ce1502b 2924
8201327c 2925 tdep->jb_pc_offset = 20;
3ce1502b
MK
2926}
2927
8201327c 2928/* DJGPP. */
3ce1502b 2929
3a1e71e3 2930static void
8201327c 2931i386_go32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
3ce1502b 2932{
8201327c 2933 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3ce1502b 2934
911bc6ee
MK
2935 /* DJGPP doesn't have any special frames for signal handlers. */
2936 tdep->sigtramp_p = NULL;
3ce1502b 2937
8201327c 2938 tdep->jb_pc_offset = 36;
15430fc0
EZ
2939
2940 /* DJGPP does not support the SSE registers. */
3a13a53b
L
2941 if (! tdesc_has_registers (info.target_desc))
2942 tdep->tdesc = tdesc_i386_mmx;
3d22076f
EZ
2943
2944 /* Native compiler is GCC, which uses the SVR4 register numbering
2945 even in COFF and STABS. See the comment in i386_gdbarch_init,
2946 before the calls to set_gdbarch_stab_reg_to_regnum and
2947 set_gdbarch_sdb_reg_to_regnum. */
2948 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
2949 set_gdbarch_sdb_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
ab38a727
PA
2950
2951 set_gdbarch_has_dos_based_file_system (gdbarch, 1);
3ce1502b 2952}
8201327c 2953\f
2acceee2 2954
38c968cf
AC
2955/* i386 register groups. In addition to the normal groups, add "mmx"
2956 and "sse". */
2957
2958static struct reggroup *i386_sse_reggroup;
2959static struct reggroup *i386_mmx_reggroup;
2960
2961static void
2962i386_init_reggroups (void)
2963{
2964 i386_sse_reggroup = reggroup_new ("sse", USER_REGGROUP);
2965 i386_mmx_reggroup = reggroup_new ("mmx", USER_REGGROUP);
2966}
2967
2968static void
2969i386_add_reggroups (struct gdbarch *gdbarch)
2970{
2971 reggroup_add (gdbarch, i386_sse_reggroup);
2972 reggroup_add (gdbarch, i386_mmx_reggroup);
2973 reggroup_add (gdbarch, general_reggroup);
2974 reggroup_add (gdbarch, float_reggroup);
2975 reggroup_add (gdbarch, all_reggroup);
2976 reggroup_add (gdbarch, save_reggroup);
2977 reggroup_add (gdbarch, restore_reggroup);
2978 reggroup_add (gdbarch, vector_reggroup);
2979 reggroup_add (gdbarch, system_reggroup);
2980}
2981
2982int
2983i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
2984 struct reggroup *group)
2985{
c131fcee
L
2986 const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2987 int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
2988 ymm_regnum_p, ymmh_regnum_p;
acd5c798 2989
1ba53b71
L
2990 /* Don't include pseudo registers, except for MMX, in any register
2991 groups. */
c131fcee 2992 if (i386_byte_regnum_p (gdbarch, regnum))
1ba53b71
L
2993 return 0;
2994
c131fcee 2995 if (i386_word_regnum_p (gdbarch, regnum))
1ba53b71
L
2996 return 0;
2997
c131fcee 2998 if (i386_dword_regnum_p (gdbarch, regnum))
1ba53b71
L
2999 return 0;
3000
3001 mmx_regnum_p = i386_mmx_regnum_p (gdbarch, regnum);
38c968cf
AC
3002 if (group == i386_mmx_reggroup)
3003 return mmx_regnum_p;
1ba53b71 3004
c131fcee
L
3005 xmm_regnum_p = i386_xmm_regnum_p (gdbarch, regnum);
3006 mxcsr_regnum_p = i386_mxcsr_regnum_p (gdbarch, regnum);
38c968cf 3007 if (group == i386_sse_reggroup)
c131fcee
L
3008 return xmm_regnum_p || mxcsr_regnum_p;
3009
3010 ymm_regnum_p = i386_ymm_regnum_p (gdbarch, regnum);
38c968cf 3011 if (group == vector_reggroup)
c131fcee
L
3012 return (mmx_regnum_p
3013 || ymm_regnum_p
3014 || mxcsr_regnum_p
3015 || (xmm_regnum_p
3016 && ((tdep->xcr0 & I386_XSTATE_AVX_MASK)
3017 == I386_XSTATE_SSE_MASK)));
1ba53b71
L
3018
3019 fp_regnum_p = (i386_fp_regnum_p (gdbarch, regnum)
3020 || i386_fpc_regnum_p (gdbarch, regnum));
38c968cf
AC
3021 if (group == float_reggroup)
3022 return fp_regnum_p;
1ba53b71 3023
c131fcee
L
3024 /* For "info reg all", don't include upper YMM registers nor XMM
3025 registers when AVX is supported. */
3026 ymmh_regnum_p = i386_ymmh_regnum_p (gdbarch, regnum);
3027 if (group == all_reggroup
3028 && ((xmm_regnum_p
3029 && (tdep->xcr0 & I386_XSTATE_AVX))
3030 || ymmh_regnum_p))
3031 return 0;
3032
38c968cf 3033 if (group == general_reggroup)
1ba53b71
L
3034 return (!fp_regnum_p
3035 && !mmx_regnum_p
c131fcee
L
3036 && !mxcsr_regnum_p
3037 && !xmm_regnum_p
3038 && !ymm_regnum_p
3039 && !ymmh_regnum_p);
acd5c798 3040
38c968cf
AC
3041 return default_register_reggroup_p (gdbarch, regnum, group);
3042}
38c968cf 3043\f
acd5c798 3044
f837910f
MK
3045/* Get the ARGIth function argument for the current function. */
3046
42c466d7 3047static CORE_ADDR
143985b7
AF
3048i386_fetch_pointer_argument (struct frame_info *frame, int argi,
3049 struct type *type)
3050{
e17a4113
UW
3051 struct gdbarch *gdbarch = get_frame_arch (frame);
3052 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
f837910f 3053 CORE_ADDR sp = get_frame_register_unsigned (frame, I386_ESP_REGNUM);
e17a4113 3054 return read_memory_unsigned_integer (sp + (4 * (argi + 1)), 4, byte_order);
143985b7
AF
3055}
3056
514f746b
AR
3057static void
3058i386_skip_permanent_breakpoint (struct regcache *regcache)
3059{
3060 CORE_ADDR current_pc = regcache_read_pc (regcache);
3061
3062 /* On i386, breakpoint is exactly 1 byte long, so we just
3063 adjust the PC in the regcache. */
3064 current_pc += 1;
3065 regcache_write_pc (regcache, current_pc);
3066}
3067
3068
7ad10968
HZ
3069#define PREFIX_REPZ 0x01
3070#define PREFIX_REPNZ 0x02
3071#define PREFIX_LOCK 0x04
3072#define PREFIX_DATA 0x08
3073#define PREFIX_ADDR 0x10
473f17b0 3074
7ad10968
HZ
3075/* operand size */
3076enum
3077{
3078 OT_BYTE = 0,
3079 OT_WORD,
3080 OT_LONG,
cf648174 3081 OT_QUAD,
a3c4230a 3082 OT_DQUAD,
7ad10968 3083};
473f17b0 3084
7ad10968
HZ
3085/* i386 arith/logic operations */
3086enum
3087{
3088 OP_ADDL,
3089 OP_ORL,
3090 OP_ADCL,
3091 OP_SBBL,
3092 OP_ANDL,
3093 OP_SUBL,
3094 OP_XORL,
3095 OP_CMPL,
3096};
5716833c 3097
7ad10968
HZ
3098struct i386_record_s
3099{
cf648174 3100 struct gdbarch *gdbarch;
7ad10968 3101 struct regcache *regcache;
df61f520 3102 CORE_ADDR orig_addr;
7ad10968
HZ
3103 CORE_ADDR addr;
3104 int aflag;
3105 int dflag;
3106 int override;
3107 uint8_t modrm;
3108 uint8_t mod, reg, rm;
3109 int ot;
cf648174
HZ
3110 uint8_t rex_x;
3111 uint8_t rex_b;
3112 int rip_offset;
3113 int popl_esp_hack;
3114 const int *regmap;
7ad10968 3115};
5716833c 3116
7ad10968
HZ
3117/* Parse "modrm" part in current memory address that irp->addr point to
3118 Return -1 if something wrong. */
5716833c 3119
7ad10968
HZ
3120static int
3121i386_record_modrm (struct i386_record_s *irp)
3122{
cf648174 3123 struct gdbarch *gdbarch = irp->gdbarch;
5af949e3 3124
7ad10968
HZ
3125 if (target_read_memory (irp->addr, &irp->modrm, 1))
3126 {
3127 if (record_debug)
3128 printf_unfiltered (_("Process record: error reading memory at "
5af949e3
UW
3129 "addr %s len = 1.\n"),
3130 paddress (gdbarch, irp->addr));
7ad10968
HZ
3131 return -1;
3132 }
3133 irp->addr++;
3134 irp->mod = (irp->modrm >> 6) & 3;
3135 irp->reg = (irp->modrm >> 3) & 7;
3136 irp->rm = irp->modrm & 7;
5716833c 3137
7ad10968
HZ
3138 return 0;
3139}
d2a7c97a 3140
7ad10968
HZ
3141/* Get the memory address that current instruction write to and set it to
3142 the argument "addr".
3143 Return -1 if something wrong. */
8201327c 3144
7ad10968 3145static int
cf648174 3146i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
7ad10968 3147{
cf648174 3148 struct gdbarch *gdbarch = irp->gdbarch;
60a1502a
MS
3149 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3150 gdb_byte buf[4];
3151 ULONGEST offset64;
21d0e8a4 3152
7ad10968
HZ
3153 *addr = 0;
3154 if (irp->aflag)
3155 {
3156 /* 32 bits */
3157 int havesib = 0;
3158 uint8_t scale = 0;
648d0c8b 3159 uint8_t byte;
7ad10968
HZ
3160 uint8_t index = 0;
3161 uint8_t base = irp->rm;
896fb97d 3162
7ad10968
HZ
3163 if (base == 4)
3164 {
3165 havesib = 1;
648d0c8b 3166 if (target_read_memory (irp->addr, &byte, 1))
7ad10968
HZ
3167 {
3168 if (record_debug)
3169 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3170 "at addr %s len = 1.\n"),
3171 paddress (gdbarch, irp->addr));
7ad10968
HZ
3172 return -1;
3173 }
3174 irp->addr++;
648d0c8b
MS
3175 scale = (byte >> 6) & 3;
3176 index = ((byte >> 3) & 7) | irp->rex_x;
3177 base = (byte & 7);
7ad10968 3178 }
cf648174 3179 base |= irp->rex_b;
21d0e8a4 3180
7ad10968
HZ
3181 switch (irp->mod)
3182 {
3183 case 0:
3184 if ((base & 7) == 5)
3185 {
3186 base = 0xff;
60a1502a 3187 if (target_read_memory (irp->addr, buf, 4))
7ad10968
HZ
3188 {
3189 if (record_debug)
3190 printf_unfiltered (_("Process record: error reading "
5af949e3
UW
3191 "memory at addr %s len = 4.\n"),
3192 paddress (gdbarch, irp->addr));
7ad10968
HZ
3193 return -1;
3194 }
3195 irp->addr += 4;
60a1502a 3196 *addr = extract_signed_integer (buf, 4, byte_order);
cf648174
HZ
3197 if (irp->regmap[X86_RECORD_R8_REGNUM] && !havesib)
3198 *addr += irp->addr + irp->rip_offset;
7ad10968 3199 }
7ad10968
HZ
3200 break;
3201 case 1:
60a1502a 3202 if (target_read_memory (irp->addr, buf, 1))
7ad10968
HZ
3203 {
3204 if (record_debug)
3205 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3206 "at addr %s len = 1.\n"),
3207 paddress (gdbarch, irp->addr));
7ad10968
HZ
3208 return -1;
3209 }
3210 irp->addr++;
60a1502a 3211 *addr = (int8_t) buf[0];
7ad10968
HZ
3212 break;
3213 case 2:
60a1502a 3214 if (target_read_memory (irp->addr, buf, 4))
7ad10968
HZ
3215 {
3216 if (record_debug)
3217 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3218 "at addr %s len = 4.\n"),
3219 paddress (gdbarch, irp->addr));
7ad10968
HZ
3220 return -1;
3221 }
60a1502a 3222 *addr = extract_signed_integer (buf, 4, byte_order);
7ad10968
HZ
3223 irp->addr += 4;
3224 break;
3225 }
356a6b3e 3226
60a1502a 3227 offset64 = 0;
7ad10968 3228 if (base != 0xff)
cf648174
HZ
3229 {
3230 if (base == 4 && irp->popl_esp_hack)
3231 *addr += irp->popl_esp_hack;
3232 regcache_raw_read_unsigned (irp->regcache, irp->regmap[base],
60a1502a 3233 &offset64);
7ad10968 3234 }
cf648174
HZ
3235 if (irp->aflag == 2)
3236 {
60a1502a 3237 *addr += offset64;
cf648174
HZ
3238 }
3239 else
60a1502a 3240 *addr = (uint32_t) (offset64 + *addr);
c4fc7f1b 3241
7ad10968
HZ
3242 if (havesib && (index != 4 || scale != 0))
3243 {
cf648174 3244 regcache_raw_read_unsigned (irp->regcache, irp->regmap[index],
60a1502a 3245 &offset64);
cf648174 3246 if (irp->aflag == 2)
60a1502a 3247 *addr += offset64 << scale;
cf648174 3248 else
60a1502a 3249 *addr = (uint32_t) (*addr + (offset64 << scale));
7ad10968
HZ
3250 }
3251 }
3252 else
3253 {
3254 /* 16 bits */
3255 switch (irp->mod)
3256 {
3257 case 0:
3258 if (irp->rm == 6)
3259 {
60a1502a 3260 if (target_read_memory (irp->addr, buf, 2))
7ad10968
HZ
3261 {
3262 if (record_debug)
3263 printf_unfiltered (_("Process record: error reading "
5af949e3
UW
3264 "memory at addr %s len = 2.\n"),
3265 paddress (gdbarch, irp->addr));
7ad10968
HZ
3266 return -1;
3267 }
3268 irp->addr += 2;
60a1502a 3269 *addr = extract_signed_integer (buf, 2, byte_order);
7ad10968
HZ
3270 irp->rm = 0;
3271 goto no_rm;
3272 }
7ad10968
HZ
3273 break;
3274 case 1:
60a1502a 3275 if (target_read_memory (irp->addr, buf, 1))
7ad10968
HZ
3276 {
3277 if (record_debug)
3278 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3279 "at addr %s len = 1.\n"),
3280 paddress (gdbarch, irp->addr));
7ad10968
HZ
3281 return -1;
3282 }
3283 irp->addr++;
60a1502a 3284 *addr = (int8_t) buf[0];
7ad10968
HZ
3285 break;
3286 case 2:
60a1502a 3287 if (target_read_memory (irp->addr, buf, 2))
7ad10968
HZ
3288 {
3289 if (record_debug)
3290 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3291 "at addr %s len = 2.\n"),
3292 paddress (gdbarch, irp->addr));
7ad10968
HZ
3293 return -1;
3294 }
3295 irp->addr += 2;
60a1502a 3296 *addr = extract_signed_integer (buf, 2, byte_order);
7ad10968
HZ
3297 break;
3298 }
c4fc7f1b 3299
7ad10968
HZ
3300 switch (irp->rm)
3301 {
3302 case 0:
cf648174
HZ
3303 regcache_raw_read_unsigned (irp->regcache,
3304 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
3305 &offset64);
3306 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3307 regcache_raw_read_unsigned (irp->regcache,
3308 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
3309 &offset64);
3310 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3311 break;
3312 case 1:
cf648174
HZ
3313 regcache_raw_read_unsigned (irp->regcache,
3314 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
3315 &offset64);
3316 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3317 regcache_raw_read_unsigned (irp->regcache,
3318 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
3319 &offset64);
3320 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3321 break;
3322 case 2:
cf648174
HZ
3323 regcache_raw_read_unsigned (irp->regcache,
3324 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
3325 &offset64);
3326 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3327 regcache_raw_read_unsigned (irp->regcache,
3328 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
3329 &offset64);
3330 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3331 break;
3332 case 3:
cf648174
HZ
3333 regcache_raw_read_unsigned (irp->regcache,
3334 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
3335 &offset64);
3336 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3337 regcache_raw_read_unsigned (irp->regcache,
3338 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
3339 &offset64);
3340 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3341 break;
3342 case 4:
cf648174
HZ
3343 regcache_raw_read_unsigned (irp->regcache,
3344 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
3345 &offset64);
3346 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3347 break;
3348 case 5:
cf648174
HZ
3349 regcache_raw_read_unsigned (irp->regcache,
3350 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
3351 &offset64);
3352 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3353 break;
3354 case 6:
cf648174
HZ
3355 regcache_raw_read_unsigned (irp->regcache,
3356 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
3357 &offset64);
3358 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3359 break;
3360 case 7:
cf648174
HZ
3361 regcache_raw_read_unsigned (irp->regcache,
3362 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
3363 &offset64);
3364 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3365 break;
3366 }
3367 *addr &= 0xffff;
3368 }
c4fc7f1b 3369
01fe1b41 3370 no_rm:
7ad10968
HZ
3371 return 0;
3372}
c4fc7f1b 3373
7ad10968
HZ
3374/* Record the value of the memory that willbe changed in current instruction
3375 to "record_arch_list".
3376 Return -1 if something wrong. */
356a6b3e 3377
7ad10968
HZ
3378static int
3379i386_record_lea_modrm (struct i386_record_s *irp)
3380{
cf648174
HZ
3381 struct gdbarch *gdbarch = irp->gdbarch;
3382 uint64_t addr;
356a6b3e 3383
d7877f7e 3384 if (irp->override >= 0)
7ad10968 3385 {
df61f520
HZ
3386 warning (_("Process record ignores the memory change "
3387 "of instruction at address %s because it "
3388 "can't get the value of the segment register."),
3389 paddress (gdbarch, irp->orig_addr));
7ad10968
HZ
3390 return 0;
3391 }
61113f8b 3392
7ad10968
HZ
3393 if (i386_record_lea_modrm_addr (irp, &addr))
3394 return -1;
96297dab 3395
7ad10968
HZ
3396 if (record_arch_list_add_mem (addr, 1 << irp->ot))
3397 return -1;
a62cc96e 3398
7ad10968
HZ
3399 return 0;
3400}
b6197528 3401
cf648174
HZ
3402/* Record the push operation to "record_arch_list".
3403 Return -1 if something wrong. */
3404
3405static int
3406i386_record_push (struct i386_record_s *irp, int size)
3407{
648d0c8b 3408 ULONGEST addr;
cf648174
HZ
3409
3410 if (record_arch_list_add_reg (irp->regcache,
3411 irp->regmap[X86_RECORD_RESP_REGNUM]))
3412 return -1;
3413 regcache_raw_read_unsigned (irp->regcache,
3414 irp->regmap[X86_RECORD_RESP_REGNUM],
648d0c8b
MS
3415 &addr);
3416 if (record_arch_list_add_mem ((CORE_ADDR) addr - size, size))
cf648174
HZ
3417 return -1;
3418
3419 return 0;
3420}
3421
0289bdd7
MS
3422
3423/* Defines contents to record. */
3424#define I386_SAVE_FPU_REGS 0xfffd
3425#define I386_SAVE_FPU_ENV 0xfffe
3426#define I386_SAVE_FPU_ENV_REG_STACK 0xffff
3427
3428/* Record the value of floating point registers which will be changed by the
3429 current instruction to "record_arch_list". Return -1 if something is wrong.
3430*/
3431
3432static int i386_record_floats (struct gdbarch *gdbarch,
3433 struct i386_record_s *ir,
3434 uint32_t iregnum)
3435{
3436 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3437 int i;
3438
3439 /* Oza: Because of floating point insn push/pop of fpu stack is going to
3440 happen. Currently we store st0-st7 registers, but we need not store all
3441 registers all the time, in future we use ftag register and record only
3442 those who are not marked as an empty. */
3443
3444 if (I386_SAVE_FPU_REGS == iregnum)
3445 {
3446 for (i = I387_ST0_REGNUM (tdep); i <= I387_ST0_REGNUM (tdep) + 7; i++)
3447 {
3448 if (record_arch_list_add_reg (ir->regcache, i))
3449 return -1;
3450 }
3451 }
3452 else if (I386_SAVE_FPU_ENV == iregnum)
3453 {
3454 for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
3455 {
3456 if (record_arch_list_add_reg (ir->regcache, i))
3457 return -1;
3458 }
3459 }
3460 else if (I386_SAVE_FPU_ENV_REG_STACK == iregnum)
3461 {
3462 for (i = I387_ST0_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
3463 {
3464 if (record_arch_list_add_reg (ir->regcache, i))
3465 return -1;
3466 }
3467 }
3468 else if ((iregnum >= I387_ST0_REGNUM (tdep)) &&
3469 (iregnum <= I387_FOP_REGNUM (tdep)))
3470 {
3471 if (record_arch_list_add_reg (ir->regcache,iregnum))
3472 return -1;
3473 }
3474 else
3475 {
3476 /* Parameter error. */
3477 return -1;
3478 }
3479 if(I386_SAVE_FPU_ENV != iregnum)
3480 {
3481 for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
3482 {
3483 if (record_arch_list_add_reg (ir->regcache, i))
3484 return -1;
3485 }
3486 }
3487 return 0;
3488}
3489
7ad10968
HZ
3490/* Parse the current instruction and record the values of the registers and
3491 memory that will be changed in current instruction to "record_arch_list".
3492 Return -1 if something wrong. */
8201327c 3493
cf648174
HZ
3494#define I386_RECORD_ARCH_LIST_ADD_REG(regnum) \
3495 record_arch_list_add_reg (ir.regcache, ir.regmap[(regnum)])
3496
a6b808b4 3497int
7ad10968 3498i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
648d0c8b 3499 CORE_ADDR input_addr)
7ad10968 3500{
60a1502a 3501 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7ad10968 3502 int prefixes = 0;
580879fc 3503 int regnum = 0;
425b824a
MS
3504 uint32_t opcode;
3505 uint8_t opcode8;
648d0c8b 3506 ULONGEST addr;
60a1502a 3507 gdb_byte buf[MAX_REGISTER_SIZE];
7ad10968 3508 struct i386_record_s ir;
0289bdd7 3509 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
cf648174
HZ
3510 int rex = 0;
3511 uint8_t rex_w = -1;
3512 uint8_t rex_r = 0;
7ad10968 3513
8408d274 3514 memset (&ir, 0, sizeof (struct i386_record_s));
7ad10968 3515 ir.regcache = regcache;
648d0c8b
MS
3516 ir.addr = input_addr;
3517 ir.orig_addr = input_addr;
7ad10968
HZ
3518 ir.aflag = 1;
3519 ir.dflag = 1;
cf648174
HZ
3520 ir.override = -1;
3521 ir.popl_esp_hack = 0;
a3c4230a 3522 ir.regmap = tdep->record_regmap;
cf648174 3523 ir.gdbarch = gdbarch;
7ad10968
HZ
3524
3525 if (record_debug > 1)
3526 fprintf_unfiltered (gdb_stdlog, "Process record: i386_process_record "
5af949e3
UW
3527 "addr = %s\n",
3528 paddress (gdbarch, ir.addr));
7ad10968
HZ
3529
3530 /* prefixes */
3531 while (1)
3532 {
425b824a 3533 if (target_read_memory (ir.addr, &opcode8, 1))
7ad10968
HZ
3534 {
3535 if (record_debug)
3536 printf_unfiltered (_("Process record: error reading memory at "
5af949e3
UW
3537 "addr %s len = 1.\n"),
3538 paddress (gdbarch, ir.addr));
7ad10968
HZ
3539 return -1;
3540 }
3541 ir.addr++;
425b824a 3542 switch (opcode8) /* Instruction prefixes */
7ad10968 3543 {
01fe1b41 3544 case REPE_PREFIX_OPCODE:
7ad10968
HZ
3545 prefixes |= PREFIX_REPZ;
3546 break;
01fe1b41 3547 case REPNE_PREFIX_OPCODE:
7ad10968
HZ
3548 prefixes |= PREFIX_REPNZ;
3549 break;
01fe1b41 3550 case LOCK_PREFIX_OPCODE:
7ad10968
HZ
3551 prefixes |= PREFIX_LOCK;
3552 break;
01fe1b41 3553 case CS_PREFIX_OPCODE:
cf648174 3554 ir.override = X86_RECORD_CS_REGNUM;
7ad10968 3555 break;
01fe1b41 3556 case SS_PREFIX_OPCODE:
cf648174 3557 ir.override = X86_RECORD_SS_REGNUM;
7ad10968 3558 break;
01fe1b41 3559 case DS_PREFIX_OPCODE:
cf648174 3560 ir.override = X86_RECORD_DS_REGNUM;
7ad10968 3561 break;
01fe1b41 3562 case ES_PREFIX_OPCODE:
cf648174 3563 ir.override = X86_RECORD_ES_REGNUM;
7ad10968 3564 break;
01fe1b41 3565 case FS_PREFIX_OPCODE:
cf648174 3566 ir.override = X86_RECORD_FS_REGNUM;
7ad10968 3567 break;
01fe1b41 3568 case GS_PREFIX_OPCODE:
cf648174 3569 ir.override = X86_RECORD_GS_REGNUM;
7ad10968 3570 break;
01fe1b41 3571 case DATA_PREFIX_OPCODE:
7ad10968
HZ
3572 prefixes |= PREFIX_DATA;
3573 break;
01fe1b41 3574 case ADDR_PREFIX_OPCODE:
7ad10968
HZ
3575 prefixes |= PREFIX_ADDR;
3576 break;
d691bec7
MS
3577 case 0x40: /* i386 inc %eax */
3578 case 0x41: /* i386 inc %ecx */
3579 case 0x42: /* i386 inc %edx */
3580 case 0x43: /* i386 inc %ebx */
3581 case 0x44: /* i386 inc %esp */
3582 case 0x45: /* i386 inc %ebp */
3583 case 0x46: /* i386 inc %esi */
3584 case 0x47: /* i386 inc %edi */
3585 case 0x48: /* i386 dec %eax */
3586 case 0x49: /* i386 dec %ecx */
3587 case 0x4a: /* i386 dec %edx */
3588 case 0x4b: /* i386 dec %ebx */
3589 case 0x4c: /* i386 dec %esp */
3590 case 0x4d: /* i386 dec %ebp */
3591 case 0x4e: /* i386 dec %esi */
3592 case 0x4f: /* i386 dec %edi */
3593 if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
cf648174
HZ
3594 {
3595 /* REX */
3596 rex = 1;
425b824a
MS
3597 rex_w = (opcode8 >> 3) & 1;
3598 rex_r = (opcode8 & 0x4) << 1;
3599 ir.rex_x = (opcode8 & 0x2) << 2;
3600 ir.rex_b = (opcode8 & 0x1) << 3;
cf648174 3601 }
d691bec7
MS
3602 else /* 32 bit target */
3603 goto out_prefixes;
cf648174 3604 break;
7ad10968
HZ
3605 default:
3606 goto out_prefixes;
3607 break;
3608 }
3609 }
01fe1b41 3610 out_prefixes:
cf648174
HZ
3611 if (ir.regmap[X86_RECORD_R8_REGNUM] && rex_w == 1)
3612 {
3613 ir.dflag = 2;
3614 }
3615 else
3616 {
3617 if (prefixes & PREFIX_DATA)
3618 ir.dflag ^= 1;
3619 }
7ad10968
HZ
3620 if (prefixes & PREFIX_ADDR)
3621 ir.aflag ^= 1;
cf648174
HZ
3622 else if (ir.regmap[X86_RECORD_R8_REGNUM])
3623 ir.aflag = 2;
7ad10968
HZ
3624
3625 /* now check op code */
425b824a 3626 opcode = (uint32_t) opcode8;
01fe1b41 3627 reswitch:
7ad10968
HZ
3628 switch (opcode)
3629 {
3630 case 0x0f:
425b824a 3631 if (target_read_memory (ir.addr, &opcode8, 1))
7ad10968
HZ
3632 {
3633 if (record_debug)
3634 printf_unfiltered (_("Process record: error reading memory at "
5af949e3
UW
3635 "addr %s len = 1.\n"),
3636 paddress (gdbarch, ir.addr));
7ad10968
HZ
3637 return -1;
3638 }
3639 ir.addr++;
a3c4230a 3640 opcode = (uint32_t) opcode8 | 0x0f00;
7ad10968
HZ
3641 goto reswitch;
3642 break;
93924b6b 3643
a38bba38 3644 case 0x00: /* arith & logic */
7ad10968
HZ
3645 case 0x01:
3646 case 0x02:
3647 case 0x03:
3648 case 0x04:
3649 case 0x05:
3650 case 0x08:
3651 case 0x09:
3652 case 0x0a:
3653 case 0x0b:
3654 case 0x0c:
3655 case 0x0d:
3656 case 0x10:
3657 case 0x11:
3658 case 0x12:
3659 case 0x13:
3660 case 0x14:
3661 case 0x15:
3662 case 0x18:
3663 case 0x19:
3664 case 0x1a:
3665 case 0x1b:
3666 case 0x1c:
3667 case 0x1d:
3668 case 0x20:
3669 case 0x21:
3670 case 0x22:
3671 case 0x23:
3672 case 0x24:
3673 case 0x25:
3674 case 0x28:
3675 case 0x29:
3676 case 0x2a:
3677 case 0x2b:
3678 case 0x2c:
3679 case 0x2d:
3680 case 0x30:
3681 case 0x31:
3682 case 0x32:
3683 case 0x33:
3684 case 0x34:
3685 case 0x35:
3686 case 0x38:
3687 case 0x39:
3688 case 0x3a:
3689 case 0x3b:
3690 case 0x3c:
3691 case 0x3d:
3692 if (((opcode >> 3) & 7) != OP_CMPL)
3693 {
3694 if ((opcode & 1) == 0)
3695 ir.ot = OT_BYTE;
3696 else
3697 ir.ot = ir.dflag + OT_WORD;
93924b6b 3698
7ad10968
HZ
3699 switch ((opcode >> 1) & 3)
3700 {
a38bba38 3701 case 0: /* OP Ev, Gv */
7ad10968
HZ
3702 if (i386_record_modrm (&ir))
3703 return -1;
3704 if (ir.mod != 3)
3705 {
3706 if (i386_record_lea_modrm (&ir))
3707 return -1;
3708 }
3709 else
3710 {
cf648174
HZ
3711 ir.rm |= ir.rex_b;
3712 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3713 ir.rm &= 0x3;
cf648174 3714 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
3715 }
3716 break;
a38bba38 3717 case 1: /* OP Gv, Ev */
7ad10968
HZ
3718 if (i386_record_modrm (&ir))
3719 return -1;
cf648174
HZ
3720 ir.reg |= rex_r;
3721 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3722 ir.reg &= 0x3;
cf648174 3723 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968 3724 break;
a38bba38 3725 case 2: /* OP A, Iv */
cf648174 3726 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
3727 break;
3728 }
3729 }
cf648174 3730 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3731 break;
42fdc8df 3732
a38bba38 3733 case 0x80: /* GRP1 */
7ad10968
HZ
3734 case 0x81:
3735 case 0x82:
3736 case 0x83:
3737 if (i386_record_modrm (&ir))
3738 return -1;
8201327c 3739
7ad10968
HZ
3740 if (ir.reg != OP_CMPL)
3741 {
3742 if ((opcode & 1) == 0)
3743 ir.ot = OT_BYTE;
3744 else
3745 ir.ot = ir.dflag + OT_WORD;
28fc6740 3746
7ad10968
HZ
3747 if (ir.mod != 3)
3748 {
cf648174
HZ
3749 if (opcode == 0x83)
3750 ir.rip_offset = 1;
3751 else
3752 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
7ad10968
HZ
3753 if (i386_record_lea_modrm (&ir))
3754 return -1;
3755 }
3756 else
cf648174 3757 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968 3758 }
cf648174 3759 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3760 break;
5e3397bb 3761
a38bba38 3762 case 0x40: /* inc */
7ad10968
HZ
3763 case 0x41:
3764 case 0x42:
3765 case 0x43:
3766 case 0x44:
3767 case 0x45:
3768 case 0x46:
3769 case 0x47:
a38bba38
MS
3770
3771 case 0x48: /* dec */
7ad10968
HZ
3772 case 0x49:
3773 case 0x4a:
3774 case 0x4b:
3775 case 0x4c:
3776 case 0x4d:
3777 case 0x4e:
3778 case 0x4f:
a38bba38 3779
cf648174
HZ
3780 I386_RECORD_ARCH_LIST_ADD_REG (opcode & 7);
3781 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3782 break;
acd5c798 3783
a38bba38 3784 case 0xf6: /* GRP3 */
7ad10968
HZ
3785 case 0xf7:
3786 if ((opcode & 1) == 0)
3787 ir.ot = OT_BYTE;
3788 else
3789 ir.ot = ir.dflag + OT_WORD;
3790 if (i386_record_modrm (&ir))
3791 return -1;
acd5c798 3792
cf648174
HZ
3793 if (ir.mod != 3 && ir.reg == 0)
3794 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
3795
7ad10968
HZ
3796 switch (ir.reg)
3797 {
a38bba38 3798 case 0: /* test */
cf648174 3799 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3800 break;
a38bba38
MS
3801 case 2: /* not */
3802 case 3: /* neg */
7ad10968
HZ
3803 if (ir.mod != 3)
3804 {
3805 if (i386_record_lea_modrm (&ir))
3806 return -1;
3807 }
3808 else
3809 {
cf648174
HZ
3810 ir.rm |= ir.rex_b;
3811 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3812 ir.rm &= 0x3;
cf648174 3813 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 3814 }
a38bba38 3815 if (ir.reg == 3) /* neg */
cf648174 3816 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3817 break;
a38bba38
MS
3818 case 4: /* mul */
3819 case 5: /* imul */
3820 case 6: /* div */
3821 case 7: /* idiv */
cf648174 3822 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968 3823 if (ir.ot != OT_BYTE)
cf648174
HZ
3824 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
3825 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3826 break;
3827 default:
3828 ir.addr -= 2;
3829 opcode = opcode << 8 | ir.modrm;
3830 goto no_support;
3831 break;
3832 }
3833 break;
3834
a38bba38
MS
3835 case 0xfe: /* GRP4 */
3836 case 0xff: /* GRP5 */
7ad10968
HZ
3837 if (i386_record_modrm (&ir))
3838 return -1;
3839 if (ir.reg >= 2 && opcode == 0xfe)
3840 {
3841 ir.addr -= 2;
3842 opcode = opcode << 8 | ir.modrm;
3843 goto no_support;
3844 }
7ad10968
HZ
3845 switch (ir.reg)
3846 {
a38bba38
MS
3847 case 0: /* inc */
3848 case 1: /* dec */
cf648174
HZ
3849 if ((opcode & 1) == 0)
3850 ir.ot = OT_BYTE;
3851 else
3852 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
3853 if (ir.mod != 3)
3854 {
3855 if (i386_record_lea_modrm (&ir))
3856 return -1;
3857 }
3858 else
3859 {
cf648174
HZ
3860 ir.rm |= ir.rex_b;
3861 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3862 ir.rm &= 0x3;
cf648174 3863 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 3864 }
cf648174 3865 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3866 break;
a38bba38 3867 case 2: /* call */
cf648174
HZ
3868 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
3869 ir.dflag = 2;
3870 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 3871 return -1;
cf648174 3872 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3873 break;
a38bba38 3874 case 3: /* lcall */
cf648174
HZ
3875 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
3876 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 3877 return -1;
cf648174 3878 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3879 break;
a38bba38
MS
3880 case 4: /* jmp */
3881 case 5: /* ljmp */
cf648174
HZ
3882 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
3883 break;
a38bba38 3884 case 6: /* push */
cf648174
HZ
3885 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
3886 ir.dflag = 2;
3887 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
3888 return -1;
7ad10968
HZ
3889 break;
3890 default:
3891 ir.addr -= 2;
3892 opcode = opcode << 8 | ir.modrm;
3893 goto no_support;
3894 break;
3895 }
3896 break;
3897
a38bba38 3898 case 0x84: /* test */
7ad10968
HZ
3899 case 0x85:
3900 case 0xa8:
3901 case 0xa9:
cf648174 3902 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3903 break;
3904
a38bba38 3905 case 0x98: /* CWDE/CBW */
cf648174 3906 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
3907 break;
3908
a38bba38 3909 case 0x99: /* CDQ/CWD */
cf648174
HZ
3910 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
3911 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
3912 break;
3913
a38bba38 3914 case 0x0faf: /* imul */
7ad10968
HZ
3915 case 0x69:
3916 case 0x6b:
3917 ir.ot = ir.dflag + OT_WORD;
3918 if (i386_record_modrm (&ir))
3919 return -1;
cf648174
HZ
3920 if (opcode == 0x69)
3921 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
3922 else if (opcode == 0x6b)
3923 ir.rip_offset = 1;
3924 ir.reg |= rex_r;
3925 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3926 ir.reg &= 0x3;
cf648174
HZ
3927 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
3928 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3929 break;
3930
a38bba38 3931 case 0x0fc0: /* xadd */
7ad10968
HZ
3932 case 0x0fc1:
3933 if ((opcode & 1) == 0)
3934 ir.ot = OT_BYTE;
3935 else
3936 ir.ot = ir.dflag + OT_WORD;
3937 if (i386_record_modrm (&ir))
3938 return -1;
cf648174 3939 ir.reg |= rex_r;
7ad10968
HZ
3940 if (ir.mod == 3)
3941 {
cf648174 3942 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3943 ir.reg &= 0x3;
cf648174
HZ
3944 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
3945 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3946 ir.rm &= 0x3;
cf648174 3947 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
3948 }
3949 else
3950 {
3951 if (i386_record_lea_modrm (&ir))
3952 return -1;
cf648174 3953 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3954 ir.reg &= 0x3;
cf648174 3955 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968 3956 }
cf648174 3957 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3958 break;
3959
a38bba38 3960 case 0x0fb0: /* cmpxchg */
7ad10968
HZ
3961 case 0x0fb1:
3962 if ((opcode & 1) == 0)
3963 ir.ot = OT_BYTE;
3964 else
3965 ir.ot = ir.dflag + OT_WORD;
3966 if (i386_record_modrm (&ir))
3967 return -1;
3968 if (ir.mod == 3)
3969 {
cf648174
HZ
3970 ir.reg |= rex_r;
3971 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
3972 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3973 ir.reg &= 0x3;
cf648174 3974 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
3975 }
3976 else
3977 {
cf648174 3978 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
3979 if (i386_record_lea_modrm (&ir))
3980 return -1;
3981 }
cf648174 3982 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3983 break;
3984
a38bba38 3985 case 0x0fc7: /* cmpxchg8b */
7ad10968
HZ
3986 if (i386_record_modrm (&ir))
3987 return -1;
3988 if (ir.mod == 3)
3989 {
3990 ir.addr -= 2;
3991 opcode = opcode << 8 | ir.modrm;
3992 goto no_support;
3993 }
cf648174
HZ
3994 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
3995 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
3996 if (i386_record_lea_modrm (&ir))
3997 return -1;
cf648174 3998 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3999 break;
4000
a38bba38 4001 case 0x50: /* push */
7ad10968
HZ
4002 case 0x51:
4003 case 0x52:
4004 case 0x53:
4005 case 0x54:
4006 case 0x55:
4007 case 0x56:
4008 case 0x57:
4009 case 0x68:
4010 case 0x6a:
cf648174
HZ
4011 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
4012 ir.dflag = 2;
4013 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
4014 return -1;
4015 break;
4016
a38bba38
MS
4017 case 0x06: /* push es */
4018 case 0x0e: /* push cs */
4019 case 0x16: /* push ss */
4020 case 0x1e: /* push ds */
cf648174
HZ
4021 if (ir.regmap[X86_RECORD_R8_REGNUM])
4022 {
4023 ir.addr -= 1;
4024 goto no_support;
4025 }
4026 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
4027 return -1;
4028 break;
4029
a38bba38
MS
4030 case 0x0fa0: /* push fs */
4031 case 0x0fa8: /* push gs */
cf648174
HZ
4032 if (ir.regmap[X86_RECORD_R8_REGNUM])
4033 {
4034 ir.addr -= 2;
4035 goto no_support;
4036 }
4037 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 4038 return -1;
cf648174
HZ
4039 break;
4040
a38bba38 4041 case 0x60: /* pusha */
cf648174
HZ
4042 if (ir.regmap[X86_RECORD_R8_REGNUM])
4043 {
4044 ir.addr -= 1;
4045 goto no_support;
4046 }
4047 if (i386_record_push (&ir, 1 << (ir.dflag + 4)))
7ad10968
HZ
4048 return -1;
4049 break;
4050
a38bba38 4051 case 0x58: /* pop */
7ad10968
HZ
4052 case 0x59:
4053 case 0x5a:
4054 case 0x5b:
4055 case 0x5c:
4056 case 0x5d:
4057 case 0x5e:
4058 case 0x5f:
cf648174
HZ
4059 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4060 I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
7ad10968
HZ
4061 break;
4062
a38bba38 4063 case 0x61: /* popa */
cf648174
HZ
4064 if (ir.regmap[X86_RECORD_R8_REGNUM])
4065 {
4066 ir.addr -= 1;
4067 goto no_support;
7ad10968 4068 }
425b824a
MS
4069 for (regnum = X86_RECORD_REAX_REGNUM;
4070 regnum <= X86_RECORD_REDI_REGNUM;
4071 regnum++)
4072 I386_RECORD_ARCH_LIST_ADD_REG (regnum);
7ad10968
HZ
4073 break;
4074
a38bba38 4075 case 0x8f: /* pop */
cf648174
HZ
4076 if (ir.regmap[X86_RECORD_R8_REGNUM])
4077 ir.ot = ir.dflag ? OT_QUAD : OT_WORD;
4078 else
4079 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4080 if (i386_record_modrm (&ir))
4081 return -1;
4082 if (ir.mod == 3)
cf648174 4083 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
4084 else
4085 {
cf648174 4086 ir.popl_esp_hack = 1 << ir.ot;
7ad10968
HZ
4087 if (i386_record_lea_modrm (&ir))
4088 return -1;
4089 }
cf648174 4090 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
7ad10968
HZ
4091 break;
4092
a38bba38 4093 case 0xc8: /* enter */
cf648174
HZ
4094 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
4095 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
4096 ir.dflag = 2;
4097 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968
HZ
4098 return -1;
4099 break;
4100
a38bba38 4101 case 0xc9: /* leave */
cf648174
HZ
4102 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4103 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
7ad10968
HZ
4104 break;
4105
a38bba38 4106 case 0x07: /* pop es */
cf648174
HZ
4107 if (ir.regmap[X86_RECORD_R8_REGNUM])
4108 {
4109 ir.addr -= 1;
4110 goto no_support;
4111 }
4112 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4113 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_ES_REGNUM);
4114 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4115 break;
4116
a38bba38 4117 case 0x17: /* pop ss */
cf648174
HZ
4118 if (ir.regmap[X86_RECORD_R8_REGNUM])
4119 {
4120 ir.addr -= 1;
4121 goto no_support;
4122 }
4123 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4124 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_SS_REGNUM);
4125 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4126 break;
4127
a38bba38 4128 case 0x1f: /* pop ds */
cf648174
HZ
4129 if (ir.regmap[X86_RECORD_R8_REGNUM])
4130 {
4131 ir.addr -= 1;
4132 goto no_support;
4133 }
4134 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4135 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_DS_REGNUM);
4136 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4137 break;
4138
a38bba38 4139 case 0x0fa1: /* pop fs */
cf648174
HZ
4140 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4141 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_FS_REGNUM);
4142 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4143 break;
4144
a38bba38 4145 case 0x0fa9: /* pop gs */
cf648174
HZ
4146 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4147 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
4148 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4149 break;
4150
a38bba38 4151 case 0x88: /* mov */
7ad10968
HZ
4152 case 0x89:
4153 case 0xc6:
4154 case 0xc7:
4155 if ((opcode & 1) == 0)
4156 ir.ot = OT_BYTE;
4157 else
4158 ir.ot = ir.dflag + OT_WORD;
4159
4160 if (i386_record_modrm (&ir))
4161 return -1;
4162
4163 if (ir.mod != 3)
4164 {
cf648174
HZ
4165 if (opcode == 0xc6 || opcode == 0xc7)
4166 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
7ad10968
HZ
4167 if (i386_record_lea_modrm (&ir))
4168 return -1;
4169 }
4170 else
4171 {
cf648174
HZ
4172 if (opcode == 0xc6 || opcode == 0xc7)
4173 ir.rm |= ir.rex_b;
4174 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4175 ir.rm &= 0x3;
cf648174 4176 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 4177 }
7ad10968 4178 break;
cf648174 4179
a38bba38 4180 case 0x8a: /* mov */
7ad10968
HZ
4181 case 0x8b:
4182 if ((opcode & 1) == 0)
4183 ir.ot = OT_BYTE;
4184 else
4185 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4186 if (i386_record_modrm (&ir))
4187 return -1;
cf648174
HZ
4188 ir.reg |= rex_r;
4189 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4190 ir.reg &= 0x3;
cf648174
HZ
4191 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
4192 break;
7ad10968 4193
a38bba38 4194 case 0x8c: /* mov seg */
cf648174 4195 if (i386_record_modrm (&ir))
7ad10968 4196 return -1;
cf648174
HZ
4197 if (ir.reg > 5)
4198 {
4199 ir.addr -= 2;
4200 opcode = opcode << 8 | ir.modrm;
4201 goto no_support;
4202 }
4203
4204 if (ir.mod == 3)
4205 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
4206 else
4207 {
4208 ir.ot = OT_WORD;
4209 if (i386_record_lea_modrm (&ir))
4210 return -1;
4211 }
7ad10968
HZ
4212 break;
4213
a38bba38 4214 case 0x8e: /* mov seg */
7ad10968
HZ
4215 if (i386_record_modrm (&ir))
4216 return -1;
7ad10968
HZ
4217 switch (ir.reg)
4218 {
4219 case 0:
425b824a 4220 regnum = X86_RECORD_ES_REGNUM;
7ad10968
HZ
4221 break;
4222 case 2:
425b824a 4223 regnum = X86_RECORD_SS_REGNUM;
7ad10968
HZ
4224 break;
4225 case 3:
425b824a 4226 regnum = X86_RECORD_DS_REGNUM;
7ad10968
HZ
4227 break;
4228 case 4:
425b824a 4229 regnum = X86_RECORD_FS_REGNUM;
7ad10968
HZ
4230 break;
4231 case 5:
425b824a 4232 regnum = X86_RECORD_GS_REGNUM;
7ad10968
HZ
4233 break;
4234 default:
4235 ir.addr -= 2;
4236 opcode = opcode << 8 | ir.modrm;
4237 goto no_support;
4238 break;
4239 }
425b824a 4240 I386_RECORD_ARCH_LIST_ADD_REG (regnum);
cf648174 4241 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4242 break;
4243
a38bba38
MS
4244 case 0x0fb6: /* movzbS */
4245 case 0x0fb7: /* movzwS */
4246 case 0x0fbe: /* movsbS */
4247 case 0x0fbf: /* movswS */
7ad10968
HZ
4248 if (i386_record_modrm (&ir))
4249 return -1;
cf648174 4250 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
7ad10968
HZ
4251 break;
4252
a38bba38 4253 case 0x8d: /* lea */
7ad10968
HZ
4254 if (i386_record_modrm (&ir))
4255 return -1;
4256 if (ir.mod == 3)
4257 {
4258 ir.addr -= 2;
4259 opcode = opcode << 8 | ir.modrm;
4260 goto no_support;
4261 }
7ad10968 4262 ir.ot = ir.dflag;
cf648174
HZ
4263 ir.reg |= rex_r;
4264 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4265 ir.reg &= 0x3;
cf648174 4266 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
4267 break;
4268
a38bba38 4269 case 0xa0: /* mov EAX */
7ad10968 4270 case 0xa1:
a38bba38
MS
4271
4272 case 0xd7: /* xlat */
cf648174 4273 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
4274 break;
4275
a38bba38 4276 case 0xa2: /* mov EAX */
7ad10968 4277 case 0xa3:
d7877f7e 4278 if (ir.override >= 0)
cf648174 4279 {
df61f520 4280 warning (_("Process record ignores the memory change "
926569ae 4281 "of instruction at address %s because "
df61f520
HZ
4282 "it can't get the value of the segment "
4283 "register."),
4284 paddress (gdbarch, ir.orig_addr));
cf648174
HZ
4285 }
4286 else
4287 {
4288 if ((opcode & 1) == 0)
4289 ir.ot = OT_BYTE;
4290 else
4291 ir.ot = ir.dflag + OT_WORD;
4292 if (ir.aflag == 2)
4293 {
60a1502a 4294 if (target_read_memory (ir.addr, buf, 8))
cf648174
HZ
4295 {
4296 if (record_debug)
4297 printf_unfiltered (_("Process record: error reading "
4298 "memory at addr 0x%s len = 8.\n"),
4299 paddress (gdbarch, ir.addr));
4300 return -1;
4301 }
4302 ir.addr += 8;
60a1502a 4303 addr = extract_unsigned_integer (buf, 8, byte_order);
cf648174
HZ
4304 }
4305 else if (ir.aflag)
4306 {
60a1502a 4307 if (target_read_memory (ir.addr, buf, 4))
cf648174
HZ
4308 {
4309 if (record_debug)
4310 printf_unfiltered (_("Process record: error reading "
4311 "memory at addr 0x%s len = 4.\n"),
4312 paddress (gdbarch, ir.addr));
4313 return -1;
4314 }
4315 ir.addr += 4;
60a1502a 4316 addr = extract_unsigned_integer (buf, 4, byte_order);
cf648174
HZ
4317 }
4318 else
4319 {
60a1502a 4320 if (target_read_memory (ir.addr, buf, 2))
cf648174
HZ
4321 {
4322 if (record_debug)
4323 printf_unfiltered (_("Process record: error reading "
4324 "memory at addr 0x%s len = 2.\n"),
4325 paddress (gdbarch, ir.addr));
4326 return -1;
4327 }
4328 ir.addr += 2;
60a1502a 4329 addr = extract_unsigned_integer (buf, 2, byte_order);
cf648174 4330 }
648d0c8b 4331 if (record_arch_list_add_mem (addr, 1 << ir.ot))
cf648174
HZ
4332 return -1;
4333 }
7ad10968
HZ
4334 break;
4335
a38bba38 4336 case 0xb0: /* mov R, Ib */
7ad10968
HZ
4337 case 0xb1:
4338 case 0xb2:
4339 case 0xb3:
4340 case 0xb4:
4341 case 0xb5:
4342 case 0xb6:
4343 case 0xb7:
cf648174
HZ
4344 I386_RECORD_ARCH_LIST_ADD_REG ((ir.regmap[X86_RECORD_R8_REGNUM])
4345 ? ((opcode & 0x7) | ir.rex_b)
4346 : ((opcode & 0x7) & 0x3));
7ad10968
HZ
4347 break;
4348
a38bba38 4349 case 0xb8: /* mov R, Iv */
7ad10968
HZ
4350 case 0xb9:
4351 case 0xba:
4352 case 0xbb:
4353 case 0xbc:
4354 case 0xbd:
4355 case 0xbe:
4356 case 0xbf:
cf648174 4357 I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
7ad10968
HZ
4358 break;
4359
a38bba38 4360 case 0x91: /* xchg R, EAX */
7ad10968
HZ
4361 case 0x92:
4362 case 0x93:
4363 case 0x94:
4364 case 0x95:
4365 case 0x96:
4366 case 0x97:
cf648174
HZ
4367 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
4368 I386_RECORD_ARCH_LIST_ADD_REG (opcode & 0x7);
7ad10968
HZ
4369 break;
4370
a38bba38 4371 case 0x86: /* xchg Ev, Gv */
7ad10968
HZ
4372 case 0x87:
4373 if ((opcode & 1) == 0)
4374 ir.ot = OT_BYTE;
4375 else
4376 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4377 if (i386_record_modrm (&ir))
4378 return -1;
7ad10968
HZ
4379 if (ir.mod == 3)
4380 {
86839d38 4381 ir.rm |= ir.rex_b;
cf648174
HZ
4382 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
4383 ir.rm &= 0x3;
4384 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
4385 }
4386 else
4387 {
4388 if (i386_record_lea_modrm (&ir))
4389 return -1;
4390 }
cf648174
HZ
4391 ir.reg |= rex_r;
4392 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4393 ir.reg &= 0x3;
cf648174 4394 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
4395 break;
4396
a38bba38
MS
4397 case 0xc4: /* les Gv */
4398 case 0xc5: /* lds Gv */
cf648174
HZ
4399 if (ir.regmap[X86_RECORD_R8_REGNUM])
4400 {
4401 ir.addr -= 1;
4402 goto no_support;
4403 }
a38bba38
MS
4404 case 0x0fb2: /* lss Gv */
4405 case 0x0fb4: /* lfs Gv */
4406 case 0x0fb5: /* lgs Gv */
7ad10968
HZ
4407 if (i386_record_modrm (&ir))
4408 return -1;
4409 if (ir.mod == 3)
4410 {
4411 if (opcode > 0xff)
4412 ir.addr -= 3;
4413 else
4414 ir.addr -= 2;
4415 opcode = opcode << 8 | ir.modrm;
4416 goto no_support;
4417 }
7ad10968
HZ
4418 switch (opcode)
4419 {
a38bba38 4420 case 0xc4: /* les Gv */
425b824a 4421 regnum = X86_RECORD_ES_REGNUM;
7ad10968 4422 break;
a38bba38 4423 case 0xc5: /* lds Gv */
425b824a 4424 regnum = X86_RECORD_DS_REGNUM;
7ad10968 4425 break;
a38bba38 4426 case 0x0fb2: /* lss Gv */
425b824a 4427 regnum = X86_RECORD_SS_REGNUM;
7ad10968 4428 break;
a38bba38 4429 case 0x0fb4: /* lfs Gv */
425b824a 4430 regnum = X86_RECORD_FS_REGNUM;
7ad10968 4431 break;
a38bba38 4432 case 0x0fb5: /* lgs Gv */
425b824a 4433 regnum = X86_RECORD_GS_REGNUM;
7ad10968
HZ
4434 break;
4435 }
425b824a 4436 I386_RECORD_ARCH_LIST_ADD_REG (regnum);
cf648174
HZ
4437 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
4438 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4439 break;
4440
a38bba38 4441 case 0xc0: /* shifts */
7ad10968
HZ
4442 case 0xc1:
4443 case 0xd0:
4444 case 0xd1:
4445 case 0xd2:
4446 case 0xd3:
4447 if ((opcode & 1) == 0)
4448 ir.ot = OT_BYTE;
4449 else
4450 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4451 if (i386_record_modrm (&ir))
4452 return -1;
7ad10968
HZ
4453 if (ir.mod != 3 && (opcode == 0xd2 || opcode == 0xd3))
4454 {
4455 if (i386_record_lea_modrm (&ir))
4456 return -1;
4457 }
4458 else
4459 {
cf648174
HZ
4460 ir.rm |= ir.rex_b;
4461 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4462 ir.rm &= 0x3;
cf648174 4463 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 4464 }
cf648174 4465 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4466 break;
4467
4468 case 0x0fa4:
4469 case 0x0fa5:
4470 case 0x0fac:
4471 case 0x0fad:
4472 if (i386_record_modrm (&ir))
4473 return -1;
4474 if (ir.mod == 3)
4475 {
4476 if (record_arch_list_add_reg (ir.regcache, ir.rm))
4477 return -1;
4478 }
4479 else
4480 {
4481 if (i386_record_lea_modrm (&ir))
4482 return -1;
4483 }
4484 break;
4485
a38bba38 4486 case 0xd8: /* Floats. */
7ad10968
HZ
4487 case 0xd9:
4488 case 0xda:
4489 case 0xdb:
4490 case 0xdc:
4491 case 0xdd:
4492 case 0xde:
4493 case 0xdf:
4494 if (i386_record_modrm (&ir))
4495 return -1;
4496 ir.reg |= ((opcode & 7) << 3);
4497 if (ir.mod != 3)
4498 {
0289bdd7 4499 /* Memory. */
955db0c0 4500 uint64_t addr64;
7ad10968 4501
955db0c0 4502 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968
HZ
4503 return -1;
4504 switch (ir.reg)
4505 {
7ad10968 4506 case 0x02:
0289bdd7
MS
4507 case 0x12:
4508 case 0x22:
4509 case 0x32:
4510 /* For fcom, ficom nothing to do. */
4511 break;
7ad10968 4512 case 0x03:
0289bdd7
MS
4513 case 0x13:
4514 case 0x23:
4515 case 0x33:
4516 /* For fcomp, ficomp pop FPU stack, store all. */
4517 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4518 return -1;
4519 break;
4520 case 0x00:
4521 case 0x01:
7ad10968
HZ
4522 case 0x04:
4523 case 0x05:
4524 case 0x06:
4525 case 0x07:
4526 case 0x10:
4527 case 0x11:
7ad10968
HZ
4528 case 0x14:
4529 case 0x15:
4530 case 0x16:
4531 case 0x17:
4532 case 0x20:
4533 case 0x21:
7ad10968
HZ
4534 case 0x24:
4535 case 0x25:
4536 case 0x26:
4537 case 0x27:
4538 case 0x30:
4539 case 0x31:
7ad10968
HZ
4540 case 0x34:
4541 case 0x35:
4542 case 0x36:
4543 case 0x37:
0289bdd7
MS
4544 /* For fadd, fmul, fsub, fsubr, fdiv, fdivr, fiadd, fimul,
4545 fisub, fisubr, fidiv, fidivr, modR/M.reg is an extension
4546 of code, always affects st(0) register. */
4547 if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
4548 return -1;
7ad10968
HZ
4549 break;
4550 case 0x08:
4551 case 0x0a:
4552 case 0x0b:
4553 case 0x18:
4554 case 0x19:
4555 case 0x1a:
4556 case 0x1b:
0289bdd7 4557 case 0x1d:
7ad10968
HZ
4558 case 0x28:
4559 case 0x29:
4560 case 0x2a:
4561 case 0x2b:
4562 case 0x38:
4563 case 0x39:
4564 case 0x3a:
4565 case 0x3b:
0289bdd7
MS
4566 case 0x3c:
4567 case 0x3d:
7ad10968
HZ
4568 switch (ir.reg & 7)
4569 {
4570 case 0:
0289bdd7
MS
4571 /* Handling fld, fild. */
4572 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4573 return -1;
7ad10968
HZ
4574 break;
4575 case 1:
4576 switch (ir.reg >> 4)
4577 {
4578 case 0:
955db0c0 4579 if (record_arch_list_add_mem (addr64, 4))
7ad10968
HZ
4580 return -1;
4581 break;
4582 case 2:
955db0c0 4583 if (record_arch_list_add_mem (addr64, 8))
7ad10968
HZ
4584 return -1;
4585 break;
4586 case 3:
0289bdd7 4587 break;
7ad10968 4588 default:
955db0c0 4589 if (record_arch_list_add_mem (addr64, 2))
7ad10968
HZ
4590 return -1;
4591 break;
4592 }
4593 break;
4594 default:
4595 switch (ir.reg >> 4)
4596 {
4597 case 0:
955db0c0 4598 if (record_arch_list_add_mem (addr64, 4))
0289bdd7
MS
4599 return -1;
4600 if (3 == (ir.reg & 7))
4601 {
4602 /* For fstp m32fp. */
4603 if (i386_record_floats (gdbarch, &ir,
4604 I386_SAVE_FPU_REGS))
4605 return -1;
4606 }
4607 break;
7ad10968 4608 case 1:
955db0c0 4609 if (record_arch_list_add_mem (addr64, 4))
7ad10968 4610 return -1;
0289bdd7
MS
4611 if ((3 == (ir.reg & 7))
4612 || (5 == (ir.reg & 7))
4613 || (7 == (ir.reg & 7)))
4614 {
4615 /* For fstp insn. */
4616 if (i386_record_floats (gdbarch, &ir,
4617 I386_SAVE_FPU_REGS))
4618 return -1;
4619 }
7ad10968
HZ
4620 break;
4621 case 2:
955db0c0 4622 if (record_arch_list_add_mem (addr64, 8))
7ad10968 4623 return -1;
0289bdd7
MS
4624 if (3 == (ir.reg & 7))
4625 {
4626 /* For fstp m64fp. */
4627 if (i386_record_floats (gdbarch, &ir,
4628 I386_SAVE_FPU_REGS))
4629 return -1;
4630 }
7ad10968
HZ
4631 break;
4632 case 3:
0289bdd7
MS
4633 if ((3 <= (ir.reg & 7)) && (6 <= (ir.reg & 7)))
4634 {
4635 /* For fistp, fbld, fild, fbstp. */
4636 if (i386_record_floats (gdbarch, &ir,
4637 I386_SAVE_FPU_REGS))
4638 return -1;
4639 }
4640 /* Fall through */
7ad10968 4641 default:
955db0c0 4642 if (record_arch_list_add_mem (addr64, 2))
7ad10968
HZ
4643 return -1;
4644 break;
4645 }
4646 break;
4647 }
4648 break;
4649 case 0x0c:
0289bdd7
MS
4650 /* Insn fldenv. */
4651 if (i386_record_floats (gdbarch, &ir,
4652 I386_SAVE_FPU_ENV_REG_STACK))
4653 return -1;
4654 break;
7ad10968 4655 case 0x0d:
0289bdd7
MS
4656 /* Insn fldcw. */
4657 if (i386_record_floats (gdbarch, &ir, I387_FCTRL_REGNUM (tdep)))
4658 return -1;
4659 break;
7ad10968 4660 case 0x2c:
0289bdd7
MS
4661 /* Insn frstor. */
4662 if (i386_record_floats (gdbarch, &ir,
4663 I386_SAVE_FPU_ENV_REG_STACK))
4664 return -1;
7ad10968
HZ
4665 break;
4666 case 0x0e:
4667 if (ir.dflag)
4668 {
955db0c0 4669 if (record_arch_list_add_mem (addr64, 28))
7ad10968
HZ
4670 return -1;
4671 }
4672 else
4673 {
955db0c0 4674 if (record_arch_list_add_mem (addr64, 14))
7ad10968
HZ
4675 return -1;
4676 }
4677 break;
4678 case 0x0f:
4679 case 0x2f:
955db0c0 4680 if (record_arch_list_add_mem (addr64, 2))
7ad10968 4681 return -1;
0289bdd7
MS
4682 /* Insn fstp, fbstp. */
4683 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4684 return -1;
7ad10968
HZ
4685 break;
4686 case 0x1f:
4687 case 0x3e:
955db0c0 4688 if (record_arch_list_add_mem (addr64, 10))
7ad10968
HZ
4689 return -1;
4690 break;
4691 case 0x2e:
4692 if (ir.dflag)
4693 {
955db0c0 4694 if (record_arch_list_add_mem (addr64, 28))
7ad10968 4695 return -1;
955db0c0 4696 addr64 += 28;
7ad10968
HZ
4697 }
4698 else
4699 {
955db0c0 4700 if (record_arch_list_add_mem (addr64, 14))
7ad10968 4701 return -1;
955db0c0 4702 addr64 += 14;
7ad10968 4703 }
955db0c0 4704 if (record_arch_list_add_mem (addr64, 80))
7ad10968 4705 return -1;
0289bdd7
MS
4706 /* Insn fsave. */
4707 if (i386_record_floats (gdbarch, &ir,
4708 I386_SAVE_FPU_ENV_REG_STACK))
4709 return -1;
7ad10968
HZ
4710 break;
4711 case 0x3f:
955db0c0 4712 if (record_arch_list_add_mem (addr64, 8))
7ad10968 4713 return -1;
0289bdd7
MS
4714 /* Insn fistp. */
4715 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4716 return -1;
7ad10968
HZ
4717 break;
4718 default:
4719 ir.addr -= 2;
4720 opcode = opcode << 8 | ir.modrm;
4721 goto no_support;
4722 break;
4723 }
4724 }
0289bdd7
MS
4725 /* Opcode is an extension of modR/M byte. */
4726 else
4727 {
4728 switch (opcode)
4729 {
4730 case 0xd8:
4731 if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
4732 return -1;
4733 break;
4734 case 0xd9:
4735 if (0x0c == (ir.modrm >> 4))
4736 {
4737 if ((ir.modrm & 0x0f) <= 7)
4738 {
4739 if (i386_record_floats (gdbarch, &ir,
4740 I386_SAVE_FPU_REGS))
4741 return -1;
4742 }
4743 else
4744 {
4745 if (i386_record_floats (gdbarch, &ir,
4746 I387_ST0_REGNUM (tdep)))
4747 return -1;
4748 /* If only st(0) is changing, then we have already
4749 recorded. */
4750 if ((ir.modrm & 0x0f) - 0x08)
4751 {
4752 if (i386_record_floats (gdbarch, &ir,
4753 I387_ST0_REGNUM (tdep) +
4754 ((ir.modrm & 0x0f) - 0x08)))
4755 return -1;
4756 }
4757 }
4758 }
4759 else
4760 {
4761 switch (ir.modrm)
4762 {
4763 case 0xe0:
4764 case 0xe1:
4765 case 0xf0:
4766 case 0xf5:
4767 case 0xf8:
4768 case 0xfa:
4769 case 0xfc:
4770 case 0xfe:
4771 case 0xff:
4772 if (i386_record_floats (gdbarch, &ir,
4773 I387_ST0_REGNUM (tdep)))
4774 return -1;
4775 break;
4776 case 0xf1:
4777 case 0xf2:
4778 case 0xf3:
4779 case 0xf4:
4780 case 0xf6:
4781 case 0xf7:
4782 case 0xe8:
4783 case 0xe9:
4784 case 0xea:
4785 case 0xeb:
4786 case 0xec:
4787 case 0xed:
4788 case 0xee:
4789 case 0xf9:
4790 case 0xfb:
4791 if (i386_record_floats (gdbarch, &ir,
4792 I386_SAVE_FPU_REGS))
4793 return -1;
4794 break;
4795 case 0xfd:
4796 if (i386_record_floats (gdbarch, &ir,
4797 I387_ST0_REGNUM (tdep)))
4798 return -1;
4799 if (i386_record_floats (gdbarch, &ir,
4800 I387_ST0_REGNUM (tdep) + 1))
4801 return -1;
4802 break;
4803 }
4804 }
4805 break;
4806 case 0xda:
4807 if (0xe9 == ir.modrm)
4808 {
4809 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4810 return -1;
4811 }
4812 else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
4813 {
4814 if (i386_record_floats (gdbarch, &ir,
4815 I387_ST0_REGNUM (tdep)))
4816 return -1;
4817 if (((ir.modrm & 0x0f) > 0) && ((ir.modrm & 0x0f) <= 7))
4818 {
4819 if (i386_record_floats (gdbarch, &ir,
4820 I387_ST0_REGNUM (tdep) +
4821 (ir.modrm & 0x0f)))
4822 return -1;
4823 }
4824 else if ((ir.modrm & 0x0f) - 0x08)
4825 {
4826 if (i386_record_floats (gdbarch, &ir,
4827 I387_ST0_REGNUM (tdep) +
4828 ((ir.modrm & 0x0f) - 0x08)))
4829 return -1;
4830 }
4831 }
4832 break;
4833 case 0xdb:
4834 if (0xe3 == ir.modrm)
4835 {
4836 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_ENV))
4837 return -1;
4838 }
4839 else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
4840 {
4841 if (i386_record_floats (gdbarch, &ir,
4842 I387_ST0_REGNUM (tdep)))
4843 return -1;
4844 if (((ir.modrm & 0x0f) > 0) && ((ir.modrm & 0x0f) <= 7))
4845 {
4846 if (i386_record_floats (gdbarch, &ir,
4847 I387_ST0_REGNUM (tdep) +
4848 (ir.modrm & 0x0f)))
4849 return -1;
4850 }
4851 else if ((ir.modrm & 0x0f) - 0x08)
4852 {
4853 if (i386_record_floats (gdbarch, &ir,
4854 I387_ST0_REGNUM (tdep) +
4855 ((ir.modrm & 0x0f) - 0x08)))
4856 return -1;
4857 }
4858 }
4859 break;
4860 case 0xdc:
4861 if ((0x0c == ir.modrm >> 4)
4862 || (0x0d == ir.modrm >> 4)
4863 || (0x0f == ir.modrm >> 4))
4864 {
4865 if ((ir.modrm & 0x0f) <= 7)
4866 {
4867 if (i386_record_floats (gdbarch, &ir,
4868 I387_ST0_REGNUM (tdep) +
4869 (ir.modrm & 0x0f)))
4870 return -1;
4871 }
4872 else
4873 {
4874 if (i386_record_floats (gdbarch, &ir,
4875 I387_ST0_REGNUM (tdep) +
4876 ((ir.modrm & 0x0f) - 0x08)))
4877 return -1;
4878 }
4879 }
4880 break;
4881 case 0xdd:
4882 if (0x0c == ir.modrm >> 4)
4883 {
4884 if (i386_record_floats (gdbarch, &ir,
4885 I387_FTAG_REGNUM (tdep)))
4886 return -1;
4887 }
4888 else if ((0x0d == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
4889 {
4890 if ((ir.modrm & 0x0f) <= 7)
4891 {
4892 if (i386_record_floats (gdbarch, &ir,
4893 I387_ST0_REGNUM (tdep) +
4894 (ir.modrm & 0x0f)))
4895 return -1;
4896 }
4897 else
4898 {
4899 if (i386_record_floats (gdbarch, &ir,
4900 I386_SAVE_FPU_REGS))
4901 return -1;
4902 }
4903 }
4904 break;
4905 case 0xde:
4906 if ((0x0c == ir.modrm >> 4)
4907 || (0x0e == ir.modrm >> 4)
4908 || (0x0f == ir.modrm >> 4)
4909 || (0xd9 == ir.modrm))
4910 {
4911 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4912 return -1;
4913 }
4914 break;
4915 case 0xdf:
4916 if (0xe0 == ir.modrm)
4917 {
4918 if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM))
4919 return -1;
4920 }
4921 else if ((0x0f == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
4922 {
4923 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4924 return -1;
4925 }
4926 break;
4927 }
4928 }
7ad10968 4929 break;
7ad10968 4930 /* string ops */
a38bba38 4931 case 0xa4: /* movsS */
7ad10968 4932 case 0xa5:
a38bba38 4933 case 0xaa: /* stosS */
7ad10968 4934 case 0xab:
a38bba38 4935 case 0x6c: /* insS */
7ad10968 4936 case 0x6d:
cf648174 4937 regcache_raw_read_unsigned (ir.regcache,
77d7dc92 4938 ir.regmap[X86_RECORD_RECX_REGNUM],
648d0c8b
MS
4939 &addr);
4940 if (addr)
cf648174 4941 {
77d7dc92
HZ
4942 ULONGEST es, ds;
4943
4944 if ((opcode & 1) == 0)
4945 ir.ot = OT_BYTE;
4946 else
4947 ir.ot = ir.dflag + OT_WORD;
cf648174
HZ
4948 regcache_raw_read_unsigned (ir.regcache,
4949 ir.regmap[X86_RECORD_REDI_REGNUM],
648d0c8b 4950 &addr);
77d7dc92 4951
d7877f7e
HZ
4952 regcache_raw_read_unsigned (ir.regcache,
4953 ir.regmap[X86_RECORD_ES_REGNUM],
4954 &es);
4955 regcache_raw_read_unsigned (ir.regcache,
4956 ir.regmap[X86_RECORD_DS_REGNUM],
4957 &ds);
4958 if (ir.aflag && (es != ds))
77d7dc92
HZ
4959 {
4960 /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
df61f520 4961 warning (_("Process record ignores the memory "
926569ae 4962 "change of instruction at address %s "
df61f520
HZ
4963 "because it can't get the value of the "
4964 "ES segment register."),
4965 paddress (gdbarch, ir.orig_addr));
4966 }
4967 else
4968 {
648d0c8b 4969 if (record_arch_list_add_mem (addr, 1 << ir.ot))
df61f520 4970 return -1;
77d7dc92
HZ
4971 }
4972
4973 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
4974 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
77d7dc92
HZ
4975 if (opcode == 0xa4 || opcode == 0xa5)
4976 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
4977 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
4978 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
4979 }
cf648174 4980 break;
7ad10968 4981
a38bba38 4982 case 0xa6: /* cmpsS */
cf648174
HZ
4983 case 0xa7:
4984 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
4985 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
4986 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
4987 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
4988 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4989 break;
4990
a38bba38 4991 case 0xac: /* lodsS */
7ad10968 4992 case 0xad:
cf648174
HZ
4993 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
4994 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
7ad10968 4995 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
cf648174
HZ
4996 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
4997 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4998 break;
4999
a38bba38 5000 case 0xae: /* scasS */
7ad10968 5001 case 0xaf:
cf648174 5002 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
7ad10968 5003 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
cf648174
HZ
5004 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5005 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5006 break;
5007
a38bba38 5008 case 0x6e: /* outsS */
cf648174
HZ
5009 case 0x6f:
5010 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
7ad10968 5011 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
cf648174
HZ
5012 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5013 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5014 break;
5015
a38bba38 5016 case 0xe4: /* port I/O */
7ad10968
HZ
5017 case 0xe5:
5018 case 0xec:
5019 case 0xed:
cf648174
HZ
5020 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5021 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5022 break;
5023
5024 case 0xe6:
5025 case 0xe7:
5026 case 0xee:
5027 case 0xef:
5028 break;
5029
5030 /* control */
a38bba38
MS
5031 case 0xc2: /* ret im */
5032 case 0xc3: /* ret */
cf648174
HZ
5033 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5034 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5035 break;
5036
a38bba38
MS
5037 case 0xca: /* lret im */
5038 case 0xcb: /* lret */
5039 case 0xcf: /* iret */
cf648174
HZ
5040 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
5041 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5042 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5043 break;
5044
a38bba38 5045 case 0xe8: /* call im */
cf648174
HZ
5046 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5047 ir.dflag = 2;
5048 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5049 return -1;
7ad10968
HZ
5050 break;
5051
a38bba38 5052 case 0x9a: /* lcall im */
cf648174
HZ
5053 if (ir.regmap[X86_RECORD_R8_REGNUM])
5054 {
5055 ir.addr -= 1;
5056 goto no_support;
5057 }
5058 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
5059 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5060 return -1;
7ad10968
HZ
5061 break;
5062
a38bba38
MS
5063 case 0xe9: /* jmp im */
5064 case 0xea: /* ljmp im */
5065 case 0xeb: /* jmp Jb */
5066 case 0x70: /* jcc Jb */
7ad10968
HZ
5067 case 0x71:
5068 case 0x72:
5069 case 0x73:
5070 case 0x74:
5071 case 0x75:
5072 case 0x76:
5073 case 0x77:
5074 case 0x78:
5075 case 0x79:
5076 case 0x7a:
5077 case 0x7b:
5078 case 0x7c:
5079 case 0x7d:
5080 case 0x7e:
5081 case 0x7f:
a38bba38 5082 case 0x0f80: /* jcc Jv */
7ad10968
HZ
5083 case 0x0f81:
5084 case 0x0f82:
5085 case 0x0f83:
5086 case 0x0f84:
5087 case 0x0f85:
5088 case 0x0f86:
5089 case 0x0f87:
5090 case 0x0f88:
5091 case 0x0f89:
5092 case 0x0f8a:
5093 case 0x0f8b:
5094 case 0x0f8c:
5095 case 0x0f8d:
5096 case 0x0f8e:
5097 case 0x0f8f:
5098 break;
5099
a38bba38 5100 case 0x0f90: /* setcc Gv */
7ad10968
HZ
5101 case 0x0f91:
5102 case 0x0f92:
5103 case 0x0f93:
5104 case 0x0f94:
5105 case 0x0f95:
5106 case 0x0f96:
5107 case 0x0f97:
5108 case 0x0f98:
5109 case 0x0f99:
5110 case 0x0f9a:
5111 case 0x0f9b:
5112 case 0x0f9c:
5113 case 0x0f9d:
5114 case 0x0f9e:
5115 case 0x0f9f:
cf648174 5116 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5117 ir.ot = OT_BYTE;
5118 if (i386_record_modrm (&ir))
5119 return -1;
5120 if (ir.mod == 3)
cf648174
HZ
5121 I386_RECORD_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
5122 : (ir.rm & 0x3));
7ad10968
HZ
5123 else
5124 {
5125 if (i386_record_lea_modrm (&ir))
5126 return -1;
5127 }
5128 break;
5129
a38bba38 5130 case 0x0f40: /* cmov Gv, Ev */
7ad10968
HZ
5131 case 0x0f41:
5132 case 0x0f42:
5133 case 0x0f43:
5134 case 0x0f44:
5135 case 0x0f45:
5136 case 0x0f46:
5137 case 0x0f47:
5138 case 0x0f48:
5139 case 0x0f49:
5140 case 0x0f4a:
5141 case 0x0f4b:
5142 case 0x0f4c:
5143 case 0x0f4d:
5144 case 0x0f4e:
5145 case 0x0f4f:
5146 if (i386_record_modrm (&ir))
5147 return -1;
cf648174 5148 ir.reg |= rex_r;
7ad10968
HZ
5149 if (ir.dflag == OT_BYTE)
5150 ir.reg &= 0x3;
cf648174 5151 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
5152 break;
5153
5154 /* flags */
a38bba38 5155 case 0x9c: /* pushf */
cf648174
HZ
5156 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5157 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5158 ir.dflag = 2;
5159 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5160 return -1;
7ad10968
HZ
5161 break;
5162
a38bba38 5163 case 0x9d: /* popf */
cf648174
HZ
5164 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5165 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5166 break;
5167
a38bba38 5168 case 0x9e: /* sahf */
cf648174
HZ
5169 if (ir.regmap[X86_RECORD_R8_REGNUM])
5170 {
5171 ir.addr -= 1;
5172 goto no_support;
5173 }
a38bba38
MS
5174 case 0xf5: /* cmc */
5175 case 0xf8: /* clc */
5176 case 0xf9: /* stc */
5177 case 0xfc: /* cld */
5178 case 0xfd: /* std */
cf648174 5179 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5180 break;
5181
a38bba38 5182 case 0x9f: /* lahf */
cf648174
HZ
5183 if (ir.regmap[X86_RECORD_R8_REGNUM])
5184 {
5185 ir.addr -= 1;
5186 goto no_support;
5187 }
5188 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5189 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5190 break;
5191
5192 /* bit operations */
a38bba38 5193 case 0x0fba: /* bt/bts/btr/btc Gv, im */
7ad10968
HZ
5194 ir.ot = ir.dflag + OT_WORD;
5195 if (i386_record_modrm (&ir))
5196 return -1;
5197 if (ir.reg < 4)
5198 {
cf648174 5199 ir.addr -= 2;
7ad10968
HZ
5200 opcode = opcode << 8 | ir.modrm;
5201 goto no_support;
5202 }
cf648174 5203 if (ir.reg != 4)
7ad10968 5204 {
cf648174
HZ
5205 if (ir.mod == 3)
5206 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5207 else
5208 {
cf648174 5209 if (i386_record_lea_modrm (&ir))
7ad10968
HZ
5210 return -1;
5211 }
5212 }
cf648174 5213 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5214 break;
5215
a38bba38 5216 case 0x0fa3: /* bt Gv, Ev */
cf648174
HZ
5217 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5218 break;
5219
a38bba38
MS
5220 case 0x0fab: /* bts */
5221 case 0x0fb3: /* btr */
5222 case 0x0fbb: /* btc */
cf648174
HZ
5223 ir.ot = ir.dflag + OT_WORD;
5224 if (i386_record_modrm (&ir))
5225 return -1;
5226 if (ir.mod == 3)
5227 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
5228 else
5229 {
955db0c0
MS
5230 uint64_t addr64;
5231 if (i386_record_lea_modrm_addr (&ir, &addr64))
cf648174
HZ
5232 return -1;
5233 regcache_raw_read_unsigned (ir.regcache,
5234 ir.regmap[ir.reg | rex_r],
648d0c8b 5235 &addr);
cf648174
HZ
5236 switch (ir.dflag)
5237 {
5238 case 0:
648d0c8b 5239 addr64 += ((int16_t) addr >> 4) << 4;
cf648174
HZ
5240 break;
5241 case 1:
648d0c8b 5242 addr64 += ((int32_t) addr >> 5) << 5;
cf648174
HZ
5243 break;
5244 case 2:
648d0c8b 5245 addr64 += ((int64_t) addr >> 6) << 6;
cf648174
HZ
5246 break;
5247 }
955db0c0 5248 if (record_arch_list_add_mem (addr64, 1 << ir.ot))
cf648174
HZ
5249 return -1;
5250 if (i386_record_lea_modrm (&ir))
5251 return -1;
5252 }
5253 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5254 break;
5255
a38bba38
MS
5256 case 0x0fbc: /* bsf */
5257 case 0x0fbd: /* bsr */
cf648174
HZ
5258 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
5259 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5260 break;
5261
5262 /* bcd */
a38bba38
MS
5263 case 0x27: /* daa */
5264 case 0x2f: /* das */
5265 case 0x37: /* aaa */
5266 case 0x3f: /* aas */
5267 case 0xd4: /* aam */
5268 case 0xd5: /* aad */
cf648174
HZ
5269 if (ir.regmap[X86_RECORD_R8_REGNUM])
5270 {
5271 ir.addr -= 1;
5272 goto no_support;
5273 }
5274 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5275 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5276 break;
5277
5278 /* misc */
a38bba38 5279 case 0x90: /* nop */
7ad10968
HZ
5280 if (prefixes & PREFIX_LOCK)
5281 {
5282 ir.addr -= 1;
5283 goto no_support;
5284 }
5285 break;
5286
a38bba38 5287 case 0x9b: /* fwait */
425b824a 5288 if (target_read_memory (ir.addr, &opcode8, 1))
0289bdd7
MS
5289 {
5290 if (record_debug)
5291 printf_unfiltered (_("Process record: error reading memory at "
5292 "addr 0x%s len = 1.\n"),
5293 paddress (gdbarch, ir.addr));
5294 return -1;
5295 }
425b824a 5296 opcode = (uint32_t) opcode8;
0289bdd7
MS
5297 ir.addr++;
5298 goto reswitch;
7ad10968
HZ
5299 break;
5300
7ad10968 5301 /* XXX */
a38bba38 5302 case 0xcc: /* int3 */
a3c4230a 5303 printf_unfiltered (_("Process record does not support instruction "
7ad10968
HZ
5304 "int3.\n"));
5305 ir.addr -= 1;
5306 goto no_support;
5307 break;
5308
7ad10968 5309 /* XXX */
a38bba38 5310 case 0xcd: /* int */
7ad10968
HZ
5311 {
5312 int ret;
425b824a
MS
5313 uint8_t interrupt;
5314 if (target_read_memory (ir.addr, &interrupt, 1))
7ad10968
HZ
5315 {
5316 if (record_debug)
5317 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
5318 "at addr %s len = 1.\n"),
5319 paddress (gdbarch, ir.addr));
7ad10968
HZ
5320 return -1;
5321 }
5322 ir.addr++;
425b824a 5323 if (interrupt != 0x80
a3c4230a 5324 || tdep->i386_intx80_record == NULL)
7ad10968 5325 {
a3c4230a 5326 printf_unfiltered (_("Process record does not support "
7ad10968 5327 "instruction int 0x%02x.\n"),
425b824a 5328 interrupt);
7ad10968
HZ
5329 ir.addr -= 2;
5330 goto no_support;
5331 }
a3c4230a 5332 ret = tdep->i386_intx80_record (ir.regcache);
7ad10968
HZ
5333 if (ret)
5334 return ret;
5335 }
5336 break;
5337
7ad10968 5338 /* XXX */
a38bba38 5339 case 0xce: /* into */
a3c4230a 5340 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5341 "instruction into.\n"));
5342 ir.addr -= 1;
5343 goto no_support;
5344 break;
5345
a38bba38
MS
5346 case 0xfa: /* cli */
5347 case 0xfb: /* sti */
7ad10968
HZ
5348 break;
5349
a38bba38 5350 case 0x62: /* bound */
a3c4230a 5351 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5352 "instruction bound.\n"));
5353 ir.addr -= 1;
5354 goto no_support;
5355 break;
5356
a38bba38 5357 case 0x0fc8: /* bswap reg */
7ad10968
HZ
5358 case 0x0fc9:
5359 case 0x0fca:
5360 case 0x0fcb:
5361 case 0x0fcc:
5362 case 0x0fcd:
5363 case 0x0fce:
5364 case 0x0fcf:
cf648174 5365 I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 7) | ir.rex_b);
7ad10968
HZ
5366 break;
5367
a38bba38 5368 case 0xd6: /* salc */
cf648174
HZ
5369 if (ir.regmap[X86_RECORD_R8_REGNUM])
5370 {
5371 ir.addr -= 1;
5372 goto no_support;
5373 }
5374 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5375 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5376 break;
5377
a38bba38
MS
5378 case 0xe0: /* loopnz */
5379 case 0xe1: /* loopz */
5380 case 0xe2: /* loop */
5381 case 0xe3: /* jecxz */
cf648174
HZ
5382 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5383 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5384 break;
5385
a38bba38 5386 case 0x0f30: /* wrmsr */
a3c4230a 5387 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5388 "instruction wrmsr.\n"));
5389 ir.addr -= 2;
5390 goto no_support;
5391 break;
5392
a38bba38 5393 case 0x0f32: /* rdmsr */
a3c4230a 5394 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5395 "instruction rdmsr.\n"));
5396 ir.addr -= 2;
5397 goto no_support;
5398 break;
5399
a38bba38 5400 case 0x0f31: /* rdtsc */
f8c4f480
HZ
5401 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5402 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
5403 break;
5404
a38bba38 5405 case 0x0f34: /* sysenter */
7ad10968
HZ
5406 {
5407 int ret;
cf648174
HZ
5408 if (ir.regmap[X86_RECORD_R8_REGNUM])
5409 {
5410 ir.addr -= 2;
5411 goto no_support;
5412 }
a3c4230a 5413 if (tdep->i386_sysenter_record == NULL)
7ad10968 5414 {
a3c4230a 5415 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5416 "instruction sysenter.\n"));
5417 ir.addr -= 2;
5418 goto no_support;
5419 }
a3c4230a 5420 ret = tdep->i386_sysenter_record (ir.regcache);
7ad10968
HZ
5421 if (ret)
5422 return ret;
5423 }
5424 break;
5425
a38bba38 5426 case 0x0f35: /* sysexit */
a3c4230a 5427 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5428 "instruction sysexit.\n"));
5429 ir.addr -= 2;
5430 goto no_support;
5431 break;
5432
a38bba38 5433 case 0x0f05: /* syscall */
cf648174
HZ
5434 {
5435 int ret;
a3c4230a 5436 if (tdep->i386_syscall_record == NULL)
cf648174 5437 {
a3c4230a 5438 printf_unfiltered (_("Process record does not support "
cf648174
HZ
5439 "instruction syscall.\n"));
5440 ir.addr -= 2;
5441 goto no_support;
5442 }
a3c4230a 5443 ret = tdep->i386_syscall_record (ir.regcache);
cf648174
HZ
5444 if (ret)
5445 return ret;
5446 }
5447 break;
5448
a38bba38 5449 case 0x0f07: /* sysret */
a3c4230a 5450 printf_unfiltered (_("Process record does not support "
cf648174
HZ
5451 "instruction sysret.\n"));
5452 ir.addr -= 2;
5453 goto no_support;
5454 break;
5455
a38bba38 5456 case 0x0fa2: /* cpuid */
cf648174
HZ
5457 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5458 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5459 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
5460 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
7ad10968
HZ
5461 break;
5462
a38bba38 5463 case 0xf4: /* hlt */
a3c4230a 5464 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5465 "instruction hlt.\n"));
5466 ir.addr -= 1;
5467 goto no_support;
5468 break;
5469
5470 case 0x0f00:
5471 if (i386_record_modrm (&ir))
5472 return -1;
5473 switch (ir.reg)
5474 {
a38bba38
MS
5475 case 0: /* sldt */
5476 case 1: /* str */
7ad10968 5477 if (ir.mod == 3)
cf648174 5478 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5479 else
5480 {
5481 ir.ot = OT_WORD;
5482 if (i386_record_lea_modrm (&ir))
5483 return -1;
5484 }
5485 break;
a38bba38
MS
5486 case 2: /* lldt */
5487 case 3: /* ltr */
7ad10968 5488 break;
a38bba38
MS
5489 case 4: /* verr */
5490 case 5: /* verw */
cf648174 5491 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5492 break;
5493 default:
5494 ir.addr -= 3;
5495 opcode = opcode << 8 | ir.modrm;
5496 goto no_support;
5497 break;
5498 }
5499 break;
5500
5501 case 0x0f01:
5502 if (i386_record_modrm (&ir))
5503 return -1;
5504 switch (ir.reg)
5505 {
a38bba38 5506 case 0: /* sgdt */
7ad10968 5507 {
955db0c0 5508 uint64_t addr64;
7ad10968
HZ
5509
5510 if (ir.mod == 3)
5511 {
5512 ir.addr -= 3;
5513 opcode = opcode << 8 | ir.modrm;
5514 goto no_support;
5515 }
d7877f7e 5516 if (ir.override >= 0)
7ad10968 5517 {
df61f520
HZ
5518 warning (_("Process record ignores the memory "
5519 "change of instruction at "
5520 "address %s because it can't get "
5521 "the value of the segment "
5522 "register."),
5523 paddress (gdbarch, ir.orig_addr));
7ad10968
HZ
5524 }
5525 else
5526 {
955db0c0 5527 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968 5528 return -1;
955db0c0 5529 if (record_arch_list_add_mem (addr64, 2))
7ad10968 5530 return -1;
955db0c0 5531 addr64 += 2;
cf648174
HZ
5532 if (ir.regmap[X86_RECORD_R8_REGNUM])
5533 {
955db0c0 5534 if (record_arch_list_add_mem (addr64, 8))
cf648174
HZ
5535 return -1;
5536 }
5537 else
5538 {
955db0c0 5539 if (record_arch_list_add_mem (addr64, 4))
cf648174
HZ
5540 return -1;
5541 }
7ad10968
HZ
5542 }
5543 }
5544 break;
5545 case 1:
5546 if (ir.mod == 3)
5547 {
5548 switch (ir.rm)
5549 {
a38bba38 5550 case 0: /* monitor */
7ad10968 5551 break;
a38bba38 5552 case 1: /* mwait */
cf648174 5553 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5554 break;
5555 default:
5556 ir.addr -= 3;
5557 opcode = opcode << 8 | ir.modrm;
5558 goto no_support;
5559 break;
5560 }
5561 }
5562 else
5563 {
5564 /* sidt */
d7877f7e 5565 if (ir.override >= 0)
7ad10968 5566 {
df61f520
HZ
5567 warning (_("Process record ignores the memory "
5568 "change of instruction at "
5569 "address %s because it can't get "
5570 "the value of the segment "
5571 "register."),
5572 paddress (gdbarch, ir.orig_addr));
7ad10968
HZ
5573 }
5574 else
5575 {
955db0c0 5576 uint64_t addr64;
7ad10968 5577
955db0c0 5578 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968 5579 return -1;
955db0c0 5580 if (record_arch_list_add_mem (addr64, 2))
7ad10968 5581 return -1;
955db0c0 5582 addr64 += 2;
cf648174
HZ
5583 if (ir.regmap[X86_RECORD_R8_REGNUM])
5584 {
955db0c0 5585 if (record_arch_list_add_mem (addr64, 8))
cf648174
HZ
5586 return -1;
5587 }
5588 else
5589 {
955db0c0 5590 if (record_arch_list_add_mem (addr64, 4))
cf648174
HZ
5591 return -1;
5592 }
7ad10968
HZ
5593 }
5594 }
5595 break;
a38bba38 5596 case 2: /* lgdt */
3800e645
MS
5597 if (ir.mod == 3)
5598 {
5599 /* xgetbv */
5600 if (ir.rm == 0)
5601 {
5602 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5603 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
5604 break;
5605 }
5606 /* xsetbv */
5607 else if (ir.rm == 1)
5608 break;
5609 }
a38bba38 5610 case 3: /* lidt */
7ad10968
HZ
5611 if (ir.mod == 3)
5612 {
5613 ir.addr -= 3;
5614 opcode = opcode << 8 | ir.modrm;
5615 goto no_support;
5616 }
5617 break;
a38bba38 5618 case 4: /* smsw */
7ad10968
HZ
5619 if (ir.mod == 3)
5620 {
cf648174 5621 if (record_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b))
7ad10968
HZ
5622 return -1;
5623 }
5624 else
5625 {
5626 ir.ot = OT_WORD;
5627 if (i386_record_lea_modrm (&ir))
5628 return -1;
5629 }
cf648174 5630 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5631 break;
a38bba38 5632 case 6: /* lmsw */
cf648174
HZ
5633 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5634 break;
a38bba38 5635 case 7: /* invlpg */
cf648174
HZ
5636 if (ir.mod == 3)
5637 {
5638 if (ir.rm == 0 && ir.regmap[X86_RECORD_R8_REGNUM])
5639 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
5640 else
5641 {
5642 ir.addr -= 3;
5643 opcode = opcode << 8 | ir.modrm;
5644 goto no_support;
5645 }
5646 }
5647 else
5648 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5649 break;
5650 default:
5651 ir.addr -= 3;
5652 opcode = opcode << 8 | ir.modrm;
5653 goto no_support;
7ad10968
HZ
5654 break;
5655 }
5656 break;
5657
a38bba38
MS
5658 case 0x0f08: /* invd */
5659 case 0x0f09: /* wbinvd */
7ad10968
HZ
5660 break;
5661
a38bba38 5662 case 0x63: /* arpl */
7ad10968
HZ
5663 if (i386_record_modrm (&ir))
5664 return -1;
cf648174
HZ
5665 if (ir.mod == 3 || ir.regmap[X86_RECORD_R8_REGNUM])
5666 {
5667 I386_RECORD_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
5668 ? (ir.reg | rex_r) : ir.rm);
5669 }
7ad10968 5670 else
cf648174
HZ
5671 {
5672 ir.ot = ir.dflag ? OT_LONG : OT_WORD;
5673 if (i386_record_lea_modrm (&ir))
5674 return -1;
5675 }
5676 if (!ir.regmap[X86_RECORD_R8_REGNUM])
5677 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5678 break;
5679
a38bba38
MS
5680 case 0x0f02: /* lar */
5681 case 0x0f03: /* lsl */
7ad10968
HZ
5682 if (i386_record_modrm (&ir))
5683 return -1;
cf648174
HZ
5684 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
5685 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5686 break;
5687
5688 case 0x0f18:
cf648174
HZ
5689 if (i386_record_modrm (&ir))
5690 return -1;
5691 if (ir.mod == 3 && ir.reg == 3)
5692 {
5693 ir.addr -= 3;
5694 opcode = opcode << 8 | ir.modrm;
5695 goto no_support;
5696 }
7ad10968
HZ
5697 break;
5698
7ad10968
HZ
5699 case 0x0f19:
5700 case 0x0f1a:
5701 case 0x0f1b:
5702 case 0x0f1c:
5703 case 0x0f1d:
5704 case 0x0f1e:
5705 case 0x0f1f:
a38bba38 5706 /* nop (multi byte) */
7ad10968
HZ
5707 break;
5708
a38bba38
MS
5709 case 0x0f20: /* mov reg, crN */
5710 case 0x0f22: /* mov crN, reg */
7ad10968
HZ
5711 if (i386_record_modrm (&ir))
5712 return -1;
5713 if ((ir.modrm & 0xc0) != 0xc0)
5714 {
cf648174 5715 ir.addr -= 3;
7ad10968
HZ
5716 opcode = opcode << 8 | ir.modrm;
5717 goto no_support;
5718 }
5719 switch (ir.reg)
5720 {
5721 case 0:
5722 case 2:
5723 case 3:
5724 case 4:
5725 case 8:
5726 if (opcode & 2)
cf648174 5727 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5728 else
cf648174 5729 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5730 break;
5731 default:
cf648174 5732 ir.addr -= 3;
7ad10968
HZ
5733 opcode = opcode << 8 | ir.modrm;
5734 goto no_support;
5735 break;
5736 }
5737 break;
5738
a38bba38
MS
5739 case 0x0f21: /* mov reg, drN */
5740 case 0x0f23: /* mov drN, reg */
7ad10968
HZ
5741 if (i386_record_modrm (&ir))
5742 return -1;
5743 if ((ir.modrm & 0xc0) != 0xc0 || ir.reg == 4
5744 || ir.reg == 5 || ir.reg >= 8)
5745 {
cf648174 5746 ir.addr -= 3;
7ad10968
HZ
5747 opcode = opcode << 8 | ir.modrm;
5748 goto no_support;
5749 }
5750 if (opcode & 2)
cf648174 5751 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5752 else
cf648174 5753 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5754 break;
5755
a38bba38 5756 case 0x0f06: /* clts */
cf648174 5757 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5758 break;
5759
a3c4230a
HZ
5760 /* MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 */
5761
5762 case 0x0f0d: /* 3DNow! prefetch */
5763 break;
5764
5765 case 0x0f0e: /* 3DNow! femms */
5766 case 0x0f77: /* emms */
5767 if (i386_fpc_regnum_p (gdbarch, I387_FTAG_REGNUM(tdep)))
5768 goto no_support;
5769 record_arch_list_add_reg (ir.regcache, I387_FTAG_REGNUM(tdep));
5770 break;
5771
5772 case 0x0f0f: /* 3DNow! data */
5773 if (i386_record_modrm (&ir))
5774 return -1;
5775 if (target_read_memory (ir.addr, &opcode8, 1))
5776 {
5777 printf_unfiltered (_("Process record: error reading memory at "
5778 "addr %s len = 1.\n"),
5779 paddress (gdbarch, ir.addr));
5780 return -1;
5781 }
5782 ir.addr++;
5783 switch (opcode8)
5784 {
5785 case 0x0c: /* 3DNow! pi2fw */
5786 case 0x0d: /* 3DNow! pi2fd */
5787 case 0x1c: /* 3DNow! pf2iw */
5788 case 0x1d: /* 3DNow! pf2id */
5789 case 0x8a: /* 3DNow! pfnacc */
5790 case 0x8e: /* 3DNow! pfpnacc */
5791 case 0x90: /* 3DNow! pfcmpge */
5792 case 0x94: /* 3DNow! pfmin */
5793 case 0x96: /* 3DNow! pfrcp */
5794 case 0x97: /* 3DNow! pfrsqrt */
5795 case 0x9a: /* 3DNow! pfsub */
5796 case 0x9e: /* 3DNow! pfadd */
5797 case 0xa0: /* 3DNow! pfcmpgt */
5798 case 0xa4: /* 3DNow! pfmax */
5799 case 0xa6: /* 3DNow! pfrcpit1 */
5800 case 0xa7: /* 3DNow! pfrsqit1 */
5801 case 0xaa: /* 3DNow! pfsubr */
5802 case 0xae: /* 3DNow! pfacc */
5803 case 0xb0: /* 3DNow! pfcmpeq */
5804 case 0xb4: /* 3DNow! pfmul */
5805 case 0xb6: /* 3DNow! pfrcpit2 */
5806 case 0xb7: /* 3DNow! pmulhrw */
5807 case 0xbb: /* 3DNow! pswapd */
5808 case 0xbf: /* 3DNow! pavgusb */
5809 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
5810 goto no_support_3dnow_data;
5811 record_arch_list_add_reg (ir.regcache, ir.reg);
5812 break;
5813
5814 default:
5815no_support_3dnow_data:
5816 opcode = (opcode << 8) | opcode8;
5817 goto no_support;
5818 break;
5819 }
5820 break;
5821
5822 case 0x0faa: /* rsm */
5823 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5824 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5825 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5826 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
5827 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
5828 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5829 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
5830 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
5831 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
5832 break;
5833
5834 case 0x0fae:
5835 if (i386_record_modrm (&ir))
5836 return -1;
5837 switch(ir.reg)
5838 {
5839 case 0: /* fxsave */
5840 {
5841 uint64_t tmpu64;
5842
5843 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5844 if (i386_record_lea_modrm_addr (&ir, &tmpu64))
5845 return -1;
5846 if (record_arch_list_add_mem (tmpu64, 512))
5847 return -1;
5848 }
5849 break;
5850
5851 case 1: /* fxrstor */
5852 {
5853 int i;
5854
5855 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5856
5857 for (i = I387_MM0_REGNUM (tdep);
5858 i386_mmx_regnum_p (gdbarch, i); i++)
5859 record_arch_list_add_reg (ir.regcache, i);
5860
5861 for (i = I387_XMM0_REGNUM (tdep);
c131fcee 5862 i386_xmm_regnum_p (gdbarch, i); i++)
a3c4230a
HZ
5863 record_arch_list_add_reg (ir.regcache, i);
5864
5865 if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
5866 record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
5867
5868 for (i = I387_ST0_REGNUM (tdep);
5869 i386_fp_regnum_p (gdbarch, i); i++)
5870 record_arch_list_add_reg (ir.regcache, i);
5871
5872 for (i = I387_FCTRL_REGNUM (tdep);
5873 i386_fpc_regnum_p (gdbarch, i); i++)
5874 record_arch_list_add_reg (ir.regcache, i);
5875 }
5876 break;
5877
5878 case 2: /* ldmxcsr */
5879 if (!i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
5880 goto no_support;
5881 record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
5882 break;
5883
5884 case 3: /* stmxcsr */
5885 ir.ot = OT_LONG;
5886 if (i386_record_lea_modrm (&ir))
5887 return -1;
5888 break;
5889
5890 case 5: /* lfence */
5891 case 6: /* mfence */
5892 case 7: /* sfence clflush */
5893 break;
5894
5895 default:
5896 opcode = (opcode << 8) | ir.modrm;
5897 goto no_support;
5898 break;
5899 }
5900 break;
5901
5902 case 0x0fc3: /* movnti */
5903 ir.ot = (ir.dflag == 2) ? OT_QUAD : OT_LONG;
5904 if (i386_record_modrm (&ir))
5905 return -1;
5906 if (ir.mod == 3)
5907 goto no_support;
5908 ir.reg |= rex_r;
5909 if (i386_record_lea_modrm (&ir))
5910 return -1;
5911 break;
5912
5913 /* Add prefix to opcode. */
5914 case 0x0f10:
5915 case 0x0f11:
5916 case 0x0f12:
5917 case 0x0f13:
5918 case 0x0f14:
5919 case 0x0f15:
5920 case 0x0f16:
5921 case 0x0f17:
5922 case 0x0f28:
5923 case 0x0f29:
5924 case 0x0f2a:
5925 case 0x0f2b:
5926 case 0x0f2c:
5927 case 0x0f2d:
5928 case 0x0f2e:
5929 case 0x0f2f:
5930 case 0x0f38:
5931 case 0x0f39:
5932 case 0x0f3a:
5933 case 0x0f50:
5934 case 0x0f51:
5935 case 0x0f52:
5936 case 0x0f53:
5937 case 0x0f54:
5938 case 0x0f55:
5939 case 0x0f56:
5940 case 0x0f57:
5941 case 0x0f58:
5942 case 0x0f59:
5943 case 0x0f5a:
5944 case 0x0f5b:
5945 case 0x0f5c:
5946 case 0x0f5d:
5947 case 0x0f5e:
5948 case 0x0f5f:
5949 case 0x0f60:
5950 case 0x0f61:
5951 case 0x0f62:
5952 case 0x0f63:
5953 case 0x0f64:
5954 case 0x0f65:
5955 case 0x0f66:
5956 case 0x0f67:
5957 case 0x0f68:
5958 case 0x0f69:
5959 case 0x0f6a:
5960 case 0x0f6b:
5961 case 0x0f6c:
5962 case 0x0f6d:
5963 case 0x0f6e:
5964 case 0x0f6f:
5965 case 0x0f70:
5966 case 0x0f71:
5967 case 0x0f72:
5968 case 0x0f73:
5969 case 0x0f74:
5970 case 0x0f75:
5971 case 0x0f76:
5972 case 0x0f7c:
5973 case 0x0f7d:
5974 case 0x0f7e:
5975 case 0x0f7f:
5976 case 0x0fb8:
5977 case 0x0fc2:
5978 case 0x0fc4:
5979 case 0x0fc5:
5980 case 0x0fc6:
5981 case 0x0fd0:
5982 case 0x0fd1:
5983 case 0x0fd2:
5984 case 0x0fd3:
5985 case 0x0fd4:
5986 case 0x0fd5:
5987 case 0x0fd6:
5988 case 0x0fd7:
5989 case 0x0fd8:
5990 case 0x0fd9:
5991 case 0x0fda:
5992 case 0x0fdb:
5993 case 0x0fdc:
5994 case 0x0fdd:
5995 case 0x0fde:
5996 case 0x0fdf:
5997 case 0x0fe0:
5998 case 0x0fe1:
5999 case 0x0fe2:
6000 case 0x0fe3:
6001 case 0x0fe4:
6002 case 0x0fe5:
6003 case 0x0fe6:
6004 case 0x0fe7:
6005 case 0x0fe8:
6006 case 0x0fe9:
6007 case 0x0fea:
6008 case 0x0feb:
6009 case 0x0fec:
6010 case 0x0fed:
6011 case 0x0fee:
6012 case 0x0fef:
6013 case 0x0ff0:
6014 case 0x0ff1:
6015 case 0x0ff2:
6016 case 0x0ff3:
6017 case 0x0ff4:
6018 case 0x0ff5:
6019 case 0x0ff6:
6020 case 0x0ff7:
6021 case 0x0ff8:
6022 case 0x0ff9:
6023 case 0x0ffa:
6024 case 0x0ffb:
6025 case 0x0ffc:
6026 case 0x0ffd:
6027 case 0x0ffe:
6028 switch (prefixes)
6029 {
6030 case PREFIX_REPNZ:
6031 opcode |= 0xf20000;
6032 break;
6033 case PREFIX_DATA:
6034 opcode |= 0x660000;
6035 break;
6036 case PREFIX_REPZ:
6037 opcode |= 0xf30000;
6038 break;
6039 }
6040reswitch_prefix_add:
6041 switch (opcode)
6042 {
6043 case 0x0f38:
6044 case 0x660f38:
6045 case 0xf20f38:
6046 case 0x0f3a:
6047 case 0x660f3a:
6048 if (target_read_memory (ir.addr, &opcode8, 1))
6049 {
6050 printf_unfiltered (_("Process record: error reading memory at "
6051 "addr %s len = 1.\n"),
6052 paddress (gdbarch, ir.addr));
6053 return -1;
6054 }
6055 ir.addr++;
6056 opcode = (uint32_t) opcode8 | opcode << 8;
6057 goto reswitch_prefix_add;
6058 break;
6059
6060 case 0x0f10: /* movups */
6061 case 0x660f10: /* movupd */
6062 case 0xf30f10: /* movss */
6063 case 0xf20f10: /* movsd */
6064 case 0x0f12: /* movlps */
6065 case 0x660f12: /* movlpd */
6066 case 0xf30f12: /* movsldup */
6067 case 0xf20f12: /* movddup */
6068 case 0x0f14: /* unpcklps */
6069 case 0x660f14: /* unpcklpd */
6070 case 0x0f15: /* unpckhps */
6071 case 0x660f15: /* unpckhpd */
6072 case 0x0f16: /* movhps */
6073 case 0x660f16: /* movhpd */
6074 case 0xf30f16: /* movshdup */
6075 case 0x0f28: /* movaps */
6076 case 0x660f28: /* movapd */
6077 case 0x0f2a: /* cvtpi2ps */
6078 case 0x660f2a: /* cvtpi2pd */
6079 case 0xf30f2a: /* cvtsi2ss */
6080 case 0xf20f2a: /* cvtsi2sd */
6081 case 0x0f2c: /* cvttps2pi */
6082 case 0x660f2c: /* cvttpd2pi */
6083 case 0x0f2d: /* cvtps2pi */
6084 case 0x660f2d: /* cvtpd2pi */
6085 case 0x660f3800: /* pshufb */
6086 case 0x660f3801: /* phaddw */
6087 case 0x660f3802: /* phaddd */
6088 case 0x660f3803: /* phaddsw */
6089 case 0x660f3804: /* pmaddubsw */
6090 case 0x660f3805: /* phsubw */
6091 case 0x660f3806: /* phsubd */
6092 case 0x660f3807: /* phaddsw */
6093 case 0x660f3808: /* psignb */
6094 case 0x660f3809: /* psignw */
6095 case 0x660f380a: /* psignd */
6096 case 0x660f380b: /* pmulhrsw */
6097 case 0x660f3810: /* pblendvb */
6098 case 0x660f3814: /* blendvps */
6099 case 0x660f3815: /* blendvpd */
6100 case 0x660f381c: /* pabsb */
6101 case 0x660f381d: /* pabsw */
6102 case 0x660f381e: /* pabsd */
6103 case 0x660f3820: /* pmovsxbw */
6104 case 0x660f3821: /* pmovsxbd */
6105 case 0x660f3822: /* pmovsxbq */
6106 case 0x660f3823: /* pmovsxwd */
6107 case 0x660f3824: /* pmovsxwq */
6108 case 0x660f3825: /* pmovsxdq */
6109 case 0x660f3828: /* pmuldq */
6110 case 0x660f3829: /* pcmpeqq */
6111 case 0x660f382a: /* movntdqa */
6112 case 0x660f3a08: /* roundps */
6113 case 0x660f3a09: /* roundpd */
6114 case 0x660f3a0a: /* roundss */
6115 case 0x660f3a0b: /* roundsd */
6116 case 0x660f3a0c: /* blendps */
6117 case 0x660f3a0d: /* blendpd */
6118 case 0x660f3a0e: /* pblendw */
6119 case 0x660f3a0f: /* palignr */
6120 case 0x660f3a20: /* pinsrb */
6121 case 0x660f3a21: /* insertps */
6122 case 0x660f3a22: /* pinsrd pinsrq */
6123 case 0x660f3a40: /* dpps */
6124 case 0x660f3a41: /* dppd */
6125 case 0x660f3a42: /* mpsadbw */
6126 case 0x660f3a60: /* pcmpestrm */
6127 case 0x660f3a61: /* pcmpestri */
6128 case 0x660f3a62: /* pcmpistrm */
6129 case 0x660f3a63: /* pcmpistri */
6130 case 0x0f51: /* sqrtps */
6131 case 0x660f51: /* sqrtpd */
6132 case 0xf20f51: /* sqrtsd */
6133 case 0xf30f51: /* sqrtss */
6134 case 0x0f52: /* rsqrtps */
6135 case 0xf30f52: /* rsqrtss */
6136 case 0x0f53: /* rcpps */
6137 case 0xf30f53: /* rcpss */
6138 case 0x0f54: /* andps */
6139 case 0x660f54: /* andpd */
6140 case 0x0f55: /* andnps */
6141 case 0x660f55: /* andnpd */
6142 case 0x0f56: /* orps */
6143 case 0x660f56: /* orpd */
6144 case 0x0f57: /* xorps */
6145 case 0x660f57: /* xorpd */
6146 case 0x0f58: /* addps */
6147 case 0x660f58: /* addpd */
6148 case 0xf20f58: /* addsd */
6149 case 0xf30f58: /* addss */
6150 case 0x0f59: /* mulps */
6151 case 0x660f59: /* mulpd */
6152 case 0xf20f59: /* mulsd */
6153 case 0xf30f59: /* mulss */
6154 case 0x0f5a: /* cvtps2pd */
6155 case 0x660f5a: /* cvtpd2ps */
6156 case 0xf20f5a: /* cvtsd2ss */
6157 case 0xf30f5a: /* cvtss2sd */
6158 case 0x0f5b: /* cvtdq2ps */
6159 case 0x660f5b: /* cvtps2dq */
6160 case 0xf30f5b: /* cvttps2dq */
6161 case 0x0f5c: /* subps */
6162 case 0x660f5c: /* subpd */
6163 case 0xf20f5c: /* subsd */
6164 case 0xf30f5c: /* subss */
6165 case 0x0f5d: /* minps */
6166 case 0x660f5d: /* minpd */
6167 case 0xf20f5d: /* minsd */
6168 case 0xf30f5d: /* minss */
6169 case 0x0f5e: /* divps */
6170 case 0x660f5e: /* divpd */
6171 case 0xf20f5e: /* divsd */
6172 case 0xf30f5e: /* divss */
6173 case 0x0f5f: /* maxps */
6174 case 0x660f5f: /* maxpd */
6175 case 0xf20f5f: /* maxsd */
6176 case 0xf30f5f: /* maxss */
6177 case 0x660f60: /* punpcklbw */
6178 case 0x660f61: /* punpcklwd */
6179 case 0x660f62: /* punpckldq */
6180 case 0x660f63: /* packsswb */
6181 case 0x660f64: /* pcmpgtb */
6182 case 0x660f65: /* pcmpgtw */
6183 case 0x660f66: /* pcmpgtl */
6184 case 0x660f67: /* packuswb */
6185 case 0x660f68: /* punpckhbw */
6186 case 0x660f69: /* punpckhwd */
6187 case 0x660f6a: /* punpckhdq */
6188 case 0x660f6b: /* packssdw */
6189 case 0x660f6c: /* punpcklqdq */
6190 case 0x660f6d: /* punpckhqdq */
6191 case 0x660f6e: /* movd */
6192 case 0x660f6f: /* movdqa */
6193 case 0xf30f6f: /* movdqu */
6194 case 0x660f70: /* pshufd */
6195 case 0xf20f70: /* pshuflw */
6196 case 0xf30f70: /* pshufhw */
6197 case 0x660f74: /* pcmpeqb */
6198 case 0x660f75: /* pcmpeqw */
6199 case 0x660f76: /* pcmpeql */
6200 case 0x660f7c: /* haddpd */
6201 case 0xf20f7c: /* haddps */
6202 case 0x660f7d: /* hsubpd */
6203 case 0xf20f7d: /* hsubps */
6204 case 0xf30f7e: /* movq */
6205 case 0x0fc2: /* cmpps */
6206 case 0x660fc2: /* cmppd */
6207 case 0xf20fc2: /* cmpsd */
6208 case 0xf30fc2: /* cmpss */
6209 case 0x660fc4: /* pinsrw */
6210 case 0x0fc6: /* shufps */
6211 case 0x660fc6: /* shufpd */
6212 case 0x660fd0: /* addsubpd */
6213 case 0xf20fd0: /* addsubps */
6214 case 0x660fd1: /* psrlw */
6215 case 0x660fd2: /* psrld */
6216 case 0x660fd3: /* psrlq */
6217 case 0x660fd4: /* paddq */
6218 case 0x660fd5: /* pmullw */
6219 case 0xf30fd6: /* movq2dq */
6220 case 0x660fd8: /* psubusb */
6221 case 0x660fd9: /* psubusw */
6222 case 0x660fda: /* pminub */
6223 case 0x660fdb: /* pand */
6224 case 0x660fdc: /* paddusb */
6225 case 0x660fdd: /* paddusw */
6226 case 0x660fde: /* pmaxub */
6227 case 0x660fdf: /* pandn */
6228 case 0x660fe0: /* pavgb */
6229 case 0x660fe1: /* psraw */
6230 case 0x660fe2: /* psrad */
6231 case 0x660fe3: /* pavgw */
6232 case 0x660fe4: /* pmulhuw */
6233 case 0x660fe5: /* pmulhw */
6234 case 0x660fe6: /* cvttpd2dq */
6235 case 0xf20fe6: /* cvtpd2dq */
6236 case 0xf30fe6: /* cvtdq2pd */
6237 case 0x660fe8: /* psubsb */
6238 case 0x660fe9: /* psubsw */
6239 case 0x660fea: /* pminsw */
6240 case 0x660feb: /* por */
6241 case 0x660fec: /* paddsb */
6242 case 0x660fed: /* paddsw */
6243 case 0x660fee: /* pmaxsw */
6244 case 0x660fef: /* pxor */
6245 case 0x660ff0: /* lddqu */
6246 case 0x660ff1: /* psllw */
6247 case 0x660ff2: /* pslld */
6248 case 0x660ff3: /* psllq */
6249 case 0x660ff4: /* pmuludq */
6250 case 0x660ff5: /* pmaddwd */
6251 case 0x660ff6: /* psadbw */
6252 case 0x660ff8: /* psubb */
6253 case 0x660ff9: /* psubw */
6254 case 0x660ffa: /* psubl */
6255 case 0x660ffb: /* psubq */
6256 case 0x660ffc: /* paddb */
6257 case 0x660ffd: /* paddw */
6258 case 0x660ffe: /* paddl */
6259 if (i386_record_modrm (&ir))
6260 return -1;
6261 ir.reg |= rex_r;
c131fcee 6262 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
a3c4230a
HZ
6263 goto no_support;
6264 record_arch_list_add_reg (ir.regcache,
6265 I387_XMM0_REGNUM (tdep) + ir.reg);
6266 if ((opcode & 0xfffffffc) == 0x660f3a60)
6267 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6268 break;
6269
6270 case 0x0f11: /* movups */
6271 case 0x660f11: /* movupd */
6272 case 0xf30f11: /* movss */
6273 case 0xf20f11: /* movsd */
6274 case 0x0f13: /* movlps */
6275 case 0x660f13: /* movlpd */
6276 case 0x0f17: /* movhps */
6277 case 0x660f17: /* movhpd */
6278 case 0x0f29: /* movaps */
6279 case 0x660f29: /* movapd */
6280 case 0x660f3a14: /* pextrb */
6281 case 0x660f3a15: /* pextrw */
6282 case 0x660f3a16: /* pextrd pextrq */
6283 case 0x660f3a17: /* extractps */
6284 case 0x660f7f: /* movdqa */
6285 case 0xf30f7f: /* movdqu */
6286 if (i386_record_modrm (&ir))
6287 return -1;
6288 if (ir.mod == 3)
6289 {
6290 if (opcode == 0x0f13 || opcode == 0x660f13
6291 || opcode == 0x0f17 || opcode == 0x660f17)
6292 goto no_support;
6293 ir.rm |= ir.rex_b;
c131fcee 6294 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a
HZ
6295 goto no_support;
6296 record_arch_list_add_reg (ir.regcache,
6297 I387_XMM0_REGNUM (tdep) + ir.rm);
6298 }
6299 else
6300 {
6301 switch (opcode)
6302 {
6303 case 0x660f3a14:
6304 ir.ot = OT_BYTE;
6305 break;
6306 case 0x660f3a15:
6307 ir.ot = OT_WORD;
6308 break;
6309 case 0x660f3a16:
6310 ir.ot = OT_LONG;
6311 break;
6312 case 0x660f3a17:
6313 ir.ot = OT_QUAD;
6314 break;
6315 default:
6316 ir.ot = OT_DQUAD;
6317 break;
6318 }
6319 if (i386_record_lea_modrm (&ir))
6320 return -1;
6321 }
6322 break;
6323
6324 case 0x0f2b: /* movntps */
6325 case 0x660f2b: /* movntpd */
6326 case 0x0fe7: /* movntq */
6327 case 0x660fe7: /* movntdq */
6328 if (ir.mod == 3)
6329 goto no_support;
6330 if (opcode == 0x0fe7)
6331 ir.ot = OT_QUAD;
6332 else
6333 ir.ot = OT_DQUAD;
6334 if (i386_record_lea_modrm (&ir))
6335 return -1;
6336 break;
6337
6338 case 0xf30f2c: /* cvttss2si */
6339 case 0xf20f2c: /* cvttsd2si */
6340 case 0xf30f2d: /* cvtss2si */
6341 case 0xf20f2d: /* cvtsd2si */
6342 case 0xf20f38f0: /* crc32 */
6343 case 0xf20f38f1: /* crc32 */
6344 case 0x0f50: /* movmskps */
6345 case 0x660f50: /* movmskpd */
6346 case 0x0fc5: /* pextrw */
6347 case 0x660fc5: /* pextrw */
6348 case 0x0fd7: /* pmovmskb */
6349 case 0x660fd7: /* pmovmskb */
6350 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
6351 break;
6352
6353 case 0x0f3800: /* pshufb */
6354 case 0x0f3801: /* phaddw */
6355 case 0x0f3802: /* phaddd */
6356 case 0x0f3803: /* phaddsw */
6357 case 0x0f3804: /* pmaddubsw */
6358 case 0x0f3805: /* phsubw */
6359 case 0x0f3806: /* phsubd */
6360 case 0x0f3807: /* phaddsw */
6361 case 0x0f3808: /* psignb */
6362 case 0x0f3809: /* psignw */
6363 case 0x0f380a: /* psignd */
6364 case 0x0f380b: /* pmulhrsw */
6365 case 0x0f381c: /* pabsb */
6366 case 0x0f381d: /* pabsw */
6367 case 0x0f381e: /* pabsd */
6368 case 0x0f382b: /* packusdw */
6369 case 0x0f3830: /* pmovzxbw */
6370 case 0x0f3831: /* pmovzxbd */
6371 case 0x0f3832: /* pmovzxbq */
6372 case 0x0f3833: /* pmovzxwd */
6373 case 0x0f3834: /* pmovzxwq */
6374 case 0x0f3835: /* pmovzxdq */
6375 case 0x0f3837: /* pcmpgtq */
6376 case 0x0f3838: /* pminsb */
6377 case 0x0f3839: /* pminsd */
6378 case 0x0f383a: /* pminuw */
6379 case 0x0f383b: /* pminud */
6380 case 0x0f383c: /* pmaxsb */
6381 case 0x0f383d: /* pmaxsd */
6382 case 0x0f383e: /* pmaxuw */
6383 case 0x0f383f: /* pmaxud */
6384 case 0x0f3840: /* pmulld */
6385 case 0x0f3841: /* phminposuw */
6386 case 0x0f3a0f: /* palignr */
6387 case 0x0f60: /* punpcklbw */
6388 case 0x0f61: /* punpcklwd */
6389 case 0x0f62: /* punpckldq */
6390 case 0x0f63: /* packsswb */
6391 case 0x0f64: /* pcmpgtb */
6392 case 0x0f65: /* pcmpgtw */
6393 case 0x0f66: /* pcmpgtl */
6394 case 0x0f67: /* packuswb */
6395 case 0x0f68: /* punpckhbw */
6396 case 0x0f69: /* punpckhwd */
6397 case 0x0f6a: /* punpckhdq */
6398 case 0x0f6b: /* packssdw */
6399 case 0x0f6e: /* movd */
6400 case 0x0f6f: /* movq */
6401 case 0x0f70: /* pshufw */
6402 case 0x0f74: /* pcmpeqb */
6403 case 0x0f75: /* pcmpeqw */
6404 case 0x0f76: /* pcmpeql */
6405 case 0x0fc4: /* pinsrw */
6406 case 0x0fd1: /* psrlw */
6407 case 0x0fd2: /* psrld */
6408 case 0x0fd3: /* psrlq */
6409 case 0x0fd4: /* paddq */
6410 case 0x0fd5: /* pmullw */
6411 case 0xf20fd6: /* movdq2q */
6412 case 0x0fd8: /* psubusb */
6413 case 0x0fd9: /* psubusw */
6414 case 0x0fda: /* pminub */
6415 case 0x0fdb: /* pand */
6416 case 0x0fdc: /* paddusb */
6417 case 0x0fdd: /* paddusw */
6418 case 0x0fde: /* pmaxub */
6419 case 0x0fdf: /* pandn */
6420 case 0x0fe0: /* pavgb */
6421 case 0x0fe1: /* psraw */
6422 case 0x0fe2: /* psrad */
6423 case 0x0fe3: /* pavgw */
6424 case 0x0fe4: /* pmulhuw */
6425 case 0x0fe5: /* pmulhw */
6426 case 0x0fe8: /* psubsb */
6427 case 0x0fe9: /* psubsw */
6428 case 0x0fea: /* pminsw */
6429 case 0x0feb: /* por */
6430 case 0x0fec: /* paddsb */
6431 case 0x0fed: /* paddsw */
6432 case 0x0fee: /* pmaxsw */
6433 case 0x0fef: /* pxor */
6434 case 0x0ff1: /* psllw */
6435 case 0x0ff2: /* pslld */
6436 case 0x0ff3: /* psllq */
6437 case 0x0ff4: /* pmuludq */
6438 case 0x0ff5: /* pmaddwd */
6439 case 0x0ff6: /* psadbw */
6440 case 0x0ff8: /* psubb */
6441 case 0x0ff9: /* psubw */
6442 case 0x0ffa: /* psubl */
6443 case 0x0ffb: /* psubq */
6444 case 0x0ffc: /* paddb */
6445 case 0x0ffd: /* paddw */
6446 case 0x0ffe: /* paddl */
6447 if (i386_record_modrm (&ir))
6448 return -1;
6449 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
6450 goto no_support;
6451 record_arch_list_add_reg (ir.regcache,
6452 I387_MM0_REGNUM (tdep) + ir.reg);
6453 break;
6454
6455 case 0x0f71: /* psllw */
6456 case 0x0f72: /* pslld */
6457 case 0x0f73: /* psllq */
6458 if (i386_record_modrm (&ir))
6459 return -1;
6460 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
6461 goto no_support;
6462 record_arch_list_add_reg (ir.regcache,
6463 I387_MM0_REGNUM (tdep) + ir.rm);
6464 break;
6465
6466 case 0x660f71: /* psllw */
6467 case 0x660f72: /* pslld */
6468 case 0x660f73: /* psllq */
6469 if (i386_record_modrm (&ir))
6470 return -1;
6471 ir.rm |= ir.rex_b;
c131fcee 6472 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a
HZ
6473 goto no_support;
6474 record_arch_list_add_reg (ir.regcache,
6475 I387_XMM0_REGNUM (tdep) + ir.rm);
6476 break;
6477
6478 case 0x0f7e: /* movd */
6479 case 0x660f7e: /* movd */
6480 if (i386_record_modrm (&ir))
6481 return -1;
6482 if (ir.mod == 3)
6483 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
6484 else
6485 {
6486 if (ir.dflag == 2)
6487 ir.ot = OT_QUAD;
6488 else
6489 ir.ot = OT_LONG;
6490 if (i386_record_lea_modrm (&ir))
6491 return -1;
6492 }
6493 break;
6494
6495 case 0x0f7f: /* movq */
6496 if (i386_record_modrm (&ir))
6497 return -1;
6498 if (ir.mod == 3)
6499 {
6500 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
6501 goto no_support;
6502 record_arch_list_add_reg (ir.regcache,
6503 I387_MM0_REGNUM (tdep) + ir.rm);
6504 }
6505 else
6506 {
6507 ir.ot = OT_QUAD;
6508 if (i386_record_lea_modrm (&ir))
6509 return -1;
6510 }
6511 break;
6512
6513 case 0xf30fb8: /* popcnt */
6514 if (i386_record_modrm (&ir))
6515 return -1;
6516 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
6517 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6518 break;
6519
6520 case 0x660fd6: /* movq */
6521 if (i386_record_modrm (&ir))
6522 return -1;
6523 if (ir.mod == 3)
6524 {
6525 ir.rm |= ir.rex_b;
c131fcee 6526 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a
HZ
6527 goto no_support;
6528 record_arch_list_add_reg (ir.regcache,
6529 I387_XMM0_REGNUM (tdep) + ir.rm);
6530 }
6531 else
6532 {
6533 ir.ot = OT_QUAD;
6534 if (i386_record_lea_modrm (&ir))
6535 return -1;
6536 }
6537 break;
6538
6539 case 0x660f3817: /* ptest */
6540 case 0x0f2e: /* ucomiss */
6541 case 0x660f2e: /* ucomisd */
6542 case 0x0f2f: /* comiss */
6543 case 0x660f2f: /* comisd */
6544 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6545 break;
6546
6547 case 0x0ff7: /* maskmovq */
6548 regcache_raw_read_unsigned (ir.regcache,
6549 ir.regmap[X86_RECORD_REDI_REGNUM],
6550 &addr);
6551 if (record_arch_list_add_mem (addr, 64))
6552 return -1;
6553 break;
6554
6555 case 0x660ff7: /* maskmovdqu */
6556 regcache_raw_read_unsigned (ir.regcache,
6557 ir.regmap[X86_RECORD_REDI_REGNUM],
6558 &addr);
6559 if (record_arch_list_add_mem (addr, 128))
6560 return -1;
6561 break;
6562
6563 default:
6564 goto no_support;
6565 break;
6566 }
6567 break;
7ad10968
HZ
6568
6569 default:
7ad10968
HZ
6570 goto no_support;
6571 break;
6572 }
6573
cf648174
HZ
6574 /* In the future, maybe still need to deal with need_dasm. */
6575 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REIP_REGNUM);
7ad10968
HZ
6576 if (record_arch_list_add_end ())
6577 return -1;
6578
6579 return 0;
6580
01fe1b41 6581 no_support:
a3c4230a
HZ
6582 printf_unfiltered (_("Process record does not support instruction 0x%02x "
6583 "at address %s.\n"),
6584 (unsigned int) (opcode),
6585 paddress (gdbarch, ir.orig_addr));
7ad10968
HZ
6586 return -1;
6587}
6588
cf648174
HZ
6589static const int i386_record_regmap[] =
6590{
6591 I386_EAX_REGNUM, I386_ECX_REGNUM, I386_EDX_REGNUM, I386_EBX_REGNUM,
6592 I386_ESP_REGNUM, I386_EBP_REGNUM, I386_ESI_REGNUM, I386_EDI_REGNUM,
6593 0, 0, 0, 0, 0, 0, 0, 0,
6594 I386_EIP_REGNUM, I386_EFLAGS_REGNUM, I386_CS_REGNUM, I386_SS_REGNUM,
6595 I386_DS_REGNUM, I386_ES_REGNUM, I386_FS_REGNUM, I386_GS_REGNUM
6596};
6597
7a697b8d
SS
6598/* Check that the given address appears suitable for a fast
6599 tracepoint, which on x86 means that we need an instruction of at
6600 least 5 bytes, so that we can overwrite it with a 4-byte-offset
6601 jump and not have to worry about program jumps to an address in the
6602 middle of the tracepoint jump. Returns 1 if OK, and writes a size
6603 of instruction to replace, and 0 if not, plus an explanatory
6604 string. */
6605
6606static int
6607i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch,
6608 CORE_ADDR addr, int *isize, char **msg)
6609{
6610 int len, jumplen;
6611 static struct ui_file *gdb_null = NULL;
6612
6613 /* This is based on the target agent using a 4-byte relative jump.
6614 Alternate future possibilities include 8-byte offset for x86-84,
6615 or 3-byte jumps if the program has trampoline space close by. */
6616 jumplen = 5;
6617
6618 /* Dummy file descriptor for the disassembler. */
6619 if (!gdb_null)
6620 gdb_null = ui_file_new ();
6621
6622 /* Check for fit. */
6623 len = gdb_print_insn (gdbarch, addr, gdb_null, NULL);
6624 if (len < jumplen)
6625 {
6626 /* Return a bit of target-specific detail to add to the caller's
6627 generic failure message. */
6628 if (msg)
6629 *msg = xstrprintf (_("; instruction is only %d bytes long, need at least %d bytes for the jump"),
6630 len, jumplen);
6631 return 0;
6632 }
6633
6634 if (isize)
6635 *isize = len;
6636 if (msg)
6637 *msg = NULL;
6638 return 1;
6639}
6640
90884b2b
L
6641static int
6642i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
6643 struct tdesc_arch_data *tdesc_data)
6644{
6645 const struct target_desc *tdesc = tdep->tdesc;
c131fcee
L
6646 const struct tdesc_feature *feature_core;
6647 const struct tdesc_feature *feature_sse, *feature_avx;
90884b2b
L
6648 int i, num_regs, valid_p;
6649
6650 if (! tdesc_has_registers (tdesc))
6651 return 0;
6652
6653 /* Get core registers. */
6654 feature_core = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.core");
3a13a53b
L
6655 if (feature_core == NULL)
6656 return 0;
90884b2b
L
6657
6658 /* Get SSE registers. */
c131fcee 6659 feature_sse = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.sse");
90884b2b 6660
c131fcee
L
6661 /* Try AVX registers. */
6662 feature_avx = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx");
6663
90884b2b
L
6664 valid_p = 1;
6665
c131fcee
L
6666 /* The XCR0 bits. */
6667 if (feature_avx)
6668 {
3a13a53b
L
6669 /* AVX register description requires SSE register description. */
6670 if (!feature_sse)
6671 return 0;
6672
c131fcee
L
6673 tdep->xcr0 = I386_XSTATE_AVX_MASK;
6674
6675 /* It may have been set by OSABI initialization function. */
6676 if (tdep->num_ymm_regs == 0)
6677 {
6678 tdep->ymmh_register_names = i386_ymmh_names;
6679 tdep->num_ymm_regs = 8;
6680 tdep->ymm0h_regnum = I386_YMM0H_REGNUM;
6681 }
6682
6683 for (i = 0; i < tdep->num_ymm_regs; i++)
6684 valid_p &= tdesc_numbered_register (feature_avx, tdesc_data,
6685 tdep->ymm0h_regnum + i,
6686 tdep->ymmh_register_names[i]);
6687 }
3a13a53b 6688 else if (feature_sse)
c131fcee 6689 tdep->xcr0 = I386_XSTATE_SSE_MASK;
3a13a53b
L
6690 else
6691 {
6692 tdep->xcr0 = I386_XSTATE_X87_MASK;
6693 tdep->num_xmm_regs = 0;
6694 }
c131fcee 6695
90884b2b
L
6696 num_regs = tdep->num_core_regs;
6697 for (i = 0; i < num_regs; i++)
6698 valid_p &= tdesc_numbered_register (feature_core, tdesc_data, i,
6699 tdep->register_names[i]);
6700
3a13a53b
L
6701 if (feature_sse)
6702 {
6703 /* Need to include %mxcsr, so add one. */
6704 num_regs += tdep->num_xmm_regs + 1;
6705 for (; i < num_regs; i++)
6706 valid_p &= tdesc_numbered_register (feature_sse, tdesc_data, i,
6707 tdep->register_names[i]);
6708 }
90884b2b
L
6709
6710 return valid_p;
6711}
6712
7ad10968
HZ
6713\f
6714static struct gdbarch *
6715i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
6716{
6717 struct gdbarch_tdep *tdep;
6718 struct gdbarch *gdbarch;
90884b2b
L
6719 struct tdesc_arch_data *tdesc_data;
6720 const struct target_desc *tdesc;
1ba53b71 6721 int mm0_regnum;
c131fcee 6722 int ymm0_regnum;
7ad10968
HZ
6723
6724 /* If there is already a candidate, use it. */
6725 arches = gdbarch_list_lookup_by_info (arches, &info);
6726 if (arches != NULL)
6727 return arches->gdbarch;
6728
6729 /* Allocate space for the new architecture. */
6730 tdep = XCALLOC (1, struct gdbarch_tdep);
6731 gdbarch = gdbarch_alloc (&info, tdep);
6732
6733 /* General-purpose registers. */
6734 tdep->gregset = NULL;
6735 tdep->gregset_reg_offset = NULL;
6736 tdep->gregset_num_regs = I386_NUM_GREGS;
6737 tdep->sizeof_gregset = 0;
6738
6739 /* Floating-point registers. */
6740 tdep->fpregset = NULL;
6741 tdep->sizeof_fpregset = I387_SIZEOF_FSAVE;
6742
c131fcee
L
6743 tdep->xstateregset = NULL;
6744
7ad10968
HZ
6745 /* The default settings include the FPU registers, the MMX registers
6746 and the SSE registers. This can be overridden for a specific ABI
6747 by adjusting the members `st0_regnum', `mm0_regnum' and
6748 `num_xmm_regs' of `struct gdbarch_tdep', otherwise the registers
3a13a53b 6749 will show up in the output of "info all-registers". */
7ad10968
HZ
6750
6751 tdep->st0_regnum = I386_ST0_REGNUM;
6752
7ad10968
HZ
6753 /* I386_NUM_XREGS includes %mxcsr, so substract one. */
6754 tdep->num_xmm_regs = I386_NUM_XREGS - 1;
6755
6756 tdep->jb_pc_offset = -1;
6757 tdep->struct_return = pcc_struct_return;
6758 tdep->sigtramp_start = 0;
6759 tdep->sigtramp_end = 0;
6760 tdep->sigtramp_p = i386_sigtramp_p;
6761 tdep->sigcontext_addr = NULL;
6762 tdep->sc_reg_offset = NULL;
6763 tdep->sc_pc_offset = -1;
6764 tdep->sc_sp_offset = -1;
6765
c131fcee
L
6766 tdep->xsave_xcr0_offset = -1;
6767
cf648174
HZ
6768 tdep->record_regmap = i386_record_regmap;
6769
7ad10968
HZ
6770 /* The format used for `long double' on almost all i386 targets is
6771 the i387 extended floating-point format. In fact, of all targets
6772 in the GCC 2.95 tree, only OSF/1 does it different, and insists
6773 on having a `long double' that's not `long' at all. */
6774 set_gdbarch_long_double_format (gdbarch, floatformats_i387_ext);
6775
6776 /* Although the i387 extended floating-point has only 80 significant
6777 bits, a `long double' actually takes up 96, probably to enforce
6778 alignment. */
6779 set_gdbarch_long_double_bit (gdbarch, 96);
6780
7ad10968
HZ
6781 /* Register numbers of various important registers. */
6782 set_gdbarch_sp_regnum (gdbarch, I386_ESP_REGNUM); /* %esp */
6783 set_gdbarch_pc_regnum (gdbarch, I386_EIP_REGNUM); /* %eip */
6784 set_gdbarch_ps_regnum (gdbarch, I386_EFLAGS_REGNUM); /* %eflags */
6785 set_gdbarch_fp0_regnum (gdbarch, I386_ST0_REGNUM); /* %st(0) */
6786
6787 /* NOTE: kettenis/20040418: GCC does have two possible register
6788 numbering schemes on the i386: dbx and SVR4. These schemes
6789 differ in how they number %ebp, %esp, %eflags, and the
6790 floating-point registers, and are implemented by the arrays
6791 dbx_register_map[] and svr4_dbx_register_map in
6792 gcc/config/i386.c. GCC also defines a third numbering scheme in
6793 gcc/config/i386.c, which it designates as the "default" register
6794 map used in 64bit mode. This last register numbering scheme is
6795 implemented in dbx64_register_map, and is used for AMD64; see
6796 amd64-tdep.c.
6797
6798 Currently, each GCC i386 target always uses the same register
6799 numbering scheme across all its supported debugging formats
6800 i.e. SDB (COFF), stabs and DWARF 2. This is because
6801 gcc/sdbout.c, gcc/dbxout.c and gcc/dwarf2out.c all use the
6802 DBX_REGISTER_NUMBER macro which is defined by each target's
6803 respective config header in a manner independent of the requested
6804 output debugging format.
6805
6806 This does not match the arrangement below, which presumes that
6807 the SDB and stabs numbering schemes differ from the DWARF and
6808 DWARF 2 ones. The reason for this arrangement is that it is
6809 likely to get the numbering scheme for the target's
6810 default/native debug format right. For targets where GCC is the
6811 native compiler (FreeBSD, NetBSD, OpenBSD, GNU/Linux) or for
6812 targets where the native toolchain uses a different numbering
6813 scheme for a particular debug format (stabs-in-ELF on Solaris)
6814 the defaults below will have to be overridden, like
6815 i386_elf_init_abi() does. */
6816
6817 /* Use the dbx register numbering scheme for stabs and COFF. */
6818 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
6819 set_gdbarch_sdb_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
6820
6821 /* Use the SVR4 register numbering scheme for DWARF 2. */
6822 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
6823
6824 /* We don't set gdbarch_stab_reg_to_regnum, since ECOFF doesn't seem to
6825 be in use on any of the supported i386 targets. */
6826
6827 set_gdbarch_print_float_info (gdbarch, i387_print_float_info);
6828
6829 set_gdbarch_get_longjmp_target (gdbarch, i386_get_longjmp_target);
6830
6831 /* Call dummy code. */
6832 set_gdbarch_push_dummy_call (gdbarch, i386_push_dummy_call);
6833
6834 set_gdbarch_convert_register_p (gdbarch, i386_convert_register_p);
6835 set_gdbarch_register_to_value (gdbarch, i386_register_to_value);
6836 set_gdbarch_value_to_register (gdbarch, i386_value_to_register);
6837
6838 set_gdbarch_return_value (gdbarch, i386_return_value);
6839
6840 set_gdbarch_skip_prologue (gdbarch, i386_skip_prologue);
6841
6842 /* Stack grows downward. */
6843 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
6844
6845 set_gdbarch_breakpoint_from_pc (gdbarch, i386_breakpoint_from_pc);
6846 set_gdbarch_decr_pc_after_break (gdbarch, 1);
6847 set_gdbarch_max_insn_length (gdbarch, I386_MAX_INSN_LEN);
6848
6849 set_gdbarch_frame_args_skip (gdbarch, 8);
6850
7ad10968
HZ
6851 set_gdbarch_print_insn (gdbarch, i386_print_insn);
6852
6853 set_gdbarch_dummy_id (gdbarch, i386_dummy_id);
6854
6855 set_gdbarch_unwind_pc (gdbarch, i386_unwind_pc);
6856
6857 /* Add the i386 register groups. */
6858 i386_add_reggroups (gdbarch);
90884b2b 6859 tdep->register_reggroup_p = i386_register_reggroup_p;
38c968cf 6860
143985b7
AF
6861 /* Helper for function argument information. */
6862 set_gdbarch_fetch_pointer_argument (gdbarch, i386_fetch_pointer_argument);
6863
06da04c6
MS
6864 /* Hook the function epilogue frame unwinder. This unwinder is
6865 appended to the list first, so that it supercedes the Dwarf
6866 unwinder in function epilogues (where the Dwarf unwinder
6867 currently fails). */
6868 frame_unwind_append_unwinder (gdbarch, &i386_epilogue_frame_unwind);
6869
6870 /* Hook in the DWARF CFI frame unwinder. This unwinder is appended
6871 to the list before the prologue-based unwinders, so that Dwarf
6872 CFI info will be used if it is available. */
10458914 6873 dwarf2_append_unwinders (gdbarch);
6405b0a6 6874
acd5c798 6875 frame_base_set_default (gdbarch, &i386_frame_base);
6c0e89ed 6876
1ba53b71 6877 /* Pseudo registers may be changed by amd64_init_abi. */
90884b2b
L
6878 set_gdbarch_pseudo_register_read (gdbarch, i386_pseudo_register_read);
6879 set_gdbarch_pseudo_register_write (gdbarch, i386_pseudo_register_write);
6880
6881 set_tdesc_pseudo_register_type (gdbarch, i386_pseudo_register_type);
6882 set_tdesc_pseudo_register_name (gdbarch, i386_pseudo_register_name);
6883
c131fcee
L
6884 /* Override the normal target description method to make the AVX
6885 upper halves anonymous. */
6886 set_gdbarch_register_name (gdbarch, i386_register_name);
6887
6888 /* Even though the default ABI only includes general-purpose registers,
6889 floating-point registers and the SSE registers, we have to leave a
6890 gap for the upper AVX registers. */
6891 set_gdbarch_num_regs (gdbarch, I386_AVX_NUM_REGS);
90884b2b
L
6892
6893 /* Get the x86 target description from INFO. */
6894 tdesc = info.target_desc;
6895 if (! tdesc_has_registers (tdesc))
6896 tdesc = tdesc_i386;
6897 tdep->tdesc = tdesc;
6898
6899 tdep->num_core_regs = I386_NUM_GREGS + I387_NUM_REGS;
6900 tdep->register_names = i386_register_names;
6901
c131fcee
L
6902 /* No upper YMM registers. */
6903 tdep->ymmh_register_names = NULL;
6904 tdep->ymm0h_regnum = -1;
6905
1ba53b71
L
6906 tdep->num_byte_regs = 8;
6907 tdep->num_word_regs = 8;
6908 tdep->num_dword_regs = 0;
6909 tdep->num_mmx_regs = 8;
c131fcee 6910 tdep->num_ymm_regs = 0;
1ba53b71 6911
90884b2b
L
6912 tdesc_data = tdesc_data_alloc ();
6913
3ce1502b 6914 /* Hook in ABI-specific overrides, if they have been registered. */
90884b2b 6915 info.tdep_info = (void *) tdesc_data;
4be87837 6916 gdbarch_init_osabi (info, gdbarch);
3ce1502b 6917
c131fcee
L
6918 if (!i386_validate_tdesc_p (tdep, tdesc_data))
6919 {
6920 tdesc_data_cleanup (tdesc_data);
6921 xfree (tdep);
6922 gdbarch_free (gdbarch);
6923 return NULL;
6924 }
6925
1ba53b71
L
6926 /* Wire in pseudo registers. Number of pseudo registers may be
6927 changed. */
6928 set_gdbarch_num_pseudo_regs (gdbarch, (tdep->num_byte_regs
6929 + tdep->num_word_regs
6930 + tdep->num_dword_regs
c131fcee
L
6931 + tdep->num_mmx_regs
6932 + tdep->num_ymm_regs));
1ba53b71 6933
90884b2b
L
6934 /* Target description may be changed. */
6935 tdesc = tdep->tdesc;
6936
90884b2b
L
6937 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
6938
6939 /* Override gdbarch_register_reggroup_p set in tdesc_use_registers. */
6940 set_gdbarch_register_reggroup_p (gdbarch, tdep->register_reggroup_p);
6941
1ba53b71
L
6942 /* Make %al the first pseudo-register. */
6943 tdep->al_regnum = gdbarch_num_regs (gdbarch);
6944 tdep->ax_regnum = tdep->al_regnum + tdep->num_byte_regs;
6945
c131fcee 6946 ymm0_regnum = tdep->ax_regnum + tdep->num_word_regs;
1ba53b71
L
6947 if (tdep->num_dword_regs)
6948 {
6949 /* Support dword pseudo-registesr if it hasn't been disabled, */
c131fcee
L
6950 tdep->eax_regnum = ymm0_regnum;
6951 ymm0_regnum += tdep->num_dword_regs;
1ba53b71
L
6952 }
6953 else
6954 tdep->eax_regnum = -1;
6955
c131fcee
L
6956 mm0_regnum = ymm0_regnum;
6957 if (tdep->num_ymm_regs)
6958 {
6959 /* Support YMM pseudo-registesr if it is available, */
6960 tdep->ymm0_regnum = ymm0_regnum;
6961 mm0_regnum += tdep->num_ymm_regs;
6962 }
6963 else
6964 tdep->ymm0_regnum = -1;
6965
1ba53b71
L
6966 if (tdep->num_mmx_regs != 0)
6967 {
6968 /* Support MMX pseudo-registesr if MMX hasn't been disabled, */
6969 tdep->mm0_regnum = mm0_regnum;
6970 }
6971 else
6972 tdep->mm0_regnum = -1;
6973
06da04c6 6974 /* Hook in the legacy prologue-based unwinders last (fallback). */
10458914
DJ
6975 frame_unwind_append_unwinder (gdbarch, &i386_sigtramp_frame_unwind);
6976 frame_unwind_append_unwinder (gdbarch, &i386_frame_unwind);
acd5c798 6977
8446b36a
MK
6978 /* If we have a register mapping, enable the generic core file
6979 support, unless it has already been enabled. */
6980 if (tdep->gregset_reg_offset
6981 && !gdbarch_regset_from_core_section_p (gdbarch))
6982 set_gdbarch_regset_from_core_section (gdbarch,
6983 i386_regset_from_core_section);
6984
514f746b
AR
6985 set_gdbarch_skip_permanent_breakpoint (gdbarch,
6986 i386_skip_permanent_breakpoint);
6987
7a697b8d
SS
6988 set_gdbarch_fast_tracepoint_valid_at (gdbarch,
6989 i386_fast_tracepoint_valid_at);
6990
a62cc96e
AC
6991 return gdbarch;
6992}
6993
8201327c
MK
6994static enum gdb_osabi
6995i386_coff_osabi_sniffer (bfd *abfd)
6996{
762c5349
MK
6997 if (strcmp (bfd_get_target (abfd), "coff-go32-exe") == 0
6998 || strcmp (bfd_get_target (abfd), "coff-go32") == 0)
8201327c
MK
6999 return GDB_OSABI_GO32;
7000
7001 return GDB_OSABI_UNKNOWN;
7002}
8201327c
MK
7003\f
7004
28e9e0f0
MK
7005/* Provide a prototype to silence -Wmissing-prototypes. */
7006void _initialize_i386_tdep (void);
7007
c906108c 7008void
fba45db2 7009_initialize_i386_tdep (void)
c906108c 7010{
a62cc96e
AC
7011 register_gdbarch_init (bfd_arch_i386, i386_gdbarch_init);
7012
fc338970 7013 /* Add the variable that controls the disassembly flavor. */
7ab04401
AC
7014 add_setshow_enum_cmd ("disassembly-flavor", no_class, valid_flavors,
7015 &disassembly_flavor, _("\
7016Set the disassembly flavor."), _("\
7017Show the disassembly flavor."), _("\
7018The valid values are \"att\" and \"intel\", and the default value is \"att\"."),
7019 NULL,
7020 NULL, /* FIXME: i18n: */
7021 &setlist, &showlist);
8201327c
MK
7022
7023 /* Add the variable that controls the convention for returning
7024 structs. */
7ab04401
AC
7025 add_setshow_enum_cmd ("struct-convention", no_class, valid_conventions,
7026 &struct_convention, _("\
7027Set the convention for returning small structs."), _("\
7028Show the convention for returning small structs."), _("\
7029Valid values are \"default\", \"pcc\" and \"reg\", and the default value\n\
7030is \"default\"."),
7031 NULL,
7032 NULL, /* FIXME: i18n: */
7033 &setlist, &showlist);
8201327c
MK
7034
7035 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_coff_flavour,
7036 i386_coff_osabi_sniffer);
8201327c 7037
05816f70 7038 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_SVR4,
8201327c 7039 i386_svr4_init_abi);
05816f70 7040 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_GO32,
8201327c 7041 i386_go32_init_abi);
38c968cf 7042
209bd28e 7043 /* Initialize the i386-specific register groups. */
38c968cf 7044 i386_init_reggroups ();
90884b2b
L
7045
7046 /* Initialize the standard target descriptions. */
7047 initialize_tdesc_i386 ();
3a13a53b 7048 initialize_tdesc_i386_mmx ();
c131fcee 7049 initialize_tdesc_i386_avx ();
c8d5aac9
L
7050
7051 /* Tell remote stub that we support XML target description. */
7052 register_remote_support_xml ("i386");
c906108c 7053}
This page took 1.236717 seconds and 4 git commands to generate.