@@ -1035,6 +1035,7 @@ DECL_TEMPLATE(solaris, sys_timer_getoverrun);
10351035DECL_TEMPLATE (solaris , sys_facl );
10361036DECL_TEMPLATE (solaris , sys_door );
10371037DECL_TEMPLATE (solaris , sys_schedctl );
1038+ DECL_TEMPLATE (solaris , sys_pset );
10381039DECL_TEMPLATE (solaris , sys_resolvepath );
10391040DECL_TEMPLATE (solaris , sys_lwp_mutex_timedlock );
10401041DECL_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+
91189323PRE (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 */
0 commit comments