From: Paul Floyd Date: Mon, 30 Sep 2024 18:52:58 +0000 (+0200) Subject: FreeBSD syscalls and regtest, cleanup freebsd7 compatible syscalls on arm64 X-Git-Tag: VALGRIND_3_24_0~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ebc5dcd79722f39469d4c6c82d45726df7add939;p=thirdparty%2Fvalgrind.git FreeBSD syscalls and regtest, cleanup freebsd7 compatible syscalls on arm64 None of the freebsd7 interfaces exist on arm64 as the OS wasn't ported until well after FreeBSD 7. --- diff --git a/coregrind/m_syswrap/priv_syswrap-freebsd.h b/coregrind/m_syswrap/priv_syswrap-freebsd.h index 040f308d8..e405a1172 100644 --- a/coregrind/m_syswrap/priv_syswrap-freebsd.h +++ b/coregrind/m_syswrap/priv_syswrap-freebsd.h @@ -199,15 +199,21 @@ DECL_TEMPLATE(freebsd, sys_undelete) // 205 DECL_TEMPLATE(freebsd, sys_futimes) // 206 // generic getpgod 207 // generic poll 209 +#if !defined(VGP_arm64_freebsd) DECL_TEMPLATE(freebsd, sys_freebsd7___semctl) // 220 +#endif DECL_TEMPLATE(freebsd, sys_semget) // 221 DECL_TEMPLATE(freebsd, sys_semop) // 222 +#if !defined(VGP_arm64_freebsd) DECL_TEMPLATE(freebsd, sys_freebsd7_msgctl) // 224 +#endif DECL_TEMPLATE(freebsd, sys_msgget) // 225 DECL_TEMPLATE(freebsd, sys_msgsnd) // 226 DECL_TEMPLATE(freebsd, sys_msgrcv) // 227 DECL_TEMPLATE(freebsd, sys_shmat) // 228 +#if !defined(VGP_arm64_freebsd) DECL_TEMPLATE(freebsd, sys_freebsd7_shmctl) // 229 +#endif DECL_TEMPLATE(freebsd, sys_shmdt) // 230 DECL_TEMPLATE(freebsd, sys_shmget) // 231 DECL_TEMPLATE(freebsd, sys_clock_gettime) // 232 diff --git a/coregrind/m_syswrap/syswrap-arm64-freebsd.c b/coregrind/m_syswrap/syswrap-arm64-freebsd.c index 7d3d3a330..da536af37 100644 --- a/coregrind/m_syswrap/syswrap-arm64-freebsd.c +++ b/coregrind/m_syswrap/syswrap-arm64-freebsd.c @@ -860,19 +860,15 @@ POST(sys_wait6) } } -// the man page is inconsistent for the last argument -// See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=247386 -// will stick to 'arg' for simplicity - // SYS_procctl 544 -// int procctl(idtype_t idtype, id_t id, int cmd, void *arg); +// int procctl(idtype_t idtype, id_t id, int cmd, void *data); PRE(sys_procctl) { PRINT("sys_procctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, SARG2, SARG3, ARG4); PRE_REG_READ4(int, "procctl", vki_idtype_t, idtype, vki_id_t, id, int, cmd, - void*, arg); + void*, data); switch (ARG3) { case VKI_PROC_ASLR_CTL: case VKI_PROC_SPROTECT: @@ -882,14 +878,14 @@ PRE(sys_procctl) case VKI_PROC_STACKGAP_CTL: case VKI_PROC_NO_NEW_PRIVS_CTL: case VKI_PROC_WXMAP_CTL: - PRE_MEM_READ("procctl(arg)", ARG4, sizeof(int)); + PRE_MEM_READ("procctl(data)", ARG4, sizeof(int)); break; case VKI_PROC_REAP_STATUS: - PRE_MEM_READ("procctl(arg)", ARG4, + PRE_MEM_READ("procctl(data)", ARG4, sizeof(struct vki_procctl_reaper_status)); break; case VKI_PROC_REAP_GETPIDS: - PRE_MEM_READ("procctl(arg)", ARG4, + PRE_MEM_READ("procctl(data)", ARG4, sizeof(struct vki_procctl_reaper_pids)); break; case VKI_PROC_REAP_KILL: @@ -904,9 +900,9 @@ PRE(sys_procctl) * * There is also a pad field */ - PRE_MEM_READ("procctl(arg)", ARG4, + PRE_MEM_READ("procctl(data)", ARG4, sizeof(int) + sizeof(u_int) + sizeof(vki_pid_t)); - PRE_MEM_WRITE("procctl(arg)", + PRE_MEM_WRITE("procctl(data)", ARG4 + offsetof(struct vki_procctl_reaper_kill, rk_killed), sizeof(u_int) + sizeof(vki_pid_t)); break; @@ -917,7 +913,7 @@ PRE(sys_procctl) case VKI_PROC_TRACE_STATUS: case VKI_PROC_NO_NEW_PRIVS_STATUS: case VKI_PROC_WXMAP_STATUS: - PRE_MEM_WRITE("procctl(arg)", ARG4, sizeof(int)); + PRE_MEM_WRITE("procctl(data)", ARG4, sizeof(int)); case VKI_PROC_REAP_ACQUIRE: case VKI_PROC_REAP_RELEASE: default: diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index 41372f4e1..593fd6f90 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -2208,6 +2208,7 @@ PRE(sys_futimes) // SYS_freebsd7___semctl 220 // int semctl(int semid, int semnum, int cmd, ...); +#if !defined(VGP_arm64_freebsd) PRE(sys_freebsd7___semctl) { union vki_semun* semun; @@ -2243,6 +2244,7 @@ POST(sys_freebsd7___semctl) ML_(generic_POST_sys_semctl)(tid, RES, ARG1,ARG2,ARG3,ARG4); } } +#endif // SYS_semget 221 // int semget(key_t key, int nsems, int flag); @@ -2265,6 +2267,7 @@ PRE(sys_semop) // SYS_freebsd7_msgctl 224 // int msgctl(int msqid, int cmd, struct msqid_ds_old *buf); +#if !defined(VGP_arm64_freebsd) PRE(sys_freebsd7_msgctl) { PRINT("sys_freebsd7_msgctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1,SARG2,ARG3 ); @@ -2291,6 +2294,7 @@ POST(sys_freebsd7_msgctl) break; } } +#endif // SYS_msgget 225 // int msgget(key_t key, int msgflg); @@ -2354,6 +2358,7 @@ POST(sys_shmat) // SYS_freebsd7_shmctl 229 // int shmctl(int shmid, int cmd, struct shmid_ds *buf); +#if !defined(VGP_arm64_freebsd) PRE(sys_freebsd7_shmctl) { PRINT("sys_freebsd7_shmctl ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",SARG1,SARG2,ARG3); @@ -2377,6 +2382,7 @@ POST(sys_freebsd7_shmctl) POST_MEM_WRITE( ARG3, sizeof(struct vki_shmid_ds_old) ); } } +#endif // SYS_shmdt 230 // int shmdt(const void *addr); @@ -6264,7 +6270,7 @@ PRE(sys_aio_mlock) } // SYS_procctl 544 -// amd64 / x86 +// amd64 / x86 / arm64 // SYS_ppoll 545 // int ppoll(struct pollfd fds[], nfds_t nfds, @@ -7451,18 +7457,24 @@ const SyscallTableEntry ML_(syscall_table)[] = { // netbsd newreboot 208 GENXY(__NR_poll, sys_poll), // 209 +#if !defined(VGP_arm64_freebsd) BSDXY(__NR_freebsd7___semctl, sys_freebsd7___semctl), // 220 +#endif BSDX_(__NR_semget, sys_semget), // 221 BSDX_(__NR_semop, sys_semop), // 222 // obs semconfig 223 +#if !defined(VGP_arm64_freebsd) BSDXY(__NR_freebsd7_msgctl, sys_freebsd7_msgctl), // 224 +#endif BSDX_(__NR_msgget, sys_msgget), // 225 BSDX_(__NR_msgsnd, sys_msgsnd), // 226 BSDXY(__NR_msgrcv, sys_msgrcv), // 227 BSDXY(__NR_shmat, sys_shmat), // 228 +#if !defined(VGP_arm64_freebsd) BSDXY(__NR_freebsd7_shmctl, sys_freebsd7_shmctl), // 229 +#endif BSDXY(__NR_shmdt, sys_shmdt), // 230 BSDX_(__NR_shmget, sys_shmget), // 231 diff --git a/coregrind/m_syswrap/syswrap-x86-freebsd.c b/coregrind/m_syswrap/syswrap-x86-freebsd.c index 069af4c2d..a75d298fc 100644 --- a/coregrind/m_syswrap/syswrap-x86-freebsd.c +++ b/coregrind/m_syswrap/syswrap-x86-freebsd.c @@ -1307,12 +1307,8 @@ POST(sys_wait6) } } -// the man page is inconsistent for the last argument -// See https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=247386 -// will stick to 'arg' for simplicity - // SYS_procctl 544 -// int procctl(idtype_t idtype, id_t id, int cmd, void *arg); +// int procctl(idtype_t idtype, id_t id, int cmd, void *data); PRE(sys_procctl) { PRINT("sys_procctl ( %" FMT_REGWORD "d, %llu, %" FMT_REGWORD"d, %#" FMT_REGWORD "x )", @@ -1320,7 +1316,7 @@ PRE(sys_procctl) PRE_REG_READ5(int, "procctl", vki_idtype_t, idtype, vki_uint32_t, MERGE64_FIRST(id), vki_uint32_t, MERGE64_SECOND(id), - int, cmd, void *, arg); + int, cmd, void *, data); switch (ARG4) { case VKI_PROC_ASLR_CTL: case VKI_PROC_SPROTECT: @@ -1330,13 +1326,13 @@ PRE(sys_procctl) case VKI_PROC_STACKGAP_CTL: case VKI_PROC_NO_NEW_PRIVS_CTL: case VKI_PROC_WXMAP_CTL: - PRE_MEM_READ("procctl(arg)", ARG5, sizeof(int)); + PRE_MEM_READ("procctl(data)", ARG5, sizeof(int)); break; case VKI_PROC_REAP_STATUS: - PRE_MEM_READ("procctl(arg)", ARG5, sizeof(struct vki_procctl_reaper_status)); + PRE_MEM_READ("procctl(data)", ARG5, sizeof(struct vki_procctl_reaper_status)); break; case VKI_PROC_REAP_GETPIDS: - PRE_MEM_READ("procctl(arg)", ARG5, sizeof(struct vki_procctl_reaper_pids)); + PRE_MEM_READ("procctl(data)", ARG5, sizeof(struct vki_procctl_reaper_pids)); break; case VKI_PROC_REAP_KILL: /* The first three fields are reads @@ -1350,15 +1346,15 @@ PRE(sys_procctl) * * There is also a pad field */ - PRE_MEM_READ("procctl(arg)", ARG5, sizeof(int) + sizeof(u_int) + sizeof(vki_pid_t)); - PRE_MEM_WRITE("procctl(arg)", ARG5+offsetof(struct vki_procctl_reaper_kill, rk_killed), sizeof(u_int) + sizeof(vki_pid_t)); + PRE_MEM_READ("procctl(data)", ARG5, sizeof(int) + sizeof(u_int) + sizeof(vki_pid_t)); + PRE_MEM_WRITE("procctl(data)", ARG5+offsetof(struct vki_procctl_reaper_kill, rk_killed), sizeof(u_int) + sizeof(vki_pid_t)); break; case VKI_PROC_ASLR_STATUS: case VKI_PROC_PDEATHSIG_STATUS: case VKI_PROC_STACKGAP_STATUS: case VKI_PROC_TRAPCAP_STATUS: case VKI_PROC_TRACE_STATUS: - PRE_MEM_WRITE("procctl(arg)", ARG5, sizeof(int)); + PRE_MEM_WRITE("procctl(data)", ARG5, sizeof(int)); case VKI_PROC_REAP_ACQUIRE: case VKI_PROC_REAP_RELEASE: default: diff --git a/include/vki/vki-scnums-freebsd.h b/include/vki/vki-scnums-freebsd.h index 399f14e5c..62093a6c2 100644 --- a/include/vki/vki-scnums-freebsd.h +++ b/include/vki/vki-scnums-freebsd.h @@ -253,16 +253,22 @@ #define __NR_futimes 206 #define __NR_getpgid 207 #define __NR_poll 209 +#if !defined(VGP_arm64_freebsd) #define __NR_freebsd7___semctl 220 +#endif #define __NR_semget 221 #define __NR_semop 222 /* obs semconfig 223 */ +#if !defined(VGP_arm64_freebsd) #define __NR_freebsd7_msgctl 224 +#endif #define __NR_msgget 225 #define __NR_msgsnd 226 #define __NR_msgrcv 227 #define __NR_shmat 228 +#if !defined(VGP_arm64_freebsd) #define __NR_freebsd7_shmctl 229 +#endif #define __NR_shmdt 230 #define __NR_shmget 231 #define __NR_clock_gettime 232 diff --git a/memcheck/tests/freebsd/scalar.c b/memcheck/tests/freebsd/scalar.c index bdacf23e0..c76db8ecd 100644 --- a/memcheck/tests/freebsd/scalar.c +++ b/memcheck/tests/freebsd/scalar.c @@ -781,7 +781,10 @@ int main(void) SY(SYS_poll, &fds, 1, 1); SUCC; } -#if defined(SYS_freebsd7___semctl) +// On aarch64 this is defined in the header but +// the kernel returns ENOSYS +// The aarch64 port postdates FreeBSD 7 +#if defined(SYS_freebsd7___semctl) && !defined(VGP_arm64_freebsd) /* SYS_freebsd7___semctl 220 */ GO(SYS_freebsd7___semctl, "(IPC_STAT) 4s 1m"); SY(SYS_freebsd7___semctl, x0, x0, x0+IPC_STAT, x0+1); FAIL; @@ -800,7 +803,7 @@ int main(void) /* unimpl semconfig 223 */ -#if defined(SYS_freebsd7_msgctl) +#if defined(SYS_freebsd7_msgctl) && !defined(VGP_arm64_freebsd) /* SYS_freebsd7_msgctl 224 */ GO(SYS_freebsd7_msgctl, "(set) 3s 1m"); SY(SYS_freebsd7_msgctl, x0, x0+1, x0); FAIL; @@ -825,7 +828,7 @@ int main(void) GO(SYS_shmat, "3s 0m"); SY(SYS_shmat, x0, x0, x0); FAIL; -#if defined(SYS_freebsd7_shmctl) +#if defined(SYS_freebsd7_shmctl) && !defined(VGP_arm64_freebsd) /* SYS_freebsd7_shmctl 229 */ GO(SYS_freebsd7_shmctl, "3s 0m"); SY(SYS_freebsd7_shmctl, x0, x0, x0); FAIL;