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