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