]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
FreeBSD: improve internal syscallbyname
authorPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 2 Feb 2023 21:06:38 +0000 (22:06 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 2 Feb 2023 21:06:38 +0000 (22:06 +0100)
Post FreeBSD 12.2 this is a syscall that does everything
(rather than needing an undocumented syscall).

coregrind/m_libcproc.c
coregrind/pub_core_libcproc.h

index b94cabcf1f0d60c4cc4e859333ce1e2b32429c96..55bb7cbf9761bbf2a8800571dc16c71162777c41 100644 (file)
@@ -1194,12 +1194,16 @@ void VG_(do_atfork_child)(ThreadId tid)
 }
 
 /* ---------------------------------------------------------------------
-   FreeBSD sysctlbyname(), modfind(), etc
+   FreeBSD sysctlbyname, getosreldate, is32on64
    ------------------------------------------------------------------ */
 
 #if defined(VGO_freebsd)
 Int VG_(sysctlbyname)(const HChar *name, void *oldp, SizeT *oldlenp, const void *newp, SizeT newlen)
 {
+#if (FREEBSD_VERS >= FREEBSD_12_2)
+   SysRes res = VG_(do_syscall5)(__NR___sysctlbyname, (UWord)name, (UWord)oldp, (UWord)oldlenp, (UWord)newp, (UWord)newlen);
+   return sr_isError(res) ? -1 : sr_Res(res);
+#else
    Int oid[2];
    Int real_oid[10];
    SizeT oidlen;
@@ -1214,6 +1218,7 @@ Int VG_(sysctlbyname)(const HChar *name, void *oldp, SizeT *oldlenp, const void
    oidlen /= sizeof(int);
    error = VG_(sysctl)(real_oid, oidlen, oldp, oldlenp, newp, newlen);
    return error;
+ #endif
 }
 
 Int VG_(getosreldate)(void)
index d63a4f7c47948bbfb963722a62ce518c2bebbe63..ff056ec40851bd926f946ea8e81d2717c5da07c9 100644 (file)
@@ -86,7 +86,7 @@ extern void VG_(do_atfork_parent) ( ThreadId tid );
 extern void VG_(do_atfork_child)  ( ThreadId tid );
 
 #if defined(VGO_freebsd)
-// sysctl, modfind
+// sysctlbyname, getosreldate, is32on64
 extern Int VG_(sysctlbyname)(const HChar *name, void *oldp, SizeT *oldlenp, const void *newp, SizeT newlen);
 extern Int VG_(getosreldate)(void);
 extern Bool VG_(is32on64)(void);