1999-02-19 00:21:36 +00:00
/*
* Copyright ( c ) 1991 , 1992 Paul Kranenburg < pk @ cs . few . eur . nl >
* Copyright ( c ) 1993 Branko Lankester < branko @ hacktic . nl >
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
1999-12-23 14:20:14 +00:00
* Copyright ( c ) 1996 - 1999 Wichert Akkerman < wichert @ cistron . nl >
1999-02-19 00:21:36 +00: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 .
*/
# include "defs.h"
# define _LINUX_SOCKET_H
1999-07-09 18:56:34 +00:00
# define _LINUX_FS_H
1999-02-19 00:21:36 +00:00
2005-02-01 Roland McGrath <roland@redhat.com>
* system.c [LINUX] (MS_MANDLOCK, MS_NOATIME, MS_NODIRATIME, MS_BIND,
MS_MOVE, MS_REC, MS_VERBOSE, MS_POSIXACL, MS_ACTIVE, MS_NOUSER):
New macros.
[LINUX] (mount_flags): Add them.
[LINUX] (sys_mount): If any of (MS_BIND|MS_MOVE|MS_REMOUNT) bits are
set in the flags argument, don't try to fetch the filesystem string.
Fixes RH#141932.
2005-02-02 04:36:11 +00:00
# define MS_RDONLY 1 /* Mount read-only */
# define MS_NOSUID 2 /* Ignore suid and sgid bits */
# define MS_NODEV 4 /* Disallow access to device special files */
# define MS_NOEXEC 8 /* Disallow program execution */
# define MS_SYNCHRONOUS 16 /* Writes are synced at once */
# define MS_REMOUNT 32 /* Alter flags of a mounted FS */
# define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */
# define MS_DIRSYNC 128 /* Directory modifications are synchronous */
# define MS_NOATIME 1024 /* Do not update access times. */
# define MS_NODIRATIME 2048 /* Do not update directory access times */
# define MS_BIND 4096
# define MS_MOVE 8192
# define MS_REC 16384
2007-01-16 15:10:07 +00:00
# define MS_SILENT 32768
2005-02-01 Roland McGrath <roland@redhat.com>
* system.c [LINUX] (MS_MANDLOCK, MS_NOATIME, MS_NODIRATIME, MS_BIND,
MS_MOVE, MS_REC, MS_VERBOSE, MS_POSIXACL, MS_ACTIVE, MS_NOUSER):
New macros.
[LINUX] (mount_flags): Add them.
[LINUX] (sys_mount): If any of (MS_BIND|MS_MOVE|MS_REMOUNT) bits are
set in the flags argument, don't try to fetch the filesystem string.
Fixes RH#141932.
2005-02-02 04:36:11 +00:00
# define MS_POSIXACL (1<<16) /* VFS does not apply the umask */
2007-01-16 15:10:07 +00:00
# define MS_UNBINDABLE (1<<17) /* change to unbindable */
# define MS_PRIVATE (1<<18) /* change to private */
# define MS_SLAVE (1<<19) /* change to slave */
# define MS_SHARED (1<<20) /* change to shared */
2011-02-21 23:04:30 -05:00
# define MS_RELATIME (1<<21)
# define MS_KERNMOUNT (1<<22)
# define MS_I_VERSION (1<<23)
# define MS_STRICTATIME (1<<24)
2013-02-05 19:31:56 +01:00
# define MS_NOSEC (1<<28)
2011-02-21 23:04:30 -05:00
# define MS_BORN (1<<29)
2005-02-01 Roland McGrath <roland@redhat.com>
* system.c [LINUX] (MS_MANDLOCK, MS_NOATIME, MS_NODIRATIME, MS_BIND,
MS_MOVE, MS_REC, MS_VERBOSE, MS_POSIXACL, MS_ACTIVE, MS_NOUSER):
New macros.
[LINUX] (mount_flags): Add them.
[LINUX] (sys_mount): If any of (MS_BIND|MS_MOVE|MS_REMOUNT) bits are
set in the flags argument, don't try to fetch the filesystem string.
Fixes RH#141932.
2005-02-02 04:36:11 +00:00
# define MS_ACTIVE (1<<30)
# define MS_NOUSER (1<<31)
2006-01-12 21:21:06 +00:00
# define MS_MGC_VAL 0xc0ed0000 /* Magic flag number */
2007-01-16 15:10:07 +00:00
# define MS_MGC_MSK 0xffff0000 /* Magic flag mask */
1999-02-19 00:21:36 +00:00
# include <sys/socket.h>
# include <netinet/in.h>
# include <arpa/inet.h>
2009-06-01 09:59:11 +00:00
# ifdef HAVE_LINUX_CAPABILITY_H
2012-03-16 12:02:22 +01:00
# include <linux / capability.h>
1999-02-19 00:21:36 +00:00
# endif
2009-06-01 09:59:11 +00:00
# ifdef HAVE_ASM_CACHECTL_H
2012-03-16 12:02:22 +01:00
# include <asm / cachectl.h>
1999-05-09 00:29:58 +00:00
# endif
2001-04-07 21:37:12 +00:00
# ifdef HAVE_LINUX_USTNAME_H
2012-03-16 12:02:22 +01:00
# include <linux / utsname.h>
2001-04-07 21:37:12 +00:00
# endif
2009-06-01 09:59:11 +00:00
# ifdef HAVE_ASM_SYSMIPS_H
2012-03-16 12:02:22 +01:00
# include <asm / sysmips.h>
2001-04-07 21:37:12 +00:00
# endif
1999-05-27 12:00:57 +00:00
# include <linux/sysctl.h>
2014-02-05 02:09:49 +00:00
# include <linux/personality.h>
1999-05-27 12:00:57 +00:00
2014-04-25 23:30:54 +00:00
# include "xlat/mount_flags.h"
1999-02-19 00:21:36 +00:00
int
2007-01-16 15:10:07 +00:00
sys_mount ( struct tcb * tcp )
1999-02-19 00:21:36 +00:00
{
if ( entering ( tcp ) ) {
2007-01-16 15:10:07 +00:00
int ignore_type = 0 , ignore_data = 0 ;
unsigned long flags = tcp - > u_arg [ 3 ] ;
/* Discard magic */
if ( ( flags & MS_MGC_MSK ) = = MS_MGC_VAL )
flags & = ~ MS_MGC_MSK ;
if ( flags & MS_REMOUNT )
ignore_type = 1 ;
else if ( flags & ( MS_BIND | MS_MOVE ) )
ignore_type = ignore_data = 1 ;
1999-02-19 00:21:36 +00:00
printpath ( tcp , tcp - > u_arg [ 0 ] ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2007-01-16 15:10:07 +00:00
1999-02-19 00:21:36 +00:00
printpath ( tcp , tcp - > u_arg [ 1 ] ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2007-01-16 15:10:07 +00:00
if ( ignore_type & & tcp - > u_arg [ 2 ] )
2005-02-01 Roland McGrath <roland@redhat.com>
* system.c [LINUX] (MS_MANDLOCK, MS_NOATIME, MS_NODIRATIME, MS_BIND,
MS_MOVE, MS_REC, MS_VERBOSE, MS_POSIXACL, MS_ACTIVE, MS_NOUSER):
New macros.
[LINUX] (mount_flags): Add them.
[LINUX] (sys_mount): If any of (MS_BIND|MS_MOVE|MS_REMOUNT) bits are
set in the flags argument, don't try to fetch the filesystem string.
Fixes RH#141932.
2005-02-02 04:36:11 +00:00
tprintf ( " %#lx " , tcp - > u_arg [ 2 ] ) ;
2007-01-16 15:10:07 +00:00
else
printstr ( tcp , tcp - > u_arg [ 2 ] , - 1 ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2007-01-16 15:10:07 +00:00
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 19:02:36 +00:00
printflags ( mount_flags , tcp - > u_arg [ 3 ] , " MS_??? " ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2007-01-16 15:10:07 +00:00
if ( ignore_data & & tcp - > u_arg [ 4 ] )
2006-01-12 21:21:06 +00:00
tprintf ( " %#lx " , tcp - > u_arg [ 4 ] ) ;
2007-01-16 15:10:07 +00:00
else
printstr ( tcp , tcp - > u_arg [ 4 ] , - 1 ) ;
1999-02-19 00:21:36 +00:00
}
return 0 ;
}
2007-01-13 11:15:48 +00:00
# define MNT_FORCE 0x00000001 /* Attempt to forcibily umount */
# define MNT_DETACH 0x00000002 /* Just detach from the tree */
# define MNT_EXPIRE 0x00000004 /* Mark for expiry */
2014-04-25 23:30:54 +00:00
# include "xlat/umount_flags.h"
2007-01-13 11:15:48 +00:00
1999-06-03 14:21:07 +00:00
int
2007-01-13 11:15:48 +00:00
sys_umount2 ( struct tcb * tcp )
1999-06-03 14:21:07 +00:00
{
if ( entering ( tcp ) ) {
printstr ( tcp , tcp - > u_arg [ 0 ] , - 1 ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2007-01-13 11:15:48 +00:00
printflags ( umount_flags , tcp - > u_arg [ 1 ] , " MNT_??? " ) ;
1999-06-03 14:21:07 +00:00
}
return 0 ;
}
2004-08-31 06:48:46 +00:00
/* These are not macros, but enums. We just copy the values by hand
from Linux 2.6 .9 here . */
2014-04-25 23:30:54 +00:00
# include "xlat/personality_options.h"
1999-02-19 00:21:36 +00:00
int
2011-05-30 14:00:14 +02:00
sys_personality ( struct tcb * tcp )
1999-02-19 00:21:36 +00:00
{
if ( entering ( tcp ) )
printxval ( personality_options , tcp - > u_arg [ 0 ] , " PER_??? " ) ;
return 0 ;
}
2012-03-13 15:28:01 +00:00
enum {
SYSLOG_ACTION_CLOSE = 0 ,
SYSLOG_ACTION_OPEN ,
SYSLOG_ACTION_READ ,
SYSLOG_ACTION_READ_ALL ,
SYSLOG_ACTION_READ_CLEAR ,
SYSLOG_ACTION_CLEAR ,
SYSLOG_ACTION_CONSOLE_OFF ,
SYSLOG_ACTION_CONSOLE_ON ,
SYSLOG_ACTION_CONSOLE_LEVEL ,
SYSLOG_ACTION_SIZE_UNREAD ,
SYSLOG_ACTION_SIZE_BUFFER
} ;
2014-04-25 23:30:54 +00:00
# include "xlat/syslog_action_type.h"
2012-03-13 15:28:01 +00:00
int
sys_syslog ( struct tcb * tcp )
{
int type = tcp - > u_arg [ 0 ] ;
if ( entering ( tcp ) ) {
/* type */
printxval ( syslog_action_type , type , " SYSLOG_ACTION_??? " ) ;
tprints ( " , " ) ;
}
switch ( type ) {
case SYSLOG_ACTION_READ :
case SYSLOG_ACTION_READ_ALL :
case SYSLOG_ACTION_READ_CLEAR :
if ( entering ( tcp ) )
return 0 ;
break ;
default :
if ( entering ( tcp ) ) {
tprintf ( " %#lx, %lu " ,
tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
}
return 0 ;
}
/* bufp */
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_rval ) ;
/* len */
tprintf ( " , %d " , ( int ) tcp - > u_arg [ 2 ] ) ;
return 0 ;
}
1999-05-09 00:29:58 +00:00
# ifdef M68K
2014-04-25 23:30:54 +00:00
# include "xlat/cacheflush_scope.h"
1999-05-09 00:29:58 +00:00
2004-09-04 03:39:20 +00:00
static const struct xlat cacheflush_flags [ ] = {
1999-05-09 00:29:58 +00:00
# ifdef FLUSH_CACHE_BOTH
2014-02-05 01:33:50 +00:00
XLAT ( FLUSH_CACHE_BOTH ) ,
1999-05-09 00:29:58 +00:00
# endif
# ifdef FLUSH_CACHE_DATA
2014-02-05 01:33:50 +00:00
XLAT ( FLUSH_CACHE_DATA ) ,
1999-05-09 00:29:58 +00:00
# endif
# ifdef FLUSH_CACHE_INSN
2014-02-05 01:33:50 +00:00
XLAT ( FLUSH_CACHE_INSN ) ,
1999-05-09 00:29:58 +00:00
# endif
2014-02-05 02:20:51 +00:00
XLAT_END
1999-05-09 00:29:58 +00:00
} ;
int
2011-05-30 14:00:14 +02:00
sys_cacheflush ( struct tcb * tcp )
1999-05-09 00:29:58 +00:00
{
if ( entering ( tcp ) ) {
/* addr */
tprintf ( " %#lx, " , tcp - > u_arg [ 0 ] ) ;
/* scope */
printxval ( cacheflush_scope , tcp - > u_arg [ 1 ] , " FLUSH_SCOPE_??? " ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-09 00:29:58 +00:00
/* flags */
2005-05-31 Dmitry V. Levin <ldv@altlinux.org>
* util.c (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument, "const char *", with similar
meaning to the third argument of printxval().
* defs.h (printxval): Change third argument from "char *" to
"const char *".
(printflags): Add third argument.
* bjm.c (sys_query_module) [LINUX]: Pass third argument to
printflags().
* desc.c (sys_fcntl): Likewise.
(sys_flock) [LOCK_SH]: Likewise.
(print_epoll_event) [HAVE_SYS_EPOLL_H]: Likewise.
* file.c (sys_open): Likewise.
(solaris_open) [LINUXSPARC]: Likewise.
(sys_access): Likewise.
(sys_chflags, sys_fchflags) [FREEBSD]: Likewise.
(realprintstat) [HAVE_LONG_LONG_OFF_T &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(printstat64) [HAVE_STAT64 &&
HAVE_STRUCT_STAT_ST_FLAGS]: Likewise.
(sys_setxattr, sys_fsetxattr): Likewise.
* ipc.c (sys_msgget, sys_msgsnd, sys_msgrcv, sys_semget,
sys_shmget, sys_shmat) [LINUX || SUNOS4 || FREEBSD]: Likewise.
(sys_mq_open) [LINUX]: Likewise.
(printmqattr) [HAVE_MQUEUE_H]: Likewise.
* mem.c (print_mmap) [!HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mmap64) [_LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T]: Likewise.
(sys_mprotect): Likewise.
(sys_mremap, sys_madvise, sys_mlockall) [LINUX]: Likewise.
(sys_msync) [MS_ASYNC]: Likewise.
(sys_mctl) [MC_SYNC]: Likewise.
(sys_remap_file_pages, sys_mbind, sys_get_mempolicy) [LINUX]:
Likewise.
* net.c (printmsghdr) [HAVE_STRUCT_MSGHDR_MSG_CONTROL]: Likewise.
(sys_send, sys_sendto): Likewise.
(sys_sendmsg) [HAVE_SENDMSG]: Likewise.
(sys_recv, sys_recvfrom): Likewise.
(sys_recvmsg) [HAVE_SENDMSG]: Likewise.
(printicmpfilter) [ICMP_FILTER]: Likewise.
* proc.c (proc_ioctl) [SVR4 && !HAVE_MP_PROCFS || FREEBSD]: Likewise.
* process.c (sys_clone) [LINUX]: Likewise.
(printwaitn): Likewise.
(sys_waitid) [SVR4 || LINUX]: Likewise.
* signal.c (sys_sigvec) [SUNOS4 || FREEBSD]: Likewise.
(sys_sigaction): Likewise.
(printcontext) [SVR4]: Likewise.
(print_stack_t) [LINUX) || FREEBSD]: Likewise.
(sys_rt_sigaction) [LINUX]: Likewise.
* sock.c (sock_ioctl) [LINUX]: Likewise.
* stream.c (sys_putmsg, sys_getmsg): Likewise.
(sys_putpmsg) [SYS_putpmsg]: Likewise.
(sys_getpmsg) [SYS_getpmsg]: Likewise.
(sys_poll): Likewise.
(print_transport_message) [TI_BIND]: Likewise.
(stream_ioctl): Likewise.
* system.c (sys_mount, sys_reboot): Likewise.
(sys_cacheflush) [LINUX && M68K]: Likewise.
(sys_capget, sys_capset) [SYS_capget]: Likewise.
* term.c (term_ioctl) [TIOCMGET]: Likewise.
* time.c (sys_clock_nanosleep, sys_timer_settime) [LINUX]:
Likewise.
Fixes RH#159310.
2005-06-01 19:02:36 +00:00
printflags ( cacheflush_flags , tcp - > u_arg [ 2 ] , " FLUSH_CACHE_??? " ) ;
1999-05-09 00:29:58 +00:00
/* len */
tprintf ( " , %lu " , tcp - > u_arg [ 3 ] ) ;
}
return 0 ;
}
# endif /* M68K */
2008-11-10 22:21:41 +00:00
# ifdef BFIN
# include <bfin_sram.h>
2014-04-25 23:30:54 +00:00
# include "xlat/sram_alloc_flags.h"
2008-11-10 22:21:41 +00:00
int
2009-03-23 13:12:46 +00:00
sys_sram_alloc ( struct tcb * tcp )
2008-11-10 22:21:41 +00:00
{
if ( entering ( tcp ) ) {
/* size */
2009-03-23 13:12:46 +00:00
tprintf ( " %lu, " , tcp - > u_arg [ 0 ] ) ;
2008-11-10 22:21:41 +00:00
/* flags */
2013-04-03 00:19:31 -04:00
printflags ( sram_alloc_flags , tcp - > u_arg [ 1 ] , " ???_SRAM " ) ;
2008-11-10 22:21:41 +00:00
}
return 1 ;
}
2010-09-11 15:04:18 -04:00
# include <asm/cachectl.h>
static const struct xlat cacheflush_flags [ ] = {
2014-02-05 01:33:50 +00:00
XLAT ( ICACHE ) ,
XLAT ( DCACHE ) ,
XLAT ( BCACHE ) ,
2014-02-05 02:20:51 +00:00
XLAT_END
2010-09-11 15:04:18 -04:00
} ;
int
sys_cacheflush ( struct tcb * tcp )
{
if ( entering ( tcp ) ) {
/* start addr */
tprintf ( " %#lx, " , tcp - > u_arg [ 0 ] ) ;
/* length */
tprintf ( " %ld, " , tcp - > u_arg [ 1 ] ) ;
/* flags */
printxval ( cacheflush_flags , tcp - > u_arg [ 1 ] , " ?CACHE " ) ;
}
return 0 ;
}
2008-11-10 22:21:41 +00:00
# endif
2010-12-01 14:27:07 +01:00
# ifdef SH
static const struct xlat cacheflush_flags [ ] = {
# ifdef CACHEFLUSH_D_INVAL
2014-02-05 01:33:50 +00:00
XLAT ( CACHEFLUSH_D_INVAL ) ,
2010-12-01 14:27:07 +01:00
# endif
# ifdef CACHEFLUSH_D_WB
2014-02-05 01:33:50 +00:00
XLAT ( CACHEFLUSH_D_WB ) ,
2010-12-01 14:27:07 +01:00
# endif
# ifdef CACHEFLUSH_D_PURGE
2014-02-05 01:33:50 +00:00
XLAT ( CACHEFLUSH_D_PURGE ) ,
2010-12-01 14:27:07 +01:00
# endif
# ifdef CACHEFLUSH_I
2014-02-05 01:33:50 +00:00
XLAT ( CACHEFLUSH_I ) ,
2010-12-01 14:27:07 +01:00
# endif
2014-02-05 02:20:51 +00:00
XLAT_END
2010-12-01 14:27:07 +01:00
} ;
int
sys_cacheflush ( struct tcb * tcp )
{
if ( entering ( tcp ) ) {
/* addr */
tprintf ( " %#lx, " , tcp - > u_arg [ 0 ] ) ;
/* len */
tprintf ( " %lu, " , tcp - > u_arg [ 1 ] ) ;
/* flags */
printflags ( cacheflush_flags , tcp - > u_arg [ 2 ] , " CACHEFLUSH_??? " ) ;
}
return 0 ;
}
# endif /* SH */
1999-07-03 18:53:05 +00:00
# ifdef SYS_capget
2000-04-10 22:22:31 +00:00
2014-04-25 23:30:54 +00:00
# include "xlat/capabilities.h"
2000-04-10 22:22:31 +00:00
2012-03-15 22:58:39 +00:00
# ifndef _LINUX_CAPABILITY_VERSION_1
# define _LINUX_CAPABILITY_VERSION_1 0x19980330
# endif
# ifndef _LINUX_CAPABILITY_VERSION_2
# define _LINUX_CAPABILITY_VERSION_2 0x20071026
# endif
# ifndef _LINUX_CAPABILITY_VERSION_3
# define _LINUX_CAPABILITY_VERSION_3 0x20080522
# endif
2014-04-25 23:30:54 +00:00
# include "xlat/cap_version.h"
2012-03-15 22:58:39 +00:00
static void
print_cap_header ( struct tcb * tcp , unsigned long addr )
{
union { cap_user_header_t p ; long * a ; char * c ; } arg ;
long a [ sizeof ( * arg . p ) / sizeof ( long ) + 1 ] ;
arg . a = a ;
if ( ! addr )
tprints ( " NULL " ) ;
else if ( ! verbose ( tcp ) | |
umoven ( tcp , addr , sizeof ( * arg . p ) , arg . c ) < 0 )
tprintf ( " %#lx " , addr ) ;
else {
tprints ( " { " ) ;
printxval ( cap_version , arg . p - > version ,
" _LINUX_CAPABILITY_VERSION_??? " ) ;
tprintf ( " , %d} " , arg . p - > pid ) ;
}
}
static void
print_cap_data ( struct tcb * tcp , unsigned long addr )
{
union { cap_user_data_t p ; long * a ; char * c ; } arg ;
long a [ sizeof ( * arg . p ) / sizeof ( long ) + 1 ] ;
arg . a = a ;
if ( ! addr )
tprints ( " NULL " ) ;
else if ( ! verbose ( tcp ) | |
( exiting ( tcp ) & & syserror ( tcp ) ) | |
umoven ( tcp , addr , sizeof ( * arg . p ) , arg . c ) < 0 )
tprintf ( " %#lx " , addr ) ;
else {
tprints ( " { " ) ;
printflags ( capabilities , arg . p - > effective , " CAP_??? " ) ;
tprints ( " , " ) ;
printflags ( capabilities , arg . p - > permitted , " CAP_??? " ) ;
tprints ( " , " ) ;
printflags ( capabilities , arg . p - > inheritable , " CAP_??? " ) ;
tprints ( " } " ) ;
}
}
1999-02-19 00:21:36 +00:00
int
2011-05-30 14:00:14 +02:00
sys_capget ( struct tcb * tcp )
1999-02-19 00:21:36 +00:00
{
2012-03-15 22:58:39 +00:00
if ( entering ( tcp ) ) {
print_cap_header ( tcp , tcp - > u_arg [ 0 ] ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2012-03-15 22:58:39 +00:00
} else {
print_cap_data ( tcp , tcp - > u_arg [ 1 ] ) ;
1999-02-19 00:21:36 +00:00
}
return 0 ;
}
int
2011-05-30 14:00:14 +02:00
sys_capset ( struct tcb * tcp )
1999-02-19 00:21:36 +00:00
{
2011-06-07 12:13:24 +02:00
if ( entering ( tcp ) ) {
2012-03-15 22:58:39 +00:00
print_cap_header ( tcp , tcp - > u_arg [ 0 ] ) ;
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
2012-03-15 22:58:39 +00:00
print_cap_data ( tcp , tcp - > u_arg [ 1 ] ) ;
1999-02-19 00:21:36 +00:00
}
return 0 ;
}
# else
2011-05-30 14:00:14 +02:00
int sys_capget ( struct tcb * tcp )
1999-02-19 00:21:36 +00:00
{
return printargs ( tcp ) ;
}
2011-05-30 14:00:14 +02:00
int sys_capset ( struct tcb * tcp )
1999-02-19 00:21:36 +00:00
{
return printargs ( tcp ) ;
}
# endif
2014-04-25 23:30:54 +00:00
# include "xlat/sysctl_root.h"
# include "xlat/sysctl_kern.h"
# include "xlat/sysctl_vm.h"
# include "xlat/sysctl_net.h"
# include "xlat/sysctl_net_core.h"
# include "xlat/sysctl_net_unix.h"
# include "xlat/sysctl_net_ipv4.h"
# include "xlat/sysctl_net_ipv4_route.h"
# include "xlat/sysctl_net_ipv4_conf.h"
# include "xlat/sysctl_net_ipv6.h"
# include "xlat/sysctl_net_ipv6_route.h"
1999-05-27 12:00:57 +00:00
int
2011-05-30 14:00:14 +02:00
sys_sysctl ( struct tcb * tcp )
1999-05-27 12:00:57 +00:00
{
struct __sysctl_args info ;
int * name ;
2005-06-01 19:22:06 +00:00
unsigned long size ;
2011-06-07 12:13:24 +02:00
if ( umove ( tcp , tcp - > u_arg [ 0 ] , & info ) < 0 )
2005-05-26 23:21:09 +00:00
return printargs ( tcp ) ;
2011-06-07 12:13:24 +02:00
size = sizeof ( int ) * ( unsigned long ) info . nlen ;
name = ( size / sizeof ( int ) ! = info . nlen ) ? NULL : malloc ( size ) ;
2005-05-26 23:21:09 +00:00
if ( name = = NULL | |
2005-06-01 19:22:06 +00:00
umoven ( tcp , ( unsigned long ) info . name , size , ( char * ) name ) < 0 ) {
free ( name ) ;
if ( entering ( tcp ) )
2012-05-16 12:20:17 +02:00
tprintf ( " {%p, %d, %p, %p, %p, %lu} " ,
2005-06-01 19:22:06 +00:00
info . name , info . nlen , info . oldval ,
2012-05-16 12:20:17 +02:00
info . oldlenp , info . newval , ( unsigned long ) info . newlen ) ;
2005-05-26 23:21:09 +00:00
return 0 ;
}
1999-05-27 12:00:57 +00:00
if ( entering ( tcp ) ) {
2005-06-01 19:22:06 +00:00
int cnt = 0 , max_cnt ;
1999-05-27 12:00:57 +00:00
2011-09-01 10:00:28 +02:00
tprints ( " {{ " ) ;
1999-05-27 12:00:57 +00:00
if ( info . nlen = = 0 )
goto out ;
printxval ( sysctl_root , name [ 0 ] , " CTL_??? " ) ;
+ + cnt ;
if ( info . nlen = = 1 )
goto out ;
switch ( name [ 0 ] ) {
case CTL_KERN :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_kern , name [ 1 ] , " KERN_??? " ) ;
+ + cnt ;
break ;
case CTL_VM :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_vm , name [ 1 ] , " VM_??? " ) ;
+ + cnt ;
break ;
case CTL_NET :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net , name [ 1 ] , " NET_??? " ) ;
+ + cnt ;
if ( info . nlen = = 2 )
goto out ;
switch ( name [ 1 ] ) {
case NET_CORE :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net_core , name [ 2 ] ,
" NET_CORE_??? " ) ;
break ;
case NET_UNIX :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net_unix , name [ 2 ] ,
" NET_UNIX_??? " ) ;
break ;
case NET_IPV4 :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net_ipv4 , name [ 2 ] ,
" NET_IPV4_??? " ) ;
if ( info . nlen = = 3 )
goto out ;
switch ( name [ 2 ] ) {
case NET_IPV4_ROUTE :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net_ipv4_route ,
name [ 3 ] ,
" NET_IPV4_ROUTE_??? " ) ;
break ;
case NET_IPV4_CONF :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net_ipv4_conf ,
name [ 3 ] ,
" NET_IPV4_CONF_??? " ) ;
break ;
default :
goto out ;
}
break ;
case NET_IPV6 :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net_ipv6 , name [ 2 ] ,
" NET_IPV6_??? " ) ;
if ( info . nlen = = 3 )
goto out ;
switch ( name [ 2 ] ) {
case NET_IPV6_ROUTE :
2011-09-01 10:00:28 +02:00
tprints ( " , " ) ;
1999-05-27 12:00:57 +00:00
printxval ( sysctl_net_ipv6_route ,
name [ 3 ] ,
" NET_IPV6_ROUTE_??? " ) ;
break ;
default :
goto out ;
}
break ;
default :
goto out ;
}
break ;
default :
goto out ;
}
out :
2006-01-12 11:03:46 +00:00
max_cnt = info . nlen ;
if ( abbrev ( tcp ) & & max_cnt > max_strlen )
max_cnt = max_strlen ;
2005-06-01 19:22:06 +00:00
while ( cnt < max_cnt )
1999-05-27 12:00:57 +00:00
tprintf ( " , %x " , name [ cnt + + ] ) ;
2005-06-01 19:22:06 +00:00
if ( cnt < info . nlen )
2011-09-01 10:00:28 +02:00
tprints ( " , ... " ) ;
1999-05-27 12:00:57 +00:00
tprintf ( " }, %d, " , info . nlen ) ;
} else {
2012-05-16 12:23:58 +02:00
size_t oldlen = 0 ;
Fix decoding of sysctl() when oldval fields are NULL
If you call glibc's syscall wrapper like so:
static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
int buffer[2] = { 32768, 61000 };
size_t size = sizeof(buffer);
sysctl(name, 3, 0, 0, buffer, size);
(note that oldval/oldlenp are NULL).
The current strace code complains like so:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, process_vm_readv: Bad address
(nil), 0, 0x7fffe23c3960, 8}) = -1 EACCES (Permission denied)
Since passing NULL for the old values is valid, handle that explicitly.
This also simplifies the code a bit by splitting up the handling of the
new and old args so that we only handle the new args once.
Now the output looks like:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, NULL, 0, 0x7fff8c0c91b0, 8) = -1 EACCES (Permission denied)
* system.c (sys_sysctl): Check if info.oldval is NULL first. Move the
processing of oldlen/info.newval/info.newlen out so they always get
executed. Fix the format strings so we use %lu for unsigned long rather
than a mix of %ld and %lu.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-02-08 19:10:07 -05:00
if ( info . oldval = = NULL ) {
tprints ( " NULL " ) ;
} else if ( umove ( tcp , ( long ) info . oldlenp , & oldlen ) > = 0
& & info . nlen > = 2
& & ( ( name [ 0 ] = = CTL_KERN
& & ( name [ 1 ] = = KERN_OSRELEASE
| | name [ 1 ] = = KERN_OSTYPE
1999-08-29 23:15:07 +00:00
# ifdef KERN_JAVA_INTERPRETER
Fix decoding of sysctl() when oldval fields are NULL
If you call glibc's syscall wrapper like so:
static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
int buffer[2] = { 32768, 61000 };
size_t size = sizeof(buffer);
sysctl(name, 3, 0, 0, buffer, size);
(note that oldval/oldlenp are NULL).
The current strace code complains like so:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, process_vm_readv: Bad address
(nil), 0, 0x7fffe23c3960, 8}) = -1 EACCES (Permission denied)
Since passing NULL for the old values is valid, handle that explicitly.
This also simplifies the code a bit by splitting up the handling of the
new and old args so that we only handle the new args once.
Now the output looks like:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, NULL, 0, 0x7fff8c0c91b0, 8) = -1 EACCES (Permission denied)
* system.c (sys_sysctl): Check if info.oldval is NULL first. Move the
processing of oldlen/info.newval/info.newlen out so they always get
executed. Fix the format strings so we use %lu for unsigned long rather
than a mix of %ld and %lu.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-02-08 19:10:07 -05:00
| | name [ 1 ] = = KERN_JAVA_INTERPRETER
1999-08-29 23:15:07 +00:00
# endif
# ifdef KERN_JAVA_APPLETVIEWER
Fix decoding of sysctl() when oldval fields are NULL
If you call glibc's syscall wrapper like so:
static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
int buffer[2] = { 32768, 61000 };
size_t size = sizeof(buffer);
sysctl(name, 3, 0, 0, buffer, size);
(note that oldval/oldlenp are NULL).
The current strace code complains like so:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, process_vm_readv: Bad address
(nil), 0, 0x7fffe23c3960, 8}) = -1 EACCES (Permission denied)
Since passing NULL for the old values is valid, handle that explicitly.
This also simplifies the code a bit by splitting up the handling of the
new and old args so that we only handle the new args once.
Now the output looks like:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, NULL, 0, 0x7fff8c0c91b0, 8) = -1 EACCES (Permission denied)
* system.c (sys_sysctl): Check if info.oldval is NULL first. Move the
processing of oldlen/info.newval/info.newlen out so they always get
executed. Fix the format strings so we use %lu for unsigned long rather
than a mix of %ld and %lu.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-02-08 19:10:07 -05:00
| | name [ 1 ] = = KERN_JAVA_APPLETVIEWER
1999-08-29 23:15:07 +00:00
# endif
Fix decoding of sysctl() when oldval fields are NULL
If you call glibc's syscall wrapper like so:
static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
int buffer[2] = { 32768, 61000 };
size_t size = sizeof(buffer);
sysctl(name, 3, 0, 0, buffer, size);
(note that oldval/oldlenp are NULL).
The current strace code complains like so:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, process_vm_readv: Bad address
(nil), 0, 0x7fffe23c3960, 8}) = -1 EACCES (Permission denied)
Since passing NULL for the old values is valid, handle that explicitly.
This also simplifies the code a bit by splitting up the handling of the
new and old args so that we only handle the new args once.
Now the output looks like:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, NULL, 0, 0x7fff8c0c91b0, 8) = -1 EACCES (Permission denied)
* system.c (sys_sysctl): Check if info.oldval is NULL first. Move the
processing of oldlen/info.newval/info.newlen out so they always get
executed. Fix the format strings so we use %lu for unsigned long rather
than a mix of %ld and %lu.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-02-08 19:10:07 -05:00
) ) ) ) {
1999-05-27 12:00:57 +00:00
printpath ( tcp , ( size_t ) info . oldval ) ;
} else {
Fix decoding of sysctl() when oldval fields are NULL
If you call glibc's syscall wrapper like so:
static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
int buffer[2] = { 32768, 61000 };
size_t size = sizeof(buffer);
sysctl(name, 3, 0, 0, buffer, size);
(note that oldval/oldlenp are NULL).
The current strace code complains like so:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, process_vm_readv: Bad address
(nil), 0, 0x7fffe23c3960, 8}) = -1 EACCES (Permission denied)
Since passing NULL for the old values is valid, handle that explicitly.
This also simplifies the code a bit by splitting up the handling of the
new and old args so that we only handle the new args once.
Now the output looks like:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, NULL, 0, 0x7fff8c0c91b0, 8) = -1 EACCES (Permission denied)
* system.c (sys_sysctl): Check if info.oldval is NULL first. Move the
processing of oldlen/info.newval/info.newlen out so they always get
executed. Fix the format strings so we use %lu for unsigned long rather
than a mix of %ld and %lu.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-02-08 19:10:07 -05:00
tprintf ( " %p " , info . oldval ) ;
1999-05-27 12:00:57 +00:00
}
Fix decoding of sysctl() when oldval fields are NULL
If you call glibc's syscall wrapper like so:
static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
int buffer[2] = { 32768, 61000 };
size_t size = sizeof(buffer);
sysctl(name, 3, 0, 0, buffer, size);
(note that oldval/oldlenp are NULL).
The current strace code complains like so:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, process_vm_readv: Bad address
(nil), 0, 0x7fffe23c3960, 8}) = -1 EACCES (Permission denied)
Since passing NULL for the old values is valid, handle that explicitly.
This also simplifies the code a bit by splitting up the handling of the
new and old args so that we only handle the new args once.
Now the output looks like:
_sysctl({{CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE, 38}, 3, NULL, 0, 0x7fff8c0c91b0, 8) = -1 EACCES (Permission denied)
* system.c (sys_sysctl): Check if info.oldval is NULL first. Move the
processing of oldlen/info.newval/info.newlen out so they always get
executed. Fix the format strings so we use %lu for unsigned long rather
than a mix of %ld and %lu.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
2013-02-08 19:10:07 -05:00
tprintf ( " , %lu, " , ( unsigned long ) oldlen ) ;
if ( info . newval = = NULL )
tprints ( " NULL " ) ;
else if ( syserror ( tcp ) )
tprintf ( " %p " , info . newval ) ;
else
printpath ( tcp , ( size_t ) info . newval ) ;
tprintf ( " , %lu " , ( unsigned long ) info . newlen ) ;
1999-05-27 12:00:57 +00:00
}
2005-05-26 23:21:09 +00:00
free ( name ) ;
1999-05-27 12:00:57 +00:00
return 0 ;
}
2004-08-31 06:48:46 +00:00
2001-02-19 13:35:53 +00:00
# ifdef MIPS
2001-04-07 21:37:12 +00:00
# ifndef __NEW_UTS_LEN
# define __NEW_UTS_LEN 64
# endif
2014-04-25 23:30:54 +00:00
# include "xlat/sysmips_operations.h"
2001-02-19 13:35:53 +00:00
2011-05-30 14:00:14 +02:00
int sys_sysmips ( struct tcb * tcp )
2001-02-19 13:35:53 +00:00
{
if ( entering ( tcp ) ) {
2001-04-10 10:27:52 +00:00
printxval ( sysmips_operations , tcp - > u_arg [ 0 ] , " ??? " ) ;
2001-02-19 13:35:53 +00:00
if ( ! verbose ( tcp ) ) {
2001-04-10 10:27:52 +00:00
tprintf ( " %ld, %ld, %ld " , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] , tcp - > u_arg [ 3 ] ) ;
2011-06-07 12:13:24 +02:00
} else if ( tcp - > u_arg [ 0 ] = = SETNAME ) {
2001-04-10 10:27:52 +00:00
char nodename [ __NEW_UTS_LEN + 1 ] ;
if ( umovestr ( tcp , tcp - > u_arg [ 1 ] , ( __NEW_UTS_LEN + 1 ) , nodename ) < 0 )
2001-02-19 13:35:53 +00:00
tprintf ( " , %#lx " , tcp - > u_arg [ 1 ] ) ;
else
2012-01-20 11:52:12 +01:00
tprintf ( " , \" %.*s \" " , ( int ) ( __NEW_UTS_LEN + 1 ) , nodename ) ;
2001-04-10 10:27:52 +00:00
} else if ( tcp - > u_arg [ 0 ] = = MIPS_ATOMIC_SET ) {
tprintf ( " , %#lx, 0x%lx " , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
} else if ( tcp - > u_arg [ 0 ] = = MIPS_FIXADE ) {
tprintf ( " , 0x%lx " , tcp - > u_arg [ 1 ] ) ;
2001-02-19 13:35:53 +00:00
} else {
2001-04-10 10:27:52 +00:00
tprintf ( " %ld, %ld, %ld " , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] , tcp - > u_arg [ 3 ] ) ;
2001-02-19 13:35:53 +00:00
}
}
return 0 ;
}
# endif /* MIPS */
2013-02-14 13:26:27 +01:00
# ifdef OR1K
# define OR1K_ATOMIC_SWAP 1
# define OR1K_ATOMIC_CMPXCHG 2
# define OR1K_ATOMIC_XCHG 3
# define OR1K_ATOMIC_ADD 4
# define OR1K_ATOMIC_DECPOS 5
# define OR1K_ATOMIC_AND 6
# define OR1K_ATOMIC_OR 7
# define OR1K_ATOMIC_UMAX 8
# define OR1K_ATOMIC_UMIN 9
2014-04-25 23:30:54 +00:00
# include "xlat/atomic_ops.h"
2013-02-14 13:26:27 +01:00
int sys_or1k_atomic ( struct tcb * tcp )
{
if ( entering ( tcp ) ) {
printxval ( atomic_ops , tcp - > u_arg [ 0 ] , " ??? " ) ;
switch ( tcp - > u_arg [ 0 ] ) {
case OR1K_ATOMIC_SWAP :
tprintf ( " , 0x%lx, 0x%lx " , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
break ;
case OR1K_ATOMIC_CMPXCHG :
tprintf ( " , 0x%lx, %#lx, %#lx " , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ,
tcp - > u_arg [ 3 ] ) ;
break ;
case OR1K_ATOMIC_XCHG :
case OR1K_ATOMIC_ADD :
case OR1K_ATOMIC_AND :
case OR1K_ATOMIC_OR :
case OR1K_ATOMIC_UMAX :
case OR1K_ATOMIC_UMIN :
tprintf ( " , 0x%lx, %#lx " , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
break ;
case OR1K_ATOMIC_DECPOS :
tprintf ( " , 0x%lx " , tcp - > u_arg [ 1 ] ) ;
break ;
default :
break ;
}
}
return RVAL_HEX ;
}
# endif /* OR1K */