From: Tom de Vries Date: Thu, 13 Mar 2025 06:41:51 +0000 (+0100) Subject: [gdb/record] Support recording syscall accept4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f9f033220046f011aeb259469cb15fe8141b213b;p=thirdparty%2Fbinutils-gdb.git [gdb/record] Support recording syscall accept4 While reviewing the enum gdb_syscall entries with values >= 500, I noticed that gdb_sys_accept exists, but gdb_sys_accept4 doesn't, while recording support is essentially the same, given that the difference in interface is only an extra int parameter: ... int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen); int accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags); ... Fix this by: - adding gdb_sys_accept4, - supporting it in record_linux_system_call alongside gdb_sys_accept, and - mapping to gdb_sys_accept4 in various syscall canonicalization functions. The usual thing to do before the rewrite of i386_canonicalize_syscall would have been to use the value from arch/x86/entry/syscalls/syscall_32.tbl: ... gdb_sys_accept4 = 364, ... but that's no longer necessary, so instead we use some >= 500 value: ... gdb_sys_accept4 = 533, ... to steer clear of the space where ppc_canonicalize_syscall and s390_canonicalize_syscall do hard-coded number magic. Tested on x86_64-linux, with and without target board unix/-m32, and aarch64-linux. Approved-By: Guinevere Larsen --- diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index 5e59941ee48..7f396194867 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -2291,7 +2291,7 @@ aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number) SYSCALL_MAP (move_pages); UNSUPPORTED_SYSCALL_MAP (rt_tgsigqueueinfo); UNSUPPORTED_SYSCALL_MAP (perf_event_open); - UNSUPPORTED_SYSCALL_MAP (accept4); + SYSCALL_MAP (accept4); UNSUPPORTED_SYSCALL_MAP (recvmmsg); SYSCALL_MAP (wait4); diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index 2c76a1de5a8..e290d2cab6d 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -556,6 +556,10 @@ amd64_canonicalize_syscall (enum amd64_syscall syscall_number) case amd64_x32_sys_accept: return gdb_sys_accept; + case amd64_sys_accept4: + case amd64_x32_sys_accept4: + return gdb_sys_accept4; + case amd64_sys_sendto: case amd64_x32_sys_sendto: return gdb_sys_sendto; diff --git a/gdb/amd64-linux-tdep.h b/gdb/amd64-linux-tdep.h index 935e9b64b49..4bcd423a21c 100644 --- a/gdb/amd64-linux-tdep.h +++ b/gdb/amd64-linux-tdep.h @@ -302,6 +302,7 @@ enum amd64_syscall { amd64_sys_sync_file_range = 277, amd64_sys_vmsplice = 278, amd64_sys_move_pages = 279, + amd64_sys_accept4 = 288, amd64_sys_pipe2 = 293, amd64_sys_getrandom = 318 }; @@ -553,6 +554,7 @@ enum amd64_x32_syscall { amd64_x32_sys_splice = (amd64_x32_syscall_bit + 275), amd64_x32_sys_tee = (amd64_x32_syscall_bit + 276), amd64_x32_sys_sync_file_range = (amd64_x32_syscall_bit + 277), + amd64_x32_sys_accept4 = (amd64_x32_syscall_bit + 288), amd64_x32_sys_rt_sigaction = (amd64_x32_syscall_bit + 512), amd64_x32_sys_rt_sigreturn = (amd64_x32_syscall_bit + 513), amd64_x32_sys_ioctl = (amd64_x32_syscall_bit + 514), diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c index 0e49f9fcf31..858705e4022 100644 --- a/gdb/arm-linux-tdep.c +++ b/gdb/arm-linux-tdep.c @@ -1629,7 +1629,9 @@ arm_canonicalize_syscall (int syscall) case 363: return gdb_sys_rt_tgsigqueueinfo; case 364: return gdb_sys_perf_event_open; case 365: return gdb_sys_recvmmsg; + */ case 366: return gdb_sys_accept4; + /* case 367: return gdb_sys_fanotify_init; case 368: return gdb_sys_fanotify_mark; case 369: return gdb_sys_prlimit64; diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c index 374a60307ac..3fb1c1765e4 100644 --- a/gdb/i386-linux-tdep.c +++ b/gdb/i386-linux-tdep.c @@ -764,7 +764,7 @@ i386_canonicalize_syscall (int syscall) SYSCALL_MAP (bind); SYSCALL_MAP (connect); SYSCALL_MAP (listen); - UNSUPPORTED_SYSCALL_MAP (accept4); + SYSCALL_MAP (accept4); SYSCALL_MAP (getsockopt); SYSCALL_MAP (setsockopt); SYSCALL_MAP (getsockname); diff --git a/gdb/linux-record.c b/gdb/linux-record.c index 33efa026a53..0b2709b30b2 100644 --- a/gdb/linux-record.c +++ b/gdb/linux-record.c @@ -725,6 +725,7 @@ Do you want to stop the program?"), break; case gdb_sys_accept: + case gdb_sys_accept4: case gdb_sys_getsockname: case gdb_sys_getpeername: { diff --git a/gdb/linux-record.h b/gdb/linux-record.h index 6b1224a6892..6d6ba073089 100644 --- a/gdb/linux-record.h +++ b/gdb/linux-record.h @@ -541,6 +541,7 @@ enum gdb_syscall { gdb_sys_msgrcv = 530, gdb_sys_msgctl = 531, gdb_sys_semtimedop = 532, + gdb_sys_accept4 = 533, gdb_sys_newfstatat = 540, }; diff --git a/gdb/loongarch-linux-tdep.c b/gdb/loongarch-linux-tdep.c index b18cacca087..2168ce642b9 100644 --- a/gdb/loongarch-linux-tdep.c +++ b/gdb/loongarch-linux-tdep.c @@ -828,7 +828,7 @@ loongarch_canonicalize_syscall (enum loongarch_syscall syscall_number) SYSCALL_MAP (move_pages); UNSUPPORTED_SYSCALL_MAP (rt_tgsigqueueinfo); UNSUPPORTED_SYSCALL_MAP (perf_event_open); - UNSUPPORTED_SYSCALL_MAP (accept4); + SYSCALL_MAP (accept4); UNSUPPORTED_SYSCALL_MAP (recvmmsg); SYSCALL_MAP (wait4); UNSUPPORTED_SYSCALL_MAP (prlimit64);