]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Solaris: Add syscall wrapper for lgrpsys(180)
authorIvo Raisr <ivosh@ivosh.net>
Tue, 14 Feb 2017 10:35:20 +0000 (10:35 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Tue, 14 Feb 2017 10:35:20 +0000 (10:35 +0000)
Fixes BZ#376455.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16224

NEWS
coregrind/m_syswrap/syswrap-solaris.c
include/vki/vki-scnums-solaris.h
include/vki/vki-solaris.h
memcheck/tests/solaris/scalar.c
memcheck/tests/solaris/scalar.stderr.exp

diff --git a/NEWS b/NEWS
index 10b723fae01f6783b910759df6dbff55051906e1..8764802ed8072ec9a85da1fc000779cc79d534ff 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -114,6 +114,7 @@ where XXXXXX is the bug number as listed below.
 375772  +1 error in get_elf_symbol_info() when computing value of 'hi' address
         for ML_(find_rx_mapping)()
 375806  Test helgrind/tests/tc22_exit_w_lock fails with glibc 2.24
+376455  Solaris: unhandled syscall lgrpsys(180)
 
 Release 3.12.0 (20 October 2016)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index 25aa9bf9b7b88b32f2e82aeabeed6c99805ce339..0b88e27187900c34334f85465dd175384b5df34b 100644 (file)
@@ -1025,6 +1025,7 @@ DECL_TEMPLATE(solaris, sys_lwp_cond_signal);
 DECL_TEMPLATE(solaris, sys_lwp_cond_broadcast);
 DECL_TEMPLATE(solaris, sys_pread);
 DECL_TEMPLATE(solaris, sys_pwrite);
+DECL_TEMPLATE(solaris, sys_lgrpsys);
 DECL_TEMPLATE(solaris, sys_rusagesys);
 DECL_TEMPLATE(solaris, sys_port);
 DECL_TEMPLATE(solaris, sys_pollsys);
@@ -7494,6 +7495,53 @@ POST(sys_getpagesizes)
       POST_MEM_WRITE(ARG2, RES * sizeof(vki_size_t));
 }
 
+PRE(sys_lgrpsys)
+{
+   /* Kernel: int lgrpsys(int subcode, long ia, void *ap); */
+   switch (ARG1 /*subcode*/) {
+   case VKI_LGRP_SYS_MEMINFO:
+      PRINT("sys_lgrpsys ( %ld, %ld, %#lx )", SARG1, SARG2, ARG3);
+      PRE_REG_READ3(long, SC2("lgrpsys", "meminfo"), int, subcode,
+                    int, addr_count, vki_meminfo_t *, minfo);
+      PRE_MEM_READ("lgrpsys(minfo)", ARG3, sizeof(vki_meminfo_t));
+
+      if (ML_(safe_to_deref)((vki_meminfo_t *) ARG3, sizeof(vki_meminfo_t))) {
+         vki_meminfo_t *minfo = (vki_meminfo_t *) ARG3;
+         PRE_MEM_READ("lgrpsys(minfo->mi_inaddr)",
+                      (Addr) minfo->mi_inaddr, SARG2 * sizeof(vki_uint64_t));
+         PRE_MEM_READ("lgrpsys(minfo->mi_info_req)", (Addr) minfo->mi_info_req,
+                      minfo->mi_info_count * sizeof(vki_uint_t));
+         PRE_MEM_WRITE("lgrpsys(minfo->mi_outdata)", (Addr) minfo->mi_outdata,
+                       SARG2 * minfo->mi_info_count * sizeof(vki_uint64_t));
+         PRE_MEM_WRITE("lgrpsys(minfo->mi_validity)",
+                       (Addr) minfo->mi_validity, SARG2 * sizeof(vki_uint_t));
+      }
+      break;
+   default:
+      VG_(unimplemented)("Syswrap of the lgrpsys call with subcode %ld.",
+                         SARG1);
+      /*NOTREACHED*/
+      break;
+   }
+}
+
+POST(sys_lgrpsys)
+{
+   switch (ARG1 /*subcode*/) {
+   case VKI_LGRP_SYS_MEMINFO:
+      {
+         vki_meminfo_t *minfo = (vki_meminfo_t *) ARG3;
+         POST_MEM_WRITE((Addr) minfo->mi_outdata,
+                        SARG2 * minfo->mi_info_count * sizeof(vki_uint64_t));
+         POST_MEM_WRITE((Addr) minfo->mi_validity, SARG2 * sizeof(vki_uint_t));
+      }
+      break;
+   default:
+      vg_assert(0);
+      break;
+   }
+}
+
 PRE(sys_rusagesys)
 {
    /* Kernel: int rusagesys(int code, void *arg1, void *arg2,
@@ -7554,7 +7602,6 @@ POST(sys_rusagesys)
       vg_assert(0);
       break;
    }
-
 }
 
 PRE(sys_port)
@@ -10864,6 +10911,7 @@ static SyscallTableEntry syscall_table[] = {
 #if defined(VGP_x86_solaris)
    PLAX_(__NR_llseek,               sys_llseek32),              /* 175 */
 #endif /* VGP_x86_solaris */
+   SOLXY(__NR_lgrpsys,              sys_lgrpsys),               /* 180 */
    SOLXY(__NR_rusagesys,            sys_rusagesys),             /* 181 */
    SOLXY(__NR_port,                 sys_port),                  /* 182 */
    SOLXY(__NR_pollsys,              sys_pollsys),               /* 183 */
index a788801da62515a9d85f66623482eef493e8c958..4422bd401f0f3d7e8bff90aa9431d1c71601f535 100644 (file)
 //#define __NR_brand                      SYS_brand
 //#define __NR_kaio                       SYS_kaio
 //#define __NR_cpc                        SYS_cpc
-//#define __NR_lgrpsys                    SYS_lgrpsys
-//#define __NR_meminfosys                 SYS_meminfosys /* = SYS_lgrpsys */
+#define __NR_lgrpsys                    SYS_lgrpsys
 #define __NR_rusagesys                  SYS_rusagesys
 #define __NR_port                       SYS_port
 #define __NR_pollsys                    SYS_pollsys
index eb6d82a8a8c359a2b180c7af6bf56ba246100679..8bbc343f86f9b01f8069d984c99e8497c23739a5 100644 (file)
@@ -604,6 +604,21 @@ typedef struct vki_kcf_door_arg_s {
 #define vki_semid64_ds semid_ds64
 
 
+#include <sys/lgrp_user_impl.h>
+#define VKI_LGRP_SYS_MEMINFO LGRP_SYS_MEMINFO
+#define VKI_LGRP_SYS_GENERATION LGRP_SYS_GENERATION
+#define VKI_LGRP_SYS_VERSION LGRP_SYS_VERSION
+#define VKI_LGRP_SYS_SNAPSHOT LGRP_SYS_SNAPSHOT
+#define VKI_LGRP_SYS_AFFINITY_GET LGRP_SYS_AFFINITY_GET
+#define VKI_LGRP_SYS_AFFINITY_SET LGRP_SYS_AFFINITY_SET
+#define VKI_LGRP_SYS_LATENCY LGRP_SYS_LATENCY
+#define VKI_LGRP_SYS_HOME LGRP_SYS_HOME
+#define VKI_LGRP_SYS_AFF_INHERIT_GET LGRP_SYS_AFF_INHERIT_GET
+#define VKI_LGRP_SYS_AFF_INHERIT_SET LGRP_SYS_AFF_INHERIT_SET
+#define VKI_LGRP_SYS_DEVICE_LGRPS LGRP_SYS_DEVICE_LGRPS
+#define VKI_LGRP_SYS_MAXSOCKETS_GET LGRP_SYS_MAXSOCKETS_GET
+
+
 #include <sys/loadavg.h>
 #define VKI_LOADAVG_NSTATS LOADAVG_NSTATS
 
@@ -643,6 +658,8 @@ typedef struct vki_kcf_door_arg_s {
 #define VKI_MC_UNLOCKAS MC_UNLOCKAS
 #define VKI_MC_HAT_ADVISE MC_HAT_ADVISE
 
+#define vki_meminfo_t meminfo_t
+
 
 #include <sys/mntio.h>
 #define VKI_MNTIOC_GETEXTMNTENT MNTIOC_GETEXTMNTENT
index c96b6626abe844a58ef4a05b2764f0767d5ab8cf..36188b744a00178075f8e3a53632bf5c763a5c83 100644 (file)
@@ -9,6 +9,7 @@
 #include <sys/door.h>
 #include <sys/fcntl.h>
 #include <sys/fstyp.h>
+#include <sys/lgrp_user_impl.h>
 #include <sys/mman.h>
 #include <sys/modctl.h>
 #include <sys/mount.h>
@@ -700,6 +701,34 @@ static void sys_modctl3(void)
    SY(SYS_modctl, x0 + MODINFO, x0 + 1, x0 - 1); FAIL;
 }
 
+__attribute__((noinline))
+static void sys_lgrpsys(void)
+{
+   GO(SYS_lgrpsys, "(LGRP_SYS_MEMINFO) 3s 1m");
+   SY(SYS_lgrpsys, x0 + LGRP_SYS_MEMINFO, x0 + 0, x0 + 1); FAIL;
+}
+
+__attribute__((noinline))
+static void sys_lgrpsys2(void)
+{
+   GO(SYS_lgrpsys, "(LGRP_SYS_MEMINFO) 3s 1m");
+   SY(SYS_lgrpsys, x0 + LGRP_SYS_MEMINFO, x0 + 1, x0 + 1); FAIL;
+}
+
+__attribute__((noinline))
+static void sys_lgrpsys3(void)
+{
+   meminfo_t minfo;
+   minfo.mi_inaddr = (void *)(x0 + 1);
+   minfo.mi_info_req = (void *)(x0 + 1);
+   minfo.mi_info_count = x0 + 1;
+   minfo.mi_outdata = (void *)(x0 + 1);
+   minfo.mi_validity = (void *)(x0 + 1);
+
+   GO(SYS_lgrpsys, "(LGRP_SYS_MEMINFO) 4s 4m");
+   SY(SYS_lgrpsys, x0 + LGRP_SYS_MEMINFO, x0 + 1, x0 + &minfo); FAIL;
+}
+
 __attribute__((noinline))
 static void sys_rusagesys(void)
 {
@@ -2185,7 +2214,9 @@ int main(void)
    /* XXX Missing wrapper. */
 
    /* SYS_lgrpsys               180 */
-   /* XXX Missing wrapper. */
+   sys_lgrpsys();
+   sys_lgrpsys2();
+   sys_lgrpsys3();
 
    /* SYS_rusagesys             181 */
    sys_rusagesys();
index 274345483e28fe95c22e6a66696883ece267393c..90fac530351517a60ee790e8e1687e80a4db138e 100644 (file)
@@ -2805,6 +2805,70 @@ Syscall param pwrite(buf) points to unaddressable byte(s)
    ...
  Address 0x........ is not stack'd, malloc'd or (recently) free'd
 
+---------------------------------------------------------
+180:             SYS_lgrpsys (LGRP_SYS_MEMINFO) 3s 1m
+---------------------------------------------------------
+Syscall param lgrpsys_meminfo(subcode) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys_meminfo(addr_count) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys_meminfo(minfo) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys(minfo) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+---------------------------------------------------------
+180:             SYS_lgrpsys (LGRP_SYS_MEMINFO) 3s 1m
+---------------------------------------------------------
+Syscall param lgrpsys_meminfo(subcode) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys_meminfo(addr_count) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys_meminfo(minfo) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys(minfo) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+---------------------------------------------------------
+180:             SYS_lgrpsys (LGRP_SYS_MEMINFO) 4s 4m
+---------------------------------------------------------
+Syscall param lgrpsys_meminfo(subcode) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys_meminfo(addr_count) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys_meminfo(minfo) contains uninitialised byte(s)
+   ...
+
+Syscall param lgrpsys(minfo) points to uninitialised byte(s)
+   ...
+ Address 0x........ is on thread 1's stack
+
+Syscall param lgrpsys(minfo->mi_inaddr) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lgrpsys(minfo->mi_info_req) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lgrpsys(minfo->mi_outdata) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lgrpsys(minfo->mi_validity) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
 ---------------------------------------------------------
 181:           SYS_rusagesys (_RUSAGESYS_GETRUSAGE) 2s 1m
 ---------------------------------------------------------