]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/record] Support recording syscall accept4
authorTom de Vries <tdevries@suse.de>
Thu, 13 Mar 2025 06:41:51 +0000 (07:41 +0100)
committerTom de Vries <tdevries@suse.de>
Thu, 13 Mar 2025 06:41:51 +0000 (07:41 +0100)
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>
gdb/aarch64-linux-tdep.c
gdb/amd64-linux-tdep.c
gdb/amd64-linux-tdep.h
gdb/arm-linux-tdep.c
gdb/i386-linux-tdep.c
gdb/linux-record.c
gdb/linux-record.h
gdb/loongarch-linux-tdep.c

index 5e59941ee4857cf842ad4813023db0a06847865b..7f396194867612ae7addc4138a9c28c2a65f7e79 100644 (file)
@@ -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);
index 2c76a1de5a8f7a322f1d7e9fe7e0aba5d32e1e97..e290d2cab6dd054bd63cb5dc87dd587761fc3f71 100644 (file)
@@ -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;
index 935e9b64b49c4035eddeba5fa94890b6411817f2..4bcd423a21ca85cbe8373a8d58428cde3ae11480 100644 (file)
@@ -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),
index 0e49f9fcf31b35d149299cdcdd8cb448a0a0db72..858705e40227396180eadbe2855d8df3286e18b6 100644 (file)
@@ -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;
index 374a60307ac67dbd534ccad9a20e3b7af9300f3e..3fb1c1765e44d10bad36a3c9851bff58e8217678 100644 (file)
@@ -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);
index 33efa026a538826dcbf395b80cc76e85565ff2c7..0b2709b30b2b9cba54ca0d3dc77884c20d07ae44 100644 (file)
@@ -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:
       {
index 6b1224a689267f96fe78af2056f175d5083a8c82..6d6ba07308994c943855bbc479fce1d5a07c31e8 100644 (file)
@@ -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,
 };
 
index b18cacca087d96b5af8ffd0c3b244fa270c6d49c..2168ce642b9ec3f735a5d9e99568f88e4648c181 100644 (file)
@@ -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);