Skip to content

Commit cf5c887

Browse files
author
iraisr
committed
Solaris syscall: Add support for pset family (207).
Provide scalar tests as well. Fixes BZ #353398. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15700 a5019735-40e9-0310-863c-91ae7b9d1cf9
1 parent 8f8d720 commit cf5c887

File tree

7 files changed

+596
-3
lines changed

7 files changed

+596
-3
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ where XXXXXX is the bug number as listed below.
3434
353083 arm64 doesn't implement various xattr system calls
3535
353084 arm64 doesn't support sigpending system call
3636
353370 don't advertise RDRAND in cpuid for Core-i7-4910-like avx2 machine
37+
353398 WARNING: unhandled amd64-solaris syscall: 207
3738

3839

3940

configure.ac

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3142,6 +3142,30 @@ AC_MSG_RESULT([no])
31423142
AM_CONDITIONAL(SOLARIS_TSOL_CLEARANCE, test x$solaris_tsol_clearance = xyes)
31433143

31443144

3145+
# Solaris-specific check determining if the new pset() syscall subcode
3146+
# PSET_GET_NAME is available. This subcode was added in Solaris 12 but
3147+
# is missing on illumos and Solaris 11.
3148+
#
3149+
# C-level symbol: SOLARIS_PSET_GET_NAME
3150+
# Automake-level symbol: SOLARIS_PSET_GET_NAME
3151+
#
3152+
AC_MSG_CHECKING([for PSET_GET_NAME (Solaris-specific)])
3153+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
3154+
#include <sys/pset.h>
3155+
]], [[
3156+
return !(PSET_GET_NAME);
3157+
]])], [
3158+
solaris_pset_get_name=yes
3159+
AC_MSG_RESULT([yes])
3160+
AC_DEFINE([SOLARIS_PSET_GET_NAME], 1,
3161+
[Define to 1 if you have the `PSET_GET_NAME' constants.])
3162+
], [
3163+
solaris_pset_get_name=no
3164+
AC_MSG_RESULT([no])
3165+
])
3166+
AM_CONDITIONAL(SOLARIS_PSET_GET_NAME, test x$solaris_pset_get_name = xyes)
3167+
3168+
31453169
# Solaris-specific check determining if the utimesys() syscall is
31463170
# available (on illumos and older Solaris).
31473171
#
@@ -3450,6 +3474,7 @@ AM_CONDITIONAL(SOLARIS_FREALPATHAT_SYSCALL, false)
34503474
AM_CONDITIONAL(SOLARIS_UUIDSYS_SYSCALL, false)
34513475
AM_CONDITIONAL(SOLARIS_TNDB_GET_TNIP, false)
34523476
AM_CONDITIONAL(SOLARIS_TSOL_CLEARANCE, false)
3477+
AM_CONDITIONAL(SOLARIS_PSET_GET_NAME, false)
34533478
AM_CONDITIONAL(SOLARIS_UTIMESYS_SYSCALL, false)
34543479
AM_CONDITIONAL(SOLARIS_UTIMENSAT_SYSCALL, false)
34553480
AM_CONDITIONAL(SOLARIS_SPAWN_SYSCALL, false)

coregrind/m_syswrap/syswrap-solaris.c

Lines changed: 207 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,7 @@ DECL_TEMPLATE(solaris, sys_timer_getoverrun);
10351035
DECL_TEMPLATE(solaris, sys_facl);
10361036
DECL_TEMPLATE(solaris, sys_door);
10371037
DECL_TEMPLATE(solaris, sys_schedctl);
1038+
DECL_TEMPLATE(solaris, sys_pset);
10381039
DECL_TEMPLATE(solaris, sys_resolvepath);
10391040
DECL_TEMPLATE(solaris, sys_lwp_mutex_timedlock);
10401041
DECL_TEMPLATE(solaris, sys_lwp_rwlock_sys);
@@ -9115,6 +9116,210 @@ POST(sys_schedctl)
91159116
POST_MEM_WRITE(a, sizeof(struct vki_sc_shared));
91169117
}
91179118

9119+
PRE(sys_pset)
9120+
{
9121+
/* Kernel: int pset(int subcode, long arg1, long arg2, long arg3,
9122+
long arg4); */
9123+
switch (ARG1 /* subcode */) {
9124+
case VKI_PSET_CREATE:
9125+
/* Libc: int pset_create(psetid_t *newpset); */
9126+
PRINT("sys_pset ( %ld, %#lx )", SARG1, ARG2);
9127+
PRE_REG_READ2(long, SC2("pset", "create"), int, subcode,
9128+
vki_psetid_t *, newpset);
9129+
PRE_MEM_WRITE("pset(newpset)", ARG2, sizeof(vki_psetid_t));
9130+
break;
9131+
case VKI_PSET_DESTROY:
9132+
/* Libc: int pset_destroy(psetid_t pset); */
9133+
PRINT("sys_pset ( %ld, %ld )", SARG1, SARG2);
9134+
PRE_REG_READ2(long, SC2("pset", "destroy"), int, subcode,
9135+
vki_psetid_t, pset);
9136+
break;
9137+
case VKI_PSET_ASSIGN:
9138+
/* Libc: int pset_assign(psetid_t pset, processorid_t cpu,
9139+
psetid_t *opset); */
9140+
PRINT("sys_pset ( %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3, ARG4);
9141+
PRE_REG_READ4(long, SC2("pset", "assign"), int, subcode,
9142+
vki_psetid_t, pset, vki_processorid_t, cpu,
9143+
vki_psetid_t *, opset);
9144+
if (ARG4 != 0)
9145+
PRE_MEM_WRITE("pset(opset)", ARG4, sizeof(vki_psetid_t));
9146+
break;
9147+
case VKI_PSET_INFO:
9148+
/* Libc: int pset_info(psetid_t pset, int *type, uint_t *numcpus,
9149+
processorid_t *cpulist); */
9150+
PRINT("sys_pset ( %ld, %ld, %#lx, %#lx, %#lx )", SARG1, SARG2, ARG3,
9151+
ARG4, ARG5);
9152+
PRE_REG_READ5(long, SC2("pset", "info"), int, subcode, vki_psetid_t, pset,
9153+
int *, type, vki_uint_t *, numcpus,
9154+
vki_processorid_t *, cpulist);
9155+
if (ARG3 != 0)
9156+
PRE_MEM_WRITE("pset(type)", ARG3, sizeof(int));
9157+
if (ARG4 != 0)
9158+
PRE_MEM_WRITE("pset(numcpus)", ARG4, sizeof(vki_uint_t));
9159+
if ((ARG4 != 0) && (ARG5 != 0)) {
9160+
vki_uint_t *numcpus = (vki_uint_t *) ARG4;
9161+
if (ML_(safe_to_deref(numcpus, sizeof(vki_uint_t)))) {
9162+
PRE_MEM_WRITE("pset(cpulist)", ARG5,
9163+
*numcpus * sizeof(vki_processorid_t));
9164+
/* If cpulist buffer is not large enough, it will hold only as many
9165+
entries as fit in the buffer. However numcpus will contain the
9166+
real number of cpus which will be greater than originally passed
9167+
in. Stash the original value in unused ARG6. */
9168+
ARG6 = *numcpus;
9169+
}
9170+
}
9171+
break;
9172+
case VKI_PSET_BIND:
9173+
/* Libc: int pset_bind(psetid_t pset, idtype_t idtype, id_t id,
9174+
psetid_t *opset); */
9175+
PRINT("sys_pset ( %ld, %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3,
9176+
SARG4, ARG5);
9177+
PRE_REG_READ5(long, SC2("pset", "bind"), int, subcode, vki_psetid_t, pset,
9178+
vki_idtype_t, idtype, vki_id_t, id, vki_psetid_t *, opset);
9179+
if (ARG5 != 0)
9180+
PRE_MEM_WRITE("pset(opset)", ARG5, sizeof(vki_psetid_t));
9181+
break;
9182+
case VKI_PSET_BIND_LWP:
9183+
/* Libc: int pset_bind_lwp(psetid_t pset, id_t id, pid_t pid,
9184+
psetid_t *opset); */
9185+
PRINT("sys_pset ( %ld, %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3,
9186+
SARG4, ARG5);
9187+
PRE_REG_READ5(long, SC2("pset", "bind_lwp"), int, subcode,
9188+
vki_psetid_t, pset, vki_id_t, id, vki_pid_t, pid,
9189+
vki_psetid_t *, opset);
9190+
if (ARG5 != 0)
9191+
PRE_MEM_WRITE("pset(opset)", ARG5, sizeof(vki_psetid_t));
9192+
break;
9193+
case VKI_PSET_GETLOADAVG:
9194+
/* Libc: int pset_getloadavg(psetid_t pset, double loadavg[],
9195+
int nelem); */
9196+
PRINT("sys_pset ( %ld, %ld, %#lx, %ld )", SARG1, SARG2, ARG3, SARG4);
9197+
PRE_REG_READ4(long, SC2("pset", "getloadavg"), int, subcode,
9198+
vki_psetid_t, pset, double, loadavg[], int, nelem);
9199+
if (ARG3 != 0)
9200+
PRE_MEM_WRITE("pset(loadavg)", ARG3, SARG4 * sizeof(double));
9201+
break;
9202+
case VKI_PSET_LIST:
9203+
/* Libc: int pset_list(psetid_t *psetlist, uint_t *numpsets); */
9204+
PRINT("sys_pset ( %ld, %#lx, %#lx )", SARG1, ARG2, ARG3);
9205+
PRE_REG_READ3(long, SC2("pset", "list"), int, subcode,
9206+
vki_psetid_t *, psetlist, vki_uint_t *, numpsets);
9207+
if (ARG3 != 0)
9208+
PRE_MEM_WRITE("pset(numpsets)", ARG3, sizeof(vki_uint_t));
9209+
if ((ARG2 != 0) && (ARG3 != 0)) {
9210+
vki_uint_t *numpsets = (vki_uint_t *) ARG3;
9211+
if (ML_(safe_to_deref(numpsets, sizeof(vki_uint_t)))) {
9212+
PRE_MEM_WRITE("pset(psetlist)", ARG2,
9213+
*numpsets * sizeof(vki_psetid_t));
9214+
/* If psetlist buffer is not large enough, it will hold only as many
9215+
entries as fit in the buffer. However numpsets will contain the
9216+
real number of processor sets which will be greater than
9217+
originally passed in. Stash the original value in unused ARG6. */
9218+
ARG6 = *numpsets;
9219+
}
9220+
}
9221+
break;
9222+
# if defined(SOLARIS_PSET_GET_NAME)
9223+
case VKI_PSET_GET_NAME:
9224+
/* Libc: int pset_get_name(psetid_t psetid, char *buf, uint_t len); */
9225+
PRINT("sys_pset ( %ld, %ld, %#lx, %ld )", SARG1, SARG2, ARG3, SARG4);
9226+
PRE_REG_READ4(long, SC2("pset", "get_name"), int, subcode,
9227+
vki_psetid_t, pset, char *, buf, vki_uint_t, len);
9228+
PRE_MEM_WRITE("pset(buf)", ARG3, ARG4);
9229+
break;
9230+
# endif /* SOLARIS_PSET_GET_NAME */
9231+
case VKI_PSET_SETATTR:
9232+
/* Libc: int pset_setattr(psetid_t pset, uint_t attr); */
9233+
PRINT("sys_pset ( %ld, %ld, %ld )", SARG1, SARG2, ARG3);
9234+
PRE_REG_READ3(long, SC2("pset", "setattr"), int, subcode,
9235+
vki_psetid_t, pset, vki_uint_t, attr);
9236+
break;
9237+
case VKI_PSET_GETATTR:
9238+
/* Libc: int pset_getattr(psetid_t pset, uint_t *attr); */
9239+
PRINT("sys_pset ( %ld, %ld, %#lx )", SARG1, SARG2, ARG3);
9240+
PRE_REG_READ3(long, SC2("pset", "getattr"), int, subcode,
9241+
vki_psetid_t, pset, vki_uint_t *, attr);
9242+
PRE_MEM_WRITE("pset(attr)", ARG3, sizeof(vki_uint_t));
9243+
break;
9244+
case VKI_PSET_ASSIGN_FORCED:
9245+
/* Libc: int pset_assign_forced(psetid_t pset, processorid_t cpu,
9246+
psetid_t *opset); */
9247+
PRINT("sys_pset ( %ld, %ld, %ld, %#lx )", SARG1, SARG2, SARG3, ARG4);
9248+
PRE_REG_READ4(long, SC2("pset", "assign_forced"), int, subcode,
9249+
vki_psetid_t, pset, vki_processorid_t, cpu,
9250+
vki_psetid_t *, opset);
9251+
if (ARG4 != 0)
9252+
PRE_MEM_WRITE("pset(opset)", ARG4, sizeof(vki_psetid_t));
9253+
break;
9254+
default:
9255+
VG_(unimplemented)("Syswrap of pset syscall with subcode %ld.", SARG1);
9256+
/*NOTREACHED*/
9257+
break;
9258+
}
9259+
}
9260+
9261+
POST(sys_pset)
9262+
{
9263+
switch (ARG1 /*subcode*/) {
9264+
case VKI_PSET_CREATE:
9265+
POST_MEM_WRITE(ARG2, sizeof(vki_psetid_t));
9266+
break;
9267+
case VKI_PSET_DESTROY:
9268+
break;
9269+
case VKI_PSET_ASSIGN:
9270+
if (ARG4 != 0)
9271+
POST_MEM_WRITE(ARG4, sizeof(vki_psetid_t));
9272+
break;
9273+
case VKI_PSET_INFO:
9274+
if (ARG3 != 0)
9275+
POST_MEM_WRITE(ARG3, sizeof(int));
9276+
if (ARG4 != 0)
9277+
POST_MEM_WRITE(ARG4, sizeof(vki_uint_t));
9278+
if ((ARG4 != 0) && (ARG5 != 0)) {
9279+
vki_uint_t *numcpus = (vki_uint_t *) ARG4;
9280+
POST_MEM_WRITE(ARG5, MIN(*numcpus, ARG6) * sizeof(vki_processorid_t));
9281+
}
9282+
break;
9283+
case VKI_PSET_BIND:
9284+
if (ARG5 != 0)
9285+
POST_MEM_WRITE(ARG5, sizeof(vki_psetid_t));
9286+
break;
9287+
case VKI_PSET_BIND_LWP:
9288+
if (ARG5 != 0)
9289+
POST_MEM_WRITE(ARG5, sizeof(vki_psetid_t));
9290+
break;
9291+
case VKI_PSET_GETLOADAVG:
9292+
if (ARG3 != 0)
9293+
POST_MEM_WRITE(ARG3, MIN(SARG4, VKI_LOADAVG_NSTATS) * sizeof(double));
9294+
break;
9295+
case VKI_PSET_LIST:
9296+
if (ARG3 != 0)
9297+
POST_MEM_WRITE(ARG3, sizeof(vki_uint_t));
9298+
if ((ARG2 != 0) && (ARG3 != 0)) {
9299+
vki_uint_t *numpsets = (vki_uint_t *) ARG3;
9300+
POST_MEM_WRITE(ARG2, MIN(*numpsets, ARG6) * sizeof(vki_psetid_t));
9301+
}
9302+
break;
9303+
# if defined(SOLARIS_PSET_GET_NAME)
9304+
case VKI_PSET_GET_NAME:
9305+
POST_MEM_WRITE(ARG3, VG_(strlen)((HChar *) ARG3) + 1);
9306+
break;
9307+
# endif /* SOLARIS_PSET_GET_NAME */
9308+
case VKI_PSET_SETATTR:
9309+
break;
9310+
case VKI_PSET_GETATTR:
9311+
POST_MEM_WRITE(ARG3, sizeof(vki_uint_t));
9312+
break;
9313+
case VKI_PSET_ASSIGN_FORCED:
9314+
if (ARG4 != 0)
9315+
POST_MEM_WRITE(ARG4, sizeof(vki_psetid_t));
9316+
break;
9317+
default:
9318+
vg_assert(0);
9319+
break;
9320+
}
9321+
}
9322+
91189323
PRE(sys_resolvepath)
91199324
{
91209325
/* int resolvepath(const char *path, char *buf, size_t bufsiz); */
@@ -9408,7 +9613,7 @@ PRE(sys_zone)
94089613
break;
94099614
case VKI_ZONE_LOOKUP:
94109615
/* Libc: zoneid_t zone_lookup(const char *name); */
9411-
PRINT("sys_zone ( %ld, %#lx )", SARG1, ARG2);
9616+
PRINT("sys_zone ( %ld, %#lx(%s) )", SARG1, ARG2, (HChar *) ARG2);
94129617
PRE_REG_READ2(long, SC2("zone", "lookup"), int, cmd,
94139618
const char *, name);
94149619
if (ARG2)
@@ -10197,6 +10402,7 @@ static SyscallTableEntry syscall_table[] = {
1019710402
GENX_(__NR_setreuid, sys_setreuid), /* 202 */
1019810403
GENX_(__NR_setregid, sys_setregid), /* 202 */
1019910404
SOLXY(__NR_schedctl, sys_schedctl), /* 206 */
10405+
SOLXY(__NR_pset, sys_pset), /* 207 */
1020010406
SOLXY(__NR_resolvepath, sys_resolvepath), /* 209 */
1020110407
SOLXY(__NR_lwp_mutex_timedlock, sys_lwp_mutex_timedlock), /* 210 */
1020210408
SOLXY(__NR_lwp_sema_timedwait, sys_lwp_sema_timedwait), /* 211 */

include/vki/vki-scnums-solaris.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@
262262
//#define __NR_install_utrap SYS_install_utrap
263263
//#define __NR_signotify SYS_signotify
264264
#define __NR_schedctl SYS_schedctl
265-
//#define __NR_pset SYS_pset
265+
#define __NR_pset SYS_pset
266266
//#define SYS_sparc_utrap_install
267267
#define __NR_resolvepath SYS_resolvepath
268268
#define __NR_lwp_mutex_timedlock SYS_lwp_mutex_timedlock

include/vki/vki-solaris.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,10 @@ typedef struct vki_kcf_door_arg_s {
581581
#define vki_semid64_ds semid_ds64
582582

583583

584+
#include <sys/loadavg.h>
585+
#define VKI_LOADAVG_NSTATS LOADAVG_NSTATS
586+
587+
584588
#include <sys/lwp.h>
585589
#define VKI_LWP_DAEMON LWP_DAEMON
586590
#define VKI_LWP_FSBASE _LWP_FSBASE
@@ -770,6 +774,24 @@ typedef struct vki_kcf_door_arg_s {
770774
#define vki_procset_t procset_t
771775

772776

777+
#include <sys/pset.h>
778+
#define VKI_PSET_CREATE PSET_CREATE
779+
#define VKI_PSET_DESTROY PSET_DESTROY
780+
#define VKI_PSET_ASSIGN PSET_ASSIGN
781+
#define VKI_PSET_INFO PSET_INFO
782+
#define VKI_PSET_BIND PSET_BIND
783+
#define VKI_PSET_GETLOADAVG PSET_GETLOADAVG
784+
#define VKI_PSET_LIST PSET_LIST
785+
#define VKI_PSET_SETATTR PSET_SETATTR
786+
#define VKI_PSET_GETATTR PSET_GETATTR
787+
#define VKI_PSET_ASSIGN_FORCED PSET_ASSIGN_FORCED
788+
#define VKI_PSET_BIND_LWP PSET_BIND_LWP
789+
#if defined(SOLARIS_PSET_GET_NAME)
790+
#define VKI_PSET_GET_NAME PSET_GET_NAME
791+
#endif /* SOLARIS_PSET_GET_NAME */
792+
#define vki_psetid_t psetid_t
793+
794+
773795
#include <sys/regset.h>
774796
#define vki_prgregset_t prgregset_t
775797

0 commit comments

Comments
 (0)