From: Ivo Raisr Date: Tue, 14 Feb 2017 10:35:20 +0000 (+0000) Subject: Solaris: Add syscall wrapper for lgrpsys(180) X-Git-Tag: svn/VALGRIND_3_13_0~197 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0f667376e67084300a02c8e72adeeb24d011719e;p=thirdparty%2Fvalgrind.git Solaris: Add syscall wrapper for lgrpsys(180) Fixes BZ#376455. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16224 --- diff --git a/NEWS b/NEWS index 10b723fae0..8764802ed8 100644 --- 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) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index 25aa9bf9b7..0b88e27187 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -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 */ diff --git a/include/vki/vki-scnums-solaris.h b/include/vki/vki-scnums-solaris.h index a788801da6..4422bd401f 100644 --- a/include/vki/vki-scnums-solaris.h +++ b/include/vki/vki-scnums-solaris.h @@ -237,8 +237,7 @@ //#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 diff --git a/include/vki/vki-solaris.h b/include/vki/vki-solaris.h index eb6d82a8a8..8bbc343f86 100644 --- a/include/vki/vki-solaris.h +++ b/include/vki/vki-solaris.h @@ -604,6 +604,21 @@ typedef struct vki_kcf_door_arg_s { #define vki_semid64_ds semid_ds64 +#include +#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 #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 #define VKI_MNTIOC_GETEXTMNTENT MNTIOC_GETEXTMNTENT diff --git a/memcheck/tests/solaris/scalar.c b/memcheck/tests/solaris/scalar.c index c96b6626ab..36188b744a 100644 --- a/memcheck/tests/solaris/scalar.c +++ b/memcheck/tests/solaris/scalar.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -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(); diff --git a/memcheck/tests/solaris/scalar.stderr.exp b/memcheck/tests/solaris/scalar.stderr.exp index 274345483e..90fac53035 100644 --- a/memcheck/tests/solaris/scalar.stderr.exp +++ b/memcheck/tests/solaris/scalar.stderr.exp @@ -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 ---------------------------------------------------------