1 /* Target-dependent code for GNU/Linux x86-64.
3 Copyright (C) 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5 Contributed by Jiri Smid, SuSE Labs.
7 This file is part of GDB.
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.
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.
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/>. */
23 #include "arch-utils.h"
30 #include "reggroups.h"
31 #include "amd64-linux-tdep.h"
32 #include "linux-tdep.h"
34 #include "gdb_string.h"
36 #include "amd64-tdep.h"
37 #include "solib-svr4.h"
40 #include "linux-record.h"
42 /* Mapping between the general-purpose registers in `struct user'
43 format and GDB's register cache layout. */
45 /* From <sys/reg.h>. */
46 static int amd64_linux_gregset_reg_offset
[] =
75 /* Support for signal handlers. */
77 #define LINUX_SIGTRAMP_INSN0 0x48 /* mov $NNNNNNNN, %rax */
78 #define LINUX_SIGTRAMP_OFFSET0 0
79 #define LINUX_SIGTRAMP_INSN1 0x0f /* syscall */
80 #define LINUX_SIGTRAMP_OFFSET1 7
82 static const gdb_byte linux_sigtramp_code
[] =
84 /* mov $__NR_rt_sigreturn, %rax */
85 LINUX_SIGTRAMP_INSN0
, 0xc7, 0xc0, 0x0f, 0x00, 0x00, 0x00,
87 LINUX_SIGTRAMP_INSN1
, 0x05
90 #define LINUX_SIGTRAMP_LEN (sizeof linux_sigtramp_code)
92 /* If PC is in a sigtramp routine, return the address of the start of
93 the routine. Otherwise, return 0. */
96 amd64_linux_sigtramp_start (struct frame_info
*this_frame
)
98 CORE_ADDR pc
= get_frame_pc (this_frame
);
99 gdb_byte buf
[LINUX_SIGTRAMP_LEN
];
101 /* We only recognize a signal trampoline if PC is at the start of
102 one of the two instructions. We optimize for finding the PC at
103 the start, as will be the case when the trampoline is not the
104 first frame on the stack. We assume that in the case where the
105 PC is not at the start of the instruction sequence, there will be
106 a few trailing readable bytes on the stack. */
108 if (!safe_frame_unwind_memory (this_frame
, pc
, buf
, sizeof buf
))
111 if (buf
[0] != LINUX_SIGTRAMP_INSN0
)
113 if (buf
[0] != LINUX_SIGTRAMP_INSN1
)
116 pc
-= LINUX_SIGTRAMP_OFFSET1
;
117 if (!safe_frame_unwind_memory (this_frame
, pc
, buf
, sizeof buf
))
121 if (memcmp (buf
, linux_sigtramp_code
, LINUX_SIGTRAMP_LEN
) != 0)
127 /* Return whether THIS_FRAME corresponds to a GNU/Linux sigtramp
131 amd64_linux_sigtramp_p (struct frame_info
*this_frame
)
133 CORE_ADDR pc
= get_frame_pc (this_frame
);
136 find_pc_partial_function (pc
, &name
, NULL
, NULL
);
138 /* If we have NAME, we can optimize the search. The trampoline is
139 named __restore_rt. However, it isn't dynamically exported from
140 the shared C library, so the trampoline may appear to be part of
141 the preceding function. This should always be sigaction,
142 __sigaction, or __libc_sigaction (all aliases to the same
144 if (name
== NULL
|| strstr (name
, "sigaction") != NULL
)
145 return (amd64_linux_sigtramp_start (this_frame
) != 0);
147 return (strcmp ("__restore_rt", name
) == 0);
150 /* Offset to struct sigcontext in ucontext, from <asm/ucontext.h>. */
151 #define AMD64_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 40
153 /* Assuming THIS_FRAME is a GNU/Linux sigtramp routine, return the
154 address of the associated sigcontext structure. */
157 amd64_linux_sigcontext_addr (struct frame_info
*this_frame
)
159 struct gdbarch
*gdbarch
= get_frame_arch (this_frame
);
160 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
164 get_frame_register (this_frame
, AMD64_RSP_REGNUM
, buf
);
165 sp
= extract_unsigned_integer (buf
, 8, byte_order
);
167 /* The sigcontext structure is part of the user context. A pointer
168 to the user context is passed as the third argument to the signal
169 handler, i.e. in %rdx. Unfortunately %rdx isn't preserved across
170 function calls so we can't use it. Fortunately the user context
171 is part of the signal frame and the unwound %rsp directly points
173 return sp
+ AMD64_LINUX_UCONTEXT_SIGCONTEXT_OFFSET
;
177 /* From <asm/sigcontext.h>. */
178 static int amd64_linux_sc_reg_offset
[] =
197 17 * 8, /* %eflags */
199 /* FIXME: kettenis/2002030531: The registers %cs, %fs and %gs are
200 available in `struct sigcontext'. However, they only occupy two
201 bytes instead of four, which makes using them here rather
202 difficult. Leave them out for now. */
211 /* Replacement register functions which know about %orig_rax. */
214 amd64_linux_register_name (struct gdbarch
*gdbarch
, int reg
)
216 if (reg
== AMD64_LINUX_ORIG_RAX_REGNUM
)
219 return amd64_register_name (gdbarch
, reg
);
223 amd64_linux_register_type (struct gdbarch
*gdbarch
, int reg
)
225 if (reg
== AMD64_LINUX_ORIG_RAX_REGNUM
)
226 return builtin_type (gdbarch
)->builtin_int64
;
228 return amd64_register_type (gdbarch
, reg
);
232 amd64_linux_register_reggroup_p (struct gdbarch
*gdbarch
, int regnum
,
233 struct reggroup
*group
)
235 if (regnum
== AMD64_LINUX_ORIG_RAX_REGNUM
)
236 return (group
== system_reggroup
237 || group
== save_reggroup
238 || group
== restore_reggroup
);
239 return default_register_reggroup_p (gdbarch
, regnum
, group
);
242 /* Set the program counter for process PTID to PC. */
245 amd64_linux_write_pc (struct regcache
*regcache
, CORE_ADDR pc
)
247 regcache_cooked_write_unsigned (regcache
, AMD64_RIP_REGNUM
, pc
);
249 /* We must be careful with modifying the program counter. If we
250 just interrupted a system call, the kernel might try to restart
251 it when we resume the inferior. On restarting the system call,
252 the kernel will try backing up the program counter even though it
253 no longer points at the system call. This typically results in a
254 SIGSEGV or SIGILL. We can prevent this by writing `-1' in the
255 "orig_rax" pseudo-register.
257 Note that "orig_rax" is saved when setting up a dummy call frame.
258 This means that it is properly restored when that frame is
259 popped, and that the interrupted system call will be restarted
260 when we resume the inferior on return from a function call from
261 within GDB. In all other cases the system call will not be
263 regcache_cooked_write_unsigned (regcache
, AMD64_LINUX_ORIG_RAX_REGNUM
, -1);
266 /* Parse the arguments of current system call instruction and record
267 the values of the registers and memory that will be changed into
268 "record_arch_list". This instruction is "syscall".
270 Return -1 if something wrong. */
272 static struct linux_record_tdep amd64_linux_record_tdep
;
274 #define RECORD_ARCH_GET_FS 0x1003
275 #define RECORD_ARCH_GET_GS 0x1004
278 amd64_linux_syscall_record (struct regcache
*regcache
)
281 ULONGEST tmpulongest
;
283 regcache_raw_read_unsigned (regcache
, AMD64_RAX_REGNUM
, &tmpulongest
);
285 /* Convert tmpulongest to number in record_linux_system_call. */
340 /* sys_rt_sigaction */
344 /* sys_rt_sigprocmask */
348 /* sys_rt_sigreturn */
384 /* sys_sched_yield */
492 /* sys_getsockname */
496 /* sys_getpeername */
672 /* sys_gettimeofday */
796 /* sys_rt_sigpending */
800 /* sys_rt_sigtimedwait */
804 /* sys_rt_sigqueueinfo */
808 /* sys_rt_sigsuspend */
812 /* sys_sigaltstack */
824 /* sys_personality */
844 /* sys_getpriority */
848 /* sys_setpriority */
852 /* sys_sched_setparam */
856 /* sys_sched_getparam */
860 /* sys_sched_setscheduler */
864 /* sys_sched_getscheduler */
868 /* sys_sched_get_priority_max */
872 /* sys_sched_get_priority_min */
876 /* sys_sched_rr_get_interval */
918 regcache_raw_read_unsigned (regcache
, amd64_linux_record_tdep
.arg3
,
920 if (tmpulongest
== RECORD_ARCH_GET_FS
921 || tmpulongest
== RECORD_ARCH_GET_GS
)
923 regcache_raw_read_unsigned (regcache
, amd64_linux_record_tdep
.arg2
,
925 if (record_arch_list_add_mem ((CORE_ADDR
) tmpulongest
,
926 amd64_linux_record_tdep
.size_ulong
))
950 /* sys_settimeofday */
974 /* sys_sethostname */
978 /* sys_setdomainname */
990 /* sys_init_module */
994 /* sys_delete_module */
1002 /* sys_nfsservctl */
1042 /* sys_llistxattr */
1046 /* sys_flistxattr */
1050 /* sys_removexattr */
1054 /* sys_lremovexattr */
1058 /* sys_fremovexattr */
1074 /* sys_sched_setaffinity */
1078 /* sys_sched_getaffinity */
1086 /* sys_io_destroy */
1090 /* sys_io_getevents */
1102 /* sys_lookup_dcookie */
1106 /* sys_epoll_create */
1110 /* sys_remap_file_pages */
1114 /* sys_getdents64 */
1118 /* sys_set_tid_address */
1122 /* sys_restart_syscall */
1126 /* sys_semtimedop */
1134 /* sys_timer_create */
1138 /* sys_timer_settime */
1142 /* sys_timer_gettime */
1146 /* sys_timer_getoverrun */
1150 /* sys_timer_delete */
1154 /* sys_clock_settime */
1158 /* sys_clock_gettime */
1162 /* sys_clock_getres */
1166 /* sys_clock_nanosleep */
1170 /* sys_exit_group */
1174 /* sys_epoll_wait */
1194 /* sys_set_mempolicy */
1198 /* sys_get_mempolicy */
1210 /* sys_mq_timedsend */
1214 /* sys_mq_timedreceive */
1222 /* sys_mq_getsetattr */
1226 /* sys_kexec_load */
1238 /* sys_request_key */
1246 /* sys_ioprio_set */
1250 /* sys_ioprio_get */
1254 /* sys_inotify_init */
1258 /* sys_inotify_add_watch */
1262 /* sys_inotify_rm_watch */
1266 /* sys_migrate_pages */
1290 /* sys_newfstatat */
1310 /* sys_readlinkat */
1334 /* sys_set_robust_list */
1338 /* sys_get_robust_list */
1350 /* sys_sync_file_range */
1358 /* sys_move_pages */
1363 printf_unfiltered (_("Process record and replay target doesn't "
1364 "support syscall number %d\n"), (int) tmpulongest
);
1371 ret
= record_linux_system_call (num
, regcache
,
1372 &amd64_linux_record_tdep
);
1377 /* Record the return value of the system call. */
1378 if (record_arch_list_add_reg (regcache
, AMD64_RCX_REGNUM
))
1380 if (record_arch_list_add_reg (regcache
, AMD64_R11_REGNUM
))
1388 amd64_linux_init_abi (struct gdbarch_info info
, struct gdbarch
*gdbarch
)
1390 struct gdbarch_tdep
*tdep
= gdbarch_tdep (gdbarch
);
1392 tdep
->gregset_reg_offset
= amd64_linux_gregset_reg_offset
;
1393 tdep
->gregset_num_regs
= ARRAY_SIZE (amd64_linux_gregset_reg_offset
);
1394 tdep
->sizeof_gregset
= 27 * 8;
1396 amd64_init_abi (info
, gdbarch
);
1398 tdep
->sigtramp_p
= amd64_linux_sigtramp_p
;
1399 tdep
->sigcontext_addr
= amd64_linux_sigcontext_addr
;
1400 tdep
->sc_reg_offset
= amd64_linux_sc_reg_offset
;
1401 tdep
->sc_num_regs
= ARRAY_SIZE (amd64_linux_sc_reg_offset
);
1403 /* GNU/Linux uses SVR4-style shared libraries. */
1404 set_solib_svr4_fetch_link_map_offsets
1405 (gdbarch
, svr4_lp64_fetch_link_map_offsets
);
1407 /* Add the %orig_rax register used for syscall restarting. */
1408 set_gdbarch_write_pc (gdbarch
, amd64_linux_write_pc
);
1409 set_gdbarch_num_regs (gdbarch
, AMD64_LINUX_NUM_REGS
);
1410 set_gdbarch_register_name (gdbarch
, amd64_linux_register_name
);
1411 set_gdbarch_register_type (gdbarch
, amd64_linux_register_type
);
1412 set_gdbarch_register_reggroup_p (gdbarch
, amd64_linux_register_reggroup_p
);
1414 /* Enable TLS support. */
1415 set_gdbarch_fetch_tls_load_module_address (gdbarch
,
1416 svr4_fetch_objfile_link_map
);
1418 /* GNU/Linux uses SVR4-style shared libraries. */
1419 set_gdbarch_skip_trampoline_code (gdbarch
, find_solib_trampoline_target
);
1421 /* Displaced stepping. */
1422 set_gdbarch_displaced_step_copy_insn (gdbarch
,
1423 amd64_displaced_step_copy_insn
);
1424 set_gdbarch_displaced_step_fixup (gdbarch
, amd64_displaced_step_fixup
);
1425 set_gdbarch_displaced_step_free_closure (gdbarch
,
1426 simple_displaced_step_free_closure
);
1427 set_gdbarch_displaced_step_location (gdbarch
,
1428 displaced_step_at_entry_point
);
1430 set_gdbarch_get_siginfo_type (gdbarch
, linux_get_siginfo_type
);
1432 set_gdbarch_process_record (gdbarch
, i386_process_record
);
1434 /* Initialize the amd64_linux_record_tdep. */
1435 /* These values are the size of the type that will be used in a system
1436 call. They are obtained from Linux Kernel source. */
1437 amd64_linux_record_tdep
.size_pointer
1438 = gdbarch_ptr_bit (gdbarch
) / TARGET_CHAR_BIT
;
1439 amd64_linux_record_tdep
.size__old_kernel_stat
= 32;
1440 amd64_linux_record_tdep
.size_tms
= 32;
1441 amd64_linux_record_tdep
.size_loff_t
= 8;
1442 amd64_linux_record_tdep
.size_flock
= 32;
1443 amd64_linux_record_tdep
.size_oldold_utsname
= 45;
1444 amd64_linux_record_tdep
.size_ustat
= 32;
1445 /* ADM64 doesn't need this size because it doesn't have sys_sigaction
1446 but sys_rt_sigaction. */
1447 amd64_linux_record_tdep
.size_old_sigaction
= 152;
1448 /* ADM64 doesn't need this size because it doesn't have sys_sigpending
1449 but sys_rt_sigpending. */
1450 amd64_linux_record_tdep
.size_old_sigset_t
= 128;
1451 amd64_linux_record_tdep
.size_rlimit
= 16;
1452 amd64_linux_record_tdep
.size_rusage
= 144;
1453 amd64_linux_record_tdep
.size_timeval
= 16;
1454 amd64_linux_record_tdep
.size_timezone
= 8;
1455 /* ADM64 doesn't need this size because it doesn't have sys_getgroups16
1456 but sys_getgroups. */
1457 amd64_linux_record_tdep
.size_old_gid_t
= 2;
1458 /* ADM64 doesn't need this size because it doesn't have sys_getresuid16
1459 but sys_getresuid. */
1460 amd64_linux_record_tdep
.size_old_uid_t
= 2;
1461 amd64_linux_record_tdep
.size_fd_set
= 128;
1462 amd64_linux_record_tdep
.size_dirent
= 280;
1463 amd64_linux_record_tdep
.size_dirent64
= 280;
1464 amd64_linux_record_tdep
.size_statfs
= 120;
1465 amd64_linux_record_tdep
.size_statfs64
= 120;
1466 amd64_linux_record_tdep
.size_sockaddr
= 16;
1467 amd64_linux_record_tdep
.size_int
1468 = gdbarch_int_bit (gdbarch
) / TARGET_CHAR_BIT
;
1469 amd64_linux_record_tdep
.size_long
1470 = gdbarch_long_bit (gdbarch
) / TARGET_CHAR_BIT
;
1471 amd64_linux_record_tdep
.size_ulong
1472 = gdbarch_long_bit (gdbarch
) / TARGET_CHAR_BIT
;
1473 amd64_linux_record_tdep
.size_msghdr
= 56;
1474 amd64_linux_record_tdep
.size_itimerval
= 32;
1475 amd64_linux_record_tdep
.size_stat
= 144;
1476 amd64_linux_record_tdep
.size_old_utsname
= 325;
1477 amd64_linux_record_tdep
.size_sysinfo
= 112;
1478 amd64_linux_record_tdep
.size_msqid_ds
= 120;
1479 amd64_linux_record_tdep
.size_shmid_ds
= 112;
1480 amd64_linux_record_tdep
.size_new_utsname
= 390;
1481 amd64_linux_record_tdep
.size_timex
= 208;
1482 amd64_linux_record_tdep
.size_mem_dqinfo
= 24;
1483 amd64_linux_record_tdep
.size_if_dqblk
= 72;
1484 amd64_linux_record_tdep
.size_fs_quota_stat
= 80;
1485 amd64_linux_record_tdep
.size_timespec
= 16;
1486 amd64_linux_record_tdep
.size_pollfd
= 8;
1487 amd64_linux_record_tdep
.size_NFS_FHSIZE
= 32;
1488 amd64_linux_record_tdep
.size_knfsd_fh
= 132;
1489 amd64_linux_record_tdep
.size_TASK_COMM_LEN
= 16;
1490 amd64_linux_record_tdep
.size_sigaction
= 152;
1491 amd64_linux_record_tdep
.size_sigset_t
= 128;
1492 amd64_linux_record_tdep
.size_siginfo_t
= 128;
1493 amd64_linux_record_tdep
.size_cap_user_data_t
= 8;
1494 amd64_linux_record_tdep
.size_stack_t
= 24;
1495 amd64_linux_record_tdep
.size_off_t
= 8;
1496 amd64_linux_record_tdep
.size_stat64
= 144;
1497 amd64_linux_record_tdep
.size_gid_t
= 4;
1498 amd64_linux_record_tdep
.size_uid_t
= 4;
1499 amd64_linux_record_tdep
.size_PAGE_SIZE
= 4096;
1500 amd64_linux_record_tdep
.size_flock64
= 32;
1501 amd64_linux_record_tdep
.size_user_desc
= 16;
1502 amd64_linux_record_tdep
.size_io_event
= 32;
1503 amd64_linux_record_tdep
.size_iocb
= 64;
1504 amd64_linux_record_tdep
.size_epoll_event
= 12;
1505 amd64_linux_record_tdep
.size_itimerspec
= 32;
1506 amd64_linux_record_tdep
.size_mq_attr
= 64;
1507 amd64_linux_record_tdep
.size_siginfo
= 128;
1508 amd64_linux_record_tdep
.size_termios
= 60;
1509 amd64_linux_record_tdep
.size_termios2
= 44;
1510 amd64_linux_record_tdep
.size_pid_t
= 4;
1511 amd64_linux_record_tdep
.size_winsize
= 8;
1512 amd64_linux_record_tdep
.size_serial_struct
= 72;
1513 amd64_linux_record_tdep
.size_serial_icounter_struct
= 80;
1514 amd64_linux_record_tdep
.size_hayes_esp_config
= 12;
1515 amd64_linux_record_tdep
.size_size_t
= 8;
1516 amd64_linux_record_tdep
.size_iovec
= 16;
1518 /* These values are the second argument of system call "sys_ioctl".
1519 They are obtained from Linux Kernel source. */
1520 amd64_linux_record_tdep
.ioctl_TCGETS
= 0x5401;
1521 amd64_linux_record_tdep
.ioctl_TCSETS
= 0x5402;
1522 amd64_linux_record_tdep
.ioctl_TCSETSW
= 0x5403;
1523 amd64_linux_record_tdep
.ioctl_TCSETSF
= 0x5404;
1524 amd64_linux_record_tdep
.ioctl_TCGETA
= 0x5405;
1525 amd64_linux_record_tdep
.ioctl_TCSETA
= 0x5406;
1526 amd64_linux_record_tdep
.ioctl_TCSETAW
= 0x5407;
1527 amd64_linux_record_tdep
.ioctl_TCSETAF
= 0x5408;
1528 amd64_linux_record_tdep
.ioctl_TCSBRK
= 0x5409;
1529 amd64_linux_record_tdep
.ioctl_TCXONC
= 0x540A;
1530 amd64_linux_record_tdep
.ioctl_TCFLSH
= 0x540B;
1531 amd64_linux_record_tdep
.ioctl_TIOCEXCL
= 0x540C;
1532 amd64_linux_record_tdep
.ioctl_TIOCNXCL
= 0x540D;
1533 amd64_linux_record_tdep
.ioctl_TIOCSCTTY
= 0x540E;
1534 amd64_linux_record_tdep
.ioctl_TIOCGPGRP
= 0x540F;
1535 amd64_linux_record_tdep
.ioctl_TIOCSPGRP
= 0x5410;
1536 amd64_linux_record_tdep
.ioctl_TIOCOUTQ
= 0x5411;
1537 amd64_linux_record_tdep
.ioctl_TIOCSTI
= 0x5412;
1538 amd64_linux_record_tdep
.ioctl_TIOCGWINSZ
= 0x5413;
1539 amd64_linux_record_tdep
.ioctl_TIOCSWINSZ
= 0x5414;
1540 amd64_linux_record_tdep
.ioctl_TIOCMGET
= 0x5415;
1541 amd64_linux_record_tdep
.ioctl_TIOCMBIS
= 0x5416;
1542 amd64_linux_record_tdep
.ioctl_TIOCMBIC
= 0x5417;
1543 amd64_linux_record_tdep
.ioctl_TIOCMSET
= 0x5418;
1544 amd64_linux_record_tdep
.ioctl_TIOCGSOFTCAR
= 0x5419;
1545 amd64_linux_record_tdep
.ioctl_TIOCSSOFTCAR
= 0x541A;
1546 amd64_linux_record_tdep
.ioctl_FIONREAD
= 0x541B;
1547 amd64_linux_record_tdep
.ioctl_TIOCINQ
1548 = amd64_linux_record_tdep
.ioctl_FIONREAD
;
1549 amd64_linux_record_tdep
.ioctl_TIOCLINUX
= 0x541C;
1550 amd64_linux_record_tdep
.ioctl_TIOCCONS
= 0x541D;
1551 amd64_linux_record_tdep
.ioctl_TIOCGSERIAL
= 0x541E;
1552 amd64_linux_record_tdep
.ioctl_TIOCSSERIAL
= 0x541F;
1553 amd64_linux_record_tdep
.ioctl_TIOCPKT
= 0x5420;
1554 amd64_linux_record_tdep
.ioctl_FIONBIO
= 0x5421;
1555 amd64_linux_record_tdep
.ioctl_TIOCNOTTY
= 0x5422;
1556 amd64_linux_record_tdep
.ioctl_TIOCSETD
= 0x5423;
1557 amd64_linux_record_tdep
.ioctl_TIOCGETD
= 0x5424;
1558 amd64_linux_record_tdep
.ioctl_TCSBRKP
= 0x5425;
1559 amd64_linux_record_tdep
.ioctl_TIOCTTYGSTRUCT
= 0x5426;
1560 amd64_linux_record_tdep
.ioctl_TIOCSBRK
= 0x5427;
1561 amd64_linux_record_tdep
.ioctl_TIOCCBRK
= 0x5428;
1562 amd64_linux_record_tdep
.ioctl_TIOCGSID
= 0x5429;
1563 amd64_linux_record_tdep
.ioctl_TCGETS2
= 0x802c542a;
1564 amd64_linux_record_tdep
.ioctl_TCSETS2
= 0x402c542b;
1565 amd64_linux_record_tdep
.ioctl_TCSETSW2
= 0x402c542c;
1566 amd64_linux_record_tdep
.ioctl_TCSETSF2
= 0x402c542d;
1567 amd64_linux_record_tdep
.ioctl_TIOCGPTN
= 0x80045430;
1568 amd64_linux_record_tdep
.ioctl_TIOCSPTLCK
= 0x40045431;
1569 amd64_linux_record_tdep
.ioctl_FIONCLEX
= 0x5450;
1570 amd64_linux_record_tdep
.ioctl_FIOCLEX
= 0x5451;
1571 amd64_linux_record_tdep
.ioctl_FIOASYNC
= 0x5452;
1572 amd64_linux_record_tdep
.ioctl_TIOCSERCONFIG
= 0x5453;
1573 amd64_linux_record_tdep
.ioctl_TIOCSERGWILD
= 0x5454;
1574 amd64_linux_record_tdep
.ioctl_TIOCSERSWILD
= 0x5455;
1575 amd64_linux_record_tdep
.ioctl_TIOCGLCKTRMIOS
= 0x5456;
1576 amd64_linux_record_tdep
.ioctl_TIOCSLCKTRMIOS
= 0x5457;
1577 amd64_linux_record_tdep
.ioctl_TIOCSERGSTRUCT
= 0x5458;
1578 amd64_linux_record_tdep
.ioctl_TIOCSERGETLSR
= 0x5459;
1579 amd64_linux_record_tdep
.ioctl_TIOCSERGETMULTI
= 0x545A;
1580 amd64_linux_record_tdep
.ioctl_TIOCSERSETMULTI
= 0x545B;
1581 amd64_linux_record_tdep
.ioctl_TIOCMIWAIT
= 0x545C;
1582 amd64_linux_record_tdep
.ioctl_TIOCGICOUNT
= 0x545D;
1583 amd64_linux_record_tdep
.ioctl_TIOCGHAYESESP
= 0x545E;
1584 amd64_linux_record_tdep
.ioctl_TIOCSHAYESESP
= 0x545F;
1585 amd64_linux_record_tdep
.ioctl_FIOQSIZE
= 0x5460;
1587 /* These values are the second argument of system call "sys_fcntl"
1588 and "sys_fcntl64". They are obtained from Linux Kernel source. */
1589 amd64_linux_record_tdep
.fcntl_F_GETLK
= 5;
1590 amd64_linux_record_tdep
.fcntl_F_GETLK64
= 12;
1591 amd64_linux_record_tdep
.fcntl_F_SETLK64
= 13;
1592 amd64_linux_record_tdep
.fcntl_F_SETLKW64
= 14;
1594 amd64_linux_record_tdep
.arg1
= AMD64_RDI_REGNUM
;
1595 amd64_linux_record_tdep
.arg2
= AMD64_RSI_REGNUM
;
1596 amd64_linux_record_tdep
.arg3
= AMD64_RDX_REGNUM
;
1597 amd64_linux_record_tdep
.arg4
= AMD64_R10_REGNUM
;
1598 amd64_linux_record_tdep
.arg5
= AMD64_R8_REGNUM
;
1599 amd64_linux_record_tdep
.arg6
= AMD64_R9_REGNUM
;
1601 tdep
->i386_syscall_record
= amd64_linux_syscall_record
;
1605 /* Provide a prototype to silence -Wmissing-prototypes. */
1606 extern void _initialize_amd64_linux_tdep (void);
1609 _initialize_amd64_linux_tdep (void)
1611 gdbarch_register_osabi (bfd_arch_i386
, bfd_mach_x86_64
,
1612 GDB_OSABI_LINUX
, amd64_linux_init_abi
);