2015-12-17 20:56:48 +03:00
/*
* Copyright ( c ) 2015 Dmitry V . Levin < ldv @ altlinux . org >
2017-05-22 20:14:52 +03:00
* Copyright ( c ) 2015 - 2017 The strace developers .
2015-12-17 20:56:48 +03:00
* 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 .
*/
2015-11-22 21:35:27 +03:00
# include "defs.h"
2017-09-16 04:02:16 +03:00
# include "print_fields.h"
2015-11-22 21:35:27 +03:00
# include "xlat/kcmp_types.h"
2017-09-16 04:05:33 +03:00
struct strace_kcmp_epoll_slot {
uint32_t efd ;
uint32_t tfd ;
uint32_t toff ;
} ;
2017-09-16 04:02:16 +03:00
static void
printpidfd ( struct tcb * tcp , pid_t pid , int fd )
{
/*
* XXX We want to use printfd here , but we should figure out which
* process in strace ' s PID NS is referred to first .
*/
tprintf ( " %d " , fd ) ;
}
# define PRINT_FIELD_PIDFD(prefix_, where_, field_, tcp_, pid_) \
do { \
STRACE_PRINTF ( " %s%s= " , ( prefix_ ) , # field_ ) ; \
printpidfd ( ( tcp_ ) , ( pid_ ) , ( where_ ) . field_ ) ; \
} while ( 0 )
2015-11-22 21:35:27 +03:00
SYS_FUNC ( kcmp )
{
pid_t pid1 = tcp - > u_arg [ 0 ] ;
pid_t pid2 = tcp - > u_arg [ 1 ] ;
int type = tcp - > u_arg [ 2 ] ;
2016-12-26 05:28:04 +03:00
kernel_ulong_t idx1 = tcp - > u_arg [ 3 ] ;
kernel_ulong_t idx2 = tcp - > u_arg [ 4 ] ;
2015-11-22 21:35:27 +03:00
tprintf ( " %d, %d, " , pid1 , pid2 ) ;
printxval ( kcmp_types , type , " KCMP_??? " ) ;
2017-06-18 01:23:09 +03:00
switch ( type ) {
2015-11-22 21:35:27 +03:00
case KCMP_FILE :
2017-09-16 04:02:16 +03:00
tprints ( " , " ) ;
printpidfd ( tcp , pid1 , idx1 ) ;
tprints ( " , " ) ;
printpidfd ( tcp , pid1 , idx2 ) ;
2015-11-22 21:35:27 +03:00
break ;
2017-09-16 04:05:33 +03:00
case KCMP_EPOLL_TFD : {
struct strace_kcmp_epoll_slot slot ;
tprints ( " , " ) ;
printpidfd ( tcp , pid1 , idx1 ) ;
tprints ( " , " ) ;
if ( umove_or_printaddr ( tcp , idx2 , & slot ) )
break ;
PRINT_FIELD_PIDFD ( " { " , slot , efd , tcp , pid2 ) ;
PRINT_FIELD_PIDFD ( " , " , slot , tfd , tcp , pid2 ) ;
PRINT_FIELD_U ( " , " , slot , toff ) ;
tprints ( " } " ) ;
break ;
}
2015-11-22 21:35:27 +03:00
case KCMP_FILES :
case KCMP_FS :
case KCMP_IO :
case KCMP_SIGHAND :
case KCMP_SYSVSEM :
case KCMP_VM :
break ;
default :
Use kernel_ulong_t instead of unsigned long long where appropriate
* defs.h (printaddr_ull): Rename to printaddr_klu, change argument
type from unsigned long long to kernel_ulong_t. All callers updated.
(getarg_ull): Rename to getarg_klu, change return value type
from unsigned long long to kernel_ulong_t. All callers updated.
(PRI_kl, PRI_kld, PRI_klu, PRI_klx): New macros.
* bjm.c (SYS_FUNC(init_module)): Print kernel_ulong_t type using
PRI_klu format.
* desc.c (SYS_FUNC(pselect6)): Likewise.
* fadvise.c (SYS_FUNC(fadvise64)): Likewise.
* lookup_dcookie.c (SYS_FUNC(lookup_dcookie)): Likewise.
* mq.c (SYS_FUNC(mq_timedsend), SYS_FUNC(mq_timedreceive)): Likewise.
* kcmp.c (SYS_FUNC(kcmp)): Print kernel_ulong_t type using
PRI_klx format.
* keyctl.c (SYS_FUNC(keyctl)): Likewise.
* pkeys.c (SYS_FUNC(pkey_alloc)): Likewise.
* prctl.c (print_prctl_args, SYS_FUNC(prctl), SYS_FUNC(arch_prctl)):
Print kernel_ulong_t type using PRI_kld, PRI_klu, or PRI_klx format.
* util.c (printaddr_ull): Rename to printaddr_klu, change argument
type from unsigned long long to kernel_ulong_t, print it using
PRI_klx format.
(getarg_ull): Rename to getarg_klu, change return value type
from unsigned long long to kernel_ulong_t, print it using
PRI_klx format.
2016-12-19 19:56:45 +03:00
tprintf ( " , %# " PRI_klx " , %# " PRI_klx , idx1 , idx2 ) ;
2015-11-22 21:35:27 +03:00
}
return RVAL_DECODED ;
}