]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdbserver/linux-x86-low.cc
MIPS/opcodes: Add MIPS Allegrex DBREAK instruction
[thirdparty/binutils-gdb.git] / gdbserver / linux-x86-low.cc
1 /* GNU/Linux/x86-64 specific low level interface, for the remote server
2 for GDB.
3 Copyright (C) 2002-2024 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include <signal.h>
21 #include <limits.h>
22 #include <inttypes.h>
23 #include "linux-low.h"
24 #include "i387-fp.h"
25 #include "x86-low.h"
26 #include "gdbsupport/x86-xstate.h"
27 #include "nat/x86-xstate.h"
28 #include "nat/gdb_ptrace.h"
29
30 #ifdef __x86_64__
31 #include "nat/amd64-linux-siginfo.h"
32 #endif
33
34 #include "gdb_proc_service.h"
35 /* Don't include elf/common.h if linux/elf.h got included by
36 gdb_proc_service.h. */
37 #ifndef ELFMAG0
38 #include "elf/common.h"
39 #endif
40
41 #include "gdbsupport/agent.h"
42 #include "tdesc.h"
43 #include "tracepoint.h"
44 #include "ax.h"
45 #include "nat/linux-nat.h"
46 #include "nat/x86-linux.h"
47 #include "nat/x86-linux-dregs.h"
48 #include "linux-x86-tdesc.h"
49
50 #ifdef __x86_64__
51 static target_desc_up tdesc_amd64_linux_no_xml;
52 #endif
53 static target_desc_up tdesc_i386_linux_no_xml;
54
55
56 static unsigned char jump_insn[] = { 0xe9, 0, 0, 0, 0 };
57 static unsigned char small_jump_insn[] = { 0x66, 0xe9, 0, 0 };
58
59 /* Backward compatibility for gdb without XML support. */
60
61 static const char xmltarget_i386_linux_no_xml[] = "@<target>\
62 <architecture>i386</architecture>\
63 <osabi>GNU/Linux</osabi>\
64 </target>";
65
66 #ifdef __x86_64__
67 static const char xmltarget_amd64_linux_no_xml[] = "@<target>\
68 <architecture>i386:x86-64</architecture>\
69 <osabi>GNU/Linux</osabi>\
70 </target>";
71 #endif
72
73 #include <sys/reg.h>
74 #include <sys/procfs.h>
75 #include <sys/uio.h>
76
77 #ifndef PTRACE_GET_THREAD_AREA
78 #define PTRACE_GET_THREAD_AREA 25
79 #endif
80
81 /* This definition comes from prctl.h, but some kernels may not have it. */
82 #ifndef PTRACE_ARCH_PRCTL
83 #define PTRACE_ARCH_PRCTL 30
84 #endif
85
86 /* The following definitions come from prctl.h, but may be absent
87 for certain configurations. */
88 #ifndef ARCH_GET_FS
89 #define ARCH_SET_GS 0x1001
90 #define ARCH_SET_FS 0x1002
91 #define ARCH_GET_FS 0x1003
92 #define ARCH_GET_GS 0x1004
93 #endif
94
95 /* Linux target op definitions for the x86 architecture.
96 This is initialized assuming an amd64 target.
97 'low_arch_setup' will correct it for i386 or amd64 targets. */
98
99 class x86_target : public linux_process_target
100 {
101 public:
102
103 const regs_info *get_regs_info () override;
104
105 const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override;
106
107 bool supports_z_point_type (char z_type) override;
108
109 void process_qsupported (gdb::array_view<const char * const> features) override;
110
111 bool supports_tracepoints () override;
112
113 bool supports_fast_tracepoints () override;
114
115 int install_fast_tracepoint_jump_pad
116 (CORE_ADDR tpoint, CORE_ADDR tpaddr, CORE_ADDR collector,
117 CORE_ADDR lockaddr, ULONGEST orig_size, CORE_ADDR *jump_entry,
118 CORE_ADDR *trampoline, ULONGEST *trampoline_size,
119 unsigned char *jjump_pad_insn, ULONGEST *jjump_pad_insn_size,
120 CORE_ADDR *adjusted_insn_addr, CORE_ADDR *adjusted_insn_addr_end,
121 char *err) override;
122
123 int get_min_fast_tracepoint_insn_len () override;
124
125 struct emit_ops *emit_ops () override;
126
127 int get_ipa_tdesc_idx () override;
128
129 protected:
130
131 void low_arch_setup () override;
132
133 bool low_cannot_fetch_register (int regno) override;
134
135 bool low_cannot_store_register (int regno) override;
136
137 bool low_supports_breakpoints () override;
138
139 CORE_ADDR low_get_pc (regcache *regcache) override;
140
141 void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
142
143 int low_decr_pc_after_break () override;
144
145 bool low_breakpoint_at (CORE_ADDR pc) override;
146
147 int low_insert_point (raw_bkpt_type type, CORE_ADDR addr,
148 int size, raw_breakpoint *bp) override;
149
150 int low_remove_point (raw_bkpt_type type, CORE_ADDR addr,
151 int size, raw_breakpoint *bp) override;
152
153 bool low_stopped_by_watchpoint () override;
154
155 CORE_ADDR low_stopped_data_address () override;
156
157 /* collect_ptrace_register/supply_ptrace_register are not needed in the
158 native i386 case (no registers smaller than an xfer unit), and are not
159 used in the biarch case (HAVE_LINUX_USRREGS is not defined). */
160
161 /* Need to fix up i386 siginfo if host is amd64. */
162 bool low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
163 int direction) override;
164
165 arch_process_info *low_new_process () override;
166
167 void low_delete_process (arch_process_info *info) override;
168
169 void low_new_thread (lwp_info *) override;
170
171 void low_delete_thread (arch_lwp_info *) override;
172
173 void low_new_fork (process_info *parent, process_info *child) override;
174
175 void low_prepare_to_resume (lwp_info *lwp) override;
176
177 int low_get_thread_area (int lwpid, CORE_ADDR *addrp) override;
178
179 bool low_supports_range_stepping () override;
180
181 bool low_supports_catch_syscall () override;
182
183 void low_get_syscall_trapinfo (regcache *regcache, int *sysno) override;
184
185 private:
186
187 /* Update all the target description of all processes; a new GDB
188 connected, and it may or not support xml target descriptions. */
189 void update_xmltarget ();
190 };
191
192 /* The singleton target ops object. */
193
194 static x86_target the_x86_target;
195
196 /* Per-process arch-specific data we want to keep. */
197
198 struct arch_process_info
199 {
200 struct x86_debug_reg_state debug_reg_state;
201 };
202
203 #ifdef __x86_64__
204
205 /* Mapping between the general-purpose registers in `struct user'
206 format and GDB's register array layout.
207 Note that the transfer layout uses 64-bit regs. */
208 static /*const*/ int i386_regmap[] =
209 {
210 RAX * 8, RCX * 8, RDX * 8, RBX * 8,
211 RSP * 8, RBP * 8, RSI * 8, RDI * 8,
212 RIP * 8, EFLAGS * 8, CS * 8, SS * 8,
213 DS * 8, ES * 8, FS * 8, GS * 8
214 };
215
216 #define I386_NUM_REGS (sizeof (i386_regmap) / sizeof (i386_regmap[0]))
217
218 /* So code below doesn't have to care, i386 or amd64. */
219 #define ORIG_EAX ORIG_RAX
220 #define REGSIZE 8
221
222 static const int x86_64_regmap[] =
223 {
224 RAX * 8, RBX * 8, RCX * 8, RDX * 8,
225 RSI * 8, RDI * 8, RBP * 8, RSP * 8,
226 R8 * 8, R9 * 8, R10 * 8, R11 * 8,
227 R12 * 8, R13 * 8, R14 * 8, R15 * 8,
228 RIP * 8, EFLAGS * 8, CS * 8, SS * 8,
229 DS * 8, ES * 8, FS * 8, GS * 8,
230 -1, -1, -1, -1, -1, -1, -1, -1,
231 -1, -1, -1, -1, -1, -1, -1, -1,
232 -1, -1, -1, -1, -1, -1, -1, -1,
233 -1,
234 -1, -1, -1, -1, -1, -1, -1, -1,
235 ORIG_RAX * 8,
236 21 * 8, 22 * 8,
237 -1, -1, -1, -1, /* MPX registers BND0 ... BND3. */
238 -1, -1, /* MPX registers BNDCFGU, BNDSTATUS. */
239 -1, -1, -1, -1, -1, -1, -1, -1, /* xmm16 ... xmm31 (AVX512) */
240 -1, -1, -1, -1, -1, -1, -1, -1,
241 -1, -1, -1, -1, -1, -1, -1, -1, /* ymm16 ... ymm31 (AVX512) */
242 -1, -1, -1, -1, -1, -1, -1, -1,
243 -1, -1, -1, -1, -1, -1, -1, -1, /* k0 ... k7 (AVX512) */
244 -1, -1, -1, -1, -1, -1, -1, -1, /* zmm0 ... zmm31 (AVX512) */
245 -1, -1, -1, -1, -1, -1, -1, -1,
246 -1, -1, -1, -1, -1, -1, -1, -1,
247 -1, -1, -1, -1, -1, -1, -1, -1,
248 -1 /* pkru */
249 };
250
251 #define X86_64_NUM_REGS (sizeof (x86_64_regmap) / sizeof (x86_64_regmap[0]))
252 #define X86_64_USER_REGS (GS + 1)
253
254 #else /* ! __x86_64__ */
255
256 /* Mapping between the general-purpose registers in `struct user'
257 format and GDB's register array layout. */
258 static /*const*/ int i386_regmap[] =
259 {
260 EAX * 4, ECX * 4, EDX * 4, EBX * 4,
261 UESP * 4, EBP * 4, ESI * 4, EDI * 4,
262 EIP * 4, EFL * 4, CS * 4, SS * 4,
263 DS * 4, ES * 4, FS * 4, GS * 4
264 };
265
266 #define I386_NUM_REGS (sizeof (i386_regmap) / sizeof (i386_regmap[0]))
267
268 #define REGSIZE 4
269
270 #endif
271
272 #ifdef __x86_64__
273
274 /* Returns true if THREAD belongs to a x86-64 process, per the tdesc. */
275
276 static int
277 is_64bit_tdesc (thread_info *thread)
278 {
279 struct regcache *regcache = get_thread_regcache (thread, 0);
280
281 return register_size (regcache->tdesc, 0) == 8;
282 }
283
284 #endif
285
286 \f
287 /* Called by libthread_db. */
288
289 ps_err_e
290 ps_get_thread_area (struct ps_prochandle *ph,
291 lwpid_t lwpid, int idx, void **base)
292 {
293 #ifdef __x86_64__
294 lwp_info *lwp = find_lwp_pid (ptid_t (lwpid));
295 gdb_assert (lwp != nullptr);
296 int use_64bit = is_64bit_tdesc (get_lwp_thread (lwp));
297
298 if (use_64bit)
299 {
300 switch (idx)
301 {
302 case FS:
303 if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_FS) == 0)
304 return PS_OK;
305 break;
306 case GS:
307 if (ptrace (PTRACE_ARCH_PRCTL, lwpid, base, ARCH_GET_GS) == 0)
308 return PS_OK;
309 break;
310 default:
311 return PS_BADADDR;
312 }
313 return PS_ERR;
314 }
315 #endif
316
317 {
318 unsigned int desc[4];
319
320 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid,
321 (void *) (intptr_t) idx, (unsigned long) &desc) < 0)
322 return PS_ERR;
323
324 /* Ensure we properly extend the value to 64-bits for x86_64. */
325 *base = (void *) (uintptr_t) desc[1];
326 return PS_OK;
327 }
328 }
329
330 /* Get the thread area address. This is used to recognize which
331 thread is which when tracing with the in-process agent library. We
332 don't read anything from the address, and treat it as opaque; it's
333 the address itself that we assume is unique per-thread. */
334
335 int
336 x86_target::low_get_thread_area (int lwpid, CORE_ADDR *addr)
337 {
338 lwp_info *lwp = find_lwp_pid (ptid_t (lwpid));
339 gdb_assert (lwp != nullptr);
340 #ifdef __x86_64__
341 int use_64bit = is_64bit_tdesc (get_lwp_thread (lwp));
342
343 if (use_64bit)
344 {
345 void *base;
346 if (ptrace (PTRACE_ARCH_PRCTL, lwpid, &base, ARCH_GET_FS) == 0)
347 {
348 *addr = (CORE_ADDR) (uintptr_t) base;
349 return 0;
350 }
351
352 return -1;
353 }
354 #endif
355
356 {
357 struct thread_info *thr = get_lwp_thread (lwp);
358 struct regcache *regcache = get_thread_regcache (thr, 1);
359 unsigned int desc[4];
360 ULONGEST gs = 0;
361 const int reg_thread_area = 3; /* bits to scale down register value. */
362 int idx;
363
364 collect_register_by_name (regcache, "gs", &gs);
365
366 idx = gs >> reg_thread_area;
367
368 if (ptrace (PTRACE_GET_THREAD_AREA,
369 lwpid_of (thr),
370 (void *) (long) idx, (unsigned long) &desc) < 0)
371 return -1;
372
373 *addr = desc[1];
374 return 0;
375 }
376 }
377
378
379 \f
380 bool
381 x86_target::low_cannot_store_register (int regno)
382 {
383 #ifdef __x86_64__
384 if (is_64bit_tdesc (current_thread))
385 return false;
386 #endif
387
388 return regno >= I386_NUM_REGS;
389 }
390
391 bool
392 x86_target::low_cannot_fetch_register (int regno)
393 {
394 #ifdef __x86_64__
395 if (is_64bit_tdesc (current_thread))
396 return false;
397 #endif
398
399 return regno >= I386_NUM_REGS;
400 }
401
402 static void
403 collect_register_i386 (struct regcache *regcache, int regno, void *buf)
404 {
405 collect_register (regcache, regno, buf);
406
407 #ifdef __x86_64__
408 /* In case of x86_64 -m32, collect_register only writes 4 bytes, but the
409 space reserved in buf for the register is 8 bytes. Make sure the entire
410 reserved space is initialized. */
411
412 gdb_assert (register_size (regcache->tdesc, regno) == 4);
413
414 if (regno == RAX)
415 {
416 /* Sign extend EAX value to avoid potential syscall restart
417 problems.
418
419 See amd64_linux_collect_native_gregset() in
420 gdb/amd64-linux-nat.c for a detailed explanation. */
421 *(int64_t *) buf = *(int32_t *) buf;
422 }
423 else
424 {
425 /* Zero-extend. */
426 *(uint64_t *) buf = *(uint32_t *) buf;
427 }
428 #endif
429 }
430
431 static void
432 x86_fill_gregset (struct regcache *regcache, void *buf)
433 {
434 int i;
435
436 #ifdef __x86_64__
437 if (register_size (regcache->tdesc, 0) == 8)
438 {
439 for (i = 0; i < X86_64_NUM_REGS; i++)
440 if (x86_64_regmap[i] != -1)
441 collect_register (regcache, i, ((char *) buf) + x86_64_regmap[i]);
442
443 return;
444 }
445 #endif
446
447 for (i = 0; i < I386_NUM_REGS; i++)
448 collect_register_i386 (regcache, i, ((char *) buf) + i386_regmap[i]);
449
450 /* Handle ORIG_EAX, which is not in i386_regmap. */
451 collect_register_i386 (regcache, find_regno (regcache->tdesc, "orig_eax"),
452 ((char *) buf) + ORIG_EAX * REGSIZE);
453 }
454
455 static void
456 x86_store_gregset (struct regcache *regcache, const void *buf)
457 {
458 int i;
459
460 #ifdef __x86_64__
461 if (register_size (regcache->tdesc, 0) == 8)
462 {
463 for (i = 0; i < X86_64_NUM_REGS; i++)
464 if (x86_64_regmap[i] != -1)
465 supply_register (regcache, i, ((char *) buf) + x86_64_regmap[i]);
466
467 return;
468 }
469 #endif
470
471 for (i = 0; i < I386_NUM_REGS; i++)
472 supply_register (regcache, i, ((char *) buf) + i386_regmap[i]);
473
474 supply_register_by_name (regcache, "orig_eax",
475 ((char *) buf) + ORIG_EAX * REGSIZE);
476 }
477
478 static void
479 x86_fill_fpregset (struct regcache *regcache, void *buf)
480 {
481 #ifdef __x86_64__
482 i387_cache_to_fxsave (regcache, buf);
483 #else
484 i387_cache_to_fsave (regcache, buf);
485 #endif
486 }
487
488 static void
489 x86_store_fpregset (struct regcache *regcache, const void *buf)
490 {
491 #ifdef __x86_64__
492 i387_fxsave_to_cache (regcache, buf);
493 #else
494 i387_fsave_to_cache (regcache, buf);
495 #endif
496 }
497
498 #ifndef __x86_64__
499
500 static void
501 x86_fill_fpxregset (struct regcache *regcache, void *buf)
502 {
503 i387_cache_to_fxsave (regcache, buf);
504 }
505
506 static void
507 x86_store_fpxregset (struct regcache *regcache, const void *buf)
508 {
509 i387_fxsave_to_cache (regcache, buf);
510 }
511
512 #endif
513
514 static void
515 x86_fill_xstateregset (struct regcache *regcache, void *buf)
516 {
517 i387_cache_to_xsave (regcache, buf);
518 }
519
520 static void
521 x86_store_xstateregset (struct regcache *regcache, const void *buf)
522 {
523 i387_xsave_to_cache (regcache, buf);
524 }
525
526 /* ??? The non-biarch i386 case stores all the i387 regs twice.
527 Once in i387_.*fsave.* and once in i387_.*fxsave.*.
528 This is, presumably, to handle the case where PTRACE_[GS]ETFPXREGS
529 doesn't work. IWBN to avoid the duplication in the case where it
530 does work. Maybe the arch_setup routine could check whether it works
531 and update the supported regsets accordingly. */
532
533 static struct regset_info x86_regsets[] =
534 {
535 #ifdef HAVE_PTRACE_GETREGS
536 { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t),
537 GENERAL_REGS,
538 x86_fill_gregset, x86_store_gregset },
539 { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_X86_XSTATE, 0,
540 EXTENDED_REGS, x86_fill_xstateregset, x86_store_xstateregset },
541 # ifndef __x86_64__
542 # ifdef HAVE_PTRACE_GETFPXREGS
543 { PTRACE_GETFPXREGS, PTRACE_SETFPXREGS, 0, sizeof (elf_fpxregset_t),
544 EXTENDED_REGS,
545 x86_fill_fpxregset, x86_store_fpxregset },
546 # endif
547 # endif
548 { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, sizeof (elf_fpregset_t),
549 FP_REGS,
550 x86_fill_fpregset, x86_store_fpregset },
551 #endif /* HAVE_PTRACE_GETREGS */
552 NULL_REGSET
553 };
554
555 bool
556 x86_target::low_supports_breakpoints ()
557 {
558 return true;
559 }
560
561 CORE_ADDR
562 x86_target::low_get_pc (regcache *regcache)
563 {
564 int use_64bit = register_size (regcache->tdesc, 0) == 8;
565
566 if (use_64bit)
567 {
568 uint64_t pc;
569
570 collect_register_by_name (regcache, "rip", &pc);
571 return (CORE_ADDR) pc;
572 }
573 else
574 {
575 uint32_t pc;
576
577 collect_register_by_name (regcache, "eip", &pc);
578 return (CORE_ADDR) pc;
579 }
580 }
581
582 void
583 x86_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
584 {
585 int use_64bit = register_size (regcache->tdesc, 0) == 8;
586
587 if (use_64bit)
588 {
589 uint64_t newpc = pc;
590
591 supply_register_by_name (regcache, "rip", &newpc);
592 }
593 else
594 {
595 uint32_t newpc = pc;
596
597 supply_register_by_name (regcache, "eip", &newpc);
598 }
599 }
600
601 int
602 x86_target::low_decr_pc_after_break ()
603 {
604 return 1;
605 }
606
607 \f
608 static const gdb_byte x86_breakpoint[] = { 0xCC };
609 #define x86_breakpoint_len 1
610
611 bool
612 x86_target::low_breakpoint_at (CORE_ADDR pc)
613 {
614 unsigned char c;
615
616 read_memory (pc, &c, 1);
617 if (c == 0xCC)
618 return true;
619
620 return false;
621 }
622 \f
623 /* Low-level function vector. */
624 struct x86_dr_low_type x86_dr_low =
625 {
626 x86_linux_dr_set_control,
627 x86_linux_dr_set_addr,
628 x86_linux_dr_get_addr,
629 x86_linux_dr_get_status,
630 x86_linux_dr_get_control,
631 sizeof (void *),
632 };
633 \f
634 /* Breakpoint/Watchpoint support. */
635
636 bool
637 x86_target::supports_z_point_type (char z_type)
638 {
639 switch (z_type)
640 {
641 case Z_PACKET_SW_BP:
642 case Z_PACKET_HW_BP:
643 case Z_PACKET_WRITE_WP:
644 case Z_PACKET_ACCESS_WP:
645 return true;
646 default:
647 return false;
648 }
649 }
650
651 int
652 x86_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr,
653 int size, raw_breakpoint *bp)
654 {
655 struct process_info *proc = current_process ();
656
657 switch (type)
658 {
659 case raw_bkpt_type_hw:
660 case raw_bkpt_type_write_wp:
661 case raw_bkpt_type_access_wp:
662 {
663 enum target_hw_bp_type hw_type
664 = raw_bkpt_type_to_target_hw_bp_type (type);
665 struct x86_debug_reg_state *state
666 = &proc->priv->arch_private->debug_reg_state;
667
668 return x86_dr_insert_watchpoint (state, hw_type, addr, size);
669 }
670
671 default:
672 /* Unsupported. */
673 return 1;
674 }
675 }
676
677 int
678 x86_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr,
679 int size, raw_breakpoint *bp)
680 {
681 struct process_info *proc = current_process ();
682
683 switch (type)
684 {
685 case raw_bkpt_type_hw:
686 case raw_bkpt_type_write_wp:
687 case raw_bkpt_type_access_wp:
688 {
689 enum target_hw_bp_type hw_type
690 = raw_bkpt_type_to_target_hw_bp_type (type);
691 struct x86_debug_reg_state *state
692 = &proc->priv->arch_private->debug_reg_state;
693
694 return x86_dr_remove_watchpoint (state, hw_type, addr, size);
695 }
696 default:
697 /* Unsupported. */
698 return 1;
699 }
700 }
701
702 bool
703 x86_target::low_stopped_by_watchpoint ()
704 {
705 struct process_info *proc = current_process ();
706 return x86_dr_stopped_by_watchpoint (&proc->priv->arch_private->debug_reg_state);
707 }
708
709 CORE_ADDR
710 x86_target::low_stopped_data_address ()
711 {
712 struct process_info *proc = current_process ();
713 CORE_ADDR addr;
714 if (x86_dr_stopped_data_address (&proc->priv->arch_private->debug_reg_state,
715 &addr))
716 return addr;
717 return 0;
718 }
719 \f
720 /* Called when a new process is created. */
721
722 arch_process_info *
723 x86_target::low_new_process ()
724 {
725 struct arch_process_info *info = XCNEW (struct arch_process_info);
726
727 x86_low_init_dregs (&info->debug_reg_state);
728
729 return info;
730 }
731
732 /* Called when a process is being deleted. */
733
734 void
735 x86_target::low_delete_process (arch_process_info *info)
736 {
737 xfree (info);
738 }
739
740 void
741 x86_target::low_new_thread (lwp_info *lwp)
742 {
743 /* This comes from nat/. */
744 x86_linux_new_thread (lwp);
745 }
746
747 void
748 x86_target::low_delete_thread (arch_lwp_info *alwp)
749 {
750 /* This comes from nat/. */
751 x86_linux_delete_thread (alwp);
752 }
753
754 /* Target routine for new_fork. */
755
756 void
757 x86_target::low_new_fork (process_info *parent, process_info *child)
758 {
759 /* These are allocated by linux_add_process. */
760 gdb_assert (parent->priv != NULL
761 && parent->priv->arch_private != NULL);
762 gdb_assert (child->priv != NULL
763 && child->priv->arch_private != NULL);
764
765 /* Linux kernel before 2.6.33 commit
766 72f674d203cd230426437cdcf7dd6f681dad8b0d
767 will inherit hardware debug registers from parent
768 on fork/vfork/clone. Newer Linux kernels create such tasks with
769 zeroed debug registers.
770
771 GDB core assumes the child inherits the watchpoints/hw
772 breakpoints of the parent, and will remove them all from the
773 forked off process. Copy the debug registers mirrors into the
774 new process so that all breakpoints and watchpoints can be
775 removed together. The debug registers mirror will become zeroed
776 in the end before detaching the forked off process, thus making
777 this compatible with older Linux kernels too. */
778
779 *child->priv->arch_private = *parent->priv->arch_private;
780 }
781
782 void
783 x86_target::low_prepare_to_resume (lwp_info *lwp)
784 {
785 /* This comes from nat/. */
786 x86_linux_prepare_to_resume (lwp);
787 }
788
789 /* See nat/x86-dregs.h. */
790
791 struct x86_debug_reg_state *
792 x86_debug_reg_state (pid_t pid)
793 {
794 struct process_info *proc = find_process_pid (pid);
795
796 return &proc->priv->arch_private->debug_reg_state;
797 }
798 \f
799 /* When GDBSERVER is built as a 64-bit application on linux, the
800 PTRACE_GETSIGINFO data is always presented in 64-bit layout. Since
801 debugging a 32-bit inferior with a 64-bit GDBSERVER should look the same
802 as debugging it with a 32-bit GDBSERVER, we do the 32-bit <-> 64-bit
803 conversion in-place ourselves. */
804
805 /* Convert a ptrace/host siginfo object, into/from the siginfo in the
806 layout of the inferiors' architecture. Returns true if any
807 conversion was done; false otherwise. If DIRECTION is 1, then copy
808 from INF to PTRACE. If DIRECTION is 0, copy from PTRACE to
809 INF. */
810
811 bool
812 x86_target::low_siginfo_fixup (siginfo_t *ptrace, gdb_byte *inf, int direction)
813 {
814 #ifdef __x86_64__
815 unsigned int machine;
816 int tid = lwpid_of (current_thread);
817 int is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
818
819 /* Is the inferior 32-bit? If so, then fixup the siginfo object. */
820 if (!is_64bit_tdesc (current_thread))
821 return amd64_linux_siginfo_fixup_common (ptrace, inf, direction,
822 FIXUP_32);
823 /* No fixup for native x32 GDB. */
824 else if (!is_elf64 && sizeof (void *) == 8)
825 return amd64_linux_siginfo_fixup_common (ptrace, inf, direction,
826 FIXUP_X32);
827 #endif
828
829 return false;
830 }
831 \f
832 static int use_xml;
833
834 /* Format of XSAVE extended state is:
835 struct
836 {
837 fxsave_bytes[0..463]
838 sw_usable_bytes[464..511]
839 xstate_hdr_bytes[512..575]
840 avx_bytes[576..831]
841 future_state etc
842 };
843
844 Same memory layout will be used for the coredump NT_X86_XSTATE
845 representing the XSAVE extended state registers.
846
847 The first 8 bytes of the sw_usable_bytes[464..467] is the OS enabled
848 extended state mask, which is the same as the extended control register
849 0 (the XFEATURE_ENABLED_MASK register), XCR0. We can use this mask
850 together with the mask saved in the xstate_hdr_bytes to determine what
851 states the processor/OS supports and what state, used or initialized,
852 the process/thread is in. */
853 #define I386_LINUX_XSAVE_XCR0_OFFSET 464
854
855 /* Does the current host support the GETFPXREGS request? The header
856 file may or may not define it, and even if it is defined, the
857 kernel will return EIO if it's running on a pre-SSE processor. */
858 int have_ptrace_getfpxregs =
859 #ifdef HAVE_PTRACE_GETFPXREGS
860 -1
861 #else
862 0
863 #endif
864 ;
865
866 /* Get Linux/x86 target description from running target. */
867
868 static const struct target_desc *
869 x86_linux_read_description (void)
870 {
871 unsigned int machine;
872 int is_elf64;
873 int xcr0_features;
874 int tid;
875 static uint64_t xcr0;
876 static int xsave_len;
877 struct regset_info *regset;
878
879 tid = lwpid_of (current_thread);
880
881 is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
882
883 if (sizeof (void *) == 4)
884 {
885 if (is_elf64 > 0)
886 error (_("Can't debug 64-bit process with 32-bit GDBserver"));
887 #ifndef __x86_64__
888 else if (machine == EM_X86_64)
889 error (_("Can't debug x86-64 process with 32-bit GDBserver"));
890 #endif
891 }
892
893 #if !defined __x86_64__ && defined HAVE_PTRACE_GETFPXREGS
894 if (machine == EM_386 && have_ptrace_getfpxregs == -1)
895 {
896 elf_fpxregset_t fpxregs;
897
898 if (ptrace (PTRACE_GETFPXREGS, tid, 0, (long) &fpxregs) < 0)
899 {
900 have_ptrace_getfpxregs = 0;
901 have_ptrace_getregset = TRIBOOL_FALSE;
902 return i386_linux_read_description (X86_XSTATE_X87);
903 }
904 else
905 have_ptrace_getfpxregs = 1;
906 }
907 #endif
908
909 if (!use_xml)
910 {
911 /* Don't use XML. */
912 #ifdef __x86_64__
913 if (machine == EM_X86_64)
914 return tdesc_amd64_linux_no_xml.get ();
915 else
916 #endif
917 return tdesc_i386_linux_no_xml.get ();
918 }
919
920 if (have_ptrace_getregset == TRIBOOL_UNKNOWN)
921 {
922 uint64_t xstateregs[(X86_XSTATE_SSE_SIZE / sizeof (uint64_t))];
923 struct iovec iov;
924
925 iov.iov_base = xstateregs;
926 iov.iov_len = sizeof (xstateregs);
927
928 /* Check if PTRACE_GETREGSET works. */
929 if (ptrace (PTRACE_GETREGSET, tid,
930 (unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
931 have_ptrace_getregset = TRIBOOL_FALSE;
932 else
933 {
934 have_ptrace_getregset = TRIBOOL_TRUE;
935
936 /* Get XCR0 from XSAVE extended state. */
937 xcr0 = xstateregs[(I386_LINUX_XSAVE_XCR0_OFFSET
938 / sizeof (uint64_t))];
939
940 /* No MPX on x32. */
941 if (machine == EM_X86_64 && !is_elf64)
942 xcr0 &= ~X86_XSTATE_MPX;
943
944 xsave_len = x86_xsave_length ();
945
946 /* Use PTRACE_GETREGSET if it is available. */
947 for (regset = x86_regsets;
948 regset->fill_function != NULL; regset++)
949 if (regset->get_request == PTRACE_GETREGSET)
950 regset->size = xsave_len;
951 else if (regset->type != GENERAL_REGS)
952 regset->size = 0;
953 }
954 }
955
956 /* Check the native XCR0 only if PTRACE_GETREGSET is available. */
957 xcr0_features = (have_ptrace_getregset == TRIBOOL_TRUE
958 && (xcr0 & X86_XSTATE_ALL_MASK));
959
960 if (xcr0_features)
961 i387_set_xsave_mask (xcr0, xsave_len);
962
963 if (machine == EM_X86_64)
964 {
965 #ifdef __x86_64__
966 const target_desc *tdesc = NULL;
967
968 if (xcr0_features)
969 {
970 tdesc = amd64_linux_read_description (xcr0 & X86_XSTATE_ALL_MASK,
971 !is_elf64);
972 }
973
974 if (tdesc == NULL)
975 tdesc = amd64_linux_read_description (X86_XSTATE_SSE_MASK, !is_elf64);
976 return tdesc;
977 #endif
978 }
979 else
980 {
981 const target_desc *tdesc = NULL;
982
983 if (xcr0_features)
984 tdesc = i386_linux_read_description (xcr0 & X86_XSTATE_ALL_MASK);
985
986 if (tdesc == NULL)
987 tdesc = i386_linux_read_description (X86_XSTATE_SSE);
988
989 return tdesc;
990 }
991
992 gdb_assert_not_reached ("failed to return tdesc");
993 }
994
995 /* Update all the target description of all processes; a new GDB
996 connected, and it may or not support xml target descriptions. */
997
998 void
999 x86_target::update_xmltarget ()
1000 {
1001 scoped_restore_current_thread restore_thread;
1002
1003 /* Before changing the register cache's internal layout, flush the
1004 contents of the current valid caches back to the threads, and
1005 release the current regcache objects. */
1006 regcache_release ();
1007
1008 for_each_process ([this] (process_info *proc) {
1009 int pid = proc->pid;
1010
1011 /* Look up any thread of this process. */
1012 switch_to_thread (find_any_thread_of_pid (pid));
1013
1014 low_arch_setup ();
1015 });
1016 }
1017
1018 /* Process qSupported query, "xmlRegisters=". Update the buffer size for
1019 PTRACE_GETREGSET. */
1020
1021 void
1022 x86_target::process_qsupported (gdb::array_view<const char * const> features)
1023 {
1024 /* Return if gdb doesn't support XML. If gdb sends "xmlRegisters="
1025 with "i386" in qSupported query, it supports x86 XML target
1026 descriptions. */
1027 use_xml = 0;
1028
1029 for (const char *feature : features)
1030 {
1031 if (startswith (feature, "xmlRegisters="))
1032 {
1033 char *copy = xstrdup (feature + 13);
1034
1035 char *saveptr;
1036 for (char *p = strtok_r (copy, ",", &saveptr);
1037 p != NULL;
1038 p = strtok_r (NULL, ",", &saveptr))
1039 {
1040 if (strcmp (p, "i386") == 0)
1041 {
1042 use_xml = 1;
1043 break;
1044 }
1045 }
1046
1047 free (copy);
1048 }
1049 }
1050
1051 update_xmltarget ();
1052 }
1053
1054 /* Common for x86/x86-64. */
1055
1056 static struct regsets_info x86_regsets_info =
1057 {
1058 x86_regsets, /* regsets */
1059 0, /* num_regsets */
1060 NULL, /* disabled_regsets */
1061 };
1062
1063 #ifdef __x86_64__
1064 static struct regs_info amd64_linux_regs_info =
1065 {
1066 NULL, /* regset_bitmap */
1067 NULL, /* usrregs_info */
1068 &x86_regsets_info
1069 };
1070 #endif
1071 static struct usrregs_info i386_linux_usrregs_info =
1072 {
1073 I386_NUM_REGS,
1074 i386_regmap,
1075 };
1076
1077 static struct regs_info i386_linux_regs_info =
1078 {
1079 NULL, /* regset_bitmap */
1080 &i386_linux_usrregs_info,
1081 &x86_regsets_info
1082 };
1083
1084 const regs_info *
1085 x86_target::get_regs_info ()
1086 {
1087 #ifdef __x86_64__
1088 if (is_64bit_tdesc (current_thread))
1089 return &amd64_linux_regs_info;
1090 else
1091 #endif
1092 return &i386_linux_regs_info;
1093 }
1094
1095 /* Initialize the target description for the architecture of the
1096 inferior. */
1097
1098 void
1099 x86_target::low_arch_setup ()
1100 {
1101 current_process ()->tdesc = x86_linux_read_description ();
1102 }
1103
1104 bool
1105 x86_target::low_supports_catch_syscall ()
1106 {
1107 return true;
1108 }
1109
1110 /* Fill *SYSNO and *SYSRET with the syscall nr trapped and the syscall return
1111 code. This should only be called if LWP got a SYSCALL_SIGTRAP. */
1112
1113 void
1114 x86_target::low_get_syscall_trapinfo (regcache *regcache, int *sysno)
1115 {
1116 int use_64bit = register_size (regcache->tdesc, 0) == 8;
1117
1118 if (use_64bit)
1119 {
1120 long l_sysno;
1121
1122 collect_register_by_name (regcache, "orig_rax", &l_sysno);
1123 *sysno = (int) l_sysno;
1124 }
1125 else
1126 collect_register_by_name (regcache, "orig_eax", sysno);
1127 }
1128
1129 bool
1130 x86_target::supports_tracepoints ()
1131 {
1132 return true;
1133 }
1134
1135 static void
1136 append_insns (CORE_ADDR *to, size_t len, const unsigned char *buf)
1137 {
1138 target_write_memory (*to, buf, len);
1139 *to += len;
1140 }
1141
1142 static int
1143 push_opcode (unsigned char *buf, const char *op)
1144 {
1145 unsigned char *buf_org = buf;
1146
1147 while (1)
1148 {
1149 char *endptr;
1150 unsigned long ul = strtoul (op, &endptr, 16);
1151
1152 if (endptr == op)
1153 break;
1154
1155 *buf++ = ul;
1156 op = endptr;
1157 }
1158
1159 return buf - buf_org;
1160 }
1161
1162 #ifdef __x86_64__
1163
1164 /* Build a jump pad that saves registers and calls a collection
1165 function. Writes a jump instruction to the jump pad to
1166 JJUMPAD_INSN. The caller is responsible to write it in at the
1167 tracepoint address. */
1168
1169 static int
1170 amd64_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint, CORE_ADDR tpaddr,
1171 CORE_ADDR collector,
1172 CORE_ADDR lockaddr,
1173 ULONGEST orig_size,
1174 CORE_ADDR *jump_entry,
1175 CORE_ADDR *trampoline,
1176 ULONGEST *trampoline_size,
1177 unsigned char *jjump_pad_insn,
1178 ULONGEST *jjump_pad_insn_size,
1179 CORE_ADDR *adjusted_insn_addr,
1180 CORE_ADDR *adjusted_insn_addr_end,
1181 char *err)
1182 {
1183 unsigned char buf[40];
1184 int i, offset;
1185 int64_t loffset;
1186
1187 CORE_ADDR buildaddr = *jump_entry;
1188
1189 /* Build the jump pad. */
1190
1191 /* First, do tracepoint data collection. Save registers. */
1192 i = 0;
1193 /* Need to ensure stack pointer saved first. */
1194 buf[i++] = 0x54; /* push %rsp */
1195 buf[i++] = 0x55; /* push %rbp */
1196 buf[i++] = 0x57; /* push %rdi */
1197 buf[i++] = 0x56; /* push %rsi */
1198 buf[i++] = 0x52; /* push %rdx */
1199 buf[i++] = 0x51; /* push %rcx */
1200 buf[i++] = 0x53; /* push %rbx */
1201 buf[i++] = 0x50; /* push %rax */
1202 buf[i++] = 0x41; buf[i++] = 0x57; /* push %r15 */
1203 buf[i++] = 0x41; buf[i++] = 0x56; /* push %r14 */
1204 buf[i++] = 0x41; buf[i++] = 0x55; /* push %r13 */
1205 buf[i++] = 0x41; buf[i++] = 0x54; /* push %r12 */
1206 buf[i++] = 0x41; buf[i++] = 0x53; /* push %r11 */
1207 buf[i++] = 0x41; buf[i++] = 0x52; /* push %r10 */
1208 buf[i++] = 0x41; buf[i++] = 0x51; /* push %r9 */
1209 buf[i++] = 0x41; buf[i++] = 0x50; /* push %r8 */
1210 buf[i++] = 0x9c; /* pushfq */
1211 buf[i++] = 0x48; /* movabs <addr>,%rdi */
1212 buf[i++] = 0xbf;
1213 memcpy (buf + i, &tpaddr, 8);
1214 i += 8;
1215 buf[i++] = 0x57; /* push %rdi */
1216 append_insns (&buildaddr, i, buf);
1217
1218 /* Stack space for the collecting_t object. */
1219 i = 0;
1220 i += push_opcode (&buf[i], "48 83 ec 18"); /* sub $0x18,%rsp */
1221 i += push_opcode (&buf[i], "48 b8"); /* mov <tpoint>,%rax */
1222 memcpy (buf + i, &tpoint, 8);
1223 i += 8;
1224 i += push_opcode (&buf[i], "48 89 04 24"); /* mov %rax,(%rsp) */
1225 i += push_opcode (&buf[i],
1226 "64 48 8b 04 25 00 00 00 00"); /* mov %fs:0x0,%rax */
1227 i += push_opcode (&buf[i], "48 89 44 24 08"); /* mov %rax,0x8(%rsp) */
1228 append_insns (&buildaddr, i, buf);
1229
1230 /* spin-lock. */
1231 i = 0;
1232 i += push_opcode (&buf[i], "48 be"); /* movl <lockaddr>,%rsi */
1233 memcpy (&buf[i], (void *) &lockaddr, 8);
1234 i += 8;
1235 i += push_opcode (&buf[i], "48 89 e1"); /* mov %rsp,%rcx */
1236 i += push_opcode (&buf[i], "31 c0"); /* xor %eax,%eax */
1237 i += push_opcode (&buf[i], "f0 48 0f b1 0e"); /* lock cmpxchg %rcx,(%rsi) */
1238 i += push_opcode (&buf[i], "48 85 c0"); /* test %rax,%rax */
1239 i += push_opcode (&buf[i], "75 f4"); /* jne <again> */
1240 append_insns (&buildaddr, i, buf);
1241
1242 /* Set up the gdb_collect call. */
1243 /* At this point, (stack pointer + 0x18) is the base of our saved
1244 register block. */
1245
1246 i = 0;
1247 i += push_opcode (&buf[i], "48 89 e6"); /* mov %rsp,%rsi */
1248 i += push_opcode (&buf[i], "48 83 c6 18"); /* add $0x18,%rsi */
1249
1250 /* tpoint address may be 64-bit wide. */
1251 i += push_opcode (&buf[i], "48 bf"); /* movl <addr>,%rdi */
1252 memcpy (buf + i, &tpoint, 8);
1253 i += 8;
1254 append_insns (&buildaddr, i, buf);
1255
1256 /* The collector function being in the shared library, may be
1257 >31-bits away off the jump pad. */
1258 i = 0;
1259 i += push_opcode (&buf[i], "48 b8"); /* mov $collector,%rax */
1260 memcpy (buf + i, &collector, 8);
1261 i += 8;
1262 i += push_opcode (&buf[i], "ff d0"); /* callq *%rax */
1263 append_insns (&buildaddr, i, buf);
1264
1265 /* Clear the spin-lock. */
1266 i = 0;
1267 i += push_opcode (&buf[i], "31 c0"); /* xor %eax,%eax */
1268 i += push_opcode (&buf[i], "48 a3"); /* mov %rax, lockaddr */
1269 memcpy (buf + i, &lockaddr, 8);
1270 i += 8;
1271 append_insns (&buildaddr, i, buf);
1272
1273 /* Remove stack that had been used for the collect_t object. */
1274 i = 0;
1275 i += push_opcode (&buf[i], "48 83 c4 18"); /* add $0x18,%rsp */
1276 append_insns (&buildaddr, i, buf);
1277
1278 /* Restore register state. */
1279 i = 0;
1280 buf[i++] = 0x48; /* add $0x8,%rsp */
1281 buf[i++] = 0x83;
1282 buf[i++] = 0xc4;
1283 buf[i++] = 0x08;
1284 buf[i++] = 0x9d; /* popfq */
1285 buf[i++] = 0x41; buf[i++] = 0x58; /* pop %r8 */
1286 buf[i++] = 0x41; buf[i++] = 0x59; /* pop %r9 */
1287 buf[i++] = 0x41; buf[i++] = 0x5a; /* pop %r10 */
1288 buf[i++] = 0x41; buf[i++] = 0x5b; /* pop %r11 */
1289 buf[i++] = 0x41; buf[i++] = 0x5c; /* pop %r12 */
1290 buf[i++] = 0x41; buf[i++] = 0x5d; /* pop %r13 */
1291 buf[i++] = 0x41; buf[i++] = 0x5e; /* pop %r14 */
1292 buf[i++] = 0x41; buf[i++] = 0x5f; /* pop %r15 */
1293 buf[i++] = 0x58; /* pop %rax */
1294 buf[i++] = 0x5b; /* pop %rbx */
1295 buf[i++] = 0x59; /* pop %rcx */
1296 buf[i++] = 0x5a; /* pop %rdx */
1297 buf[i++] = 0x5e; /* pop %rsi */
1298 buf[i++] = 0x5f; /* pop %rdi */
1299 buf[i++] = 0x5d; /* pop %rbp */
1300 buf[i++] = 0x5c; /* pop %rsp */
1301 append_insns (&buildaddr, i, buf);
1302
1303 /* Now, adjust the original instruction to execute in the jump
1304 pad. */
1305 *adjusted_insn_addr = buildaddr;
1306 relocate_instruction (&buildaddr, tpaddr);
1307 *adjusted_insn_addr_end = buildaddr;
1308
1309 /* Finally, write a jump back to the program. */
1310
1311 loffset = (tpaddr + orig_size) - (buildaddr + sizeof (jump_insn));
1312 if (loffset > INT_MAX || loffset < INT_MIN)
1313 {
1314 sprintf (err,
1315 "E.Jump back from jump pad too far from tracepoint "
1316 "(offset 0x%" PRIx64 " > int32).", loffset);
1317 return 1;
1318 }
1319
1320 offset = (int) loffset;
1321 memcpy (buf, jump_insn, sizeof (jump_insn));
1322 memcpy (buf + 1, &offset, 4);
1323 append_insns (&buildaddr, sizeof (jump_insn), buf);
1324
1325 /* The jump pad is now built. Wire in a jump to our jump pad. This
1326 is always done last (by our caller actually), so that we can
1327 install fast tracepoints with threads running. This relies on
1328 the agent's atomic write support. */
1329 loffset = *jump_entry - (tpaddr + sizeof (jump_insn));
1330 if (loffset > INT_MAX || loffset < INT_MIN)
1331 {
1332 sprintf (err,
1333 "E.Jump pad too far from tracepoint "
1334 "(offset 0x%" PRIx64 " > int32).", loffset);
1335 return 1;
1336 }
1337
1338 offset = (int) loffset;
1339
1340 memcpy (buf, jump_insn, sizeof (jump_insn));
1341 memcpy (buf + 1, &offset, 4);
1342 memcpy (jjump_pad_insn, buf, sizeof (jump_insn));
1343 *jjump_pad_insn_size = sizeof (jump_insn);
1344
1345 /* Return the end address of our pad. */
1346 *jump_entry = buildaddr;
1347
1348 return 0;
1349 }
1350
1351 #endif /* __x86_64__ */
1352
1353 /* Build a jump pad that saves registers and calls a collection
1354 function. Writes a jump instruction to the jump pad to
1355 JJUMPAD_INSN. The caller is responsible to write it in at the
1356 tracepoint address. */
1357
1358 static int
1359 i386_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint, CORE_ADDR tpaddr,
1360 CORE_ADDR collector,
1361 CORE_ADDR lockaddr,
1362 ULONGEST orig_size,
1363 CORE_ADDR *jump_entry,
1364 CORE_ADDR *trampoline,
1365 ULONGEST *trampoline_size,
1366 unsigned char *jjump_pad_insn,
1367 ULONGEST *jjump_pad_insn_size,
1368 CORE_ADDR *adjusted_insn_addr,
1369 CORE_ADDR *adjusted_insn_addr_end,
1370 char *err)
1371 {
1372 unsigned char buf[0x100];
1373 int i, offset;
1374 CORE_ADDR buildaddr = *jump_entry;
1375
1376 /* Build the jump pad. */
1377
1378 /* First, do tracepoint data collection. Save registers. */
1379 i = 0;
1380 buf[i++] = 0x60; /* pushad */
1381 buf[i++] = 0x68; /* push tpaddr aka $pc */
1382 *((int *)(buf + i)) = (int) tpaddr;
1383 i += 4;
1384 buf[i++] = 0x9c; /* pushf */
1385 buf[i++] = 0x1e; /* push %ds */
1386 buf[i++] = 0x06; /* push %es */
1387 buf[i++] = 0x0f; /* push %fs */
1388 buf[i++] = 0xa0;
1389 buf[i++] = 0x0f; /* push %gs */
1390 buf[i++] = 0xa8;
1391 buf[i++] = 0x16; /* push %ss */
1392 buf[i++] = 0x0e; /* push %cs */
1393 append_insns (&buildaddr, i, buf);
1394
1395 /* Stack space for the collecting_t object. */
1396 i = 0;
1397 i += push_opcode (&buf[i], "83 ec 08"); /* sub $0x8,%esp */
1398
1399 /* Build the object. */
1400 i += push_opcode (&buf[i], "b8"); /* mov <tpoint>,%eax */
1401 memcpy (buf + i, &tpoint, 4);
1402 i += 4;
1403 i += push_opcode (&buf[i], "89 04 24"); /* mov %eax,(%esp) */
1404
1405 i += push_opcode (&buf[i], "65 a1 00 00 00 00"); /* mov %gs:0x0,%eax */
1406 i += push_opcode (&buf[i], "89 44 24 04"); /* mov %eax,0x4(%esp) */
1407 append_insns (&buildaddr, i, buf);
1408
1409 /* spin-lock. Note this is using cmpxchg, which leaves i386 behind.
1410 If we cared for it, this could be using xchg alternatively. */
1411
1412 i = 0;
1413 i += push_opcode (&buf[i], "31 c0"); /* xor %eax,%eax */
1414 i += push_opcode (&buf[i], "f0 0f b1 25"); /* lock cmpxchg
1415 %esp,<lockaddr> */
1416 memcpy (&buf[i], (void *) &lockaddr, 4);
1417 i += 4;
1418 i += push_opcode (&buf[i], "85 c0"); /* test %eax,%eax */
1419 i += push_opcode (&buf[i], "75 f2"); /* jne <again> */
1420 append_insns (&buildaddr, i, buf);
1421
1422
1423 /* Set up arguments to the gdb_collect call. */
1424 i = 0;
1425 i += push_opcode (&buf[i], "89 e0"); /* mov %esp,%eax */
1426 i += push_opcode (&buf[i], "83 c0 08"); /* add $0x08,%eax */
1427 i += push_opcode (&buf[i], "89 44 24 fc"); /* mov %eax,-0x4(%esp) */
1428 append_insns (&buildaddr, i, buf);
1429
1430 i = 0;
1431 i += push_opcode (&buf[i], "83 ec 08"); /* sub $0x8,%esp */
1432 append_insns (&buildaddr, i, buf);
1433
1434 i = 0;
1435 i += push_opcode (&buf[i], "c7 04 24"); /* movl <addr>,(%esp) */
1436 memcpy (&buf[i], (void *) &tpoint, 4);
1437 i += 4;
1438 append_insns (&buildaddr, i, buf);
1439
1440 buf[0] = 0xe8; /* call <reladdr> */
1441 offset = collector - (buildaddr + sizeof (jump_insn));
1442 memcpy (buf + 1, &offset, 4);
1443 append_insns (&buildaddr, 5, buf);
1444 /* Clean up after the call. */
1445 buf[0] = 0x83; /* add $0x8,%esp */
1446 buf[1] = 0xc4;
1447 buf[2] = 0x08;
1448 append_insns (&buildaddr, 3, buf);
1449
1450
1451 /* Clear the spin-lock. This would need the LOCK prefix on older
1452 broken archs. */
1453 i = 0;
1454 i += push_opcode (&buf[i], "31 c0"); /* xor %eax,%eax */
1455 i += push_opcode (&buf[i], "a3"); /* mov %eax, lockaddr */
1456 memcpy (buf + i, &lockaddr, 4);
1457 i += 4;
1458 append_insns (&buildaddr, i, buf);
1459
1460
1461 /* Remove stack that had been used for the collect_t object. */
1462 i = 0;
1463 i += push_opcode (&buf[i], "83 c4 08"); /* add $0x08,%esp */
1464 append_insns (&buildaddr, i, buf);
1465
1466 i = 0;
1467 buf[i++] = 0x83; /* add $0x4,%esp (no pop of %cs, assume unchanged) */
1468 buf[i++] = 0xc4;
1469 buf[i++] = 0x04;
1470 buf[i++] = 0x17; /* pop %ss */
1471 buf[i++] = 0x0f; /* pop %gs */
1472 buf[i++] = 0xa9;
1473 buf[i++] = 0x0f; /* pop %fs */
1474 buf[i++] = 0xa1;
1475 buf[i++] = 0x07; /* pop %es */
1476 buf[i++] = 0x1f; /* pop %ds */
1477 buf[i++] = 0x9d; /* popf */
1478 buf[i++] = 0x83; /* add $0x4,%esp (pop of tpaddr aka $pc) */
1479 buf[i++] = 0xc4;
1480 buf[i++] = 0x04;
1481 buf[i++] = 0x61; /* popad */
1482 append_insns (&buildaddr, i, buf);
1483
1484 /* Now, adjust the original instruction to execute in the jump
1485 pad. */
1486 *adjusted_insn_addr = buildaddr;
1487 relocate_instruction (&buildaddr, tpaddr);
1488 *adjusted_insn_addr_end = buildaddr;
1489
1490 /* Write the jump back to the program. */
1491 offset = (tpaddr + orig_size) - (buildaddr + sizeof (jump_insn));
1492 memcpy (buf, jump_insn, sizeof (jump_insn));
1493 memcpy (buf + 1, &offset, 4);
1494 append_insns (&buildaddr, sizeof (jump_insn), buf);
1495
1496 /* The jump pad is now built. Wire in a jump to our jump pad. This
1497 is always done last (by our caller actually), so that we can
1498 install fast tracepoints with threads running. This relies on
1499 the agent's atomic write support. */
1500 if (orig_size == 4)
1501 {
1502 /* Create a trampoline. */
1503 *trampoline_size = sizeof (jump_insn);
1504 if (!claim_trampoline_space (*trampoline_size, trampoline))
1505 {
1506 /* No trampoline space available. */
1507 strcpy (err,
1508 "E.Cannot allocate trampoline space needed for fast "
1509 "tracepoints on 4-byte instructions.");
1510 return 1;
1511 }
1512
1513 offset = *jump_entry - (*trampoline + sizeof (jump_insn));
1514 memcpy (buf, jump_insn, sizeof (jump_insn));
1515 memcpy (buf + 1, &offset, 4);
1516 target_write_memory (*trampoline, buf, sizeof (jump_insn));
1517
1518 /* Use a 16-bit relative jump instruction to jump to the trampoline. */
1519 offset = (*trampoline - (tpaddr + sizeof (small_jump_insn))) & 0xffff;
1520 memcpy (buf, small_jump_insn, sizeof (small_jump_insn));
1521 memcpy (buf + 2, &offset, 2);
1522 memcpy (jjump_pad_insn, buf, sizeof (small_jump_insn));
1523 *jjump_pad_insn_size = sizeof (small_jump_insn);
1524 }
1525 else
1526 {
1527 /* Else use a 32-bit relative jump instruction. */
1528 offset = *jump_entry - (tpaddr + sizeof (jump_insn));
1529 memcpy (buf, jump_insn, sizeof (jump_insn));
1530 memcpy (buf + 1, &offset, 4);
1531 memcpy (jjump_pad_insn, buf, sizeof (jump_insn));
1532 *jjump_pad_insn_size = sizeof (jump_insn);
1533 }
1534
1535 /* Return the end address of our pad. */
1536 *jump_entry = buildaddr;
1537
1538 return 0;
1539 }
1540
1541 bool
1542 x86_target::supports_fast_tracepoints ()
1543 {
1544 return true;
1545 }
1546
1547 int
1548 x86_target::install_fast_tracepoint_jump_pad (CORE_ADDR tpoint,
1549 CORE_ADDR tpaddr,
1550 CORE_ADDR collector,
1551 CORE_ADDR lockaddr,
1552 ULONGEST orig_size,
1553 CORE_ADDR *jump_entry,
1554 CORE_ADDR *trampoline,
1555 ULONGEST *trampoline_size,
1556 unsigned char *jjump_pad_insn,
1557 ULONGEST *jjump_pad_insn_size,
1558 CORE_ADDR *adjusted_insn_addr,
1559 CORE_ADDR *adjusted_insn_addr_end,
1560 char *err)
1561 {
1562 #ifdef __x86_64__
1563 if (is_64bit_tdesc (current_thread))
1564 return amd64_install_fast_tracepoint_jump_pad (tpoint, tpaddr,
1565 collector, lockaddr,
1566 orig_size, jump_entry,
1567 trampoline, trampoline_size,
1568 jjump_pad_insn,
1569 jjump_pad_insn_size,
1570 adjusted_insn_addr,
1571 adjusted_insn_addr_end,
1572 err);
1573 #endif
1574
1575 return i386_install_fast_tracepoint_jump_pad (tpoint, tpaddr,
1576 collector, lockaddr,
1577 orig_size, jump_entry,
1578 trampoline, trampoline_size,
1579 jjump_pad_insn,
1580 jjump_pad_insn_size,
1581 adjusted_insn_addr,
1582 adjusted_insn_addr_end,
1583 err);
1584 }
1585
1586 /* Return the minimum instruction length for fast tracepoints on x86/x86-64
1587 architectures. */
1588
1589 int
1590 x86_target::get_min_fast_tracepoint_insn_len ()
1591 {
1592 static int warned_about_fast_tracepoints = 0;
1593
1594 #ifdef __x86_64__
1595 /* On x86-64, 5-byte jump instructions with a 4-byte offset are always
1596 used for fast tracepoints. */
1597 if (is_64bit_tdesc (current_thread))
1598 return 5;
1599 #endif
1600
1601 if (agent_loaded_p ())
1602 {
1603 char errbuf[IPA_BUFSIZ];
1604
1605 errbuf[0] = '\0';
1606
1607 /* On x86, if trampolines are available, then 4-byte jump instructions
1608 with a 2-byte offset may be used, otherwise 5-byte jump instructions
1609 with a 4-byte offset are used instead. */
1610 if (have_fast_tracepoint_trampoline_buffer (errbuf))
1611 return 4;
1612 else
1613 {
1614 /* GDB has no channel to explain to user why a shorter fast
1615 tracepoint is not possible, but at least make GDBserver
1616 mention that something has gone awry. */
1617 if (!warned_about_fast_tracepoints)
1618 {
1619 warning ("4-byte fast tracepoints not available; %s", errbuf);
1620 warned_about_fast_tracepoints = 1;
1621 }
1622 return 5;
1623 }
1624 }
1625 else
1626 {
1627 /* Indicate that the minimum length is currently unknown since the IPA
1628 has not loaded yet. */
1629 return 0;
1630 }
1631 }
1632
1633 static void
1634 add_insns (unsigned char *start, int len)
1635 {
1636 CORE_ADDR buildaddr = current_insn_ptr;
1637
1638 threads_debug_printf ("Adding %d bytes of insn at %s",
1639 len, paddress (buildaddr));
1640
1641 append_insns (&buildaddr, len, start);
1642 current_insn_ptr = buildaddr;
1643 }
1644
1645 /* Our general strategy for emitting code is to avoid specifying raw
1646 bytes whenever possible, and instead copy a block of inline asm
1647 that is embedded in the function. This is a little messy, because
1648 we need to keep the compiler from discarding what looks like dead
1649 code, plus suppress various warnings. */
1650
1651 #define EMIT_ASM(NAME, INSNS) \
1652 do \
1653 { \
1654 extern unsigned char start_ ## NAME, end_ ## NAME; \
1655 add_insns (&start_ ## NAME, &end_ ## NAME - &start_ ## NAME); \
1656 __asm__ ("jmp end_" #NAME "\n" \
1657 "\t" "start_" #NAME ":" \
1658 "\t" INSNS "\n" \
1659 "\t" "end_" #NAME ":"); \
1660 } while (0)
1661
1662 #ifdef __x86_64__
1663
1664 #define EMIT_ASM32(NAME,INSNS) \
1665 do \
1666 { \
1667 extern unsigned char start_ ## NAME, end_ ## NAME; \
1668 add_insns (&start_ ## NAME, &end_ ## NAME - &start_ ## NAME); \
1669 __asm__ (".code32\n" \
1670 "\t" "jmp end_" #NAME "\n" \
1671 "\t" "start_" #NAME ":\n" \
1672 "\t" INSNS "\n" \
1673 "\t" "end_" #NAME ":\n" \
1674 ".code64\n"); \
1675 } while (0)
1676
1677 #else
1678
1679 #define EMIT_ASM32(NAME,INSNS) EMIT_ASM(NAME,INSNS)
1680
1681 #endif
1682
1683 #ifdef __x86_64__
1684
1685 static void
1686 amd64_emit_prologue (void)
1687 {
1688 EMIT_ASM (amd64_prologue,
1689 "pushq %rbp\n\t"
1690 "movq %rsp,%rbp\n\t"
1691 "sub $0x20,%rsp\n\t"
1692 "movq %rdi,-8(%rbp)\n\t"
1693 "movq %rsi,-16(%rbp)");
1694 }
1695
1696
1697 static void
1698 amd64_emit_epilogue (void)
1699 {
1700 EMIT_ASM (amd64_epilogue,
1701 "movq -16(%rbp),%rdi\n\t"
1702 "movq %rax,(%rdi)\n\t"
1703 "xor %rax,%rax\n\t"
1704 "leave\n\t"
1705 "ret");
1706 }
1707
1708 static void
1709 amd64_emit_add (void)
1710 {
1711 EMIT_ASM (amd64_add,
1712 "add (%rsp),%rax\n\t"
1713 "lea 0x8(%rsp),%rsp");
1714 }
1715
1716 static void
1717 amd64_emit_sub (void)
1718 {
1719 EMIT_ASM (amd64_sub,
1720 "sub %rax,(%rsp)\n\t"
1721 "pop %rax");
1722 }
1723
1724 static void
1725 amd64_emit_mul (void)
1726 {
1727 emit_error = 1;
1728 }
1729
1730 static void
1731 amd64_emit_lsh (void)
1732 {
1733 emit_error = 1;
1734 }
1735
1736 static void
1737 amd64_emit_rsh_signed (void)
1738 {
1739 emit_error = 1;
1740 }
1741
1742 static void
1743 amd64_emit_rsh_unsigned (void)
1744 {
1745 emit_error = 1;
1746 }
1747
1748 static void
1749 amd64_emit_ext (int arg)
1750 {
1751 switch (arg)
1752 {
1753 case 8:
1754 EMIT_ASM (amd64_ext_8,
1755 "cbtw\n\t"
1756 "cwtl\n\t"
1757 "cltq");
1758 break;
1759 case 16:
1760 EMIT_ASM (amd64_ext_16,
1761 "cwtl\n\t"
1762 "cltq");
1763 break;
1764 case 32:
1765 EMIT_ASM (amd64_ext_32,
1766 "cltq");
1767 break;
1768 default:
1769 emit_error = 1;
1770 }
1771 }
1772
1773 static void
1774 amd64_emit_log_not (void)
1775 {
1776 EMIT_ASM (amd64_log_not,
1777 "test %rax,%rax\n\t"
1778 "sete %cl\n\t"
1779 "movzbq %cl,%rax");
1780 }
1781
1782 static void
1783 amd64_emit_bit_and (void)
1784 {
1785 EMIT_ASM (amd64_and,
1786 "and (%rsp),%rax\n\t"
1787 "lea 0x8(%rsp),%rsp");
1788 }
1789
1790 static void
1791 amd64_emit_bit_or (void)
1792 {
1793 EMIT_ASM (amd64_or,
1794 "or (%rsp),%rax\n\t"
1795 "lea 0x8(%rsp),%rsp");
1796 }
1797
1798 static void
1799 amd64_emit_bit_xor (void)
1800 {
1801 EMIT_ASM (amd64_xor,
1802 "xor (%rsp),%rax\n\t"
1803 "lea 0x8(%rsp),%rsp");
1804 }
1805
1806 static void
1807 amd64_emit_bit_not (void)
1808 {
1809 EMIT_ASM (amd64_bit_not,
1810 "xorq $0xffffffffffffffff,%rax");
1811 }
1812
1813 static void
1814 amd64_emit_equal (void)
1815 {
1816 EMIT_ASM (amd64_equal,
1817 "cmp %rax,(%rsp)\n\t"
1818 "je .Lamd64_equal_true\n\t"
1819 "xor %rax,%rax\n\t"
1820 "jmp .Lamd64_equal_end\n\t"
1821 ".Lamd64_equal_true:\n\t"
1822 "mov $0x1,%rax\n\t"
1823 ".Lamd64_equal_end:\n\t"
1824 "lea 0x8(%rsp),%rsp");
1825 }
1826
1827 static void
1828 amd64_emit_less_signed (void)
1829 {
1830 EMIT_ASM (amd64_less_signed,
1831 "cmp %rax,(%rsp)\n\t"
1832 "jl .Lamd64_less_signed_true\n\t"
1833 "xor %rax,%rax\n\t"
1834 "jmp .Lamd64_less_signed_end\n\t"
1835 ".Lamd64_less_signed_true:\n\t"
1836 "mov $1,%rax\n\t"
1837 ".Lamd64_less_signed_end:\n\t"
1838 "lea 0x8(%rsp),%rsp");
1839 }
1840
1841 static void
1842 amd64_emit_less_unsigned (void)
1843 {
1844 EMIT_ASM (amd64_less_unsigned,
1845 "cmp %rax,(%rsp)\n\t"
1846 "jb .Lamd64_less_unsigned_true\n\t"
1847 "xor %rax,%rax\n\t"
1848 "jmp .Lamd64_less_unsigned_end\n\t"
1849 ".Lamd64_less_unsigned_true:\n\t"
1850 "mov $1,%rax\n\t"
1851 ".Lamd64_less_unsigned_end:\n\t"
1852 "lea 0x8(%rsp),%rsp");
1853 }
1854
1855 static void
1856 amd64_emit_ref (int size)
1857 {
1858 switch (size)
1859 {
1860 case 1:
1861 EMIT_ASM (amd64_ref1,
1862 "movb (%rax),%al");
1863 break;
1864 case 2:
1865 EMIT_ASM (amd64_ref2,
1866 "movw (%rax),%ax");
1867 break;
1868 case 4:
1869 EMIT_ASM (amd64_ref4,
1870 "movl (%rax),%eax");
1871 break;
1872 case 8:
1873 EMIT_ASM (amd64_ref8,
1874 "movq (%rax),%rax");
1875 break;
1876 }
1877 }
1878
1879 static void
1880 amd64_emit_if_goto (int *offset_p, int *size_p)
1881 {
1882 EMIT_ASM (amd64_if_goto,
1883 "mov %rax,%rcx\n\t"
1884 "pop %rax\n\t"
1885 "cmp $0,%rcx\n\t"
1886 ".byte 0x0f, 0x85, 0x0, 0x0, 0x0, 0x0");
1887 if (offset_p)
1888 *offset_p = 10;
1889 if (size_p)
1890 *size_p = 4;
1891 }
1892
1893 static void
1894 amd64_emit_goto (int *offset_p, int *size_p)
1895 {
1896 EMIT_ASM (amd64_goto,
1897 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0");
1898 if (offset_p)
1899 *offset_p = 1;
1900 if (size_p)
1901 *size_p = 4;
1902 }
1903
1904 static void
1905 amd64_write_goto_address (CORE_ADDR from, CORE_ADDR to, int size)
1906 {
1907 int diff = (to - (from + size));
1908 unsigned char buf[sizeof (int)];
1909
1910 if (size != 4)
1911 {
1912 emit_error = 1;
1913 return;
1914 }
1915
1916 memcpy (buf, &diff, sizeof (int));
1917 target_write_memory (from, buf, sizeof (int));
1918 }
1919
1920 static void
1921 amd64_emit_const (LONGEST num)
1922 {
1923 unsigned char buf[16];
1924 int i;
1925 CORE_ADDR buildaddr = current_insn_ptr;
1926
1927 i = 0;
1928 buf[i++] = 0x48; buf[i++] = 0xb8; /* mov $<n>,%rax */
1929 memcpy (&buf[i], &num, sizeof (num));
1930 i += 8;
1931 append_insns (&buildaddr, i, buf);
1932 current_insn_ptr = buildaddr;
1933 }
1934
1935 static void
1936 amd64_emit_call (CORE_ADDR fn)
1937 {
1938 unsigned char buf[16];
1939 int i;
1940 CORE_ADDR buildaddr;
1941 LONGEST offset64;
1942
1943 /* The destination function being in the shared library, may be
1944 >31-bits away off the compiled code pad. */
1945
1946 buildaddr = current_insn_ptr;
1947
1948 offset64 = fn - (buildaddr + 1 /* call op */ + 4 /* 32-bit offset */);
1949
1950 i = 0;
1951
1952 if (offset64 > INT_MAX || offset64 < INT_MIN)
1953 {
1954 /* Offset is too large for a call. Use callq, but that requires
1955 a register, so avoid it if possible. Use r10, since it is
1956 call-clobbered, we don't have to push/pop it. */
1957 buf[i++] = 0x48; /* mov $fn,%r10 */
1958 buf[i++] = 0xba;
1959 memcpy (buf + i, &fn, 8);
1960 i += 8;
1961 buf[i++] = 0xff; /* callq *%r10 */
1962 buf[i++] = 0xd2;
1963 }
1964 else
1965 {
1966 int offset32 = offset64; /* we know we can't overflow here. */
1967
1968 buf[i++] = 0xe8; /* call <reladdr> */
1969 memcpy (buf + i, &offset32, 4);
1970 i += 4;
1971 }
1972
1973 append_insns (&buildaddr, i, buf);
1974 current_insn_ptr = buildaddr;
1975 }
1976
1977 static void
1978 amd64_emit_reg (int reg)
1979 {
1980 unsigned char buf[16];
1981 int i;
1982 CORE_ADDR buildaddr;
1983
1984 /* Assume raw_regs is still in %rdi. */
1985 buildaddr = current_insn_ptr;
1986 i = 0;
1987 buf[i++] = 0xbe; /* mov $<n>,%esi */
1988 memcpy (&buf[i], &reg, sizeof (reg));
1989 i += 4;
1990 append_insns (&buildaddr, i, buf);
1991 current_insn_ptr = buildaddr;
1992 amd64_emit_call (get_raw_reg_func_addr ());
1993 }
1994
1995 static void
1996 amd64_emit_pop (void)
1997 {
1998 EMIT_ASM (amd64_pop,
1999 "pop %rax");
2000 }
2001
2002 static void
2003 amd64_emit_stack_flush (void)
2004 {
2005 EMIT_ASM (amd64_stack_flush,
2006 "push %rax");
2007 }
2008
2009 static void
2010 amd64_emit_zero_ext (int arg)
2011 {
2012 switch (arg)
2013 {
2014 case 8:
2015 EMIT_ASM (amd64_zero_ext_8,
2016 "and $0xff,%rax");
2017 break;
2018 case 16:
2019 EMIT_ASM (amd64_zero_ext_16,
2020 "and $0xffff,%rax");
2021 break;
2022 case 32:
2023 EMIT_ASM (amd64_zero_ext_32,
2024 "mov $0xffffffff,%rcx\n\t"
2025 "and %rcx,%rax");
2026 break;
2027 default:
2028 emit_error = 1;
2029 }
2030 }
2031
2032 static void
2033 amd64_emit_swap (void)
2034 {
2035 EMIT_ASM (amd64_swap,
2036 "mov %rax,%rcx\n\t"
2037 "pop %rax\n\t"
2038 "push %rcx");
2039 }
2040
2041 static void
2042 amd64_emit_stack_adjust (int n)
2043 {
2044 unsigned char buf[16];
2045 int i;
2046 CORE_ADDR buildaddr = current_insn_ptr;
2047
2048 i = 0;
2049 buf[i++] = 0x48; /* lea $<n>(%rsp),%rsp */
2050 buf[i++] = 0x8d;
2051 buf[i++] = 0x64;
2052 buf[i++] = 0x24;
2053 /* This only handles adjustments up to 16, but we don't expect any more. */
2054 buf[i++] = n * 8;
2055 append_insns (&buildaddr, i, buf);
2056 current_insn_ptr = buildaddr;
2057 }
2058
2059 /* FN's prototype is `LONGEST(*fn)(int)'. */
2060
2061 static void
2062 amd64_emit_int_call_1 (CORE_ADDR fn, int arg1)
2063 {
2064 unsigned char buf[16];
2065 int i;
2066 CORE_ADDR buildaddr;
2067
2068 buildaddr = current_insn_ptr;
2069 i = 0;
2070 buf[i++] = 0xbf; /* movl $<n>,%edi */
2071 memcpy (&buf[i], &arg1, sizeof (arg1));
2072 i += 4;
2073 append_insns (&buildaddr, i, buf);
2074 current_insn_ptr = buildaddr;
2075 amd64_emit_call (fn);
2076 }
2077
2078 /* FN's prototype is `void(*fn)(int,LONGEST)'. */
2079
2080 static void
2081 amd64_emit_void_call_2 (CORE_ADDR fn, int arg1)
2082 {
2083 unsigned char buf[16];
2084 int i;
2085 CORE_ADDR buildaddr;
2086
2087 buildaddr = current_insn_ptr;
2088 i = 0;
2089 buf[i++] = 0xbf; /* movl $<n>,%edi */
2090 memcpy (&buf[i], &arg1, sizeof (arg1));
2091 i += 4;
2092 append_insns (&buildaddr, i, buf);
2093 current_insn_ptr = buildaddr;
2094 EMIT_ASM (amd64_void_call_2_a,
2095 /* Save away a copy of the stack top. */
2096 "push %rax\n\t"
2097 /* Also pass top as the second argument. */
2098 "mov %rax,%rsi");
2099 amd64_emit_call (fn);
2100 EMIT_ASM (amd64_void_call_2_b,
2101 /* Restore the stack top, %rax may have been trashed. */
2102 "pop %rax");
2103 }
2104
2105 static void
2106 amd64_emit_eq_goto (int *offset_p, int *size_p)
2107 {
2108 EMIT_ASM (amd64_eq,
2109 "cmp %rax,(%rsp)\n\t"
2110 "jne .Lamd64_eq_fallthru\n\t"
2111 "lea 0x8(%rsp),%rsp\n\t"
2112 "pop %rax\n\t"
2113 /* jmp, but don't trust the assembler to choose the right jump */
2114 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2115 ".Lamd64_eq_fallthru:\n\t"
2116 "lea 0x8(%rsp),%rsp\n\t"
2117 "pop %rax");
2118
2119 if (offset_p)
2120 *offset_p = 13;
2121 if (size_p)
2122 *size_p = 4;
2123 }
2124
2125 static void
2126 amd64_emit_ne_goto (int *offset_p, int *size_p)
2127 {
2128 EMIT_ASM (amd64_ne,
2129 "cmp %rax,(%rsp)\n\t"
2130 "je .Lamd64_ne_fallthru\n\t"
2131 "lea 0x8(%rsp),%rsp\n\t"
2132 "pop %rax\n\t"
2133 /* jmp, but don't trust the assembler to choose the right jump */
2134 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2135 ".Lamd64_ne_fallthru:\n\t"
2136 "lea 0x8(%rsp),%rsp\n\t"
2137 "pop %rax");
2138
2139 if (offset_p)
2140 *offset_p = 13;
2141 if (size_p)
2142 *size_p = 4;
2143 }
2144
2145 static void
2146 amd64_emit_lt_goto (int *offset_p, int *size_p)
2147 {
2148 EMIT_ASM (amd64_lt,
2149 "cmp %rax,(%rsp)\n\t"
2150 "jnl .Lamd64_lt_fallthru\n\t"
2151 "lea 0x8(%rsp),%rsp\n\t"
2152 "pop %rax\n\t"
2153 /* jmp, but don't trust the assembler to choose the right jump */
2154 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2155 ".Lamd64_lt_fallthru:\n\t"
2156 "lea 0x8(%rsp),%rsp\n\t"
2157 "pop %rax");
2158
2159 if (offset_p)
2160 *offset_p = 13;
2161 if (size_p)
2162 *size_p = 4;
2163 }
2164
2165 static void
2166 amd64_emit_le_goto (int *offset_p, int *size_p)
2167 {
2168 EMIT_ASM (amd64_le,
2169 "cmp %rax,(%rsp)\n\t"
2170 "jnle .Lamd64_le_fallthru\n\t"
2171 "lea 0x8(%rsp),%rsp\n\t"
2172 "pop %rax\n\t"
2173 /* jmp, but don't trust the assembler to choose the right jump */
2174 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2175 ".Lamd64_le_fallthru:\n\t"
2176 "lea 0x8(%rsp),%rsp\n\t"
2177 "pop %rax");
2178
2179 if (offset_p)
2180 *offset_p = 13;
2181 if (size_p)
2182 *size_p = 4;
2183 }
2184
2185 static void
2186 amd64_emit_gt_goto (int *offset_p, int *size_p)
2187 {
2188 EMIT_ASM (amd64_gt,
2189 "cmp %rax,(%rsp)\n\t"
2190 "jng .Lamd64_gt_fallthru\n\t"
2191 "lea 0x8(%rsp),%rsp\n\t"
2192 "pop %rax\n\t"
2193 /* jmp, but don't trust the assembler to choose the right jump */
2194 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2195 ".Lamd64_gt_fallthru:\n\t"
2196 "lea 0x8(%rsp),%rsp\n\t"
2197 "pop %rax");
2198
2199 if (offset_p)
2200 *offset_p = 13;
2201 if (size_p)
2202 *size_p = 4;
2203 }
2204
2205 static void
2206 amd64_emit_ge_goto (int *offset_p, int *size_p)
2207 {
2208 EMIT_ASM (amd64_ge,
2209 "cmp %rax,(%rsp)\n\t"
2210 "jnge .Lamd64_ge_fallthru\n\t"
2211 ".Lamd64_ge_jump:\n\t"
2212 "lea 0x8(%rsp),%rsp\n\t"
2213 "pop %rax\n\t"
2214 /* jmp, but don't trust the assembler to choose the right jump */
2215 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2216 ".Lamd64_ge_fallthru:\n\t"
2217 "lea 0x8(%rsp),%rsp\n\t"
2218 "pop %rax");
2219
2220 if (offset_p)
2221 *offset_p = 13;
2222 if (size_p)
2223 *size_p = 4;
2224 }
2225
2226 static emit_ops amd64_emit_ops =
2227 {
2228 amd64_emit_prologue,
2229 amd64_emit_epilogue,
2230 amd64_emit_add,
2231 amd64_emit_sub,
2232 amd64_emit_mul,
2233 amd64_emit_lsh,
2234 amd64_emit_rsh_signed,
2235 amd64_emit_rsh_unsigned,
2236 amd64_emit_ext,
2237 amd64_emit_log_not,
2238 amd64_emit_bit_and,
2239 amd64_emit_bit_or,
2240 amd64_emit_bit_xor,
2241 amd64_emit_bit_not,
2242 amd64_emit_equal,
2243 amd64_emit_less_signed,
2244 amd64_emit_less_unsigned,
2245 amd64_emit_ref,
2246 amd64_emit_if_goto,
2247 amd64_emit_goto,
2248 amd64_write_goto_address,
2249 amd64_emit_const,
2250 amd64_emit_call,
2251 amd64_emit_reg,
2252 amd64_emit_pop,
2253 amd64_emit_stack_flush,
2254 amd64_emit_zero_ext,
2255 amd64_emit_swap,
2256 amd64_emit_stack_adjust,
2257 amd64_emit_int_call_1,
2258 amd64_emit_void_call_2,
2259 amd64_emit_eq_goto,
2260 amd64_emit_ne_goto,
2261 amd64_emit_lt_goto,
2262 amd64_emit_le_goto,
2263 amd64_emit_gt_goto,
2264 amd64_emit_ge_goto
2265 };
2266
2267 #endif /* __x86_64__ */
2268
2269 static void
2270 i386_emit_prologue (void)
2271 {
2272 EMIT_ASM32 (i386_prologue,
2273 "push %ebp\n\t"
2274 "mov %esp,%ebp\n\t"
2275 "push %ebx");
2276 /* At this point, the raw regs base address is at 8(%ebp), and the
2277 value pointer is at 12(%ebp). */
2278 }
2279
2280 static void
2281 i386_emit_epilogue (void)
2282 {
2283 EMIT_ASM32 (i386_epilogue,
2284 "mov 12(%ebp),%ecx\n\t"
2285 "mov %eax,(%ecx)\n\t"
2286 "mov %ebx,0x4(%ecx)\n\t"
2287 "xor %eax,%eax\n\t"
2288 "pop %ebx\n\t"
2289 "pop %ebp\n\t"
2290 "ret");
2291 }
2292
2293 static void
2294 i386_emit_add (void)
2295 {
2296 EMIT_ASM32 (i386_add,
2297 "add (%esp),%eax\n\t"
2298 "adc 0x4(%esp),%ebx\n\t"
2299 "lea 0x8(%esp),%esp");
2300 }
2301
2302 static void
2303 i386_emit_sub (void)
2304 {
2305 EMIT_ASM32 (i386_sub,
2306 "subl %eax,(%esp)\n\t"
2307 "sbbl %ebx,4(%esp)\n\t"
2308 "pop %eax\n\t"
2309 "pop %ebx\n\t");
2310 }
2311
2312 static void
2313 i386_emit_mul (void)
2314 {
2315 emit_error = 1;
2316 }
2317
2318 static void
2319 i386_emit_lsh (void)
2320 {
2321 emit_error = 1;
2322 }
2323
2324 static void
2325 i386_emit_rsh_signed (void)
2326 {
2327 emit_error = 1;
2328 }
2329
2330 static void
2331 i386_emit_rsh_unsigned (void)
2332 {
2333 emit_error = 1;
2334 }
2335
2336 static void
2337 i386_emit_ext (int arg)
2338 {
2339 switch (arg)
2340 {
2341 case 8:
2342 EMIT_ASM32 (i386_ext_8,
2343 "cbtw\n\t"
2344 "cwtl\n\t"
2345 "movl %eax,%ebx\n\t"
2346 "sarl $31,%ebx");
2347 break;
2348 case 16:
2349 EMIT_ASM32 (i386_ext_16,
2350 "cwtl\n\t"
2351 "movl %eax,%ebx\n\t"
2352 "sarl $31,%ebx");
2353 break;
2354 case 32:
2355 EMIT_ASM32 (i386_ext_32,
2356 "movl %eax,%ebx\n\t"
2357 "sarl $31,%ebx");
2358 break;
2359 default:
2360 emit_error = 1;
2361 }
2362 }
2363
2364 static void
2365 i386_emit_log_not (void)
2366 {
2367 EMIT_ASM32 (i386_log_not,
2368 "or %ebx,%eax\n\t"
2369 "test %eax,%eax\n\t"
2370 "sete %cl\n\t"
2371 "xor %ebx,%ebx\n\t"
2372 "movzbl %cl,%eax");
2373 }
2374
2375 static void
2376 i386_emit_bit_and (void)
2377 {
2378 EMIT_ASM32 (i386_and,
2379 "and (%esp),%eax\n\t"
2380 "and 0x4(%esp),%ebx\n\t"
2381 "lea 0x8(%esp),%esp");
2382 }
2383
2384 static void
2385 i386_emit_bit_or (void)
2386 {
2387 EMIT_ASM32 (i386_or,
2388 "or (%esp),%eax\n\t"
2389 "or 0x4(%esp),%ebx\n\t"
2390 "lea 0x8(%esp),%esp");
2391 }
2392
2393 static void
2394 i386_emit_bit_xor (void)
2395 {
2396 EMIT_ASM32 (i386_xor,
2397 "xor (%esp),%eax\n\t"
2398 "xor 0x4(%esp),%ebx\n\t"
2399 "lea 0x8(%esp),%esp");
2400 }
2401
2402 static void
2403 i386_emit_bit_not (void)
2404 {
2405 EMIT_ASM32 (i386_bit_not,
2406 "xor $0xffffffff,%eax\n\t"
2407 "xor $0xffffffff,%ebx\n\t");
2408 }
2409
2410 static void
2411 i386_emit_equal (void)
2412 {
2413 EMIT_ASM32 (i386_equal,
2414 "cmpl %ebx,4(%esp)\n\t"
2415 "jne .Li386_equal_false\n\t"
2416 "cmpl %eax,(%esp)\n\t"
2417 "je .Li386_equal_true\n\t"
2418 ".Li386_equal_false:\n\t"
2419 "xor %eax,%eax\n\t"
2420 "jmp .Li386_equal_end\n\t"
2421 ".Li386_equal_true:\n\t"
2422 "mov $1,%eax\n\t"
2423 ".Li386_equal_end:\n\t"
2424 "xor %ebx,%ebx\n\t"
2425 "lea 0x8(%esp),%esp");
2426 }
2427
2428 static void
2429 i386_emit_less_signed (void)
2430 {
2431 EMIT_ASM32 (i386_less_signed,
2432 "cmpl %ebx,4(%esp)\n\t"
2433 "jl .Li386_less_signed_true\n\t"
2434 "jne .Li386_less_signed_false\n\t"
2435 "cmpl %eax,(%esp)\n\t"
2436 "jl .Li386_less_signed_true\n\t"
2437 ".Li386_less_signed_false:\n\t"
2438 "xor %eax,%eax\n\t"
2439 "jmp .Li386_less_signed_end\n\t"
2440 ".Li386_less_signed_true:\n\t"
2441 "mov $1,%eax\n\t"
2442 ".Li386_less_signed_end:\n\t"
2443 "xor %ebx,%ebx\n\t"
2444 "lea 0x8(%esp),%esp");
2445 }
2446
2447 static void
2448 i386_emit_less_unsigned (void)
2449 {
2450 EMIT_ASM32 (i386_less_unsigned,
2451 "cmpl %ebx,4(%esp)\n\t"
2452 "jb .Li386_less_unsigned_true\n\t"
2453 "jne .Li386_less_unsigned_false\n\t"
2454 "cmpl %eax,(%esp)\n\t"
2455 "jb .Li386_less_unsigned_true\n\t"
2456 ".Li386_less_unsigned_false:\n\t"
2457 "xor %eax,%eax\n\t"
2458 "jmp .Li386_less_unsigned_end\n\t"
2459 ".Li386_less_unsigned_true:\n\t"
2460 "mov $1,%eax\n\t"
2461 ".Li386_less_unsigned_end:\n\t"
2462 "xor %ebx,%ebx\n\t"
2463 "lea 0x8(%esp),%esp");
2464 }
2465
2466 static void
2467 i386_emit_ref (int size)
2468 {
2469 switch (size)
2470 {
2471 case 1:
2472 EMIT_ASM32 (i386_ref1,
2473 "movb (%eax),%al");
2474 break;
2475 case 2:
2476 EMIT_ASM32 (i386_ref2,
2477 "movw (%eax),%ax");
2478 break;
2479 case 4:
2480 EMIT_ASM32 (i386_ref4,
2481 "movl (%eax),%eax");
2482 break;
2483 case 8:
2484 EMIT_ASM32 (i386_ref8,
2485 "movl 4(%eax),%ebx\n\t"
2486 "movl (%eax),%eax");
2487 break;
2488 }
2489 }
2490
2491 static void
2492 i386_emit_if_goto (int *offset_p, int *size_p)
2493 {
2494 EMIT_ASM32 (i386_if_goto,
2495 "mov %eax,%ecx\n\t"
2496 "or %ebx,%ecx\n\t"
2497 "pop %eax\n\t"
2498 "pop %ebx\n\t"
2499 "cmpl $0,%ecx\n\t"
2500 /* Don't trust the assembler to choose the right jump */
2501 ".byte 0x0f, 0x85, 0x0, 0x0, 0x0, 0x0");
2502
2503 if (offset_p)
2504 *offset_p = 11; /* be sure that this matches the sequence above */
2505 if (size_p)
2506 *size_p = 4;
2507 }
2508
2509 static void
2510 i386_emit_goto (int *offset_p, int *size_p)
2511 {
2512 EMIT_ASM32 (i386_goto,
2513 /* Don't trust the assembler to choose the right jump */
2514 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0");
2515 if (offset_p)
2516 *offset_p = 1;
2517 if (size_p)
2518 *size_p = 4;
2519 }
2520
2521 static void
2522 i386_write_goto_address (CORE_ADDR from, CORE_ADDR to, int size)
2523 {
2524 int diff = (to - (from + size));
2525 unsigned char buf[sizeof (int)];
2526
2527 /* We're only doing 4-byte sizes at the moment. */
2528 if (size != 4)
2529 {
2530 emit_error = 1;
2531 return;
2532 }
2533
2534 memcpy (buf, &diff, sizeof (int));
2535 target_write_memory (from, buf, sizeof (int));
2536 }
2537
2538 static void
2539 i386_emit_const (LONGEST num)
2540 {
2541 unsigned char buf[16];
2542 int i, hi, lo;
2543 CORE_ADDR buildaddr = current_insn_ptr;
2544
2545 i = 0;
2546 buf[i++] = 0xb8; /* mov $<n>,%eax */
2547 lo = num & 0xffffffff;
2548 memcpy (&buf[i], &lo, sizeof (lo));
2549 i += 4;
2550 hi = ((num >> 32) & 0xffffffff);
2551 if (hi)
2552 {
2553 buf[i++] = 0xbb; /* mov $<n>,%ebx */
2554 memcpy (&buf[i], &hi, sizeof (hi));
2555 i += 4;
2556 }
2557 else
2558 {
2559 buf[i++] = 0x31; buf[i++] = 0xdb; /* xor %ebx,%ebx */
2560 }
2561 append_insns (&buildaddr, i, buf);
2562 current_insn_ptr = buildaddr;
2563 }
2564
2565 static void
2566 i386_emit_call (CORE_ADDR fn)
2567 {
2568 unsigned char buf[16];
2569 int i, offset;
2570 CORE_ADDR buildaddr;
2571
2572 buildaddr = current_insn_ptr;
2573 i = 0;
2574 buf[i++] = 0xe8; /* call <reladdr> */
2575 offset = ((int) fn) - (buildaddr + 5);
2576 memcpy (buf + 1, &offset, 4);
2577 append_insns (&buildaddr, 5, buf);
2578 current_insn_ptr = buildaddr;
2579 }
2580
2581 static void
2582 i386_emit_reg (int reg)
2583 {
2584 unsigned char buf[16];
2585 int i;
2586 CORE_ADDR buildaddr;
2587
2588 EMIT_ASM32 (i386_reg_a,
2589 "sub $0x8,%esp");
2590 buildaddr = current_insn_ptr;
2591 i = 0;
2592 buf[i++] = 0xb8; /* mov $<n>,%eax */
2593 memcpy (&buf[i], &reg, sizeof (reg));
2594 i += 4;
2595 append_insns (&buildaddr, i, buf);
2596 current_insn_ptr = buildaddr;
2597 EMIT_ASM32 (i386_reg_b,
2598 "mov %eax,4(%esp)\n\t"
2599 "mov 8(%ebp),%eax\n\t"
2600 "mov %eax,(%esp)");
2601 i386_emit_call (get_raw_reg_func_addr ());
2602 EMIT_ASM32 (i386_reg_c,
2603 "xor %ebx,%ebx\n\t"
2604 "lea 0x8(%esp),%esp");
2605 }
2606
2607 static void
2608 i386_emit_pop (void)
2609 {
2610 EMIT_ASM32 (i386_pop,
2611 "pop %eax\n\t"
2612 "pop %ebx");
2613 }
2614
2615 static void
2616 i386_emit_stack_flush (void)
2617 {
2618 EMIT_ASM32 (i386_stack_flush,
2619 "push %ebx\n\t"
2620 "push %eax");
2621 }
2622
2623 static void
2624 i386_emit_zero_ext (int arg)
2625 {
2626 switch (arg)
2627 {
2628 case 8:
2629 EMIT_ASM32 (i386_zero_ext_8,
2630 "and $0xff,%eax\n\t"
2631 "xor %ebx,%ebx");
2632 break;
2633 case 16:
2634 EMIT_ASM32 (i386_zero_ext_16,
2635 "and $0xffff,%eax\n\t"
2636 "xor %ebx,%ebx");
2637 break;
2638 case 32:
2639 EMIT_ASM32 (i386_zero_ext_32,
2640 "xor %ebx,%ebx");
2641 break;
2642 default:
2643 emit_error = 1;
2644 }
2645 }
2646
2647 static void
2648 i386_emit_swap (void)
2649 {
2650 EMIT_ASM32 (i386_swap,
2651 "mov %eax,%ecx\n\t"
2652 "mov %ebx,%edx\n\t"
2653 "pop %eax\n\t"
2654 "pop %ebx\n\t"
2655 "push %edx\n\t"
2656 "push %ecx");
2657 }
2658
2659 static void
2660 i386_emit_stack_adjust (int n)
2661 {
2662 unsigned char buf[16];
2663 int i;
2664 CORE_ADDR buildaddr = current_insn_ptr;
2665
2666 i = 0;
2667 buf[i++] = 0x8d; /* lea $<n>(%esp),%esp */
2668 buf[i++] = 0x64;
2669 buf[i++] = 0x24;
2670 buf[i++] = n * 8;
2671 append_insns (&buildaddr, i, buf);
2672 current_insn_ptr = buildaddr;
2673 }
2674
2675 /* FN's prototype is `LONGEST(*fn)(int)'. */
2676
2677 static void
2678 i386_emit_int_call_1 (CORE_ADDR fn, int arg1)
2679 {
2680 unsigned char buf[16];
2681 int i;
2682 CORE_ADDR buildaddr;
2683
2684 EMIT_ASM32 (i386_int_call_1_a,
2685 /* Reserve a bit of stack space. */
2686 "sub $0x8,%esp");
2687 /* Put the one argument on the stack. */
2688 buildaddr = current_insn_ptr;
2689 i = 0;
2690 buf[i++] = 0xc7; /* movl $<arg1>,(%esp) */
2691 buf[i++] = 0x04;
2692 buf[i++] = 0x24;
2693 memcpy (&buf[i], &arg1, sizeof (arg1));
2694 i += 4;
2695 append_insns (&buildaddr, i, buf);
2696 current_insn_ptr = buildaddr;
2697 i386_emit_call (fn);
2698 EMIT_ASM32 (i386_int_call_1_c,
2699 "mov %edx,%ebx\n\t"
2700 "lea 0x8(%esp),%esp");
2701 }
2702
2703 /* FN's prototype is `void(*fn)(int,LONGEST)'. */
2704
2705 static void
2706 i386_emit_void_call_2 (CORE_ADDR fn, int arg1)
2707 {
2708 unsigned char buf[16];
2709 int i;
2710 CORE_ADDR buildaddr;
2711
2712 EMIT_ASM32 (i386_void_call_2_a,
2713 /* Preserve %eax only; we don't have to worry about %ebx. */
2714 "push %eax\n\t"
2715 /* Reserve a bit of stack space for arguments. */
2716 "sub $0x10,%esp\n\t"
2717 /* Copy "top" to the second argument position. (Note that
2718 we can't assume function won't scribble on its
2719 arguments, so don't try to restore from this.) */
2720 "mov %eax,4(%esp)\n\t"
2721 "mov %ebx,8(%esp)");
2722 /* Put the first argument on the stack. */
2723 buildaddr = current_insn_ptr;
2724 i = 0;
2725 buf[i++] = 0xc7; /* movl $<arg1>,(%esp) */
2726 buf[i++] = 0x04;
2727 buf[i++] = 0x24;
2728 memcpy (&buf[i], &arg1, sizeof (arg1));
2729 i += 4;
2730 append_insns (&buildaddr, i, buf);
2731 current_insn_ptr = buildaddr;
2732 i386_emit_call (fn);
2733 EMIT_ASM32 (i386_void_call_2_b,
2734 "lea 0x10(%esp),%esp\n\t"
2735 /* Restore original stack top. */
2736 "pop %eax");
2737 }
2738
2739
2740 static void
2741 i386_emit_eq_goto (int *offset_p, int *size_p)
2742 {
2743 EMIT_ASM32 (eq,
2744 /* Check low half first, more likely to be decider */
2745 "cmpl %eax,(%esp)\n\t"
2746 "jne .Leq_fallthru\n\t"
2747 "cmpl %ebx,4(%esp)\n\t"
2748 "jne .Leq_fallthru\n\t"
2749 "lea 0x8(%esp),%esp\n\t"
2750 "pop %eax\n\t"
2751 "pop %ebx\n\t"
2752 /* jmp, but don't trust the assembler to choose the right jump */
2753 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2754 ".Leq_fallthru:\n\t"
2755 "lea 0x8(%esp),%esp\n\t"
2756 "pop %eax\n\t"
2757 "pop %ebx");
2758
2759 if (offset_p)
2760 *offset_p = 18;
2761 if (size_p)
2762 *size_p = 4;
2763 }
2764
2765 static void
2766 i386_emit_ne_goto (int *offset_p, int *size_p)
2767 {
2768 EMIT_ASM32 (ne,
2769 /* Check low half first, more likely to be decider */
2770 "cmpl %eax,(%esp)\n\t"
2771 "jne .Lne_jump\n\t"
2772 "cmpl %ebx,4(%esp)\n\t"
2773 "je .Lne_fallthru\n\t"
2774 ".Lne_jump:\n\t"
2775 "lea 0x8(%esp),%esp\n\t"
2776 "pop %eax\n\t"
2777 "pop %ebx\n\t"
2778 /* jmp, but don't trust the assembler to choose the right jump */
2779 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2780 ".Lne_fallthru:\n\t"
2781 "lea 0x8(%esp),%esp\n\t"
2782 "pop %eax\n\t"
2783 "pop %ebx");
2784
2785 if (offset_p)
2786 *offset_p = 18;
2787 if (size_p)
2788 *size_p = 4;
2789 }
2790
2791 static void
2792 i386_emit_lt_goto (int *offset_p, int *size_p)
2793 {
2794 EMIT_ASM32 (lt,
2795 "cmpl %ebx,4(%esp)\n\t"
2796 "jl .Llt_jump\n\t"
2797 "jne .Llt_fallthru\n\t"
2798 "cmpl %eax,(%esp)\n\t"
2799 "jnl .Llt_fallthru\n\t"
2800 ".Llt_jump:\n\t"
2801 "lea 0x8(%esp),%esp\n\t"
2802 "pop %eax\n\t"
2803 "pop %ebx\n\t"
2804 /* jmp, but don't trust the assembler to choose the right jump */
2805 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2806 ".Llt_fallthru:\n\t"
2807 "lea 0x8(%esp),%esp\n\t"
2808 "pop %eax\n\t"
2809 "pop %ebx");
2810
2811 if (offset_p)
2812 *offset_p = 20;
2813 if (size_p)
2814 *size_p = 4;
2815 }
2816
2817 static void
2818 i386_emit_le_goto (int *offset_p, int *size_p)
2819 {
2820 EMIT_ASM32 (le,
2821 "cmpl %ebx,4(%esp)\n\t"
2822 "jle .Lle_jump\n\t"
2823 "jne .Lle_fallthru\n\t"
2824 "cmpl %eax,(%esp)\n\t"
2825 "jnle .Lle_fallthru\n\t"
2826 ".Lle_jump:\n\t"
2827 "lea 0x8(%esp),%esp\n\t"
2828 "pop %eax\n\t"
2829 "pop %ebx\n\t"
2830 /* jmp, but don't trust the assembler to choose the right jump */
2831 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2832 ".Lle_fallthru:\n\t"
2833 "lea 0x8(%esp),%esp\n\t"
2834 "pop %eax\n\t"
2835 "pop %ebx");
2836
2837 if (offset_p)
2838 *offset_p = 20;
2839 if (size_p)
2840 *size_p = 4;
2841 }
2842
2843 static void
2844 i386_emit_gt_goto (int *offset_p, int *size_p)
2845 {
2846 EMIT_ASM32 (gt,
2847 "cmpl %ebx,4(%esp)\n\t"
2848 "jg .Lgt_jump\n\t"
2849 "jne .Lgt_fallthru\n\t"
2850 "cmpl %eax,(%esp)\n\t"
2851 "jng .Lgt_fallthru\n\t"
2852 ".Lgt_jump:\n\t"
2853 "lea 0x8(%esp),%esp\n\t"
2854 "pop %eax\n\t"
2855 "pop %ebx\n\t"
2856 /* jmp, but don't trust the assembler to choose the right jump */
2857 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2858 ".Lgt_fallthru:\n\t"
2859 "lea 0x8(%esp),%esp\n\t"
2860 "pop %eax\n\t"
2861 "pop %ebx");
2862
2863 if (offset_p)
2864 *offset_p = 20;
2865 if (size_p)
2866 *size_p = 4;
2867 }
2868
2869 static void
2870 i386_emit_ge_goto (int *offset_p, int *size_p)
2871 {
2872 EMIT_ASM32 (ge,
2873 "cmpl %ebx,4(%esp)\n\t"
2874 "jge .Lge_jump\n\t"
2875 "jne .Lge_fallthru\n\t"
2876 "cmpl %eax,(%esp)\n\t"
2877 "jnge .Lge_fallthru\n\t"
2878 ".Lge_jump:\n\t"
2879 "lea 0x8(%esp),%esp\n\t"
2880 "pop %eax\n\t"
2881 "pop %ebx\n\t"
2882 /* jmp, but don't trust the assembler to choose the right jump */
2883 ".byte 0xe9, 0x0, 0x0, 0x0, 0x0\n\t"
2884 ".Lge_fallthru:\n\t"
2885 "lea 0x8(%esp),%esp\n\t"
2886 "pop %eax\n\t"
2887 "pop %ebx");
2888
2889 if (offset_p)
2890 *offset_p = 20;
2891 if (size_p)
2892 *size_p = 4;
2893 }
2894
2895 static emit_ops i386_emit_ops =
2896 {
2897 i386_emit_prologue,
2898 i386_emit_epilogue,
2899 i386_emit_add,
2900 i386_emit_sub,
2901 i386_emit_mul,
2902 i386_emit_lsh,
2903 i386_emit_rsh_signed,
2904 i386_emit_rsh_unsigned,
2905 i386_emit_ext,
2906 i386_emit_log_not,
2907 i386_emit_bit_and,
2908 i386_emit_bit_or,
2909 i386_emit_bit_xor,
2910 i386_emit_bit_not,
2911 i386_emit_equal,
2912 i386_emit_less_signed,
2913 i386_emit_less_unsigned,
2914 i386_emit_ref,
2915 i386_emit_if_goto,
2916 i386_emit_goto,
2917 i386_write_goto_address,
2918 i386_emit_const,
2919 i386_emit_call,
2920 i386_emit_reg,
2921 i386_emit_pop,
2922 i386_emit_stack_flush,
2923 i386_emit_zero_ext,
2924 i386_emit_swap,
2925 i386_emit_stack_adjust,
2926 i386_emit_int_call_1,
2927 i386_emit_void_call_2,
2928 i386_emit_eq_goto,
2929 i386_emit_ne_goto,
2930 i386_emit_lt_goto,
2931 i386_emit_le_goto,
2932 i386_emit_gt_goto,
2933 i386_emit_ge_goto
2934 };
2935
2936
2937 emit_ops *
2938 x86_target::emit_ops ()
2939 {
2940 #ifdef __x86_64__
2941 if (is_64bit_tdesc (current_thread))
2942 return &amd64_emit_ops;
2943 else
2944 #endif
2945 return &i386_emit_ops;
2946 }
2947
2948 /* Implementation of target ops method "sw_breakpoint_from_kind". */
2949
2950 const gdb_byte *
2951 x86_target::sw_breakpoint_from_kind (int kind, int *size)
2952 {
2953 *size = x86_breakpoint_len;
2954 return x86_breakpoint;
2955 }
2956
2957 bool
2958 x86_target::low_supports_range_stepping ()
2959 {
2960 return true;
2961 }
2962
2963 int
2964 x86_target::get_ipa_tdesc_idx ()
2965 {
2966 struct regcache *regcache = get_thread_regcache (current_thread, 0);
2967 const struct target_desc *tdesc = regcache->tdesc;
2968
2969 #ifdef __x86_64__
2970 return amd64_get_ipa_tdesc_idx (tdesc);
2971 #endif
2972
2973 if (tdesc == tdesc_i386_linux_no_xml.get ())
2974 return X86_TDESC_SSE;
2975
2976 return i386_get_ipa_tdesc_idx (tdesc);
2977 }
2978
2979 /* The linux target ops object. */
2980
2981 linux_process_target *the_linux_target = &the_x86_target;
2982
2983 void
2984 initialize_low_arch (void)
2985 {
2986 /* Initialize the Linux target descriptions. */
2987 #ifdef __x86_64__
2988 tdesc_amd64_linux_no_xml = allocate_target_description ();
2989 copy_target_description (tdesc_amd64_linux_no_xml.get (),
2990 amd64_linux_read_description (X86_XSTATE_SSE_MASK,
2991 false));
2992 tdesc_amd64_linux_no_xml->xmltarget = xmltarget_amd64_linux_no_xml;
2993 #endif
2994
2995 tdesc_i386_linux_no_xml = allocate_target_description ();
2996 copy_target_description (tdesc_i386_linux_no_xml.get (),
2997 i386_linux_read_description (X86_XSTATE_SSE_MASK));
2998 tdesc_i386_linux_no_xml->xmltarget = xmltarget_i386_linux_no_xml;
2999
3000 initialize_regsets_info (&x86_regsets_info);
3001 }