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