2016-04-27 08:06:06 +03:00
/*
* Copyright ( c ) 2003 - 2007 Ulrich Drepper < drepper @ redhat . com >
* Copyright ( c ) 2005 - 2016 Dmitry V . Levin < ldv @ altlinux . org >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# include "defs.h"
2016-05-08 02:02:36 +03:00
static bool
print_node ( struct tcb * tcp , void * elem_buf , size_t elem_size , void * data )
{
if ( elem_size < sizeof ( long ) ) {
tprintf ( " %#0*x " , ( int ) elem_size * 2 + 2 ,
* ( unsigned int * ) elem_buf ) ;
} else {
tprintf ( " %#0*lx " , ( int ) elem_size * 2 + 2 ,
* ( unsigned long * ) elem_buf ) ;
}
return true ;
}
2016-04-27 08:06:06 +03:00
static void
2016-04-28 01:02:26 +03:00
print_nodemask ( struct tcb * tcp , unsigned long addr , unsigned long maxnodes )
2016-04-27 08:06:06 +03:00
{
2016-05-08 02:02:36 +03:00
const unsigned long nmemb =
2016-04-28 01:02:26 +03:00
( maxnodes + 8 * current_wordsize - 2 ) / ( 8 * current_wordsize ) ;
2016-05-08 02:02:36 +03:00
if ( nmemb < maxnodes / ( 8 * current_wordsize ) | |
( maxnodes & & ! nmemb ) ) {
2016-04-28 01:02:26 +03:00
printaddr ( addr ) ;
return ;
}
2016-05-08 02:02:36 +03:00
unsigned long buf ;
print_array ( tcp , addr , nmemb , & buf , current_wordsize ,
umoven_or_printaddr , print_node , 0 ) ;
2016-04-27 08:06:06 +03:00
}
SYS_FUNC ( migrate_pages )
{
2016-04-28 04:19:19 +03:00
tprintf ( " %d, %lu, " , ( int ) tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ) ;
2016-04-28 01:02:26 +03:00
print_nodemask ( tcp , tcp - > u_arg [ 2 ] , tcp - > u_arg [ 1 ] ) ;
2016-04-28 04:19:19 +03:00
tprints ( " , " ) ;
2016-04-28 01:02:26 +03:00
print_nodemask ( tcp , tcp - > u_arg [ 3 ] , tcp - > u_arg [ 1 ] ) ;
2016-04-27 08:06:06 +03:00
return RVAL_DECODED ;
}
# include "xlat/policies.h"
# include "xlat/mbindflags.h"
SYS_FUNC ( mbind )
{
printaddr ( tcp - > u_arg [ 0 ] ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 1 ] ) ;
2016-05-17 02:13:04 +03:00
printxval_long ( policies , tcp - > u_arg [ 2 ] , " MPOL_??? " ) ;
2016-04-27 08:06:06 +03:00
tprints ( " , " ) ;
2016-04-28 01:02:26 +03:00
print_nodemask ( tcp , tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 4 ] ) ;
2016-04-27 08:06:06 +03:00
printflags ( mbindflags , tcp - > u_arg [ 5 ] , " MPOL_??? " ) ;
return RVAL_DECODED ;
}
SYS_FUNC ( set_mempolicy )
{
printxval ( policies , tcp - > u_arg [ 0 ] , " MPOL_??? " ) ;
2016-04-28 01:02:26 +03:00
tprints ( " , " ) ;
print_nodemask ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , %lu " , tcp - > u_arg [ 2 ] ) ;
2016-04-27 08:06:06 +03:00
return RVAL_DECODED ;
}
# include "xlat/mempolicyflags.h"
SYS_FUNC ( get_mempolicy )
{
if ( exiting ( tcp ) ) {
int pol ;
2016-04-28 01:36:07 +03:00
if ( ! umove_or_printaddr ( tcp , tcp - > u_arg [ 0 ] , & pol ) ) {
tprints ( " [ " ) ;
2016-04-27 08:06:06 +03:00
printxval ( policies , pol , " MPOL_??? " ) ;
2016-04-28 01:36:07 +03:00
tprints ( " ] " ) ;
}
2016-04-27 08:06:06 +03:00
tprints ( " , " ) ;
2016-04-28 01:02:26 +03:00
print_nodemask ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
2016-04-27 08:06:06 +03:00
printaddr ( tcp - > u_arg [ 3 ] ) ;
tprints ( " , " ) ;
2016-05-17 02:15:06 +03:00
printflags_long ( mempolicyflags , tcp - > u_arg [ 4 ] , " MPOL_??? " ) ;
2016-04-27 08:06:06 +03:00
}
return 0 ;
}
# include "xlat/move_pages_flags.h"
2016-05-08 02:02:36 +03:00
static bool
print_addr ( struct tcb * tcp , void * elem_buf , size_t elem_size , void * data )
2016-04-27 08:06:06 +03:00
{
2016-05-08 02:02:36 +03:00
unsigned long addr ;
2016-04-29 20:26:56 +03:00
2016-05-08 02:02:36 +03:00
if ( elem_size < sizeof ( long ) ) {
addr = * ( unsigned int * ) elem_buf ;
} else {
addr = * ( unsigned long * ) elem_buf ;
2016-04-29 20:26:56 +03:00
}
2016-05-08 02:02:36 +03:00
printaddr ( addr ) ;
return true ;
2016-04-29 20:26:56 +03:00
}
2016-05-08 02:02:36 +03:00
static bool
print_status ( struct tcb * tcp , void * elem_buf , size_t elem_size , void * data )
2016-04-29 20:26:56 +03:00
{
2016-05-08 02:02:36 +03:00
const int status = * ( int * ) elem_buf ;
2016-04-29 20:26:56 +03:00
if ( status < 0 & & ( unsigned ) - status < nerrnos )
tprintf ( " %s " , errnoent [ - status ] ) ;
else
tprintf ( " %d " , status ) ;
2016-05-08 02:02:36 +03:00
return true ;
2016-04-29 20:26:56 +03:00
}
2016-05-08 02:02:36 +03:00
static bool
print_int ( struct tcb * tcp , void * elem_buf , size_t elem_size , void * data )
2016-04-29 20:26:56 +03:00
{
2016-05-08 02:02:36 +03:00
tprintf ( " %d " , * ( int * ) elem_buf ) ;
2016-04-29 20:26:56 +03:00
2016-05-08 02:02:36 +03:00
return true ;
2016-04-29 20:26:56 +03:00
}
SYS_FUNC ( move_pages )
{
const unsigned long npages = tcp - > u_arg [ 1 ] ;
2016-05-08 02:02:36 +03:00
long buf ;
2016-04-29 20:26:56 +03:00
if ( entering ( tcp ) ) {
tprintf ( " %d, %lu, " , ( int ) tcp - > u_arg [ 0 ] , npages ) ;
2016-05-08 02:02:36 +03:00
print_array ( tcp , tcp - > u_arg [ 2 ] , npages , & buf , current_wordsize ,
umoven_or_printaddr , print_addr , 0 ) ;
2016-04-29 20:26:56 +03:00
tprints ( " , " ) ;
2016-05-08 02:02:36 +03:00
print_array ( tcp , tcp - > u_arg [ 3 ] , npages , & buf , sizeof ( int ) ,
umoven_or_printaddr , print_int , 0 ) ;
2016-04-29 20:26:56 +03:00
tprints ( " , " ) ;
2016-04-27 08:06:06 +03:00
} else {
2016-05-08 02:02:36 +03:00
print_array ( tcp , tcp - > u_arg [ 4 ] , npages , & buf , sizeof ( int ) ,
umoven_or_printaddr , print_status , 0 ) ;
2016-04-29 20:26:56 +03:00
tprints ( " , " ) ;
2016-04-27 08:06:06 +03:00
printflags ( move_pages_flags , tcp - > u_arg [ 5 ] , " MPOL_??? " ) ;
}
return 0 ;
}