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