aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2025-03-13 07:41:51 +0100
committerTom de Vries <tdevries@suse.de>2025-03-13 07:41:51 +0100
commitf9f033220046f011aeb259469cb15fe8141b213b (patch)
tree51e36d8d84e5088d57253697afb6375cb1d3d6c9 /gdb
parentfbfb29b304ef7d3270a918b5fc60c22b0909367e (diff)
downloadbinutils-f9f033220046f011aeb259469cb15fe8141b213b.zip
binutils-f9f033220046f011aeb259469cb15fe8141b213b.tar.gz
binutils-f9f033220046f011aeb259469cb15fe8141b213b.tar.bz2
[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 <guinevere@redhat.com>
Diffstat (limited to 'gdb')
-rw-r--r--gdb/aarch64-linux-tdep.c2
-rw-r--r--gdb/amd64-linux-tdep.c4
-rw-r--r--gdb/amd64-linux-tdep.h2
-rw-r--r--gdb/arm-linux-tdep.c2
-rw-r--r--gdb/i386-linux-tdep.c2
-rw-r--r--gdb/linux-record.c1
-rw-r--r--gdb/linux-record.h1
-rw-r--r--gdb/loongarch-linux-tdep.c2
8 files changed, 13 insertions, 3 deletions
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
index 5e59941..7f39619 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 2c76a1d..e290d2c 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 935e9b6..4bcd423 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 0e49f9f..858705e 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 374a603..3fb1c17 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 33efa02..0b2709b 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 6b1224a..6d6ba07 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 b18cacc..2168ce6 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);