merge from gcc
[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{
c131fcee
L
2739 i387_supply_xsave (regcache, regnum, xstateregs);
2740}
2741
2742/* Similar to i386_collect_fpregset , but use XSAVE extended state. */
2743
2744static void
2745i386_collect_xstateregset (const struct regset *regset,
2746 const struct regcache *regcache,
2747 int regnum, void *xstateregs, size_t len)
2748{
c131fcee
L
2749 i387_collect_xsave (regcache, regnum, xstateregs, 1);
2750}
2751
8446b36a
MK
2752/* Return the appropriate register set for the core section identified
2753 by SECT_NAME and SECT_SIZE. */
2754
2755const struct regset *
2756i386_regset_from_core_section (struct gdbarch *gdbarch,
2757 const char *sect_name, size_t sect_size)
2758{
2759 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2760
2761 if (strcmp (sect_name, ".reg") == 0 && sect_size == tdep->sizeof_gregset)
2762 {
2763 if (tdep->gregset == NULL)
7fdafb5a
MK
2764 tdep->gregset = regset_alloc (gdbarch, i386_supply_gregset,
2765 i386_collect_gregset);
8446b36a
MK
2766 return tdep->gregset;
2767 }
2768
66a72d25
MK
2769 if ((strcmp (sect_name, ".reg2") == 0 && sect_size == tdep->sizeof_fpregset)
2770 || (strcmp (sect_name, ".reg-xfp") == 0
2771 && sect_size == I387_SIZEOF_FXSAVE))
8446b36a
MK
2772 {
2773 if (tdep->fpregset == NULL)
7fdafb5a
MK
2774 tdep->fpregset = regset_alloc (gdbarch, i386_supply_fpregset,
2775 i386_collect_fpregset);
8446b36a
MK
2776 return tdep->fpregset;
2777 }
2778
c131fcee
L
2779 if (strcmp (sect_name, ".reg-xstate") == 0)
2780 {
2781 if (tdep->xstateregset == NULL)
2782 tdep->xstateregset = regset_alloc (gdbarch,
2783 i386_supply_xstateregset,
2784 i386_collect_xstateregset);
2785
2786 return tdep->xstateregset;
2787 }
2788
8446b36a
MK
2789 return NULL;
2790}
473f17b0 2791\f
fc338970 2792
fc338970 2793/* Stuff for WIN32 PE style DLL's but is pretty generic really. */
c906108c
SS
2794
2795CORE_ADDR
e17a4113
UW
2796i386_pe_skip_trampoline_code (struct frame_info *frame,
2797 CORE_ADDR pc, char *name)
c906108c 2798{
e17a4113
UW
2799 struct gdbarch *gdbarch = get_frame_arch (frame);
2800 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2801
2802 /* jmp *(dest) */
2803 if (pc && read_memory_unsigned_integer (pc, 2, byte_order) == 0x25ff)
c906108c 2804 {
e17a4113
UW
2805 unsigned long indirect =
2806 read_memory_unsigned_integer (pc + 2, 4, byte_order);
c906108c 2807 struct minimal_symbol *indsym =
fc338970 2808 indirect ? lookup_minimal_symbol_by_pc (indirect) : 0;
645dd519 2809 char *symname = indsym ? SYMBOL_LINKAGE_NAME (indsym) : 0;
c906108c 2810
c5aa993b 2811 if (symname)
c906108c 2812 {
c5aa993b
JM
2813 if (strncmp (symname, "__imp_", 6) == 0
2814 || strncmp (symname, "_imp_", 5) == 0)
e17a4113
UW
2815 return name ? 1 :
2816 read_memory_unsigned_integer (indirect, 4, byte_order);
c906108c
SS
2817 }
2818 }
fc338970 2819 return 0; /* Not a trampoline. */
c906108c 2820}
fc338970
MK
2821\f
2822
10458914
DJ
2823/* Return whether the THIS_FRAME corresponds to a sigtramp
2824 routine. */
8201327c 2825
4bd207ef 2826int
10458914 2827i386_sigtramp_p (struct frame_info *this_frame)
8201327c 2828{
10458914 2829 CORE_ADDR pc = get_frame_pc (this_frame);
911bc6ee
MK
2830 char *name;
2831
2832 find_pc_partial_function (pc, &name, NULL, NULL);
8201327c
MK
2833 return (name && strcmp ("_sigtramp", name) == 0);
2834}
2835\f
2836
fc338970
MK
2837/* We have two flavours of disassembly. The machinery on this page
2838 deals with switching between those. */
c906108c
SS
2839
2840static int
a89aa300 2841i386_print_insn (bfd_vma pc, struct disassemble_info *info)
c906108c 2842{
5e3397bb
MK
2843 gdb_assert (disassembly_flavor == att_flavor
2844 || disassembly_flavor == intel_flavor);
2845
2846 /* FIXME: kettenis/20020915: Until disassembler_options is properly
2847 constified, cast to prevent a compiler warning. */
2848 info->disassembler_options = (char *) disassembly_flavor;
5e3397bb
MK
2849
2850 return print_insn_i386 (pc, info);
7a292a7a 2851}
fc338970 2852\f
3ce1502b 2853
8201327c
MK
2854/* There are a few i386 architecture variants that differ only
2855 slightly from the generic i386 target. For now, we don't give them
2856 their own source file, but include them here. As a consequence,
2857 they'll always be included. */
3ce1502b 2858
8201327c 2859/* System V Release 4 (SVR4). */
3ce1502b 2860
10458914
DJ
2861/* Return whether THIS_FRAME corresponds to a SVR4 sigtramp
2862 routine. */
911bc6ee 2863
8201327c 2864static int
10458914 2865i386_svr4_sigtramp_p (struct frame_info *this_frame)
d2a7c97a 2866{
10458914 2867 CORE_ADDR pc = get_frame_pc (this_frame);
911bc6ee
MK
2868 char *name;
2869
acd5c798
MK
2870 /* UnixWare uses _sigacthandler. The origin of the other symbols is
2871 currently unknown. */
911bc6ee 2872 find_pc_partial_function (pc, &name, NULL, NULL);
8201327c
MK
2873 return (name && (strcmp ("_sigreturn", name) == 0
2874 || strcmp ("_sigacthandler", name) == 0
2875 || strcmp ("sigvechandler", name) == 0));
2876}
d2a7c97a 2877
10458914
DJ
2878/* Assuming THIS_FRAME is for a SVR4 sigtramp routine, return the
2879 address of the associated sigcontext (ucontext) structure. */
3ce1502b 2880
3a1e71e3 2881static CORE_ADDR
10458914 2882i386_svr4_sigcontext_addr (struct frame_info *this_frame)
8201327c 2883{
e17a4113
UW
2884 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2885 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
63c0089f 2886 gdb_byte buf[4];
acd5c798 2887 CORE_ADDR sp;
3ce1502b 2888
10458914 2889 get_frame_register (this_frame, I386_ESP_REGNUM, buf);
e17a4113 2890 sp = extract_unsigned_integer (buf, 4, byte_order);
21d0e8a4 2891
e17a4113 2892 return read_memory_unsigned_integer (sp + 8, 4, byte_order);
8201327c
MK
2893}
2894\f
3ce1502b 2895
8201327c 2896/* Generic ELF. */
d2a7c97a 2897
8201327c
MK
2898void
2899i386_elf_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2900{
c4fc7f1b
MK
2901 /* We typically use stabs-in-ELF with the SVR4 register numbering. */
2902 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
8201327c 2903}
3ce1502b 2904
8201327c 2905/* System V Release 4 (SVR4). */
3ce1502b 2906
8201327c
MK
2907void
2908i386_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2909{
2910 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3ce1502b 2911
8201327c
MK
2912 /* System V Release 4 uses ELF. */
2913 i386_elf_init_abi (info, gdbarch);
3ce1502b 2914
dfe01d39 2915 /* System V Release 4 has shared libraries. */
dfe01d39
MK
2916 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
2917
911bc6ee 2918 tdep->sigtramp_p = i386_svr4_sigtramp_p;
21d0e8a4 2919 tdep->sigcontext_addr = i386_svr4_sigcontext_addr;
acd5c798
MK
2920 tdep->sc_pc_offset = 36 + 14 * 4;
2921 tdep->sc_sp_offset = 36 + 17 * 4;
3ce1502b 2922
8201327c 2923 tdep->jb_pc_offset = 20;
3ce1502b
MK
2924}
2925
8201327c 2926/* DJGPP. */
3ce1502b 2927
3a1e71e3 2928static void
8201327c 2929i386_go32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
3ce1502b 2930{
8201327c 2931 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3ce1502b 2932
911bc6ee
MK
2933 /* DJGPP doesn't have any special frames for signal handlers. */
2934 tdep->sigtramp_p = NULL;
3ce1502b 2935
8201327c 2936 tdep->jb_pc_offset = 36;
15430fc0
EZ
2937
2938 /* DJGPP does not support the SSE registers. */
3a13a53b
L
2939 if (! tdesc_has_registers (info.target_desc))
2940 tdep->tdesc = tdesc_i386_mmx;
3d22076f
EZ
2941
2942 /* Native compiler is GCC, which uses the SVR4 register numbering
2943 even in COFF and STABS. See the comment in i386_gdbarch_init,
2944 before the calls to set_gdbarch_stab_reg_to_regnum and
2945 set_gdbarch_sdb_reg_to_regnum. */
2946 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
2947 set_gdbarch_sdb_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
ab38a727
PA
2948
2949 set_gdbarch_has_dos_based_file_system (gdbarch, 1);
3ce1502b 2950}
8201327c 2951\f
2acceee2 2952
38c968cf
AC
2953/* i386 register groups. In addition to the normal groups, add "mmx"
2954 and "sse". */
2955
2956static struct reggroup *i386_sse_reggroup;
2957static struct reggroup *i386_mmx_reggroup;
2958
2959static void
2960i386_init_reggroups (void)
2961{
2962 i386_sse_reggroup = reggroup_new ("sse", USER_REGGROUP);
2963 i386_mmx_reggroup = reggroup_new ("mmx", USER_REGGROUP);
2964}
2965
2966static void
2967i386_add_reggroups (struct gdbarch *gdbarch)
2968{
2969 reggroup_add (gdbarch, i386_sse_reggroup);
2970 reggroup_add (gdbarch, i386_mmx_reggroup);
2971 reggroup_add (gdbarch, general_reggroup);
2972 reggroup_add (gdbarch, float_reggroup);
2973 reggroup_add (gdbarch, all_reggroup);
2974 reggroup_add (gdbarch, save_reggroup);
2975 reggroup_add (gdbarch, restore_reggroup);
2976 reggroup_add (gdbarch, vector_reggroup);
2977 reggroup_add (gdbarch, system_reggroup);
2978}
2979
2980int
2981i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
2982 struct reggroup *group)
2983{
c131fcee
L
2984 const struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2985 int fp_regnum_p, mmx_regnum_p, xmm_regnum_p, mxcsr_regnum_p,
2986 ymm_regnum_p, ymmh_regnum_p;
acd5c798 2987
1ba53b71
L
2988 /* Don't include pseudo registers, except for MMX, in any register
2989 groups. */
c131fcee 2990 if (i386_byte_regnum_p (gdbarch, regnum))
1ba53b71
L
2991 return 0;
2992
c131fcee 2993 if (i386_word_regnum_p (gdbarch, regnum))
1ba53b71
L
2994 return 0;
2995
c131fcee 2996 if (i386_dword_regnum_p (gdbarch, regnum))
1ba53b71
L
2997 return 0;
2998
2999 mmx_regnum_p = i386_mmx_regnum_p (gdbarch, regnum);
38c968cf
AC
3000 if (group == i386_mmx_reggroup)
3001 return mmx_regnum_p;
1ba53b71 3002
c131fcee
L
3003 xmm_regnum_p = i386_xmm_regnum_p (gdbarch, regnum);
3004 mxcsr_regnum_p = i386_mxcsr_regnum_p (gdbarch, regnum);
38c968cf 3005 if (group == i386_sse_reggroup)
c131fcee
L
3006 return xmm_regnum_p || mxcsr_regnum_p;
3007
3008 ymm_regnum_p = i386_ymm_regnum_p (gdbarch, regnum);
38c968cf 3009 if (group == vector_reggroup)
c131fcee
L
3010 return (mmx_regnum_p
3011 || ymm_regnum_p
3012 || mxcsr_regnum_p
3013 || (xmm_regnum_p
3014 && ((tdep->xcr0 & I386_XSTATE_AVX_MASK)
3015 == I386_XSTATE_SSE_MASK)));
1ba53b71
L
3016
3017 fp_regnum_p = (i386_fp_regnum_p (gdbarch, regnum)
3018 || i386_fpc_regnum_p (gdbarch, regnum));
38c968cf
AC
3019 if (group == float_reggroup)
3020 return fp_regnum_p;
1ba53b71 3021
c131fcee
L
3022 /* For "info reg all", don't include upper YMM registers nor XMM
3023 registers when AVX is supported. */
3024 ymmh_regnum_p = i386_ymmh_regnum_p (gdbarch, regnum);
3025 if (group == all_reggroup
3026 && ((xmm_regnum_p
3027 && (tdep->xcr0 & I386_XSTATE_AVX))
3028 || ymmh_regnum_p))
3029 return 0;
3030
38c968cf 3031 if (group == general_reggroup)
1ba53b71
L
3032 return (!fp_regnum_p
3033 && !mmx_regnum_p
c131fcee
L
3034 && !mxcsr_regnum_p
3035 && !xmm_regnum_p
3036 && !ymm_regnum_p
3037 && !ymmh_regnum_p);
acd5c798 3038
38c968cf
AC
3039 return default_register_reggroup_p (gdbarch, regnum, group);
3040}
38c968cf 3041\f
acd5c798 3042
f837910f
MK
3043/* Get the ARGIth function argument for the current function. */
3044
42c466d7 3045static CORE_ADDR
143985b7
AF
3046i386_fetch_pointer_argument (struct frame_info *frame, int argi,
3047 struct type *type)
3048{
e17a4113
UW
3049 struct gdbarch *gdbarch = get_frame_arch (frame);
3050 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
f837910f 3051 CORE_ADDR sp = get_frame_register_unsigned (frame, I386_ESP_REGNUM);
e17a4113 3052 return read_memory_unsigned_integer (sp + (4 * (argi + 1)), 4, byte_order);
143985b7
AF
3053}
3054
514f746b
AR
3055static void
3056i386_skip_permanent_breakpoint (struct regcache *regcache)
3057{
3058 CORE_ADDR current_pc = regcache_read_pc (regcache);
3059
3060 /* On i386, breakpoint is exactly 1 byte long, so we just
3061 adjust the PC in the regcache. */
3062 current_pc += 1;
3063 regcache_write_pc (regcache, current_pc);
3064}
3065
3066
7ad10968
HZ
3067#define PREFIX_REPZ 0x01
3068#define PREFIX_REPNZ 0x02
3069#define PREFIX_LOCK 0x04
3070#define PREFIX_DATA 0x08
3071#define PREFIX_ADDR 0x10
473f17b0 3072
7ad10968
HZ
3073/* operand size */
3074enum
3075{
3076 OT_BYTE = 0,
3077 OT_WORD,
3078 OT_LONG,
cf648174 3079 OT_QUAD,
a3c4230a 3080 OT_DQUAD,
7ad10968 3081};
473f17b0 3082
7ad10968
HZ
3083/* i386 arith/logic operations */
3084enum
3085{
3086 OP_ADDL,
3087 OP_ORL,
3088 OP_ADCL,
3089 OP_SBBL,
3090 OP_ANDL,
3091 OP_SUBL,
3092 OP_XORL,
3093 OP_CMPL,
3094};
5716833c 3095
7ad10968
HZ
3096struct i386_record_s
3097{
cf648174 3098 struct gdbarch *gdbarch;
7ad10968 3099 struct regcache *regcache;
df61f520 3100 CORE_ADDR orig_addr;
7ad10968
HZ
3101 CORE_ADDR addr;
3102 int aflag;
3103 int dflag;
3104 int override;
3105 uint8_t modrm;
3106 uint8_t mod, reg, rm;
3107 int ot;
cf648174
HZ
3108 uint8_t rex_x;
3109 uint8_t rex_b;
3110 int rip_offset;
3111 int popl_esp_hack;
3112 const int *regmap;
7ad10968 3113};
5716833c 3114
7ad10968
HZ
3115/* Parse "modrm" part in current memory address that irp->addr point to
3116 Return -1 if something wrong. */
5716833c 3117
7ad10968
HZ
3118static int
3119i386_record_modrm (struct i386_record_s *irp)
3120{
cf648174 3121 struct gdbarch *gdbarch = irp->gdbarch;
5af949e3 3122
7ad10968
HZ
3123 if (target_read_memory (irp->addr, &irp->modrm, 1))
3124 {
3125 if (record_debug)
3126 printf_unfiltered (_("Process record: error reading memory at "
5af949e3
UW
3127 "addr %s len = 1.\n"),
3128 paddress (gdbarch, irp->addr));
7ad10968
HZ
3129 return -1;
3130 }
3131 irp->addr++;
3132 irp->mod = (irp->modrm >> 6) & 3;
3133 irp->reg = (irp->modrm >> 3) & 7;
3134 irp->rm = irp->modrm & 7;
5716833c 3135
7ad10968
HZ
3136 return 0;
3137}
d2a7c97a 3138
7ad10968
HZ
3139/* Get the memory address that current instruction write to and set it to
3140 the argument "addr".
3141 Return -1 if something wrong. */
8201327c 3142
7ad10968 3143static int
cf648174 3144i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr)
7ad10968 3145{
cf648174 3146 struct gdbarch *gdbarch = irp->gdbarch;
60a1502a
MS
3147 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3148 gdb_byte buf[4];
3149 ULONGEST offset64;
21d0e8a4 3150
7ad10968
HZ
3151 *addr = 0;
3152 if (irp->aflag)
3153 {
3154 /* 32 bits */
3155 int havesib = 0;
3156 uint8_t scale = 0;
648d0c8b 3157 uint8_t byte;
7ad10968
HZ
3158 uint8_t index = 0;
3159 uint8_t base = irp->rm;
896fb97d 3160
7ad10968
HZ
3161 if (base == 4)
3162 {
3163 havesib = 1;
648d0c8b 3164 if (target_read_memory (irp->addr, &byte, 1))
7ad10968
HZ
3165 {
3166 if (record_debug)
3167 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3168 "at addr %s len = 1.\n"),
3169 paddress (gdbarch, irp->addr));
7ad10968
HZ
3170 return -1;
3171 }
3172 irp->addr++;
648d0c8b
MS
3173 scale = (byte >> 6) & 3;
3174 index = ((byte >> 3) & 7) | irp->rex_x;
3175 base = (byte & 7);
7ad10968 3176 }
cf648174 3177 base |= irp->rex_b;
21d0e8a4 3178
7ad10968
HZ
3179 switch (irp->mod)
3180 {
3181 case 0:
3182 if ((base & 7) == 5)
3183 {
3184 base = 0xff;
60a1502a 3185 if (target_read_memory (irp->addr, buf, 4))
7ad10968
HZ
3186 {
3187 if (record_debug)
3188 printf_unfiltered (_("Process record: error reading "
5af949e3
UW
3189 "memory at addr %s len = 4.\n"),
3190 paddress (gdbarch, irp->addr));
7ad10968
HZ
3191 return -1;
3192 }
3193 irp->addr += 4;
60a1502a 3194 *addr = extract_signed_integer (buf, 4, byte_order);
cf648174
HZ
3195 if (irp->regmap[X86_RECORD_R8_REGNUM] && !havesib)
3196 *addr += irp->addr + irp->rip_offset;
7ad10968 3197 }
7ad10968
HZ
3198 break;
3199 case 1:
60a1502a 3200 if (target_read_memory (irp->addr, buf, 1))
7ad10968
HZ
3201 {
3202 if (record_debug)
3203 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3204 "at addr %s len = 1.\n"),
3205 paddress (gdbarch, irp->addr));
7ad10968
HZ
3206 return -1;
3207 }
3208 irp->addr++;
60a1502a 3209 *addr = (int8_t) buf[0];
7ad10968
HZ
3210 break;
3211 case 2:
60a1502a 3212 if (target_read_memory (irp->addr, buf, 4))
7ad10968
HZ
3213 {
3214 if (record_debug)
3215 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3216 "at addr %s len = 4.\n"),
3217 paddress (gdbarch, irp->addr));
7ad10968
HZ
3218 return -1;
3219 }
60a1502a 3220 *addr = extract_signed_integer (buf, 4, byte_order);
7ad10968
HZ
3221 irp->addr += 4;
3222 break;
3223 }
356a6b3e 3224
60a1502a 3225 offset64 = 0;
7ad10968 3226 if (base != 0xff)
cf648174
HZ
3227 {
3228 if (base == 4 && irp->popl_esp_hack)
3229 *addr += irp->popl_esp_hack;
3230 regcache_raw_read_unsigned (irp->regcache, irp->regmap[base],
60a1502a 3231 &offset64);
7ad10968 3232 }
cf648174
HZ
3233 if (irp->aflag == 2)
3234 {
60a1502a 3235 *addr += offset64;
cf648174
HZ
3236 }
3237 else
60a1502a 3238 *addr = (uint32_t) (offset64 + *addr);
c4fc7f1b 3239
7ad10968
HZ
3240 if (havesib && (index != 4 || scale != 0))
3241 {
cf648174 3242 regcache_raw_read_unsigned (irp->regcache, irp->regmap[index],
60a1502a 3243 &offset64);
cf648174 3244 if (irp->aflag == 2)
60a1502a 3245 *addr += offset64 << scale;
cf648174 3246 else
60a1502a 3247 *addr = (uint32_t) (*addr + (offset64 << scale));
7ad10968
HZ
3248 }
3249 }
3250 else
3251 {
3252 /* 16 bits */
3253 switch (irp->mod)
3254 {
3255 case 0:
3256 if (irp->rm == 6)
3257 {
60a1502a 3258 if (target_read_memory (irp->addr, buf, 2))
7ad10968
HZ
3259 {
3260 if (record_debug)
3261 printf_unfiltered (_("Process record: error reading "
5af949e3
UW
3262 "memory at addr %s len = 2.\n"),
3263 paddress (gdbarch, irp->addr));
7ad10968
HZ
3264 return -1;
3265 }
3266 irp->addr += 2;
60a1502a 3267 *addr = extract_signed_integer (buf, 2, byte_order);
7ad10968
HZ
3268 irp->rm = 0;
3269 goto no_rm;
3270 }
7ad10968
HZ
3271 break;
3272 case 1:
60a1502a 3273 if (target_read_memory (irp->addr, buf, 1))
7ad10968
HZ
3274 {
3275 if (record_debug)
3276 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3277 "at addr %s len = 1.\n"),
3278 paddress (gdbarch, irp->addr));
7ad10968
HZ
3279 return -1;
3280 }
3281 irp->addr++;
60a1502a 3282 *addr = (int8_t) buf[0];
7ad10968
HZ
3283 break;
3284 case 2:
60a1502a 3285 if (target_read_memory (irp->addr, buf, 2))
7ad10968
HZ
3286 {
3287 if (record_debug)
3288 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
3289 "at addr %s len = 2.\n"),
3290 paddress (gdbarch, irp->addr));
7ad10968
HZ
3291 return -1;
3292 }
3293 irp->addr += 2;
60a1502a 3294 *addr = extract_signed_integer (buf, 2, byte_order);
7ad10968
HZ
3295 break;
3296 }
c4fc7f1b 3297
7ad10968
HZ
3298 switch (irp->rm)
3299 {
3300 case 0:
cf648174
HZ
3301 regcache_raw_read_unsigned (irp->regcache,
3302 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
3303 &offset64);
3304 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3305 regcache_raw_read_unsigned (irp->regcache,
3306 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
3307 &offset64);
3308 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3309 break;
3310 case 1:
cf648174
HZ
3311 regcache_raw_read_unsigned (irp->regcache,
3312 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
3313 &offset64);
3314 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3315 regcache_raw_read_unsigned (irp->regcache,
3316 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
3317 &offset64);
3318 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3319 break;
3320 case 2:
cf648174
HZ
3321 regcache_raw_read_unsigned (irp->regcache,
3322 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
3323 &offset64);
3324 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3325 regcache_raw_read_unsigned (irp->regcache,
3326 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
3327 &offset64);
3328 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3329 break;
3330 case 3:
cf648174
HZ
3331 regcache_raw_read_unsigned (irp->regcache,
3332 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
3333 &offset64);
3334 *addr = (uint32_t) (*addr + offset64);
cf648174
HZ
3335 regcache_raw_read_unsigned (irp->regcache,
3336 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
3337 &offset64);
3338 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3339 break;
3340 case 4:
cf648174
HZ
3341 regcache_raw_read_unsigned (irp->regcache,
3342 irp->regmap[X86_RECORD_RESI_REGNUM],
60a1502a
MS
3343 &offset64);
3344 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3345 break;
3346 case 5:
cf648174
HZ
3347 regcache_raw_read_unsigned (irp->regcache,
3348 irp->regmap[X86_RECORD_REDI_REGNUM],
60a1502a
MS
3349 &offset64);
3350 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3351 break;
3352 case 6:
cf648174
HZ
3353 regcache_raw_read_unsigned (irp->regcache,
3354 irp->regmap[X86_RECORD_REBP_REGNUM],
60a1502a
MS
3355 &offset64);
3356 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3357 break;
3358 case 7:
cf648174
HZ
3359 regcache_raw_read_unsigned (irp->regcache,
3360 irp->regmap[X86_RECORD_REBX_REGNUM],
60a1502a
MS
3361 &offset64);
3362 *addr = (uint32_t) (*addr + offset64);
7ad10968
HZ
3363 break;
3364 }
3365 *addr &= 0xffff;
3366 }
c4fc7f1b 3367
01fe1b41 3368 no_rm:
7ad10968
HZ
3369 return 0;
3370}
c4fc7f1b 3371
7ad10968
HZ
3372/* Record the value of the memory that willbe changed in current instruction
3373 to "record_arch_list".
3374 Return -1 if something wrong. */
356a6b3e 3375
7ad10968
HZ
3376static int
3377i386_record_lea_modrm (struct i386_record_s *irp)
3378{
cf648174
HZ
3379 struct gdbarch *gdbarch = irp->gdbarch;
3380 uint64_t addr;
356a6b3e 3381
d7877f7e 3382 if (irp->override >= 0)
7ad10968 3383 {
df61f520
HZ
3384 warning (_("Process record ignores the memory change "
3385 "of instruction at address %s because it "
3386 "can't get the value of the segment register."),
3387 paddress (gdbarch, irp->orig_addr));
7ad10968
HZ
3388 return 0;
3389 }
61113f8b 3390
7ad10968
HZ
3391 if (i386_record_lea_modrm_addr (irp, &addr))
3392 return -1;
96297dab 3393
7ad10968
HZ
3394 if (record_arch_list_add_mem (addr, 1 << irp->ot))
3395 return -1;
a62cc96e 3396
7ad10968
HZ
3397 return 0;
3398}
b6197528 3399
cf648174
HZ
3400/* Record the push operation to "record_arch_list".
3401 Return -1 if something wrong. */
3402
3403static int
3404i386_record_push (struct i386_record_s *irp, int size)
3405{
648d0c8b 3406 ULONGEST addr;
cf648174
HZ
3407
3408 if (record_arch_list_add_reg (irp->regcache,
3409 irp->regmap[X86_RECORD_RESP_REGNUM]))
3410 return -1;
3411 regcache_raw_read_unsigned (irp->regcache,
3412 irp->regmap[X86_RECORD_RESP_REGNUM],
648d0c8b
MS
3413 &addr);
3414 if (record_arch_list_add_mem ((CORE_ADDR) addr - size, size))
cf648174
HZ
3415 return -1;
3416
3417 return 0;
3418}
3419
0289bdd7
MS
3420
3421/* Defines contents to record. */
3422#define I386_SAVE_FPU_REGS 0xfffd
3423#define I386_SAVE_FPU_ENV 0xfffe
3424#define I386_SAVE_FPU_ENV_REG_STACK 0xffff
3425
3426/* Record the value of floating point registers which will be changed by the
3427 current instruction to "record_arch_list". Return -1 if something is wrong.
3428*/
3429
3430static int i386_record_floats (struct gdbarch *gdbarch,
3431 struct i386_record_s *ir,
3432 uint32_t iregnum)
3433{
3434 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3435 int i;
3436
3437 /* Oza: Because of floating point insn push/pop of fpu stack is going to
3438 happen. Currently we store st0-st7 registers, but we need not store all
3439 registers all the time, in future we use ftag register and record only
3440 those who are not marked as an empty. */
3441
3442 if (I386_SAVE_FPU_REGS == iregnum)
3443 {
3444 for (i = I387_ST0_REGNUM (tdep); i <= I387_ST0_REGNUM (tdep) + 7; i++)
3445 {
3446 if (record_arch_list_add_reg (ir->regcache, i))
3447 return -1;
3448 }
3449 }
3450 else if (I386_SAVE_FPU_ENV == iregnum)
3451 {
3452 for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
3453 {
3454 if (record_arch_list_add_reg (ir->regcache, i))
3455 return -1;
3456 }
3457 }
3458 else if (I386_SAVE_FPU_ENV_REG_STACK == iregnum)
3459 {
3460 for (i = I387_ST0_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
3461 {
3462 if (record_arch_list_add_reg (ir->regcache, i))
3463 return -1;
3464 }
3465 }
3466 else if ((iregnum >= I387_ST0_REGNUM (tdep)) &&
3467 (iregnum <= I387_FOP_REGNUM (tdep)))
3468 {
3469 if (record_arch_list_add_reg (ir->regcache,iregnum))
3470 return -1;
3471 }
3472 else
3473 {
3474 /* Parameter error. */
3475 return -1;
3476 }
3477 if(I386_SAVE_FPU_ENV != iregnum)
3478 {
3479 for (i = I387_FCTRL_REGNUM (tdep); i <= I387_FOP_REGNUM (tdep); i++)
3480 {
3481 if (record_arch_list_add_reg (ir->regcache, i))
3482 return -1;
3483 }
3484 }
3485 return 0;
3486}
3487
7ad10968
HZ
3488/* Parse the current instruction and record the values of the registers and
3489 memory that will be changed in current instruction to "record_arch_list".
3490 Return -1 if something wrong. */
8201327c 3491
cf648174
HZ
3492#define I386_RECORD_ARCH_LIST_ADD_REG(regnum) \
3493 record_arch_list_add_reg (ir.regcache, ir.regmap[(regnum)])
3494
a6b808b4 3495int
7ad10968 3496i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
648d0c8b 3497 CORE_ADDR input_addr)
7ad10968 3498{
60a1502a 3499 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7ad10968 3500 int prefixes = 0;
580879fc 3501 int regnum = 0;
425b824a
MS
3502 uint32_t opcode;
3503 uint8_t opcode8;
648d0c8b 3504 ULONGEST addr;
60a1502a 3505 gdb_byte buf[MAX_REGISTER_SIZE];
7ad10968 3506 struct i386_record_s ir;
0289bdd7 3507 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
cf648174
HZ
3508 int rex = 0;
3509 uint8_t rex_w = -1;
3510 uint8_t rex_r = 0;
7ad10968 3511
8408d274 3512 memset (&ir, 0, sizeof (struct i386_record_s));
7ad10968 3513 ir.regcache = regcache;
648d0c8b
MS
3514 ir.addr = input_addr;
3515 ir.orig_addr = input_addr;
7ad10968
HZ
3516 ir.aflag = 1;
3517 ir.dflag = 1;
cf648174
HZ
3518 ir.override = -1;
3519 ir.popl_esp_hack = 0;
a3c4230a 3520 ir.regmap = tdep->record_regmap;
cf648174 3521 ir.gdbarch = gdbarch;
7ad10968
HZ
3522
3523 if (record_debug > 1)
3524 fprintf_unfiltered (gdb_stdlog, "Process record: i386_process_record "
5af949e3
UW
3525 "addr = %s\n",
3526 paddress (gdbarch, ir.addr));
7ad10968
HZ
3527
3528 /* prefixes */
3529 while (1)
3530 {
425b824a 3531 if (target_read_memory (ir.addr, &opcode8, 1))
7ad10968
HZ
3532 {
3533 if (record_debug)
3534 printf_unfiltered (_("Process record: error reading memory at "
5af949e3
UW
3535 "addr %s len = 1.\n"),
3536 paddress (gdbarch, ir.addr));
7ad10968
HZ
3537 return -1;
3538 }
3539 ir.addr++;
425b824a 3540 switch (opcode8) /* Instruction prefixes */
7ad10968 3541 {
01fe1b41 3542 case REPE_PREFIX_OPCODE:
7ad10968
HZ
3543 prefixes |= PREFIX_REPZ;
3544 break;
01fe1b41 3545 case REPNE_PREFIX_OPCODE:
7ad10968
HZ
3546 prefixes |= PREFIX_REPNZ;
3547 break;
01fe1b41 3548 case LOCK_PREFIX_OPCODE:
7ad10968
HZ
3549 prefixes |= PREFIX_LOCK;
3550 break;
01fe1b41 3551 case CS_PREFIX_OPCODE:
cf648174 3552 ir.override = X86_RECORD_CS_REGNUM;
7ad10968 3553 break;
01fe1b41 3554 case SS_PREFIX_OPCODE:
cf648174 3555 ir.override = X86_RECORD_SS_REGNUM;
7ad10968 3556 break;
01fe1b41 3557 case DS_PREFIX_OPCODE:
cf648174 3558 ir.override = X86_RECORD_DS_REGNUM;
7ad10968 3559 break;
01fe1b41 3560 case ES_PREFIX_OPCODE:
cf648174 3561 ir.override = X86_RECORD_ES_REGNUM;
7ad10968 3562 break;
01fe1b41 3563 case FS_PREFIX_OPCODE:
cf648174 3564 ir.override = X86_RECORD_FS_REGNUM;
7ad10968 3565 break;
01fe1b41 3566 case GS_PREFIX_OPCODE:
cf648174 3567 ir.override = X86_RECORD_GS_REGNUM;
7ad10968 3568 break;
01fe1b41 3569 case DATA_PREFIX_OPCODE:
7ad10968
HZ
3570 prefixes |= PREFIX_DATA;
3571 break;
01fe1b41 3572 case ADDR_PREFIX_OPCODE:
7ad10968
HZ
3573 prefixes |= PREFIX_ADDR;
3574 break;
d691bec7
MS
3575 case 0x40: /* i386 inc %eax */
3576 case 0x41: /* i386 inc %ecx */
3577 case 0x42: /* i386 inc %edx */
3578 case 0x43: /* i386 inc %ebx */
3579 case 0x44: /* i386 inc %esp */
3580 case 0x45: /* i386 inc %ebp */
3581 case 0x46: /* i386 inc %esi */
3582 case 0x47: /* i386 inc %edi */
3583 case 0x48: /* i386 dec %eax */
3584 case 0x49: /* i386 dec %ecx */
3585 case 0x4a: /* i386 dec %edx */
3586 case 0x4b: /* i386 dec %ebx */
3587 case 0x4c: /* i386 dec %esp */
3588 case 0x4d: /* i386 dec %ebp */
3589 case 0x4e: /* i386 dec %esi */
3590 case 0x4f: /* i386 dec %edi */
3591 if (ir.regmap[X86_RECORD_R8_REGNUM]) /* 64 bit target */
cf648174
HZ
3592 {
3593 /* REX */
3594 rex = 1;
425b824a
MS
3595 rex_w = (opcode8 >> 3) & 1;
3596 rex_r = (opcode8 & 0x4) << 1;
3597 ir.rex_x = (opcode8 & 0x2) << 2;
3598 ir.rex_b = (opcode8 & 0x1) << 3;
cf648174 3599 }
d691bec7
MS
3600 else /* 32 bit target */
3601 goto out_prefixes;
cf648174 3602 break;
7ad10968
HZ
3603 default:
3604 goto out_prefixes;
3605 break;
3606 }
3607 }
01fe1b41 3608 out_prefixes:
cf648174
HZ
3609 if (ir.regmap[X86_RECORD_R8_REGNUM] && rex_w == 1)
3610 {
3611 ir.dflag = 2;
3612 }
3613 else
3614 {
3615 if (prefixes & PREFIX_DATA)
3616 ir.dflag ^= 1;
3617 }
7ad10968
HZ
3618 if (prefixes & PREFIX_ADDR)
3619 ir.aflag ^= 1;
cf648174
HZ
3620 else if (ir.regmap[X86_RECORD_R8_REGNUM])
3621 ir.aflag = 2;
7ad10968
HZ
3622
3623 /* now check op code */
425b824a 3624 opcode = (uint32_t) opcode8;
01fe1b41 3625 reswitch:
7ad10968
HZ
3626 switch (opcode)
3627 {
3628 case 0x0f:
425b824a 3629 if (target_read_memory (ir.addr, &opcode8, 1))
7ad10968
HZ
3630 {
3631 if (record_debug)
3632 printf_unfiltered (_("Process record: error reading memory at "
5af949e3
UW
3633 "addr %s len = 1.\n"),
3634 paddress (gdbarch, ir.addr));
7ad10968
HZ
3635 return -1;
3636 }
3637 ir.addr++;
a3c4230a 3638 opcode = (uint32_t) opcode8 | 0x0f00;
7ad10968
HZ
3639 goto reswitch;
3640 break;
93924b6b 3641
a38bba38 3642 case 0x00: /* arith & logic */
7ad10968
HZ
3643 case 0x01:
3644 case 0x02:
3645 case 0x03:
3646 case 0x04:
3647 case 0x05:
3648 case 0x08:
3649 case 0x09:
3650 case 0x0a:
3651 case 0x0b:
3652 case 0x0c:
3653 case 0x0d:
3654 case 0x10:
3655 case 0x11:
3656 case 0x12:
3657 case 0x13:
3658 case 0x14:
3659 case 0x15:
3660 case 0x18:
3661 case 0x19:
3662 case 0x1a:
3663 case 0x1b:
3664 case 0x1c:
3665 case 0x1d:
3666 case 0x20:
3667 case 0x21:
3668 case 0x22:
3669 case 0x23:
3670 case 0x24:
3671 case 0x25:
3672 case 0x28:
3673 case 0x29:
3674 case 0x2a:
3675 case 0x2b:
3676 case 0x2c:
3677 case 0x2d:
3678 case 0x30:
3679 case 0x31:
3680 case 0x32:
3681 case 0x33:
3682 case 0x34:
3683 case 0x35:
3684 case 0x38:
3685 case 0x39:
3686 case 0x3a:
3687 case 0x3b:
3688 case 0x3c:
3689 case 0x3d:
3690 if (((opcode >> 3) & 7) != OP_CMPL)
3691 {
3692 if ((opcode & 1) == 0)
3693 ir.ot = OT_BYTE;
3694 else
3695 ir.ot = ir.dflag + OT_WORD;
93924b6b 3696
7ad10968
HZ
3697 switch ((opcode >> 1) & 3)
3698 {
a38bba38 3699 case 0: /* OP Ev, Gv */
7ad10968
HZ
3700 if (i386_record_modrm (&ir))
3701 return -1;
3702 if (ir.mod != 3)
3703 {
3704 if (i386_record_lea_modrm (&ir))
3705 return -1;
3706 }
3707 else
3708 {
cf648174
HZ
3709 ir.rm |= ir.rex_b;
3710 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3711 ir.rm &= 0x3;
cf648174 3712 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
3713 }
3714 break;
a38bba38 3715 case 1: /* OP Gv, Ev */
7ad10968
HZ
3716 if (i386_record_modrm (&ir))
3717 return -1;
cf648174
HZ
3718 ir.reg |= rex_r;
3719 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3720 ir.reg &= 0x3;
cf648174 3721 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968 3722 break;
a38bba38 3723 case 2: /* OP A, Iv */
cf648174 3724 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
3725 break;
3726 }
3727 }
cf648174 3728 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3729 break;
42fdc8df 3730
a38bba38 3731 case 0x80: /* GRP1 */
7ad10968
HZ
3732 case 0x81:
3733 case 0x82:
3734 case 0x83:
3735 if (i386_record_modrm (&ir))
3736 return -1;
8201327c 3737
7ad10968
HZ
3738 if (ir.reg != OP_CMPL)
3739 {
3740 if ((opcode & 1) == 0)
3741 ir.ot = OT_BYTE;
3742 else
3743 ir.ot = ir.dflag + OT_WORD;
28fc6740 3744
7ad10968
HZ
3745 if (ir.mod != 3)
3746 {
cf648174
HZ
3747 if (opcode == 0x83)
3748 ir.rip_offset = 1;
3749 else
3750 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
7ad10968
HZ
3751 if (i386_record_lea_modrm (&ir))
3752 return -1;
3753 }
3754 else
cf648174 3755 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968 3756 }
cf648174 3757 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3758 break;
5e3397bb 3759
a38bba38 3760 case 0x40: /* inc */
7ad10968
HZ
3761 case 0x41:
3762 case 0x42:
3763 case 0x43:
3764 case 0x44:
3765 case 0x45:
3766 case 0x46:
3767 case 0x47:
a38bba38
MS
3768
3769 case 0x48: /* dec */
7ad10968
HZ
3770 case 0x49:
3771 case 0x4a:
3772 case 0x4b:
3773 case 0x4c:
3774 case 0x4d:
3775 case 0x4e:
3776 case 0x4f:
a38bba38 3777
cf648174
HZ
3778 I386_RECORD_ARCH_LIST_ADD_REG (opcode & 7);
3779 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3780 break;
acd5c798 3781
a38bba38 3782 case 0xf6: /* GRP3 */
7ad10968
HZ
3783 case 0xf7:
3784 if ((opcode & 1) == 0)
3785 ir.ot = OT_BYTE;
3786 else
3787 ir.ot = ir.dflag + OT_WORD;
3788 if (i386_record_modrm (&ir))
3789 return -1;
acd5c798 3790
cf648174
HZ
3791 if (ir.mod != 3 && ir.reg == 0)
3792 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
3793
7ad10968
HZ
3794 switch (ir.reg)
3795 {
a38bba38 3796 case 0: /* test */
cf648174 3797 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3798 break;
a38bba38
MS
3799 case 2: /* not */
3800 case 3: /* neg */
7ad10968
HZ
3801 if (ir.mod != 3)
3802 {
3803 if (i386_record_lea_modrm (&ir))
3804 return -1;
3805 }
3806 else
3807 {
cf648174
HZ
3808 ir.rm |= ir.rex_b;
3809 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3810 ir.rm &= 0x3;
cf648174 3811 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 3812 }
a38bba38 3813 if (ir.reg == 3) /* neg */
cf648174 3814 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3815 break;
a38bba38
MS
3816 case 4: /* mul */
3817 case 5: /* imul */
3818 case 6: /* div */
3819 case 7: /* idiv */
cf648174 3820 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968 3821 if (ir.ot != OT_BYTE)
cf648174
HZ
3822 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
3823 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3824 break;
3825 default:
3826 ir.addr -= 2;
3827 opcode = opcode << 8 | ir.modrm;
3828 goto no_support;
3829 break;
3830 }
3831 break;
3832
a38bba38
MS
3833 case 0xfe: /* GRP4 */
3834 case 0xff: /* GRP5 */
7ad10968
HZ
3835 if (i386_record_modrm (&ir))
3836 return -1;
3837 if (ir.reg >= 2 && opcode == 0xfe)
3838 {
3839 ir.addr -= 2;
3840 opcode = opcode << 8 | ir.modrm;
3841 goto no_support;
3842 }
7ad10968
HZ
3843 switch (ir.reg)
3844 {
a38bba38
MS
3845 case 0: /* inc */
3846 case 1: /* dec */
cf648174
HZ
3847 if ((opcode & 1) == 0)
3848 ir.ot = OT_BYTE;
3849 else
3850 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
3851 if (ir.mod != 3)
3852 {
3853 if (i386_record_lea_modrm (&ir))
3854 return -1;
3855 }
3856 else
3857 {
cf648174
HZ
3858 ir.rm |= ir.rex_b;
3859 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3860 ir.rm &= 0x3;
cf648174 3861 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 3862 }
cf648174 3863 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3864 break;
a38bba38 3865 case 2: /* call */
cf648174
HZ
3866 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
3867 ir.dflag = 2;
3868 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 3869 return -1;
cf648174 3870 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3871 break;
a38bba38 3872 case 3: /* lcall */
cf648174
HZ
3873 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
3874 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 3875 return -1;
cf648174 3876 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 3877 break;
a38bba38
MS
3878 case 4: /* jmp */
3879 case 5: /* ljmp */
cf648174
HZ
3880 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
3881 break;
a38bba38 3882 case 6: /* push */
cf648174
HZ
3883 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
3884 ir.dflag = 2;
3885 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
3886 return -1;
7ad10968
HZ
3887 break;
3888 default:
3889 ir.addr -= 2;
3890 opcode = opcode << 8 | ir.modrm;
3891 goto no_support;
3892 break;
3893 }
3894 break;
3895
a38bba38 3896 case 0x84: /* test */
7ad10968
HZ
3897 case 0x85:
3898 case 0xa8:
3899 case 0xa9:
cf648174 3900 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3901 break;
3902
a38bba38 3903 case 0x98: /* CWDE/CBW */
cf648174 3904 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
3905 break;
3906
a38bba38 3907 case 0x99: /* CDQ/CWD */
cf648174
HZ
3908 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
3909 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
3910 break;
3911
a38bba38 3912 case 0x0faf: /* imul */
7ad10968
HZ
3913 case 0x69:
3914 case 0x6b:
3915 ir.ot = ir.dflag + OT_WORD;
3916 if (i386_record_modrm (&ir))
3917 return -1;
cf648174
HZ
3918 if (opcode == 0x69)
3919 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
3920 else if (opcode == 0x6b)
3921 ir.rip_offset = 1;
3922 ir.reg |= rex_r;
3923 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3924 ir.reg &= 0x3;
cf648174
HZ
3925 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
3926 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3927 break;
3928
a38bba38 3929 case 0x0fc0: /* xadd */
7ad10968
HZ
3930 case 0x0fc1:
3931 if ((opcode & 1) == 0)
3932 ir.ot = OT_BYTE;
3933 else
3934 ir.ot = ir.dflag + OT_WORD;
3935 if (i386_record_modrm (&ir))
3936 return -1;
cf648174 3937 ir.reg |= rex_r;
7ad10968
HZ
3938 if (ir.mod == 3)
3939 {
cf648174 3940 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3941 ir.reg &= 0x3;
cf648174
HZ
3942 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
3943 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3944 ir.rm &= 0x3;
cf648174 3945 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
3946 }
3947 else
3948 {
3949 if (i386_record_lea_modrm (&ir))
3950 return -1;
cf648174 3951 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3952 ir.reg &= 0x3;
cf648174 3953 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968 3954 }
cf648174 3955 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3956 break;
3957
a38bba38 3958 case 0x0fb0: /* cmpxchg */
7ad10968
HZ
3959 case 0x0fb1:
3960 if ((opcode & 1) == 0)
3961 ir.ot = OT_BYTE;
3962 else
3963 ir.ot = ir.dflag + OT_WORD;
3964 if (i386_record_modrm (&ir))
3965 return -1;
3966 if (ir.mod == 3)
3967 {
cf648174
HZ
3968 ir.reg |= rex_r;
3969 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
3970 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 3971 ir.reg &= 0x3;
cf648174 3972 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
3973 }
3974 else
3975 {
cf648174 3976 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
3977 if (i386_record_lea_modrm (&ir))
3978 return -1;
3979 }
cf648174 3980 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3981 break;
3982
a38bba38 3983 case 0x0fc7: /* cmpxchg8b */
7ad10968
HZ
3984 if (i386_record_modrm (&ir))
3985 return -1;
3986 if (ir.mod == 3)
3987 {
3988 ir.addr -= 2;
3989 opcode = opcode << 8 | ir.modrm;
3990 goto no_support;
3991 }
cf648174
HZ
3992 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
3993 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
3994 if (i386_record_lea_modrm (&ir))
3995 return -1;
cf648174 3996 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
3997 break;
3998
a38bba38 3999 case 0x50: /* push */
7ad10968
HZ
4000 case 0x51:
4001 case 0x52:
4002 case 0x53:
4003 case 0x54:
4004 case 0x55:
4005 case 0x56:
4006 case 0x57:
4007 case 0x68:
4008 case 0x6a:
cf648174
HZ
4009 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
4010 ir.dflag = 2;
4011 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
4012 return -1;
4013 break;
4014
a38bba38
MS
4015 case 0x06: /* push es */
4016 case 0x0e: /* push cs */
4017 case 0x16: /* push ss */
4018 case 0x1e: /* push ds */
cf648174
HZ
4019 if (ir.regmap[X86_RECORD_R8_REGNUM])
4020 {
4021 ir.addr -= 1;
4022 goto no_support;
4023 }
4024 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
4025 return -1;
4026 break;
4027
a38bba38
MS
4028 case 0x0fa0: /* push fs */
4029 case 0x0fa8: /* push gs */
cf648174
HZ
4030 if (ir.regmap[X86_RECORD_R8_REGNUM])
4031 {
4032 ir.addr -= 2;
4033 goto no_support;
4034 }
4035 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968 4036 return -1;
cf648174
HZ
4037 break;
4038
a38bba38 4039 case 0x60: /* pusha */
cf648174
HZ
4040 if (ir.regmap[X86_RECORD_R8_REGNUM])
4041 {
4042 ir.addr -= 1;
4043 goto no_support;
4044 }
4045 if (i386_record_push (&ir, 1 << (ir.dflag + 4)))
7ad10968
HZ
4046 return -1;
4047 break;
4048
a38bba38 4049 case 0x58: /* pop */
7ad10968
HZ
4050 case 0x59:
4051 case 0x5a:
4052 case 0x5b:
4053 case 0x5c:
4054 case 0x5d:
4055 case 0x5e:
4056 case 0x5f:
cf648174
HZ
4057 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4058 I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
7ad10968
HZ
4059 break;
4060
a38bba38 4061 case 0x61: /* popa */
cf648174
HZ
4062 if (ir.regmap[X86_RECORD_R8_REGNUM])
4063 {
4064 ir.addr -= 1;
4065 goto no_support;
7ad10968 4066 }
425b824a
MS
4067 for (regnum = X86_RECORD_REAX_REGNUM;
4068 regnum <= X86_RECORD_REDI_REGNUM;
4069 regnum++)
4070 I386_RECORD_ARCH_LIST_ADD_REG (regnum);
7ad10968
HZ
4071 break;
4072
a38bba38 4073 case 0x8f: /* pop */
cf648174
HZ
4074 if (ir.regmap[X86_RECORD_R8_REGNUM])
4075 ir.ot = ir.dflag ? OT_QUAD : OT_WORD;
4076 else
4077 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4078 if (i386_record_modrm (&ir))
4079 return -1;
4080 if (ir.mod == 3)
cf648174 4081 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
4082 else
4083 {
cf648174 4084 ir.popl_esp_hack = 1 << ir.ot;
7ad10968
HZ
4085 if (i386_record_lea_modrm (&ir))
4086 return -1;
4087 }
cf648174 4088 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
7ad10968
HZ
4089 break;
4090
a38bba38 4091 case 0xc8: /* enter */
cf648174
HZ
4092 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
4093 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
4094 ir.dflag = 2;
4095 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
7ad10968
HZ
4096 return -1;
4097 break;
4098
a38bba38 4099 case 0xc9: /* leave */
cf648174
HZ
4100 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4101 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
7ad10968
HZ
4102 break;
4103
a38bba38 4104 case 0x07: /* pop es */
cf648174
HZ
4105 if (ir.regmap[X86_RECORD_R8_REGNUM])
4106 {
4107 ir.addr -= 1;
4108 goto no_support;
4109 }
4110 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4111 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_ES_REGNUM);
4112 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4113 break;
4114
a38bba38 4115 case 0x17: /* pop ss */
cf648174
HZ
4116 if (ir.regmap[X86_RECORD_R8_REGNUM])
4117 {
4118 ir.addr -= 1;
4119 goto no_support;
4120 }
4121 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4122 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_SS_REGNUM);
4123 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4124 break;
4125
a38bba38 4126 case 0x1f: /* pop ds */
cf648174
HZ
4127 if (ir.regmap[X86_RECORD_R8_REGNUM])
4128 {
4129 ir.addr -= 1;
4130 goto no_support;
4131 }
4132 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4133 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_DS_REGNUM);
4134 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4135 break;
4136
a38bba38 4137 case 0x0fa1: /* pop fs */
cf648174
HZ
4138 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4139 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_FS_REGNUM);
4140 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4141 break;
4142
a38bba38 4143 case 0x0fa9: /* pop gs */
cf648174
HZ
4144 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
4145 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
4146 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4147 break;
4148
a38bba38 4149 case 0x88: /* mov */
7ad10968
HZ
4150 case 0x89:
4151 case 0xc6:
4152 case 0xc7:
4153 if ((opcode & 1) == 0)
4154 ir.ot = OT_BYTE;
4155 else
4156 ir.ot = ir.dflag + OT_WORD;
4157
4158 if (i386_record_modrm (&ir))
4159 return -1;
4160
4161 if (ir.mod != 3)
4162 {
cf648174
HZ
4163 if (opcode == 0xc6 || opcode == 0xc7)
4164 ir.rip_offset = (ir.ot > OT_LONG) ? 4 : (1 << ir.ot);
7ad10968
HZ
4165 if (i386_record_lea_modrm (&ir))
4166 return -1;
4167 }
4168 else
4169 {
cf648174
HZ
4170 if (opcode == 0xc6 || opcode == 0xc7)
4171 ir.rm |= ir.rex_b;
4172 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4173 ir.rm &= 0x3;
cf648174 4174 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 4175 }
7ad10968 4176 break;
cf648174 4177
a38bba38 4178 case 0x8a: /* mov */
7ad10968
HZ
4179 case 0x8b:
4180 if ((opcode & 1) == 0)
4181 ir.ot = OT_BYTE;
4182 else
4183 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4184 if (i386_record_modrm (&ir))
4185 return -1;
cf648174
HZ
4186 ir.reg |= rex_r;
4187 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4188 ir.reg &= 0x3;
cf648174
HZ
4189 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
4190 break;
7ad10968 4191
a38bba38 4192 case 0x8c: /* mov seg */
cf648174 4193 if (i386_record_modrm (&ir))
7ad10968 4194 return -1;
cf648174
HZ
4195 if (ir.reg > 5)
4196 {
4197 ir.addr -= 2;
4198 opcode = opcode << 8 | ir.modrm;
4199 goto no_support;
4200 }
4201
4202 if (ir.mod == 3)
4203 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
4204 else
4205 {
4206 ir.ot = OT_WORD;
4207 if (i386_record_lea_modrm (&ir))
4208 return -1;
4209 }
7ad10968
HZ
4210 break;
4211
a38bba38 4212 case 0x8e: /* mov seg */
7ad10968
HZ
4213 if (i386_record_modrm (&ir))
4214 return -1;
7ad10968
HZ
4215 switch (ir.reg)
4216 {
4217 case 0:
425b824a 4218 regnum = X86_RECORD_ES_REGNUM;
7ad10968
HZ
4219 break;
4220 case 2:
425b824a 4221 regnum = X86_RECORD_SS_REGNUM;
7ad10968
HZ
4222 break;
4223 case 3:
425b824a 4224 regnum = X86_RECORD_DS_REGNUM;
7ad10968
HZ
4225 break;
4226 case 4:
425b824a 4227 regnum = X86_RECORD_FS_REGNUM;
7ad10968
HZ
4228 break;
4229 case 5:
425b824a 4230 regnum = X86_RECORD_GS_REGNUM;
7ad10968
HZ
4231 break;
4232 default:
4233 ir.addr -= 2;
4234 opcode = opcode << 8 | ir.modrm;
4235 goto no_support;
4236 break;
4237 }
425b824a 4238 I386_RECORD_ARCH_LIST_ADD_REG (regnum);
cf648174 4239 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4240 break;
4241
a38bba38
MS
4242 case 0x0fb6: /* movzbS */
4243 case 0x0fb7: /* movzwS */
4244 case 0x0fbe: /* movsbS */
4245 case 0x0fbf: /* movswS */
7ad10968
HZ
4246 if (i386_record_modrm (&ir))
4247 return -1;
cf648174 4248 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
7ad10968
HZ
4249 break;
4250
a38bba38 4251 case 0x8d: /* lea */
7ad10968
HZ
4252 if (i386_record_modrm (&ir))
4253 return -1;
4254 if (ir.mod == 3)
4255 {
4256 ir.addr -= 2;
4257 opcode = opcode << 8 | ir.modrm;
4258 goto no_support;
4259 }
7ad10968 4260 ir.ot = ir.dflag;
cf648174
HZ
4261 ir.reg |= rex_r;
4262 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4263 ir.reg &= 0x3;
cf648174 4264 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
4265 break;
4266
a38bba38 4267 case 0xa0: /* mov EAX */
7ad10968 4268 case 0xa1:
a38bba38
MS
4269
4270 case 0xd7: /* xlat */
cf648174 4271 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
4272 break;
4273
a38bba38 4274 case 0xa2: /* mov EAX */
7ad10968 4275 case 0xa3:
d7877f7e 4276 if (ir.override >= 0)
cf648174 4277 {
df61f520 4278 warning (_("Process record ignores the memory change "
926569ae 4279 "of instruction at address %s because "
df61f520
HZ
4280 "it can't get the value of the segment "
4281 "register."),
4282 paddress (gdbarch, ir.orig_addr));
cf648174
HZ
4283 }
4284 else
4285 {
4286 if ((opcode & 1) == 0)
4287 ir.ot = OT_BYTE;
4288 else
4289 ir.ot = ir.dflag + OT_WORD;
4290 if (ir.aflag == 2)
4291 {
60a1502a 4292 if (target_read_memory (ir.addr, buf, 8))
cf648174
HZ
4293 {
4294 if (record_debug)
4295 printf_unfiltered (_("Process record: error reading "
4296 "memory at addr 0x%s len = 8.\n"),
4297 paddress (gdbarch, ir.addr));
4298 return -1;
4299 }
4300 ir.addr += 8;
60a1502a 4301 addr = extract_unsigned_integer (buf, 8, byte_order);
cf648174
HZ
4302 }
4303 else if (ir.aflag)
4304 {
60a1502a 4305 if (target_read_memory (ir.addr, buf, 4))
cf648174
HZ
4306 {
4307 if (record_debug)
4308 printf_unfiltered (_("Process record: error reading "
4309 "memory at addr 0x%s len = 4.\n"),
4310 paddress (gdbarch, ir.addr));
4311 return -1;
4312 }
4313 ir.addr += 4;
60a1502a 4314 addr = extract_unsigned_integer (buf, 4, byte_order);
cf648174
HZ
4315 }
4316 else
4317 {
60a1502a 4318 if (target_read_memory (ir.addr, buf, 2))
cf648174
HZ
4319 {
4320 if (record_debug)
4321 printf_unfiltered (_("Process record: error reading "
4322 "memory at addr 0x%s len = 2.\n"),
4323 paddress (gdbarch, ir.addr));
4324 return -1;
4325 }
4326 ir.addr += 2;
60a1502a 4327 addr = extract_unsigned_integer (buf, 2, byte_order);
cf648174 4328 }
648d0c8b 4329 if (record_arch_list_add_mem (addr, 1 << ir.ot))
cf648174
HZ
4330 return -1;
4331 }
7ad10968
HZ
4332 break;
4333
a38bba38 4334 case 0xb0: /* mov R, Ib */
7ad10968
HZ
4335 case 0xb1:
4336 case 0xb2:
4337 case 0xb3:
4338 case 0xb4:
4339 case 0xb5:
4340 case 0xb6:
4341 case 0xb7:
cf648174
HZ
4342 I386_RECORD_ARCH_LIST_ADD_REG ((ir.regmap[X86_RECORD_R8_REGNUM])
4343 ? ((opcode & 0x7) | ir.rex_b)
4344 : ((opcode & 0x7) & 0x3));
7ad10968
HZ
4345 break;
4346
a38bba38 4347 case 0xb8: /* mov R, Iv */
7ad10968
HZ
4348 case 0xb9:
4349 case 0xba:
4350 case 0xbb:
4351 case 0xbc:
4352 case 0xbd:
4353 case 0xbe:
4354 case 0xbf:
cf648174 4355 I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b);
7ad10968
HZ
4356 break;
4357
a38bba38 4358 case 0x91: /* xchg R, EAX */
7ad10968
HZ
4359 case 0x92:
4360 case 0x93:
4361 case 0x94:
4362 case 0x95:
4363 case 0x96:
4364 case 0x97:
cf648174
HZ
4365 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
4366 I386_RECORD_ARCH_LIST_ADD_REG (opcode & 0x7);
7ad10968
HZ
4367 break;
4368
a38bba38 4369 case 0x86: /* xchg Ev, Gv */
7ad10968
HZ
4370 case 0x87:
4371 if ((opcode & 1) == 0)
4372 ir.ot = OT_BYTE;
4373 else
4374 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4375 if (i386_record_modrm (&ir))
4376 return -1;
7ad10968
HZ
4377 if (ir.mod == 3)
4378 {
86839d38 4379 ir.rm |= ir.rex_b;
cf648174
HZ
4380 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
4381 ir.rm &= 0x3;
4382 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968
HZ
4383 }
4384 else
4385 {
4386 if (i386_record_lea_modrm (&ir))
4387 return -1;
4388 }
cf648174
HZ
4389 ir.reg |= rex_r;
4390 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4391 ir.reg &= 0x3;
cf648174 4392 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
4393 break;
4394
a38bba38
MS
4395 case 0xc4: /* les Gv */
4396 case 0xc5: /* lds Gv */
cf648174
HZ
4397 if (ir.regmap[X86_RECORD_R8_REGNUM])
4398 {
4399 ir.addr -= 1;
4400 goto no_support;
4401 }
a38bba38
MS
4402 case 0x0fb2: /* lss Gv */
4403 case 0x0fb4: /* lfs Gv */
4404 case 0x0fb5: /* lgs Gv */
7ad10968
HZ
4405 if (i386_record_modrm (&ir))
4406 return -1;
4407 if (ir.mod == 3)
4408 {
4409 if (opcode > 0xff)
4410 ir.addr -= 3;
4411 else
4412 ir.addr -= 2;
4413 opcode = opcode << 8 | ir.modrm;
4414 goto no_support;
4415 }
7ad10968
HZ
4416 switch (opcode)
4417 {
a38bba38 4418 case 0xc4: /* les Gv */
425b824a 4419 regnum = X86_RECORD_ES_REGNUM;
7ad10968 4420 break;
a38bba38 4421 case 0xc5: /* lds Gv */
425b824a 4422 regnum = X86_RECORD_DS_REGNUM;
7ad10968 4423 break;
a38bba38 4424 case 0x0fb2: /* lss Gv */
425b824a 4425 regnum = X86_RECORD_SS_REGNUM;
7ad10968 4426 break;
a38bba38 4427 case 0x0fb4: /* lfs Gv */
425b824a 4428 regnum = X86_RECORD_FS_REGNUM;
7ad10968 4429 break;
a38bba38 4430 case 0x0fb5: /* lgs Gv */
425b824a 4431 regnum = X86_RECORD_GS_REGNUM;
7ad10968
HZ
4432 break;
4433 }
425b824a 4434 I386_RECORD_ARCH_LIST_ADD_REG (regnum);
cf648174
HZ
4435 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
4436 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4437 break;
4438
a38bba38 4439 case 0xc0: /* shifts */
7ad10968
HZ
4440 case 0xc1:
4441 case 0xd0:
4442 case 0xd1:
4443 case 0xd2:
4444 case 0xd3:
4445 if ((opcode & 1) == 0)
4446 ir.ot = OT_BYTE;
4447 else
4448 ir.ot = ir.dflag + OT_WORD;
7ad10968
HZ
4449 if (i386_record_modrm (&ir))
4450 return -1;
7ad10968
HZ
4451 if (ir.mod != 3 && (opcode == 0xd2 || opcode == 0xd3))
4452 {
4453 if (i386_record_lea_modrm (&ir))
4454 return -1;
4455 }
4456 else
4457 {
cf648174
HZ
4458 ir.rm |= ir.rex_b;
4459 if (ir.ot == OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM])
7ad10968 4460 ir.rm &= 0x3;
cf648174 4461 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm);
7ad10968 4462 }
cf648174 4463 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4464 break;
4465
4466 case 0x0fa4:
4467 case 0x0fa5:
4468 case 0x0fac:
4469 case 0x0fad:
4470 if (i386_record_modrm (&ir))
4471 return -1;
4472 if (ir.mod == 3)
4473 {
4474 if (record_arch_list_add_reg (ir.regcache, ir.rm))
4475 return -1;
4476 }
4477 else
4478 {
4479 if (i386_record_lea_modrm (&ir))
4480 return -1;
4481 }
4482 break;
4483
a38bba38 4484 case 0xd8: /* Floats. */
7ad10968
HZ
4485 case 0xd9:
4486 case 0xda:
4487 case 0xdb:
4488 case 0xdc:
4489 case 0xdd:
4490 case 0xde:
4491 case 0xdf:
4492 if (i386_record_modrm (&ir))
4493 return -1;
4494 ir.reg |= ((opcode & 7) << 3);
4495 if (ir.mod != 3)
4496 {
0289bdd7 4497 /* Memory. */
955db0c0 4498 uint64_t addr64;
7ad10968 4499
955db0c0 4500 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968
HZ
4501 return -1;
4502 switch (ir.reg)
4503 {
7ad10968 4504 case 0x02:
0289bdd7
MS
4505 case 0x12:
4506 case 0x22:
4507 case 0x32:
4508 /* For fcom, ficom nothing to do. */
4509 break;
7ad10968 4510 case 0x03:
0289bdd7
MS
4511 case 0x13:
4512 case 0x23:
4513 case 0x33:
4514 /* For fcomp, ficomp pop FPU stack, store all. */
4515 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4516 return -1;
4517 break;
4518 case 0x00:
4519 case 0x01:
7ad10968
HZ
4520 case 0x04:
4521 case 0x05:
4522 case 0x06:
4523 case 0x07:
4524 case 0x10:
4525 case 0x11:
7ad10968
HZ
4526 case 0x14:
4527 case 0x15:
4528 case 0x16:
4529 case 0x17:
4530 case 0x20:
4531 case 0x21:
7ad10968
HZ
4532 case 0x24:
4533 case 0x25:
4534 case 0x26:
4535 case 0x27:
4536 case 0x30:
4537 case 0x31:
7ad10968
HZ
4538 case 0x34:
4539 case 0x35:
4540 case 0x36:
4541 case 0x37:
0289bdd7
MS
4542 /* For fadd, fmul, fsub, fsubr, fdiv, fdivr, fiadd, fimul,
4543 fisub, fisubr, fidiv, fidivr, modR/M.reg is an extension
4544 of code, always affects st(0) register. */
4545 if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
4546 return -1;
7ad10968
HZ
4547 break;
4548 case 0x08:
4549 case 0x0a:
4550 case 0x0b:
4551 case 0x18:
4552 case 0x19:
4553 case 0x1a:
4554 case 0x1b:
0289bdd7 4555 case 0x1d:
7ad10968
HZ
4556 case 0x28:
4557 case 0x29:
4558 case 0x2a:
4559 case 0x2b:
4560 case 0x38:
4561 case 0x39:
4562 case 0x3a:
4563 case 0x3b:
0289bdd7
MS
4564 case 0x3c:
4565 case 0x3d:
7ad10968
HZ
4566 switch (ir.reg & 7)
4567 {
4568 case 0:
0289bdd7
MS
4569 /* Handling fld, fild. */
4570 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4571 return -1;
7ad10968
HZ
4572 break;
4573 case 1:
4574 switch (ir.reg >> 4)
4575 {
4576 case 0:
955db0c0 4577 if (record_arch_list_add_mem (addr64, 4))
7ad10968
HZ
4578 return -1;
4579 break;
4580 case 2:
955db0c0 4581 if (record_arch_list_add_mem (addr64, 8))
7ad10968
HZ
4582 return -1;
4583 break;
4584 case 3:
0289bdd7 4585 break;
7ad10968 4586 default:
955db0c0 4587 if (record_arch_list_add_mem (addr64, 2))
7ad10968
HZ
4588 return -1;
4589 break;
4590 }
4591 break;
4592 default:
4593 switch (ir.reg >> 4)
4594 {
4595 case 0:
955db0c0 4596 if (record_arch_list_add_mem (addr64, 4))
0289bdd7
MS
4597 return -1;
4598 if (3 == (ir.reg & 7))
4599 {
4600 /* For fstp m32fp. */
4601 if (i386_record_floats (gdbarch, &ir,
4602 I386_SAVE_FPU_REGS))
4603 return -1;
4604 }
4605 break;
7ad10968 4606 case 1:
955db0c0 4607 if (record_arch_list_add_mem (addr64, 4))
7ad10968 4608 return -1;
0289bdd7
MS
4609 if ((3 == (ir.reg & 7))
4610 || (5 == (ir.reg & 7))
4611 || (7 == (ir.reg & 7)))
4612 {
4613 /* For fstp insn. */
4614 if (i386_record_floats (gdbarch, &ir,
4615 I386_SAVE_FPU_REGS))
4616 return -1;
4617 }
7ad10968
HZ
4618 break;
4619 case 2:
955db0c0 4620 if (record_arch_list_add_mem (addr64, 8))
7ad10968 4621 return -1;
0289bdd7
MS
4622 if (3 == (ir.reg & 7))
4623 {
4624 /* For fstp m64fp. */
4625 if (i386_record_floats (gdbarch, &ir,
4626 I386_SAVE_FPU_REGS))
4627 return -1;
4628 }
7ad10968
HZ
4629 break;
4630 case 3:
0289bdd7
MS
4631 if ((3 <= (ir.reg & 7)) && (6 <= (ir.reg & 7)))
4632 {
4633 /* For fistp, fbld, fild, fbstp. */
4634 if (i386_record_floats (gdbarch, &ir,
4635 I386_SAVE_FPU_REGS))
4636 return -1;
4637 }
4638 /* Fall through */
7ad10968 4639 default:
955db0c0 4640 if (record_arch_list_add_mem (addr64, 2))
7ad10968
HZ
4641 return -1;
4642 break;
4643 }
4644 break;
4645 }
4646 break;
4647 case 0x0c:
0289bdd7
MS
4648 /* Insn fldenv. */
4649 if (i386_record_floats (gdbarch, &ir,
4650 I386_SAVE_FPU_ENV_REG_STACK))
4651 return -1;
4652 break;
7ad10968 4653 case 0x0d:
0289bdd7
MS
4654 /* Insn fldcw. */
4655 if (i386_record_floats (gdbarch, &ir, I387_FCTRL_REGNUM (tdep)))
4656 return -1;
4657 break;
7ad10968 4658 case 0x2c:
0289bdd7
MS
4659 /* Insn frstor. */
4660 if (i386_record_floats (gdbarch, &ir,
4661 I386_SAVE_FPU_ENV_REG_STACK))
4662 return -1;
7ad10968
HZ
4663 break;
4664 case 0x0e:
4665 if (ir.dflag)
4666 {
955db0c0 4667 if (record_arch_list_add_mem (addr64, 28))
7ad10968
HZ
4668 return -1;
4669 }
4670 else
4671 {
955db0c0 4672 if (record_arch_list_add_mem (addr64, 14))
7ad10968
HZ
4673 return -1;
4674 }
4675 break;
4676 case 0x0f:
4677 case 0x2f:
955db0c0 4678 if (record_arch_list_add_mem (addr64, 2))
7ad10968 4679 return -1;
0289bdd7
MS
4680 /* Insn fstp, fbstp. */
4681 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4682 return -1;
7ad10968
HZ
4683 break;
4684 case 0x1f:
4685 case 0x3e:
955db0c0 4686 if (record_arch_list_add_mem (addr64, 10))
7ad10968
HZ
4687 return -1;
4688 break;
4689 case 0x2e:
4690 if (ir.dflag)
4691 {
955db0c0 4692 if (record_arch_list_add_mem (addr64, 28))
7ad10968 4693 return -1;
955db0c0 4694 addr64 += 28;
7ad10968
HZ
4695 }
4696 else
4697 {
955db0c0 4698 if (record_arch_list_add_mem (addr64, 14))
7ad10968 4699 return -1;
955db0c0 4700 addr64 += 14;
7ad10968 4701 }
955db0c0 4702 if (record_arch_list_add_mem (addr64, 80))
7ad10968 4703 return -1;
0289bdd7
MS
4704 /* Insn fsave. */
4705 if (i386_record_floats (gdbarch, &ir,
4706 I386_SAVE_FPU_ENV_REG_STACK))
4707 return -1;
7ad10968
HZ
4708 break;
4709 case 0x3f:
955db0c0 4710 if (record_arch_list_add_mem (addr64, 8))
7ad10968 4711 return -1;
0289bdd7
MS
4712 /* Insn fistp. */
4713 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4714 return -1;
7ad10968
HZ
4715 break;
4716 default:
4717 ir.addr -= 2;
4718 opcode = opcode << 8 | ir.modrm;
4719 goto no_support;
4720 break;
4721 }
4722 }
0289bdd7
MS
4723 /* Opcode is an extension of modR/M byte. */
4724 else
4725 {
4726 switch (opcode)
4727 {
4728 case 0xd8:
4729 if (i386_record_floats (gdbarch, &ir, I387_ST0_REGNUM (tdep)))
4730 return -1;
4731 break;
4732 case 0xd9:
4733 if (0x0c == (ir.modrm >> 4))
4734 {
4735 if ((ir.modrm & 0x0f) <= 7)
4736 {
4737 if (i386_record_floats (gdbarch, &ir,
4738 I386_SAVE_FPU_REGS))
4739 return -1;
4740 }
4741 else
4742 {
4743 if (i386_record_floats (gdbarch, &ir,
4744 I387_ST0_REGNUM (tdep)))
4745 return -1;
4746 /* If only st(0) is changing, then we have already
4747 recorded. */
4748 if ((ir.modrm & 0x0f) - 0x08)
4749 {
4750 if (i386_record_floats (gdbarch, &ir,
4751 I387_ST0_REGNUM (tdep) +
4752 ((ir.modrm & 0x0f) - 0x08)))
4753 return -1;
4754 }
4755 }
4756 }
4757 else
4758 {
4759 switch (ir.modrm)
4760 {
4761 case 0xe0:
4762 case 0xe1:
4763 case 0xf0:
4764 case 0xf5:
4765 case 0xf8:
4766 case 0xfa:
4767 case 0xfc:
4768 case 0xfe:
4769 case 0xff:
4770 if (i386_record_floats (gdbarch, &ir,
4771 I387_ST0_REGNUM (tdep)))
4772 return -1;
4773 break;
4774 case 0xf1:
4775 case 0xf2:
4776 case 0xf3:
4777 case 0xf4:
4778 case 0xf6:
4779 case 0xf7:
4780 case 0xe8:
4781 case 0xe9:
4782 case 0xea:
4783 case 0xeb:
4784 case 0xec:
4785 case 0xed:
4786 case 0xee:
4787 case 0xf9:
4788 case 0xfb:
4789 if (i386_record_floats (gdbarch, &ir,
4790 I386_SAVE_FPU_REGS))
4791 return -1;
4792 break;
4793 case 0xfd:
4794 if (i386_record_floats (gdbarch, &ir,
4795 I387_ST0_REGNUM (tdep)))
4796 return -1;
4797 if (i386_record_floats (gdbarch, &ir,
4798 I387_ST0_REGNUM (tdep) + 1))
4799 return -1;
4800 break;
4801 }
4802 }
4803 break;
4804 case 0xda:
4805 if (0xe9 == ir.modrm)
4806 {
4807 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4808 return -1;
4809 }
4810 else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
4811 {
4812 if (i386_record_floats (gdbarch, &ir,
4813 I387_ST0_REGNUM (tdep)))
4814 return -1;
4815 if (((ir.modrm & 0x0f) > 0) && ((ir.modrm & 0x0f) <= 7))
4816 {
4817 if (i386_record_floats (gdbarch, &ir,
4818 I387_ST0_REGNUM (tdep) +
4819 (ir.modrm & 0x0f)))
4820 return -1;
4821 }
4822 else if ((ir.modrm & 0x0f) - 0x08)
4823 {
4824 if (i386_record_floats (gdbarch, &ir,
4825 I387_ST0_REGNUM (tdep) +
4826 ((ir.modrm & 0x0f) - 0x08)))
4827 return -1;
4828 }
4829 }
4830 break;
4831 case 0xdb:
4832 if (0xe3 == ir.modrm)
4833 {
4834 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_ENV))
4835 return -1;
4836 }
4837 else if ((0x0c == ir.modrm >> 4) || (0x0d == ir.modrm >> 4))
4838 {
4839 if (i386_record_floats (gdbarch, &ir,
4840 I387_ST0_REGNUM (tdep)))
4841 return -1;
4842 if (((ir.modrm & 0x0f) > 0) && ((ir.modrm & 0x0f) <= 7))
4843 {
4844 if (i386_record_floats (gdbarch, &ir,
4845 I387_ST0_REGNUM (tdep) +
4846 (ir.modrm & 0x0f)))
4847 return -1;
4848 }
4849 else if ((ir.modrm & 0x0f) - 0x08)
4850 {
4851 if (i386_record_floats (gdbarch, &ir,
4852 I387_ST0_REGNUM (tdep) +
4853 ((ir.modrm & 0x0f) - 0x08)))
4854 return -1;
4855 }
4856 }
4857 break;
4858 case 0xdc:
4859 if ((0x0c == ir.modrm >> 4)
4860 || (0x0d == ir.modrm >> 4)
4861 || (0x0f == ir.modrm >> 4))
4862 {
4863 if ((ir.modrm & 0x0f) <= 7)
4864 {
4865 if (i386_record_floats (gdbarch, &ir,
4866 I387_ST0_REGNUM (tdep) +
4867 (ir.modrm & 0x0f)))
4868 return -1;
4869 }
4870 else
4871 {
4872 if (i386_record_floats (gdbarch, &ir,
4873 I387_ST0_REGNUM (tdep) +
4874 ((ir.modrm & 0x0f) - 0x08)))
4875 return -1;
4876 }
4877 }
4878 break;
4879 case 0xdd:
4880 if (0x0c == ir.modrm >> 4)
4881 {
4882 if (i386_record_floats (gdbarch, &ir,
4883 I387_FTAG_REGNUM (tdep)))
4884 return -1;
4885 }
4886 else if ((0x0d == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
4887 {
4888 if ((ir.modrm & 0x0f) <= 7)
4889 {
4890 if (i386_record_floats (gdbarch, &ir,
4891 I387_ST0_REGNUM (tdep) +
4892 (ir.modrm & 0x0f)))
4893 return -1;
4894 }
4895 else
4896 {
4897 if (i386_record_floats (gdbarch, &ir,
4898 I386_SAVE_FPU_REGS))
4899 return -1;
4900 }
4901 }
4902 break;
4903 case 0xde:
4904 if ((0x0c == ir.modrm >> 4)
4905 || (0x0e == ir.modrm >> 4)
4906 || (0x0f == ir.modrm >> 4)
4907 || (0xd9 == ir.modrm))
4908 {
4909 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4910 return -1;
4911 }
4912 break;
4913 case 0xdf:
4914 if (0xe0 == ir.modrm)
4915 {
4916 if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM))
4917 return -1;
4918 }
4919 else if ((0x0f == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
4920 {
4921 if (i386_record_floats (gdbarch, &ir, I386_SAVE_FPU_REGS))
4922 return -1;
4923 }
4924 break;
4925 }
4926 }
7ad10968 4927 break;
7ad10968 4928 /* string ops */
a38bba38 4929 case 0xa4: /* movsS */
7ad10968 4930 case 0xa5:
a38bba38 4931 case 0xaa: /* stosS */
7ad10968 4932 case 0xab:
a38bba38 4933 case 0x6c: /* insS */
7ad10968 4934 case 0x6d:
cf648174 4935 regcache_raw_read_unsigned (ir.regcache,
77d7dc92 4936 ir.regmap[X86_RECORD_RECX_REGNUM],
648d0c8b
MS
4937 &addr);
4938 if (addr)
cf648174 4939 {
77d7dc92
HZ
4940 ULONGEST es, ds;
4941
4942 if ((opcode & 1) == 0)
4943 ir.ot = OT_BYTE;
4944 else
4945 ir.ot = ir.dflag + OT_WORD;
cf648174
HZ
4946 regcache_raw_read_unsigned (ir.regcache,
4947 ir.regmap[X86_RECORD_REDI_REGNUM],
648d0c8b 4948 &addr);
77d7dc92 4949
d7877f7e
HZ
4950 regcache_raw_read_unsigned (ir.regcache,
4951 ir.regmap[X86_RECORD_ES_REGNUM],
4952 &es);
4953 regcache_raw_read_unsigned (ir.regcache,
4954 ir.regmap[X86_RECORD_DS_REGNUM],
4955 &ds);
4956 if (ir.aflag && (es != ds))
77d7dc92
HZ
4957 {
4958 /* addr += ((uint32_t) read_register (I386_ES_REGNUM)) << 4; */
df61f520 4959 warning (_("Process record ignores the memory "
926569ae 4960 "change of instruction at address %s "
df61f520
HZ
4961 "because it can't get the value of the "
4962 "ES segment register."),
4963 paddress (gdbarch, ir.orig_addr));
4964 }
4965 else
4966 {
648d0c8b 4967 if (record_arch_list_add_mem (addr, 1 << ir.ot))
df61f520 4968 return -1;
77d7dc92
HZ
4969 }
4970
4971 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
4972 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
77d7dc92
HZ
4973 if (opcode == 0xa4 || opcode == 0xa5)
4974 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
4975 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
4976 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
4977 }
cf648174 4978 break;
7ad10968 4979
a38bba38 4980 case 0xa6: /* cmpsS */
cf648174
HZ
4981 case 0xa7:
4982 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
4983 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
4984 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
4985 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
4986 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4987 break;
4988
a38bba38 4989 case 0xac: /* lodsS */
7ad10968 4990 case 0xad:
cf648174
HZ
4991 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
4992 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
7ad10968 4993 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
cf648174
HZ
4994 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
4995 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
4996 break;
4997
a38bba38 4998 case 0xae: /* scasS */
7ad10968 4999 case 0xaf:
cf648174 5000 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
7ad10968 5001 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
cf648174
HZ
5002 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5003 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5004 break;
5005
a38bba38 5006 case 0x6e: /* outsS */
cf648174
HZ
5007 case 0x6f:
5008 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
7ad10968 5009 if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ))
cf648174
HZ
5010 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5011 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5012 break;
5013
a38bba38 5014 case 0xe4: /* port I/O */
7ad10968
HZ
5015 case 0xe5:
5016 case 0xec:
5017 case 0xed:
cf648174
HZ
5018 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5019 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5020 break;
5021
5022 case 0xe6:
5023 case 0xe7:
5024 case 0xee:
5025 case 0xef:
5026 break;
5027
5028 /* control */
a38bba38
MS
5029 case 0xc2: /* ret im */
5030 case 0xc3: /* ret */
cf648174
HZ
5031 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5032 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5033 break;
5034
a38bba38
MS
5035 case 0xca: /* lret im */
5036 case 0xcb: /* lret */
5037 case 0xcf: /* iret */
cf648174
HZ
5038 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
5039 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5040 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5041 break;
5042
a38bba38 5043 case 0xe8: /* call im */
cf648174
HZ
5044 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5045 ir.dflag = 2;
5046 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5047 return -1;
7ad10968
HZ
5048 break;
5049
a38bba38 5050 case 0x9a: /* lcall im */
cf648174
HZ
5051 if (ir.regmap[X86_RECORD_R8_REGNUM])
5052 {
5053 ir.addr -= 1;
5054 goto no_support;
5055 }
5056 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM);
5057 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5058 return -1;
7ad10968
HZ
5059 break;
5060
a38bba38
MS
5061 case 0xe9: /* jmp im */
5062 case 0xea: /* ljmp im */
5063 case 0xeb: /* jmp Jb */
5064 case 0x70: /* jcc Jb */
7ad10968
HZ
5065 case 0x71:
5066 case 0x72:
5067 case 0x73:
5068 case 0x74:
5069 case 0x75:
5070 case 0x76:
5071 case 0x77:
5072 case 0x78:
5073 case 0x79:
5074 case 0x7a:
5075 case 0x7b:
5076 case 0x7c:
5077 case 0x7d:
5078 case 0x7e:
5079 case 0x7f:
a38bba38 5080 case 0x0f80: /* jcc Jv */
7ad10968
HZ
5081 case 0x0f81:
5082 case 0x0f82:
5083 case 0x0f83:
5084 case 0x0f84:
5085 case 0x0f85:
5086 case 0x0f86:
5087 case 0x0f87:
5088 case 0x0f88:
5089 case 0x0f89:
5090 case 0x0f8a:
5091 case 0x0f8b:
5092 case 0x0f8c:
5093 case 0x0f8d:
5094 case 0x0f8e:
5095 case 0x0f8f:
5096 break;
5097
a38bba38 5098 case 0x0f90: /* setcc Gv */
7ad10968
HZ
5099 case 0x0f91:
5100 case 0x0f92:
5101 case 0x0f93:
5102 case 0x0f94:
5103 case 0x0f95:
5104 case 0x0f96:
5105 case 0x0f97:
5106 case 0x0f98:
5107 case 0x0f99:
5108 case 0x0f9a:
5109 case 0x0f9b:
5110 case 0x0f9c:
5111 case 0x0f9d:
5112 case 0x0f9e:
5113 case 0x0f9f:
cf648174 5114 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5115 ir.ot = OT_BYTE;
5116 if (i386_record_modrm (&ir))
5117 return -1;
5118 if (ir.mod == 3)
cf648174
HZ
5119 I386_RECORD_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
5120 : (ir.rm & 0x3));
7ad10968
HZ
5121 else
5122 {
5123 if (i386_record_lea_modrm (&ir))
5124 return -1;
5125 }
5126 break;
5127
a38bba38 5128 case 0x0f40: /* cmov Gv, Ev */
7ad10968
HZ
5129 case 0x0f41:
5130 case 0x0f42:
5131 case 0x0f43:
5132 case 0x0f44:
5133 case 0x0f45:
5134 case 0x0f46:
5135 case 0x0f47:
5136 case 0x0f48:
5137 case 0x0f49:
5138 case 0x0f4a:
5139 case 0x0f4b:
5140 case 0x0f4c:
5141 case 0x0f4d:
5142 case 0x0f4e:
5143 case 0x0f4f:
5144 if (i386_record_modrm (&ir))
5145 return -1;
cf648174 5146 ir.reg |= rex_r;
7ad10968
HZ
5147 if (ir.dflag == OT_BYTE)
5148 ir.reg &= 0x3;
cf648174 5149 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
7ad10968
HZ
5150 break;
5151
5152 /* flags */
a38bba38 5153 case 0x9c: /* pushf */
cf648174
HZ
5154 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5155 if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag)
5156 ir.dflag = 2;
5157 if (i386_record_push (&ir, 1 << (ir.dflag + 1)))
5158 return -1;
7ad10968
HZ
5159 break;
5160
a38bba38 5161 case 0x9d: /* popf */
cf648174
HZ
5162 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5163 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5164 break;
5165
a38bba38 5166 case 0x9e: /* sahf */
cf648174
HZ
5167 if (ir.regmap[X86_RECORD_R8_REGNUM])
5168 {
5169 ir.addr -= 1;
5170 goto no_support;
5171 }
a38bba38
MS
5172 case 0xf5: /* cmc */
5173 case 0xf8: /* clc */
5174 case 0xf9: /* stc */
5175 case 0xfc: /* cld */
5176 case 0xfd: /* std */
cf648174 5177 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5178 break;
5179
a38bba38 5180 case 0x9f: /* lahf */
cf648174
HZ
5181 if (ir.regmap[X86_RECORD_R8_REGNUM])
5182 {
5183 ir.addr -= 1;
5184 goto no_support;
5185 }
5186 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5187 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
7ad10968
HZ
5188 break;
5189
5190 /* bit operations */
a38bba38 5191 case 0x0fba: /* bt/bts/btr/btc Gv, im */
7ad10968
HZ
5192 ir.ot = ir.dflag + OT_WORD;
5193 if (i386_record_modrm (&ir))
5194 return -1;
5195 if (ir.reg < 4)
5196 {
cf648174 5197 ir.addr -= 2;
7ad10968
HZ
5198 opcode = opcode << 8 | ir.modrm;
5199 goto no_support;
5200 }
cf648174 5201 if (ir.reg != 4)
7ad10968 5202 {
cf648174
HZ
5203 if (ir.mod == 3)
5204 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5205 else
5206 {
cf648174 5207 if (i386_record_lea_modrm (&ir))
7ad10968
HZ
5208 return -1;
5209 }
5210 }
cf648174 5211 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5212 break;
5213
a38bba38 5214 case 0x0fa3: /* bt Gv, Ev */
cf648174
HZ
5215 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5216 break;
5217
a38bba38
MS
5218 case 0x0fab: /* bts */
5219 case 0x0fb3: /* btr */
5220 case 0x0fbb: /* btc */
cf648174
HZ
5221 ir.ot = ir.dflag + OT_WORD;
5222 if (i386_record_modrm (&ir))
5223 return -1;
5224 if (ir.mod == 3)
5225 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
5226 else
5227 {
955db0c0
MS
5228 uint64_t addr64;
5229 if (i386_record_lea_modrm_addr (&ir, &addr64))
cf648174
HZ
5230 return -1;
5231 regcache_raw_read_unsigned (ir.regcache,
5232 ir.regmap[ir.reg | rex_r],
648d0c8b 5233 &addr);
cf648174
HZ
5234 switch (ir.dflag)
5235 {
5236 case 0:
648d0c8b 5237 addr64 += ((int16_t) addr >> 4) << 4;
cf648174
HZ
5238 break;
5239 case 1:
648d0c8b 5240 addr64 += ((int32_t) addr >> 5) << 5;
cf648174
HZ
5241 break;
5242 case 2:
648d0c8b 5243 addr64 += ((int64_t) addr >> 6) << 6;
cf648174
HZ
5244 break;
5245 }
955db0c0 5246 if (record_arch_list_add_mem (addr64, 1 << ir.ot))
cf648174
HZ
5247 return -1;
5248 if (i386_record_lea_modrm (&ir))
5249 return -1;
5250 }
5251 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5252 break;
5253
a38bba38
MS
5254 case 0x0fbc: /* bsf */
5255 case 0x0fbd: /* bsr */
cf648174
HZ
5256 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
5257 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5258 break;
5259
5260 /* bcd */
a38bba38
MS
5261 case 0x27: /* daa */
5262 case 0x2f: /* das */
5263 case 0x37: /* aaa */
5264 case 0x3f: /* aas */
5265 case 0xd4: /* aam */
5266 case 0xd5: /* aad */
cf648174
HZ
5267 if (ir.regmap[X86_RECORD_R8_REGNUM])
5268 {
5269 ir.addr -= 1;
5270 goto no_support;
5271 }
5272 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5273 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5274 break;
5275
5276 /* misc */
a38bba38 5277 case 0x90: /* nop */
7ad10968
HZ
5278 if (prefixes & PREFIX_LOCK)
5279 {
5280 ir.addr -= 1;
5281 goto no_support;
5282 }
5283 break;
5284
a38bba38 5285 case 0x9b: /* fwait */
425b824a 5286 if (target_read_memory (ir.addr, &opcode8, 1))
0289bdd7
MS
5287 {
5288 if (record_debug)
5289 printf_unfiltered (_("Process record: error reading memory at "
5290 "addr 0x%s len = 1.\n"),
5291 paddress (gdbarch, ir.addr));
5292 return -1;
5293 }
425b824a 5294 opcode = (uint32_t) opcode8;
0289bdd7
MS
5295 ir.addr++;
5296 goto reswitch;
7ad10968
HZ
5297 break;
5298
7ad10968 5299 /* XXX */
a38bba38 5300 case 0xcc: /* int3 */
a3c4230a 5301 printf_unfiltered (_("Process record does not support instruction "
7ad10968
HZ
5302 "int3.\n"));
5303 ir.addr -= 1;
5304 goto no_support;
5305 break;
5306
7ad10968 5307 /* XXX */
a38bba38 5308 case 0xcd: /* int */
7ad10968
HZ
5309 {
5310 int ret;
425b824a
MS
5311 uint8_t interrupt;
5312 if (target_read_memory (ir.addr, &interrupt, 1))
7ad10968
HZ
5313 {
5314 if (record_debug)
5315 printf_unfiltered (_("Process record: error reading memory "
5af949e3
UW
5316 "at addr %s len = 1.\n"),
5317 paddress (gdbarch, ir.addr));
7ad10968
HZ
5318 return -1;
5319 }
5320 ir.addr++;
425b824a 5321 if (interrupt != 0x80
a3c4230a 5322 || tdep->i386_intx80_record == NULL)
7ad10968 5323 {
a3c4230a 5324 printf_unfiltered (_("Process record does not support "
7ad10968 5325 "instruction int 0x%02x.\n"),
425b824a 5326 interrupt);
7ad10968
HZ
5327 ir.addr -= 2;
5328 goto no_support;
5329 }
a3c4230a 5330 ret = tdep->i386_intx80_record (ir.regcache);
7ad10968
HZ
5331 if (ret)
5332 return ret;
5333 }
5334 break;
5335
7ad10968 5336 /* XXX */
a38bba38 5337 case 0xce: /* into */
a3c4230a 5338 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5339 "instruction into.\n"));
5340 ir.addr -= 1;
5341 goto no_support;
5342 break;
5343
a38bba38
MS
5344 case 0xfa: /* cli */
5345 case 0xfb: /* sti */
7ad10968
HZ
5346 break;
5347
a38bba38 5348 case 0x62: /* bound */
a3c4230a 5349 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5350 "instruction bound.\n"));
5351 ir.addr -= 1;
5352 goto no_support;
5353 break;
5354
a38bba38 5355 case 0x0fc8: /* bswap reg */
7ad10968
HZ
5356 case 0x0fc9:
5357 case 0x0fca:
5358 case 0x0fcb:
5359 case 0x0fcc:
5360 case 0x0fcd:
5361 case 0x0fce:
5362 case 0x0fcf:
cf648174 5363 I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 7) | ir.rex_b);
7ad10968
HZ
5364 break;
5365
a38bba38 5366 case 0xd6: /* salc */
cf648174
HZ
5367 if (ir.regmap[X86_RECORD_R8_REGNUM])
5368 {
5369 ir.addr -= 1;
5370 goto no_support;
5371 }
5372 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5373 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5374 break;
5375
a38bba38
MS
5376 case 0xe0: /* loopnz */
5377 case 0xe1: /* loopz */
5378 case 0xe2: /* loop */
5379 case 0xe3: /* jecxz */
cf648174
HZ
5380 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5381 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5382 break;
5383
a38bba38 5384 case 0x0f30: /* wrmsr */
a3c4230a 5385 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5386 "instruction wrmsr.\n"));
5387 ir.addr -= 2;
5388 goto no_support;
5389 break;
5390
a38bba38 5391 case 0x0f32: /* rdmsr */
a3c4230a 5392 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5393 "instruction rdmsr.\n"));
5394 ir.addr -= 2;
5395 goto no_support;
5396 break;
5397
a38bba38 5398 case 0x0f31: /* rdtsc */
f8c4f480
HZ
5399 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5400 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
7ad10968
HZ
5401 break;
5402
a38bba38 5403 case 0x0f34: /* sysenter */
7ad10968
HZ
5404 {
5405 int ret;
cf648174
HZ
5406 if (ir.regmap[X86_RECORD_R8_REGNUM])
5407 {
5408 ir.addr -= 2;
5409 goto no_support;
5410 }
a3c4230a 5411 if (tdep->i386_sysenter_record == NULL)
7ad10968 5412 {
a3c4230a 5413 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5414 "instruction sysenter.\n"));
5415 ir.addr -= 2;
5416 goto no_support;
5417 }
a3c4230a 5418 ret = tdep->i386_sysenter_record (ir.regcache);
7ad10968
HZ
5419 if (ret)
5420 return ret;
5421 }
5422 break;
5423
a38bba38 5424 case 0x0f35: /* sysexit */
a3c4230a 5425 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5426 "instruction sysexit.\n"));
5427 ir.addr -= 2;
5428 goto no_support;
5429 break;
5430
a38bba38 5431 case 0x0f05: /* syscall */
cf648174
HZ
5432 {
5433 int ret;
a3c4230a 5434 if (tdep->i386_syscall_record == NULL)
cf648174 5435 {
a3c4230a 5436 printf_unfiltered (_("Process record does not support "
cf648174
HZ
5437 "instruction syscall.\n"));
5438 ir.addr -= 2;
5439 goto no_support;
5440 }
a3c4230a 5441 ret = tdep->i386_syscall_record (ir.regcache);
cf648174
HZ
5442 if (ret)
5443 return ret;
5444 }
5445 break;
5446
a38bba38 5447 case 0x0f07: /* sysret */
a3c4230a 5448 printf_unfiltered (_("Process record does not support "
cf648174
HZ
5449 "instruction sysret.\n"));
5450 ir.addr -= 2;
5451 goto no_support;
5452 break;
5453
a38bba38 5454 case 0x0fa2: /* cpuid */
cf648174
HZ
5455 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5456 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5457 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
5458 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
7ad10968
HZ
5459 break;
5460
a38bba38 5461 case 0xf4: /* hlt */
a3c4230a 5462 printf_unfiltered (_("Process record does not support "
7ad10968
HZ
5463 "instruction hlt.\n"));
5464 ir.addr -= 1;
5465 goto no_support;
5466 break;
5467
5468 case 0x0f00:
5469 if (i386_record_modrm (&ir))
5470 return -1;
5471 switch (ir.reg)
5472 {
a38bba38
MS
5473 case 0: /* sldt */
5474 case 1: /* str */
7ad10968 5475 if (ir.mod == 3)
cf648174 5476 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5477 else
5478 {
5479 ir.ot = OT_WORD;
5480 if (i386_record_lea_modrm (&ir))
5481 return -1;
5482 }
5483 break;
a38bba38
MS
5484 case 2: /* lldt */
5485 case 3: /* ltr */
7ad10968 5486 break;
a38bba38
MS
5487 case 4: /* verr */
5488 case 5: /* verw */
cf648174 5489 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5490 break;
5491 default:
5492 ir.addr -= 3;
5493 opcode = opcode << 8 | ir.modrm;
5494 goto no_support;
5495 break;
5496 }
5497 break;
5498
5499 case 0x0f01:
5500 if (i386_record_modrm (&ir))
5501 return -1;
5502 switch (ir.reg)
5503 {
a38bba38 5504 case 0: /* sgdt */
7ad10968 5505 {
955db0c0 5506 uint64_t addr64;
7ad10968
HZ
5507
5508 if (ir.mod == 3)
5509 {
5510 ir.addr -= 3;
5511 opcode = opcode << 8 | ir.modrm;
5512 goto no_support;
5513 }
d7877f7e 5514 if (ir.override >= 0)
7ad10968 5515 {
df61f520
HZ
5516 warning (_("Process record ignores the memory "
5517 "change of instruction at "
5518 "address %s because it can't get "
5519 "the value of the segment "
5520 "register."),
5521 paddress (gdbarch, ir.orig_addr));
7ad10968
HZ
5522 }
5523 else
5524 {
955db0c0 5525 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968 5526 return -1;
955db0c0 5527 if (record_arch_list_add_mem (addr64, 2))
7ad10968 5528 return -1;
955db0c0 5529 addr64 += 2;
cf648174
HZ
5530 if (ir.regmap[X86_RECORD_R8_REGNUM])
5531 {
955db0c0 5532 if (record_arch_list_add_mem (addr64, 8))
cf648174
HZ
5533 return -1;
5534 }
5535 else
5536 {
955db0c0 5537 if (record_arch_list_add_mem (addr64, 4))
cf648174
HZ
5538 return -1;
5539 }
7ad10968
HZ
5540 }
5541 }
5542 break;
5543 case 1:
5544 if (ir.mod == 3)
5545 {
5546 switch (ir.rm)
5547 {
a38bba38 5548 case 0: /* monitor */
7ad10968 5549 break;
a38bba38 5550 case 1: /* mwait */
cf648174 5551 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5552 break;
5553 default:
5554 ir.addr -= 3;
5555 opcode = opcode << 8 | ir.modrm;
5556 goto no_support;
5557 break;
5558 }
5559 }
5560 else
5561 {
5562 /* sidt */
d7877f7e 5563 if (ir.override >= 0)
7ad10968 5564 {
df61f520
HZ
5565 warning (_("Process record ignores the memory "
5566 "change of instruction at "
5567 "address %s because it can't get "
5568 "the value of the segment "
5569 "register."),
5570 paddress (gdbarch, ir.orig_addr));
7ad10968
HZ
5571 }
5572 else
5573 {
955db0c0 5574 uint64_t addr64;
7ad10968 5575
955db0c0 5576 if (i386_record_lea_modrm_addr (&ir, &addr64))
7ad10968 5577 return -1;
955db0c0 5578 if (record_arch_list_add_mem (addr64, 2))
7ad10968 5579 return -1;
955db0c0 5580 addr64 += 2;
cf648174
HZ
5581 if (ir.regmap[X86_RECORD_R8_REGNUM])
5582 {
955db0c0 5583 if (record_arch_list_add_mem (addr64, 8))
cf648174
HZ
5584 return -1;
5585 }
5586 else
5587 {
955db0c0 5588 if (record_arch_list_add_mem (addr64, 4))
cf648174
HZ
5589 return -1;
5590 }
7ad10968
HZ
5591 }
5592 }
5593 break;
a38bba38 5594 case 2: /* lgdt */
3800e645
MS
5595 if (ir.mod == 3)
5596 {
5597 /* xgetbv */
5598 if (ir.rm == 0)
5599 {
5600 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5601 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
5602 break;
5603 }
5604 /* xsetbv */
5605 else if (ir.rm == 1)
5606 break;
5607 }
a38bba38 5608 case 3: /* lidt */
7ad10968
HZ
5609 if (ir.mod == 3)
5610 {
5611 ir.addr -= 3;
5612 opcode = opcode << 8 | ir.modrm;
5613 goto no_support;
5614 }
5615 break;
a38bba38 5616 case 4: /* smsw */
7ad10968
HZ
5617 if (ir.mod == 3)
5618 {
cf648174 5619 if (record_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b))
7ad10968
HZ
5620 return -1;
5621 }
5622 else
5623 {
5624 ir.ot = OT_WORD;
5625 if (i386_record_lea_modrm (&ir))
5626 return -1;
5627 }
cf648174 5628 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5629 break;
a38bba38 5630 case 6: /* lmsw */
cf648174
HZ
5631 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5632 break;
a38bba38 5633 case 7: /* invlpg */
cf648174
HZ
5634 if (ir.mod == 3)
5635 {
5636 if (ir.rm == 0 && ir.regmap[X86_RECORD_R8_REGNUM])
5637 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM);
5638 else
5639 {
5640 ir.addr -= 3;
5641 opcode = opcode << 8 | ir.modrm;
5642 goto no_support;
5643 }
5644 }
5645 else
5646 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5647 break;
5648 default:
5649 ir.addr -= 3;
5650 opcode = opcode << 8 | ir.modrm;
5651 goto no_support;
7ad10968
HZ
5652 break;
5653 }
5654 break;
5655
a38bba38
MS
5656 case 0x0f08: /* invd */
5657 case 0x0f09: /* wbinvd */
7ad10968
HZ
5658 break;
5659
a38bba38 5660 case 0x63: /* arpl */
7ad10968
HZ
5661 if (i386_record_modrm (&ir))
5662 return -1;
cf648174
HZ
5663 if (ir.mod == 3 || ir.regmap[X86_RECORD_R8_REGNUM])
5664 {
5665 I386_RECORD_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
5666 ? (ir.reg | rex_r) : ir.rm);
5667 }
7ad10968 5668 else
cf648174
HZ
5669 {
5670 ir.ot = ir.dflag ? OT_LONG : OT_WORD;
5671 if (i386_record_lea_modrm (&ir))
5672 return -1;
5673 }
5674 if (!ir.regmap[X86_RECORD_R8_REGNUM])
5675 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5676 break;
5677
a38bba38
MS
5678 case 0x0f02: /* lar */
5679 case 0x0f03: /* lsl */
7ad10968
HZ
5680 if (i386_record_modrm (&ir))
5681 return -1;
cf648174
HZ
5682 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
5683 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5684 break;
5685
5686 case 0x0f18:
cf648174
HZ
5687 if (i386_record_modrm (&ir))
5688 return -1;
5689 if (ir.mod == 3 && ir.reg == 3)
5690 {
5691 ir.addr -= 3;
5692 opcode = opcode << 8 | ir.modrm;
5693 goto no_support;
5694 }
7ad10968
HZ
5695 break;
5696
7ad10968
HZ
5697 case 0x0f19:
5698 case 0x0f1a:
5699 case 0x0f1b:
5700 case 0x0f1c:
5701 case 0x0f1d:
5702 case 0x0f1e:
5703 case 0x0f1f:
a38bba38 5704 /* nop (multi byte) */
7ad10968
HZ
5705 break;
5706
a38bba38
MS
5707 case 0x0f20: /* mov reg, crN */
5708 case 0x0f22: /* mov crN, reg */
7ad10968
HZ
5709 if (i386_record_modrm (&ir))
5710 return -1;
5711 if ((ir.modrm & 0xc0) != 0xc0)
5712 {
cf648174 5713 ir.addr -= 3;
7ad10968
HZ
5714 opcode = opcode << 8 | ir.modrm;
5715 goto no_support;
5716 }
5717 switch (ir.reg)
5718 {
5719 case 0:
5720 case 2:
5721 case 3:
5722 case 4:
5723 case 8:
5724 if (opcode & 2)
cf648174 5725 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5726 else
cf648174 5727 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5728 break;
5729 default:
cf648174 5730 ir.addr -= 3;
7ad10968
HZ
5731 opcode = opcode << 8 | ir.modrm;
5732 goto no_support;
5733 break;
5734 }
5735 break;
5736
a38bba38
MS
5737 case 0x0f21: /* mov reg, drN */
5738 case 0x0f23: /* mov drN, reg */
7ad10968
HZ
5739 if (i386_record_modrm (&ir))
5740 return -1;
5741 if ((ir.modrm & 0xc0) != 0xc0 || ir.reg == 4
5742 || ir.reg == 5 || ir.reg >= 8)
5743 {
cf648174 5744 ir.addr -= 3;
7ad10968
HZ
5745 opcode = opcode << 8 | ir.modrm;
5746 goto no_support;
5747 }
5748 if (opcode & 2)
cf648174 5749 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968 5750 else
cf648174 5751 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
7ad10968
HZ
5752 break;
5753
a38bba38 5754 case 0x0f06: /* clts */
cf648174 5755 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
7ad10968
HZ
5756 break;
5757
a3c4230a
HZ
5758 /* MMX 3DNow! SSE SSE2 SSE3 SSSE3 SSE4 */
5759
5760 case 0x0f0d: /* 3DNow! prefetch */
5761 break;
5762
5763 case 0x0f0e: /* 3DNow! femms */
5764 case 0x0f77: /* emms */
5765 if (i386_fpc_regnum_p (gdbarch, I387_FTAG_REGNUM(tdep)))
5766 goto no_support;
5767 record_arch_list_add_reg (ir.regcache, I387_FTAG_REGNUM(tdep));
5768 break;
5769
5770 case 0x0f0f: /* 3DNow! data */
5771 if (i386_record_modrm (&ir))
5772 return -1;
5773 if (target_read_memory (ir.addr, &opcode8, 1))
5774 {
5775 printf_unfiltered (_("Process record: error reading memory at "
5776 "addr %s len = 1.\n"),
5777 paddress (gdbarch, ir.addr));
5778 return -1;
5779 }
5780 ir.addr++;
5781 switch (opcode8)
5782 {
5783 case 0x0c: /* 3DNow! pi2fw */
5784 case 0x0d: /* 3DNow! pi2fd */
5785 case 0x1c: /* 3DNow! pf2iw */
5786 case 0x1d: /* 3DNow! pf2id */
5787 case 0x8a: /* 3DNow! pfnacc */
5788 case 0x8e: /* 3DNow! pfpnacc */
5789 case 0x90: /* 3DNow! pfcmpge */
5790 case 0x94: /* 3DNow! pfmin */
5791 case 0x96: /* 3DNow! pfrcp */
5792 case 0x97: /* 3DNow! pfrsqrt */
5793 case 0x9a: /* 3DNow! pfsub */
5794 case 0x9e: /* 3DNow! pfadd */
5795 case 0xa0: /* 3DNow! pfcmpgt */
5796 case 0xa4: /* 3DNow! pfmax */
5797 case 0xa6: /* 3DNow! pfrcpit1 */
5798 case 0xa7: /* 3DNow! pfrsqit1 */
5799 case 0xaa: /* 3DNow! pfsubr */
5800 case 0xae: /* 3DNow! pfacc */
5801 case 0xb0: /* 3DNow! pfcmpeq */
5802 case 0xb4: /* 3DNow! pfmul */
5803 case 0xb6: /* 3DNow! pfrcpit2 */
5804 case 0xb7: /* 3DNow! pmulhrw */
5805 case 0xbb: /* 3DNow! pswapd */
5806 case 0xbf: /* 3DNow! pavgusb */
5807 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
5808 goto no_support_3dnow_data;
5809 record_arch_list_add_reg (ir.regcache, ir.reg);
5810 break;
5811
5812 default:
5813no_support_3dnow_data:
5814 opcode = (opcode << 8) | opcode8;
5815 goto no_support;
5816 break;
5817 }
5818 break;
5819
5820 case 0x0faa: /* rsm */
5821 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5822 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM);
5823 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM);
5824 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM);
5825 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM);
5826 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM);
5827 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM);
5828 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM);
5829 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM);
5830 break;
5831
5832 case 0x0fae:
5833 if (i386_record_modrm (&ir))
5834 return -1;
5835 switch(ir.reg)
5836 {
5837 case 0: /* fxsave */
5838 {
5839 uint64_t tmpu64;
5840
5841 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5842 if (i386_record_lea_modrm_addr (&ir, &tmpu64))
5843 return -1;
5844 if (record_arch_list_add_mem (tmpu64, 512))
5845 return -1;
5846 }
5847 break;
5848
5849 case 1: /* fxrstor */
5850 {
5851 int i;
5852
5853 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
5854
5855 for (i = I387_MM0_REGNUM (tdep);
5856 i386_mmx_regnum_p (gdbarch, i); i++)
5857 record_arch_list_add_reg (ir.regcache, i);
5858
5859 for (i = I387_XMM0_REGNUM (tdep);
c131fcee 5860 i386_xmm_regnum_p (gdbarch, i); i++)
a3c4230a
HZ
5861 record_arch_list_add_reg (ir.regcache, i);
5862
5863 if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
5864 record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
5865
5866 for (i = I387_ST0_REGNUM (tdep);
5867 i386_fp_regnum_p (gdbarch, i); i++)
5868 record_arch_list_add_reg (ir.regcache, i);
5869
5870 for (i = I387_FCTRL_REGNUM (tdep);
5871 i386_fpc_regnum_p (gdbarch, i); i++)
5872 record_arch_list_add_reg (ir.regcache, i);
5873 }
5874 break;
5875
5876 case 2: /* ldmxcsr */
5877 if (!i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
5878 goto no_support;
5879 record_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
5880 break;
5881
5882 case 3: /* stmxcsr */
5883 ir.ot = OT_LONG;
5884 if (i386_record_lea_modrm (&ir))
5885 return -1;
5886 break;
5887
5888 case 5: /* lfence */
5889 case 6: /* mfence */
5890 case 7: /* sfence clflush */
5891 break;
5892
5893 default:
5894 opcode = (opcode << 8) | ir.modrm;
5895 goto no_support;
5896 break;
5897 }
5898 break;
5899
5900 case 0x0fc3: /* movnti */
5901 ir.ot = (ir.dflag == 2) ? OT_QUAD : OT_LONG;
5902 if (i386_record_modrm (&ir))
5903 return -1;
5904 if (ir.mod == 3)
5905 goto no_support;
5906 ir.reg |= rex_r;
5907 if (i386_record_lea_modrm (&ir))
5908 return -1;
5909 break;
5910
5911 /* Add prefix to opcode. */
5912 case 0x0f10:
5913 case 0x0f11:
5914 case 0x0f12:
5915 case 0x0f13:
5916 case 0x0f14:
5917 case 0x0f15:
5918 case 0x0f16:
5919 case 0x0f17:
5920 case 0x0f28:
5921 case 0x0f29:
5922 case 0x0f2a:
5923 case 0x0f2b:
5924 case 0x0f2c:
5925 case 0x0f2d:
5926 case 0x0f2e:
5927 case 0x0f2f:
5928 case 0x0f38:
5929 case 0x0f39:
5930 case 0x0f3a:
5931 case 0x0f50:
5932 case 0x0f51:
5933 case 0x0f52:
5934 case 0x0f53:
5935 case 0x0f54:
5936 case 0x0f55:
5937 case 0x0f56:
5938 case 0x0f57:
5939 case 0x0f58:
5940 case 0x0f59:
5941 case 0x0f5a:
5942 case 0x0f5b:
5943 case 0x0f5c:
5944 case 0x0f5d:
5945 case 0x0f5e:
5946 case 0x0f5f:
5947 case 0x0f60:
5948 case 0x0f61:
5949 case 0x0f62:
5950 case 0x0f63:
5951 case 0x0f64:
5952 case 0x0f65:
5953 case 0x0f66:
5954 case 0x0f67:
5955 case 0x0f68:
5956 case 0x0f69:
5957 case 0x0f6a:
5958 case 0x0f6b:
5959 case 0x0f6c:
5960 case 0x0f6d:
5961 case 0x0f6e:
5962 case 0x0f6f:
5963 case 0x0f70:
5964 case 0x0f71:
5965 case 0x0f72:
5966 case 0x0f73:
5967 case 0x0f74:
5968 case 0x0f75:
5969 case 0x0f76:
5970 case 0x0f7c:
5971 case 0x0f7d:
5972 case 0x0f7e:
5973 case 0x0f7f:
5974 case 0x0fb8:
5975 case 0x0fc2:
5976 case 0x0fc4:
5977 case 0x0fc5:
5978 case 0x0fc6:
5979 case 0x0fd0:
5980 case 0x0fd1:
5981 case 0x0fd2:
5982 case 0x0fd3:
5983 case 0x0fd4:
5984 case 0x0fd5:
5985 case 0x0fd6:
5986 case 0x0fd7:
5987 case 0x0fd8:
5988 case 0x0fd9:
5989 case 0x0fda:
5990 case 0x0fdb:
5991 case 0x0fdc:
5992 case 0x0fdd:
5993 case 0x0fde:
5994 case 0x0fdf:
5995 case 0x0fe0:
5996 case 0x0fe1:
5997 case 0x0fe2:
5998 case 0x0fe3:
5999 case 0x0fe4:
6000 case 0x0fe5:
6001 case 0x0fe6:
6002 case 0x0fe7:
6003 case 0x0fe8:
6004 case 0x0fe9:
6005 case 0x0fea:
6006 case 0x0feb:
6007 case 0x0fec:
6008 case 0x0fed:
6009 case 0x0fee:
6010 case 0x0fef:
6011 case 0x0ff0:
6012 case 0x0ff1:
6013 case 0x0ff2:
6014 case 0x0ff3:
6015 case 0x0ff4:
6016 case 0x0ff5:
6017 case 0x0ff6:
6018 case 0x0ff7:
6019 case 0x0ff8:
6020 case 0x0ff9:
6021 case 0x0ffa:
6022 case 0x0ffb:
6023 case 0x0ffc:
6024 case 0x0ffd:
6025 case 0x0ffe:
6026 switch (prefixes)
6027 {
6028 case PREFIX_REPNZ:
6029 opcode |= 0xf20000;
6030 break;
6031 case PREFIX_DATA:
6032 opcode |= 0x660000;
6033 break;
6034 case PREFIX_REPZ:
6035 opcode |= 0xf30000;
6036 break;
6037 }
6038reswitch_prefix_add:
6039 switch (opcode)
6040 {
6041 case 0x0f38:
6042 case 0x660f38:
6043 case 0xf20f38:
6044 case 0x0f3a:
6045 case 0x660f3a:
6046 if (target_read_memory (ir.addr, &opcode8, 1))
6047 {
6048 printf_unfiltered (_("Process record: error reading memory at "
6049 "addr %s len = 1.\n"),
6050 paddress (gdbarch, ir.addr));
6051 return -1;
6052 }
6053 ir.addr++;
6054 opcode = (uint32_t) opcode8 | opcode << 8;
6055 goto reswitch_prefix_add;
6056 break;
6057
6058 case 0x0f10: /* movups */
6059 case 0x660f10: /* movupd */
6060 case 0xf30f10: /* movss */
6061 case 0xf20f10: /* movsd */
6062 case 0x0f12: /* movlps */
6063 case 0x660f12: /* movlpd */
6064 case 0xf30f12: /* movsldup */
6065 case 0xf20f12: /* movddup */
6066 case 0x0f14: /* unpcklps */
6067 case 0x660f14: /* unpcklpd */
6068 case 0x0f15: /* unpckhps */
6069 case 0x660f15: /* unpckhpd */
6070 case 0x0f16: /* movhps */
6071 case 0x660f16: /* movhpd */
6072 case 0xf30f16: /* movshdup */
6073 case 0x0f28: /* movaps */
6074 case 0x660f28: /* movapd */
6075 case 0x0f2a: /* cvtpi2ps */
6076 case 0x660f2a: /* cvtpi2pd */
6077 case 0xf30f2a: /* cvtsi2ss */
6078 case 0xf20f2a: /* cvtsi2sd */
6079 case 0x0f2c: /* cvttps2pi */
6080 case 0x660f2c: /* cvttpd2pi */
6081 case 0x0f2d: /* cvtps2pi */
6082 case 0x660f2d: /* cvtpd2pi */
6083 case 0x660f3800: /* pshufb */
6084 case 0x660f3801: /* phaddw */
6085 case 0x660f3802: /* phaddd */
6086 case 0x660f3803: /* phaddsw */
6087 case 0x660f3804: /* pmaddubsw */
6088 case 0x660f3805: /* phsubw */
6089 case 0x660f3806: /* phsubd */
6090 case 0x660f3807: /* phaddsw */
6091 case 0x660f3808: /* psignb */
6092 case 0x660f3809: /* psignw */
6093 case 0x660f380a: /* psignd */
6094 case 0x660f380b: /* pmulhrsw */
6095 case 0x660f3810: /* pblendvb */
6096 case 0x660f3814: /* blendvps */
6097 case 0x660f3815: /* blendvpd */
6098 case 0x660f381c: /* pabsb */
6099 case 0x660f381d: /* pabsw */
6100 case 0x660f381e: /* pabsd */
6101 case 0x660f3820: /* pmovsxbw */
6102 case 0x660f3821: /* pmovsxbd */
6103 case 0x660f3822: /* pmovsxbq */
6104 case 0x660f3823: /* pmovsxwd */
6105 case 0x660f3824: /* pmovsxwq */
6106 case 0x660f3825: /* pmovsxdq */
6107 case 0x660f3828: /* pmuldq */
6108 case 0x660f3829: /* pcmpeqq */
6109 case 0x660f382a: /* movntdqa */
6110 case 0x660f3a08: /* roundps */
6111 case 0x660f3a09: /* roundpd */
6112 case 0x660f3a0a: /* roundss */
6113 case 0x660f3a0b: /* roundsd */
6114 case 0x660f3a0c: /* blendps */
6115 case 0x660f3a0d: /* blendpd */
6116 case 0x660f3a0e: /* pblendw */
6117 case 0x660f3a0f: /* palignr */
6118 case 0x660f3a20: /* pinsrb */
6119 case 0x660f3a21: /* insertps */
6120 case 0x660f3a22: /* pinsrd pinsrq */
6121 case 0x660f3a40: /* dpps */
6122 case 0x660f3a41: /* dppd */
6123 case 0x660f3a42: /* mpsadbw */
6124 case 0x660f3a60: /* pcmpestrm */
6125 case 0x660f3a61: /* pcmpestri */
6126 case 0x660f3a62: /* pcmpistrm */
6127 case 0x660f3a63: /* pcmpistri */
6128 case 0x0f51: /* sqrtps */
6129 case 0x660f51: /* sqrtpd */
6130 case 0xf20f51: /* sqrtsd */
6131 case 0xf30f51: /* sqrtss */
6132 case 0x0f52: /* rsqrtps */
6133 case 0xf30f52: /* rsqrtss */
6134 case 0x0f53: /* rcpps */
6135 case 0xf30f53: /* rcpss */
6136 case 0x0f54: /* andps */
6137 case 0x660f54: /* andpd */
6138 case 0x0f55: /* andnps */
6139 case 0x660f55: /* andnpd */
6140 case 0x0f56: /* orps */
6141 case 0x660f56: /* orpd */
6142 case 0x0f57: /* xorps */
6143 case 0x660f57: /* xorpd */
6144 case 0x0f58: /* addps */
6145 case 0x660f58: /* addpd */
6146 case 0xf20f58: /* addsd */
6147 case 0xf30f58: /* addss */
6148 case 0x0f59: /* mulps */
6149 case 0x660f59: /* mulpd */
6150 case 0xf20f59: /* mulsd */
6151 case 0xf30f59: /* mulss */
6152 case 0x0f5a: /* cvtps2pd */
6153 case 0x660f5a: /* cvtpd2ps */
6154 case 0xf20f5a: /* cvtsd2ss */
6155 case 0xf30f5a: /* cvtss2sd */
6156 case 0x0f5b: /* cvtdq2ps */
6157 case 0x660f5b: /* cvtps2dq */
6158 case 0xf30f5b: /* cvttps2dq */
6159 case 0x0f5c: /* subps */
6160 case 0x660f5c: /* subpd */
6161 case 0xf20f5c: /* subsd */
6162 case 0xf30f5c: /* subss */
6163 case 0x0f5d: /* minps */
6164 case 0x660f5d: /* minpd */
6165 case 0xf20f5d: /* minsd */
6166 case 0xf30f5d: /* minss */
6167 case 0x0f5e: /* divps */
6168 case 0x660f5e: /* divpd */
6169 case 0xf20f5e: /* divsd */
6170 case 0xf30f5e: /* divss */
6171 case 0x0f5f: /* maxps */
6172 case 0x660f5f: /* maxpd */
6173 case 0xf20f5f: /* maxsd */
6174 case 0xf30f5f: /* maxss */
6175 case 0x660f60: /* punpcklbw */
6176 case 0x660f61: /* punpcklwd */
6177 case 0x660f62: /* punpckldq */
6178 case 0x660f63: /* packsswb */
6179 case 0x660f64: /* pcmpgtb */
6180 case 0x660f65: /* pcmpgtw */
6181 case 0x660f66: /* pcmpgtl */
6182 case 0x660f67: /* packuswb */
6183 case 0x660f68: /* punpckhbw */
6184 case 0x660f69: /* punpckhwd */
6185 case 0x660f6a: /* punpckhdq */
6186 case 0x660f6b: /* packssdw */
6187 case 0x660f6c: /* punpcklqdq */
6188 case 0x660f6d: /* punpckhqdq */
6189 case 0x660f6e: /* movd */
6190 case 0x660f6f: /* movdqa */
6191 case 0xf30f6f: /* movdqu */
6192 case 0x660f70: /* pshufd */
6193 case 0xf20f70: /* pshuflw */
6194 case 0xf30f70: /* pshufhw */
6195 case 0x660f74: /* pcmpeqb */
6196 case 0x660f75: /* pcmpeqw */
6197 case 0x660f76: /* pcmpeql */
6198 case 0x660f7c: /* haddpd */
6199 case 0xf20f7c: /* haddps */
6200 case 0x660f7d: /* hsubpd */
6201 case 0xf20f7d: /* hsubps */
6202 case 0xf30f7e: /* movq */
6203 case 0x0fc2: /* cmpps */
6204 case 0x660fc2: /* cmppd */
6205 case 0xf20fc2: /* cmpsd */
6206 case 0xf30fc2: /* cmpss */
6207 case 0x660fc4: /* pinsrw */
6208 case 0x0fc6: /* shufps */
6209 case 0x660fc6: /* shufpd */
6210 case 0x660fd0: /* addsubpd */
6211 case 0xf20fd0: /* addsubps */
6212 case 0x660fd1: /* psrlw */
6213 case 0x660fd2: /* psrld */
6214 case 0x660fd3: /* psrlq */
6215 case 0x660fd4: /* paddq */
6216 case 0x660fd5: /* pmullw */
6217 case 0xf30fd6: /* movq2dq */
6218 case 0x660fd8: /* psubusb */
6219 case 0x660fd9: /* psubusw */
6220 case 0x660fda: /* pminub */
6221 case 0x660fdb: /* pand */
6222 case 0x660fdc: /* paddusb */
6223 case 0x660fdd: /* paddusw */
6224 case 0x660fde: /* pmaxub */
6225 case 0x660fdf: /* pandn */
6226 case 0x660fe0: /* pavgb */
6227 case 0x660fe1: /* psraw */
6228 case 0x660fe2: /* psrad */
6229 case 0x660fe3: /* pavgw */
6230 case 0x660fe4: /* pmulhuw */
6231 case 0x660fe5: /* pmulhw */
6232 case 0x660fe6: /* cvttpd2dq */
6233 case 0xf20fe6: /* cvtpd2dq */
6234 case 0xf30fe6: /* cvtdq2pd */
6235 case 0x660fe8: /* psubsb */
6236 case 0x660fe9: /* psubsw */
6237 case 0x660fea: /* pminsw */
6238 case 0x660feb: /* por */
6239 case 0x660fec: /* paddsb */
6240 case 0x660fed: /* paddsw */
6241 case 0x660fee: /* pmaxsw */
6242 case 0x660fef: /* pxor */
6243 case 0x660ff0: /* lddqu */
6244 case 0x660ff1: /* psllw */
6245 case 0x660ff2: /* pslld */
6246 case 0x660ff3: /* psllq */
6247 case 0x660ff4: /* pmuludq */
6248 case 0x660ff5: /* pmaddwd */
6249 case 0x660ff6: /* psadbw */
6250 case 0x660ff8: /* psubb */
6251 case 0x660ff9: /* psubw */
6252 case 0x660ffa: /* psubl */
6253 case 0x660ffb: /* psubq */
6254 case 0x660ffc: /* paddb */
6255 case 0x660ffd: /* paddw */
6256 case 0x660ffe: /* paddl */
6257 if (i386_record_modrm (&ir))
6258 return -1;
6259 ir.reg |= rex_r;
c131fcee 6260 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
a3c4230a
HZ
6261 goto no_support;
6262 record_arch_list_add_reg (ir.regcache,
6263 I387_XMM0_REGNUM (tdep) + ir.reg);
6264 if ((opcode & 0xfffffffc) == 0x660f3a60)
6265 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6266 break;
6267
6268 case 0x0f11: /* movups */
6269 case 0x660f11: /* movupd */
6270 case 0xf30f11: /* movss */
6271 case 0xf20f11: /* movsd */
6272 case 0x0f13: /* movlps */
6273 case 0x660f13: /* movlpd */
6274 case 0x0f17: /* movhps */
6275 case 0x660f17: /* movhpd */
6276 case 0x0f29: /* movaps */
6277 case 0x660f29: /* movapd */
6278 case 0x660f3a14: /* pextrb */
6279 case 0x660f3a15: /* pextrw */
6280 case 0x660f3a16: /* pextrd pextrq */
6281 case 0x660f3a17: /* extractps */
6282 case 0x660f7f: /* movdqa */
6283 case 0xf30f7f: /* movdqu */
6284 if (i386_record_modrm (&ir))
6285 return -1;
6286 if (ir.mod == 3)
6287 {
6288 if (opcode == 0x0f13 || opcode == 0x660f13
6289 || opcode == 0x0f17 || opcode == 0x660f17)
6290 goto no_support;
6291 ir.rm |= ir.rex_b;
c131fcee 6292 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a
HZ
6293 goto no_support;
6294 record_arch_list_add_reg (ir.regcache,
6295 I387_XMM0_REGNUM (tdep) + ir.rm);
6296 }
6297 else
6298 {
6299 switch (opcode)
6300 {
6301 case 0x660f3a14:
6302 ir.ot = OT_BYTE;
6303 break;
6304 case 0x660f3a15:
6305 ir.ot = OT_WORD;
6306 break;
6307 case 0x660f3a16:
6308 ir.ot = OT_LONG;
6309 break;
6310 case 0x660f3a17:
6311 ir.ot = OT_QUAD;
6312 break;
6313 default:
6314 ir.ot = OT_DQUAD;
6315 break;
6316 }
6317 if (i386_record_lea_modrm (&ir))
6318 return -1;
6319 }
6320 break;
6321
6322 case 0x0f2b: /* movntps */
6323 case 0x660f2b: /* movntpd */
6324 case 0x0fe7: /* movntq */
6325 case 0x660fe7: /* movntdq */
6326 if (ir.mod == 3)
6327 goto no_support;
6328 if (opcode == 0x0fe7)
6329 ir.ot = OT_QUAD;
6330 else
6331 ir.ot = OT_DQUAD;
6332 if (i386_record_lea_modrm (&ir))
6333 return -1;
6334 break;
6335
6336 case 0xf30f2c: /* cvttss2si */
6337 case 0xf20f2c: /* cvttsd2si */
6338 case 0xf30f2d: /* cvtss2si */
6339 case 0xf20f2d: /* cvtsd2si */
6340 case 0xf20f38f0: /* crc32 */
6341 case 0xf20f38f1: /* crc32 */
6342 case 0x0f50: /* movmskps */
6343 case 0x660f50: /* movmskpd */
6344 case 0x0fc5: /* pextrw */
6345 case 0x660fc5: /* pextrw */
6346 case 0x0fd7: /* pmovmskb */
6347 case 0x660fd7: /* pmovmskb */
6348 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r);
6349 break;
6350
6351 case 0x0f3800: /* pshufb */
6352 case 0x0f3801: /* phaddw */
6353 case 0x0f3802: /* phaddd */
6354 case 0x0f3803: /* phaddsw */
6355 case 0x0f3804: /* pmaddubsw */
6356 case 0x0f3805: /* phsubw */
6357 case 0x0f3806: /* phsubd */
6358 case 0x0f3807: /* phaddsw */
6359 case 0x0f3808: /* psignb */
6360 case 0x0f3809: /* psignw */
6361 case 0x0f380a: /* psignd */
6362 case 0x0f380b: /* pmulhrsw */
6363 case 0x0f381c: /* pabsb */
6364 case 0x0f381d: /* pabsw */
6365 case 0x0f381e: /* pabsd */
6366 case 0x0f382b: /* packusdw */
6367 case 0x0f3830: /* pmovzxbw */
6368 case 0x0f3831: /* pmovzxbd */
6369 case 0x0f3832: /* pmovzxbq */
6370 case 0x0f3833: /* pmovzxwd */
6371 case 0x0f3834: /* pmovzxwq */
6372 case 0x0f3835: /* pmovzxdq */
6373 case 0x0f3837: /* pcmpgtq */
6374 case 0x0f3838: /* pminsb */
6375 case 0x0f3839: /* pminsd */
6376 case 0x0f383a: /* pminuw */
6377 case 0x0f383b: /* pminud */
6378 case 0x0f383c: /* pmaxsb */
6379 case 0x0f383d: /* pmaxsd */
6380 case 0x0f383e: /* pmaxuw */
6381 case 0x0f383f: /* pmaxud */
6382 case 0x0f3840: /* pmulld */
6383 case 0x0f3841: /* phminposuw */
6384 case 0x0f3a0f: /* palignr */
6385 case 0x0f60: /* punpcklbw */
6386 case 0x0f61: /* punpcklwd */
6387 case 0x0f62: /* punpckldq */
6388 case 0x0f63: /* packsswb */
6389 case 0x0f64: /* pcmpgtb */
6390 case 0x0f65: /* pcmpgtw */
6391 case 0x0f66: /* pcmpgtl */
6392 case 0x0f67: /* packuswb */
6393 case 0x0f68: /* punpckhbw */
6394 case 0x0f69: /* punpckhwd */
6395 case 0x0f6a: /* punpckhdq */
6396 case 0x0f6b: /* packssdw */
6397 case 0x0f6e: /* movd */
6398 case 0x0f6f: /* movq */
6399 case 0x0f70: /* pshufw */
6400 case 0x0f74: /* pcmpeqb */
6401 case 0x0f75: /* pcmpeqw */
6402 case 0x0f76: /* pcmpeql */
6403 case 0x0fc4: /* pinsrw */
6404 case 0x0fd1: /* psrlw */
6405 case 0x0fd2: /* psrld */
6406 case 0x0fd3: /* psrlq */
6407 case 0x0fd4: /* paddq */
6408 case 0x0fd5: /* pmullw */
6409 case 0xf20fd6: /* movdq2q */
6410 case 0x0fd8: /* psubusb */
6411 case 0x0fd9: /* psubusw */
6412 case 0x0fda: /* pminub */
6413 case 0x0fdb: /* pand */
6414 case 0x0fdc: /* paddusb */
6415 case 0x0fdd: /* paddusw */
6416 case 0x0fde: /* pmaxub */
6417 case 0x0fdf: /* pandn */
6418 case 0x0fe0: /* pavgb */
6419 case 0x0fe1: /* psraw */
6420 case 0x0fe2: /* psrad */
6421 case 0x0fe3: /* pavgw */
6422 case 0x0fe4: /* pmulhuw */
6423 case 0x0fe5: /* pmulhw */
6424 case 0x0fe8: /* psubsb */
6425 case 0x0fe9: /* psubsw */
6426 case 0x0fea: /* pminsw */
6427 case 0x0feb: /* por */
6428 case 0x0fec: /* paddsb */
6429 case 0x0fed: /* paddsw */
6430 case 0x0fee: /* pmaxsw */
6431 case 0x0fef: /* pxor */
6432 case 0x0ff1: /* psllw */
6433 case 0x0ff2: /* pslld */
6434 case 0x0ff3: /* psllq */
6435 case 0x0ff4: /* pmuludq */
6436 case 0x0ff5: /* pmaddwd */
6437 case 0x0ff6: /* psadbw */
6438 case 0x0ff8: /* psubb */
6439 case 0x0ff9: /* psubw */
6440 case 0x0ffa: /* psubl */
6441 case 0x0ffb: /* psubq */
6442 case 0x0ffc: /* paddb */
6443 case 0x0ffd: /* paddw */
6444 case 0x0ffe: /* paddl */
6445 if (i386_record_modrm (&ir))
6446 return -1;
6447 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
6448 goto no_support;
6449 record_arch_list_add_reg (ir.regcache,
6450 I387_MM0_REGNUM (tdep) + ir.reg);
6451 break;
6452
6453 case 0x0f71: /* psllw */
6454 case 0x0f72: /* pslld */
6455 case 0x0f73: /* psllq */
6456 if (i386_record_modrm (&ir))
6457 return -1;
6458 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
6459 goto no_support;
6460 record_arch_list_add_reg (ir.regcache,
6461 I387_MM0_REGNUM (tdep) + ir.rm);
6462 break;
6463
6464 case 0x660f71: /* psllw */
6465 case 0x660f72: /* pslld */
6466 case 0x660f73: /* psllq */
6467 if (i386_record_modrm (&ir))
6468 return -1;
6469 ir.rm |= ir.rex_b;
c131fcee 6470 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a
HZ
6471 goto no_support;
6472 record_arch_list_add_reg (ir.regcache,
6473 I387_XMM0_REGNUM (tdep) + ir.rm);
6474 break;
6475
6476 case 0x0f7e: /* movd */
6477 case 0x660f7e: /* movd */
6478 if (i386_record_modrm (&ir))
6479 return -1;
6480 if (ir.mod == 3)
6481 I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b);
6482 else
6483 {
6484 if (ir.dflag == 2)
6485 ir.ot = OT_QUAD;
6486 else
6487 ir.ot = OT_LONG;
6488 if (i386_record_lea_modrm (&ir))
6489 return -1;
6490 }
6491 break;
6492
6493 case 0x0f7f: /* movq */
6494 if (i386_record_modrm (&ir))
6495 return -1;
6496 if (ir.mod == 3)
6497 {
6498 if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
6499 goto no_support;
6500 record_arch_list_add_reg (ir.regcache,
6501 I387_MM0_REGNUM (tdep) + ir.rm);
6502 }
6503 else
6504 {
6505 ir.ot = OT_QUAD;
6506 if (i386_record_lea_modrm (&ir))
6507 return -1;
6508 }
6509 break;
6510
6511 case 0xf30fb8: /* popcnt */
6512 if (i386_record_modrm (&ir))
6513 return -1;
6514 I386_RECORD_ARCH_LIST_ADD_REG (ir.reg);
6515 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6516 break;
6517
6518 case 0x660fd6: /* movq */
6519 if (i386_record_modrm (&ir))
6520 return -1;
6521 if (ir.mod == 3)
6522 {
6523 ir.rm |= ir.rex_b;
c131fcee 6524 if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
a3c4230a
HZ
6525 goto no_support;
6526 record_arch_list_add_reg (ir.regcache,
6527 I387_XMM0_REGNUM (tdep) + ir.rm);
6528 }
6529 else
6530 {
6531 ir.ot = OT_QUAD;
6532 if (i386_record_lea_modrm (&ir))
6533 return -1;
6534 }
6535 break;
6536
6537 case 0x660f3817: /* ptest */
6538 case 0x0f2e: /* ucomiss */
6539 case 0x660f2e: /* ucomisd */
6540 case 0x0f2f: /* comiss */
6541 case 0x660f2f: /* comisd */
6542 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
6543 break;
6544
6545 case 0x0ff7: /* maskmovq */
6546 regcache_raw_read_unsigned (ir.regcache,
6547 ir.regmap[X86_RECORD_REDI_REGNUM],
6548 &addr);
6549 if (record_arch_list_add_mem (addr, 64))
6550 return -1;
6551 break;
6552
6553 case 0x660ff7: /* maskmovdqu */
6554 regcache_raw_read_unsigned (ir.regcache,
6555 ir.regmap[X86_RECORD_REDI_REGNUM],
6556 &addr);
6557 if (record_arch_list_add_mem (addr, 128))
6558 return -1;
6559 break;
6560
6561 default:
6562 goto no_support;
6563 break;
6564 }
6565 break;
7ad10968
HZ
6566
6567 default:
7ad10968
HZ
6568 goto no_support;
6569 break;
6570 }
6571
cf648174
HZ
6572 /* In the future, maybe still need to deal with need_dasm. */
6573 I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REIP_REGNUM);
7ad10968
HZ
6574 if (record_arch_list_add_end ())
6575 return -1;
6576
6577 return 0;
6578
01fe1b41 6579 no_support:
a3c4230a
HZ
6580 printf_unfiltered (_("Process record does not support instruction 0x%02x "
6581 "at address %s.\n"),
6582 (unsigned int) (opcode),
6583 paddress (gdbarch, ir.orig_addr));
7ad10968
HZ
6584 return -1;
6585}
6586
cf648174
HZ
6587static const int i386_record_regmap[] =
6588{
6589 I386_EAX_REGNUM, I386_ECX_REGNUM, I386_EDX_REGNUM, I386_EBX_REGNUM,
6590 I386_ESP_REGNUM, I386_EBP_REGNUM, I386_ESI_REGNUM, I386_EDI_REGNUM,
6591 0, 0, 0, 0, 0, 0, 0, 0,
6592 I386_EIP_REGNUM, I386_EFLAGS_REGNUM, I386_CS_REGNUM, I386_SS_REGNUM,
6593 I386_DS_REGNUM, I386_ES_REGNUM, I386_FS_REGNUM, I386_GS_REGNUM
6594};
6595
7a697b8d
SS
6596/* Check that the given address appears suitable for a fast
6597 tracepoint, which on x86 means that we need an instruction of at
6598 least 5 bytes, so that we can overwrite it with a 4-byte-offset
6599 jump and not have to worry about program jumps to an address in the
6600 middle of the tracepoint jump. Returns 1 if OK, and writes a size
6601 of instruction to replace, and 0 if not, plus an explanatory
6602 string. */
6603
6604static int
6605i386_fast_tracepoint_valid_at (struct gdbarch *gdbarch,
6606 CORE_ADDR addr, int *isize, char **msg)
6607{
6608 int len, jumplen;
6609 static struct ui_file *gdb_null = NULL;
6610
6611 /* This is based on the target agent using a 4-byte relative jump.
6612 Alternate future possibilities include 8-byte offset for x86-84,
6613 or 3-byte jumps if the program has trampoline space close by. */
6614 jumplen = 5;
6615
6616 /* Dummy file descriptor for the disassembler. */
6617 if (!gdb_null)
6618 gdb_null = ui_file_new ();
6619
6620 /* Check for fit. */
6621 len = gdb_print_insn (gdbarch, addr, gdb_null, NULL);
6622 if (len < jumplen)
6623 {
6624 /* Return a bit of target-specific detail to add to the caller's
6625 generic failure message. */
6626 if (msg)
6627 *msg = xstrprintf (_("; instruction is only %d bytes long, need at least %d bytes for the jump"),
6628 len, jumplen);
6629 return 0;
6630 }
6631
6632 if (isize)
6633 *isize = len;
6634 if (msg)
6635 *msg = NULL;
6636 return 1;
6637}
6638
90884b2b
L
6639static int
6640i386_validate_tdesc_p (struct gdbarch_tdep *tdep,
6641 struct tdesc_arch_data *tdesc_data)
6642{
6643 const struct target_desc *tdesc = tdep->tdesc;
c131fcee
L
6644 const struct tdesc_feature *feature_core;
6645 const struct tdesc_feature *feature_sse, *feature_avx;
90884b2b
L
6646 int i, num_regs, valid_p;
6647
6648 if (! tdesc_has_registers (tdesc))
6649 return 0;
6650
6651 /* Get core registers. */
6652 feature_core = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.core");
3a13a53b
L
6653 if (feature_core == NULL)
6654 return 0;
90884b2b
L
6655
6656 /* Get SSE registers. */
c131fcee 6657 feature_sse = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.sse");
90884b2b 6658
c131fcee
L
6659 /* Try AVX registers. */
6660 feature_avx = tdesc_find_feature (tdesc, "org.gnu.gdb.i386.avx");
6661
90884b2b
L
6662 valid_p = 1;
6663
c131fcee
L
6664 /* The XCR0 bits. */
6665 if (feature_avx)
6666 {
3a13a53b
L
6667 /* AVX register description requires SSE register description. */
6668 if (!feature_sse)
6669 return 0;
6670
c131fcee
L
6671 tdep->xcr0 = I386_XSTATE_AVX_MASK;
6672
6673 /* It may have been set by OSABI initialization function. */
6674 if (tdep->num_ymm_regs == 0)
6675 {
6676 tdep->ymmh_register_names = i386_ymmh_names;
6677 tdep->num_ymm_regs = 8;
6678 tdep->ymm0h_regnum = I386_YMM0H_REGNUM;
6679 }
6680
6681 for (i = 0; i < tdep->num_ymm_regs; i++)
6682 valid_p &= tdesc_numbered_register (feature_avx, tdesc_data,
6683 tdep->ymm0h_regnum + i,
6684 tdep->ymmh_register_names[i]);
6685 }
3a13a53b 6686 else if (feature_sse)
c131fcee 6687 tdep->xcr0 = I386_XSTATE_SSE_MASK;
3a13a53b
L
6688 else
6689 {
6690 tdep->xcr0 = I386_XSTATE_X87_MASK;
6691 tdep->num_xmm_regs = 0;
6692 }
c131fcee 6693
90884b2b
L
6694 num_regs = tdep->num_core_regs;
6695 for (i = 0; i < num_regs; i++)
6696 valid_p &= tdesc_numbered_register (feature_core, tdesc_data, i,
6697 tdep->register_names[i]);
6698
3a13a53b
L
6699 if (feature_sse)
6700 {
6701 /* Need to include %mxcsr, so add one. */
6702 num_regs += tdep->num_xmm_regs + 1;
6703 for (; i < num_regs; i++)
6704 valid_p &= tdesc_numbered_register (feature_sse, tdesc_data, i,
6705 tdep->register_names[i]);
6706 }
90884b2b
L
6707
6708 return valid_p;
6709}
6710
7ad10968
HZ
6711\f
6712static struct gdbarch *
6713i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
6714{
6715 struct gdbarch_tdep *tdep;
6716 struct gdbarch *gdbarch;
90884b2b
L
6717 struct tdesc_arch_data *tdesc_data;
6718 const struct target_desc *tdesc;
1ba53b71 6719 int mm0_regnum;
c131fcee 6720 int ymm0_regnum;
7ad10968
HZ
6721
6722 /* If there is already a candidate, use it. */
6723 arches = gdbarch_list_lookup_by_info (arches, &info);
6724 if (arches != NULL)
6725 return arches->gdbarch;
6726
6727 /* Allocate space for the new architecture. */
6728 tdep = XCALLOC (1, struct gdbarch_tdep);
6729 gdbarch = gdbarch_alloc (&info, tdep);
6730
6731 /* General-purpose registers. */
6732 tdep->gregset = NULL;
6733 tdep->gregset_reg_offset = NULL;
6734 tdep->gregset_num_regs = I386_NUM_GREGS;
6735 tdep->sizeof_gregset = 0;
6736
6737 /* Floating-point registers. */
6738 tdep->fpregset = NULL;
6739 tdep->sizeof_fpregset = I387_SIZEOF_FSAVE;
6740
c131fcee
L
6741 tdep->xstateregset = NULL;
6742
7ad10968
HZ
6743 /* The default settings include the FPU registers, the MMX registers
6744 and the SSE registers. This can be overridden for a specific ABI
6745 by adjusting the members `st0_regnum', `mm0_regnum' and
6746 `num_xmm_regs' of `struct gdbarch_tdep', otherwise the registers
3a13a53b 6747 will show up in the output of "info all-registers". */
7ad10968
HZ
6748
6749 tdep->st0_regnum = I386_ST0_REGNUM;
6750
7ad10968
HZ
6751 /* I386_NUM_XREGS includes %mxcsr, so substract one. */
6752 tdep->num_xmm_regs = I386_NUM_XREGS - 1;
6753
6754 tdep->jb_pc_offset = -1;
6755 tdep->struct_return = pcc_struct_return;
6756 tdep->sigtramp_start = 0;
6757 tdep->sigtramp_end = 0;
6758 tdep->sigtramp_p = i386_sigtramp_p;
6759 tdep->sigcontext_addr = NULL;
6760 tdep->sc_reg_offset = NULL;
6761 tdep->sc_pc_offset = -1;
6762 tdep->sc_sp_offset = -1;
6763
c131fcee
L
6764 tdep->xsave_xcr0_offset = -1;
6765
cf648174
HZ
6766 tdep->record_regmap = i386_record_regmap;
6767
7ad10968
HZ
6768 /* The format used for `long double' on almost all i386 targets is
6769 the i387 extended floating-point format. In fact, of all targets
6770 in the GCC 2.95 tree, only OSF/1 does it different, and insists
6771 on having a `long double' that's not `long' at all. */
6772 set_gdbarch_long_double_format (gdbarch, floatformats_i387_ext);
6773
6774 /* Although the i387 extended floating-point has only 80 significant
6775 bits, a `long double' actually takes up 96, probably to enforce
6776 alignment. */
6777 set_gdbarch_long_double_bit (gdbarch, 96);
6778
7ad10968
HZ
6779 /* Register numbers of various important registers. */
6780 set_gdbarch_sp_regnum (gdbarch, I386_ESP_REGNUM); /* %esp */
6781 set_gdbarch_pc_regnum (gdbarch, I386_EIP_REGNUM); /* %eip */
6782 set_gdbarch_ps_regnum (gdbarch, I386_EFLAGS_REGNUM); /* %eflags */
6783 set_gdbarch_fp0_regnum (gdbarch, I386_ST0_REGNUM); /* %st(0) */
6784
6785 /* NOTE: kettenis/20040418: GCC does have two possible register
6786 numbering schemes on the i386: dbx and SVR4. These schemes
6787 differ in how they number %ebp, %esp, %eflags, and the
6788 floating-point registers, and are implemented by the arrays
6789 dbx_register_map[] and svr4_dbx_register_map in
6790 gcc/config/i386.c. GCC also defines a third numbering scheme in
6791 gcc/config/i386.c, which it designates as the "default" register
6792 map used in 64bit mode. This last register numbering scheme is
6793 implemented in dbx64_register_map, and is used for AMD64; see
6794 amd64-tdep.c.
6795
6796 Currently, each GCC i386 target always uses the same register
6797 numbering scheme across all its supported debugging formats
6798 i.e. SDB (COFF), stabs and DWARF 2. This is because
6799 gcc/sdbout.c, gcc/dbxout.c and gcc/dwarf2out.c all use the
6800 DBX_REGISTER_NUMBER macro which is defined by each target's
6801 respective config header in a manner independent of the requested
6802 output debugging format.
6803
6804 This does not match the arrangement below, which presumes that
6805 the SDB and stabs numbering schemes differ from the DWARF and
6806 DWARF 2 ones. The reason for this arrangement is that it is
6807 likely to get the numbering scheme for the target's
6808 default/native debug format right. For targets where GCC is the
6809 native compiler (FreeBSD, NetBSD, OpenBSD, GNU/Linux) or for
6810 targets where the native toolchain uses a different numbering
6811 scheme for a particular debug format (stabs-in-ELF on Solaris)
6812 the defaults below will have to be overridden, like
6813 i386_elf_init_abi() does. */
6814
6815 /* Use the dbx register numbering scheme for stabs and COFF. */
6816 set_gdbarch_stab_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
6817 set_gdbarch_sdb_reg_to_regnum (gdbarch, i386_dbx_reg_to_regnum);
6818
6819 /* Use the SVR4 register numbering scheme for DWARF 2. */
6820 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, i386_svr4_reg_to_regnum);
6821
6822 /* We don't set gdbarch_stab_reg_to_regnum, since ECOFF doesn't seem to
6823 be in use on any of the supported i386 targets. */
6824
6825 set_gdbarch_print_float_info (gdbarch, i387_print_float_info);
6826
6827 set_gdbarch_get_longjmp_target (gdbarch, i386_get_longjmp_target);
6828
6829 /* Call dummy code. */
6830 set_gdbarch_push_dummy_call (gdbarch, i386_push_dummy_call);
6831
6832 set_gdbarch_convert_register_p (gdbarch, i386_convert_register_p);
6833 set_gdbarch_register_to_value (gdbarch, i386_register_to_value);
6834 set_gdbarch_value_to_register (gdbarch, i386_value_to_register);
6835
6836 set_gdbarch_return_value (gdbarch, i386_return_value);
6837
6838 set_gdbarch_skip_prologue (gdbarch, i386_skip_prologue);
6839
6840 /* Stack grows downward. */
6841 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
6842
6843 set_gdbarch_breakpoint_from_pc (gdbarch, i386_breakpoint_from_pc);
6844 set_gdbarch_decr_pc_after_break (gdbarch, 1);
6845 set_gdbarch_max_insn_length (gdbarch, I386_MAX_INSN_LEN);
6846
6847 set_gdbarch_frame_args_skip (gdbarch, 8);
6848
7ad10968
HZ
6849 set_gdbarch_print_insn (gdbarch, i386_print_insn);
6850
6851 set_gdbarch_dummy_id (gdbarch, i386_dummy_id);
6852
6853 set_gdbarch_unwind_pc (gdbarch, i386_unwind_pc);
6854
6855 /* Add the i386 register groups. */
6856 i386_add_reggroups (gdbarch);
90884b2b 6857 tdep->register_reggroup_p = i386_register_reggroup_p;
38c968cf 6858
143985b7
AF
6859 /* Helper for function argument information. */
6860 set_gdbarch_fetch_pointer_argument (gdbarch, i386_fetch_pointer_argument);
6861
06da04c6
MS
6862 /* Hook the function epilogue frame unwinder. This unwinder is
6863 appended to the list first, so that it supercedes the Dwarf
6864 unwinder in function epilogues (where the Dwarf unwinder
6865 currently fails). */
6866 frame_unwind_append_unwinder (gdbarch, &i386_epilogue_frame_unwind);
6867
6868 /* Hook in the DWARF CFI frame unwinder. This unwinder is appended
6869 to the list before the prologue-based unwinders, so that Dwarf
6870 CFI info will be used if it is available. */
10458914 6871 dwarf2_append_unwinders (gdbarch);
6405b0a6 6872
acd5c798 6873 frame_base_set_default (gdbarch, &i386_frame_base);
6c0e89ed 6874
1ba53b71 6875 /* Pseudo registers may be changed by amd64_init_abi. */
90884b2b
L
6876 set_gdbarch_pseudo_register_read (gdbarch, i386_pseudo_register_read);
6877 set_gdbarch_pseudo_register_write (gdbarch, i386_pseudo_register_write);
6878
6879 set_tdesc_pseudo_register_type (gdbarch, i386_pseudo_register_type);
6880 set_tdesc_pseudo_register_name (gdbarch, i386_pseudo_register_name);
6881
c131fcee
L
6882 /* Override the normal target description method to make the AVX
6883 upper halves anonymous. */
6884 set_gdbarch_register_name (gdbarch, i386_register_name);
6885
6886 /* Even though the default ABI only includes general-purpose registers,
6887 floating-point registers and the SSE registers, we have to leave a
6888 gap for the upper AVX registers. */
6889 set_gdbarch_num_regs (gdbarch, I386_AVX_NUM_REGS);
90884b2b
L
6890
6891 /* Get the x86 target description from INFO. */
6892 tdesc = info.target_desc;
6893 if (! tdesc_has_registers (tdesc))
6894 tdesc = tdesc_i386;
6895 tdep->tdesc = tdesc;
6896
6897 tdep->num_core_regs = I386_NUM_GREGS + I387_NUM_REGS;
6898 tdep->register_names = i386_register_names;
6899
c131fcee
L
6900 /* No upper YMM registers. */
6901 tdep->ymmh_register_names = NULL;
6902 tdep->ymm0h_regnum = -1;
6903
1ba53b71
L
6904 tdep->num_byte_regs = 8;
6905 tdep->num_word_regs = 8;
6906 tdep->num_dword_regs = 0;
6907 tdep->num_mmx_regs = 8;
c131fcee 6908 tdep->num_ymm_regs = 0;
1ba53b71 6909
90884b2b
L
6910 tdesc_data = tdesc_data_alloc ();
6911
3ce1502b 6912 /* Hook in ABI-specific overrides, if they have been registered. */
90884b2b 6913 info.tdep_info = (void *) tdesc_data;
4be87837 6914 gdbarch_init_osabi (info, gdbarch);
3ce1502b 6915
c131fcee
L
6916 if (!i386_validate_tdesc_p (tdep, tdesc_data))
6917 {
6918 tdesc_data_cleanup (tdesc_data);
6919 xfree (tdep);
6920 gdbarch_free (gdbarch);
6921 return NULL;
6922 }
6923
1ba53b71
L
6924 /* Wire in pseudo registers. Number of pseudo registers may be
6925 changed. */
6926 set_gdbarch_num_pseudo_regs (gdbarch, (tdep->num_byte_regs
6927 + tdep->num_word_regs
6928 + tdep->num_dword_regs
c131fcee
L
6929 + tdep->num_mmx_regs
6930 + tdep->num_ymm_regs));
1ba53b71 6931
90884b2b
L
6932 /* Target description may be changed. */
6933 tdesc = tdep->tdesc;
6934
90884b2b
L
6935 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
6936
6937 /* Override gdbarch_register_reggroup_p set in tdesc_use_registers. */
6938 set_gdbarch_register_reggroup_p (gdbarch, tdep->register_reggroup_p);
6939
1ba53b71
L
6940 /* Make %al the first pseudo-register. */
6941 tdep->al_regnum = gdbarch_num_regs (gdbarch);
6942 tdep->ax_regnum = tdep->al_regnum + tdep->num_byte_regs;
6943
c131fcee 6944 ymm0_regnum = tdep->ax_regnum + tdep->num_word_regs;
1ba53b71
L
6945 if (tdep->num_dword_regs)
6946 {
6947 /* Support dword pseudo-registesr if it hasn't been disabled, */
c131fcee
L
6948 tdep->eax_regnum = ymm0_regnum;
6949 ymm0_regnum += tdep->num_dword_regs;
1ba53b71
L
6950 }
6951 else
6952 tdep->eax_regnum = -1;
6953
c131fcee
L
6954 mm0_regnum = ymm0_regnum;
6955 if (tdep->num_ymm_regs)
6956 {
6957 /* Support YMM pseudo-registesr if it is available, */
6958 tdep->ymm0_regnum = ymm0_regnum;
6959 mm0_regnum += tdep->num_ymm_regs;
6960 }
6961 else
6962 tdep->ymm0_regnum = -1;
6963
1ba53b71
L
6964 if (tdep->num_mmx_regs != 0)
6965 {
6966 /* Support MMX pseudo-registesr if MMX hasn't been disabled, */
6967 tdep->mm0_regnum = mm0_regnum;
6968 }
6969 else
6970 tdep->mm0_regnum = -1;
6971
06da04c6 6972 /* Hook in the legacy prologue-based unwinders last (fallback). */
10458914
DJ
6973 frame_unwind_append_unwinder (gdbarch, &i386_sigtramp_frame_unwind);
6974 frame_unwind_append_unwinder (gdbarch, &i386_frame_unwind);
acd5c798 6975
8446b36a
MK
6976 /* If we have a register mapping, enable the generic core file
6977 support, unless it has already been enabled. */
6978 if (tdep->gregset_reg_offset
6979 && !gdbarch_regset_from_core_section_p (gdbarch))
6980 set_gdbarch_regset_from_core_section (gdbarch,
6981 i386_regset_from_core_section);
6982
514f746b
AR
6983 set_gdbarch_skip_permanent_breakpoint (gdbarch,
6984 i386_skip_permanent_breakpoint);
6985
7a697b8d
SS
6986 set_gdbarch_fast_tracepoint_valid_at (gdbarch,
6987 i386_fast_tracepoint_valid_at);
6988
a62cc96e
AC
6989 return gdbarch;
6990}
6991
8201327c
MK
6992static enum gdb_osabi
6993i386_coff_osabi_sniffer (bfd *abfd)
6994{
762c5349
MK
6995 if (strcmp (bfd_get_target (abfd), "coff-go32-exe") == 0
6996 || strcmp (bfd_get_target (abfd), "coff-go32") == 0)
8201327c
MK
6997 return GDB_OSABI_GO32;
6998
6999 return GDB_OSABI_UNKNOWN;
7000}
8201327c
MK
7001\f
7002
28e9e0f0
MK
7003/* Provide a prototype to silence -Wmissing-prototypes. */
7004void _initialize_i386_tdep (void);
7005
c906108c 7006void
fba45db2 7007_initialize_i386_tdep (void)
c906108c 7008{
a62cc96e
AC
7009 register_gdbarch_init (bfd_arch_i386, i386_gdbarch_init);
7010
fc338970 7011 /* Add the variable that controls the disassembly flavor. */
7ab04401
AC
7012 add_setshow_enum_cmd ("disassembly-flavor", no_class, valid_flavors,
7013 &disassembly_flavor, _("\
7014Set the disassembly flavor."), _("\
7015Show the disassembly flavor."), _("\
7016The valid values are \"att\" and \"intel\", and the default value is \"att\"."),
7017 NULL,
7018 NULL, /* FIXME: i18n: */
7019 &setlist, &showlist);
8201327c
MK
7020
7021 /* Add the variable that controls the convention for returning
7022 structs. */
7ab04401
AC
7023 add_setshow_enum_cmd ("struct-convention", no_class, valid_conventions,
7024 &struct_convention, _("\
7025Set the convention for returning small structs."), _("\
7026Show the convention for returning small structs."), _("\
7027Valid values are \"default\", \"pcc\" and \"reg\", and the default value\n\
7028is \"default\"."),
7029 NULL,
7030 NULL, /* FIXME: i18n: */
7031 &setlist, &showlist);
8201327c
MK
7032
7033 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_coff_flavour,
7034 i386_coff_osabi_sniffer);
8201327c 7035
05816f70 7036 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_SVR4,
8201327c 7037 i386_svr4_init_abi);
05816f70 7038 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_GO32,
8201327c 7039 i386_go32_init_abi);
38c968cf 7040
209bd28e 7041 /* Initialize the i386-specific register groups. */
38c968cf 7042 i386_init_reggroups ();
90884b2b
L
7043
7044 /* Initialize the standard target descriptions. */
7045 initialize_tdesc_i386 ();
3a13a53b 7046 initialize_tdesc_i386_mmx ();
c131fcee 7047 initialize_tdesc_i386_avx ();
c8d5aac9
L
7048
7049 /* Tell remote stub that we support XML target description. */
7050 register_remote_support_xml ("i386");
c906108c 7051}
This page took 1.18805 seconds and 4 git commands to generate.