diff --git a/ChangeLog b/ChangeLog index 5aa3e250..e06a8822 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2004-01-29 John Hughes + + * README-linux: Document method for finding OpenSSI includes. + + * linux/syscallent.h: Add OpenSSI syscalls. + + * linux/syscall.h: Add OpenSSI syscalls. + + * linux/dummy.h: Add OpenSSI syscalls. + + * system.c (tcp;): make sys_ssisys work on Linux. + + * process.c (sys_rfork, sys_rexecve): Add cluster syscalls for Linux. + + * configure.ac: check for cluster/ssisys.h. + 2004-01-13 Roland McGrath * stream.c (internal_stream_ioctl): Fix typo strict -> struct. diff --git a/README-linux b/README-linux index e2f97796..d36eafb1 100644 --- a/README-linux +++ b/README-linux @@ -30,3 +30,16 @@ There are three ways to compile strace with other kernel headers: * you can link /usr/include/linux and /usr/include/asm to the corresponding directories in your kernel source-tree. + +OpenSSI: +-------- + +If you want to compile strace with support for the OpenSSI clustering +software the easy way is to use the CPPFLAGS to point configure to your +ci source code: + +CPPFLAGS="-I path-to-ci/kernel/include" ./configure + +Note that I don't know how to strace across rfork. + + - John Hughes diff --git a/configure.ac b/configure.ac index a60b61f7..03bb7899 100644 --- a/configure.ac +++ b/configure.ac @@ -188,7 +188,7 @@ AC_CHECK_LIB(nsl, main) fi AC_CHECK_FUNCS(sigaction strerror strsignal pread sys_siglist _sys_siglist getdents mctl prctl sendmsg inet_ntop if_indextoname) -AC_CHECK_HEADERS([sys/reg.h sys/filio.h sys/acl.h sys/asynch.h sys/door.h stropts.h sys/conf.h sys/stream.h sys/tihdr.h sys/tiuser.h sys/sysconfig.h ioctls.h sys/ioctl.h sys/ptrace.h termio.h linux/ptrace.h asm/reg.h sys/uio.h sys/aio.h poll.h sys/poll.h sys/vfs.h asm/sysmips.h linux/utsname.h sys/nscsys.h], [], []) +AC_CHECK_HEADERS([sys/reg.h sys/filio.h sys/acl.h sys/asynch.h sys/door.h stropts.h sys/conf.h sys/stream.h sys/tihdr.h sys/tiuser.h sys/sysconfig.h ioctls.h sys/ioctl.h sys/ptrace.h termio.h linux/ptrace.h asm/reg.h sys/uio.h sys/aio.h poll.h sys/poll.h sys/vfs.h asm/sysmips.h linux/utsname.h sys/nscsys.h cluster/ssisys.h], [], []) AC_CHECK_HEADERS([linux/icmp.h linux/in6.h linux/netlink.h linux/if_packet.h], [], [], [#include ]) AC_CHECK_HEADERS([asm/sigcontext.h], [], [], [#include ]) diff --git a/linux/dummy.h b/linux/dummy.h index 2cccdead..c36c3b8a 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -37,6 +37,7 @@ #define sys_bdflush printargs #define sys_sysfs printargs #define sys_afs_syscall printargs +#define sys_migrate printargs /* machine-specific */ #ifndef I386 @@ -44,6 +45,9 @@ #define sys_get_thread_area printargs #define sys_set_thread_area printargs #endif +#ifndef HAVE_CLUSTER_SSISYS_H +#define sys_ssisys printargs +#endif #define sys_sched_setparam printargs #define sys_sched_getparam printargs diff --git a/linux/syscall.h b/linux/syscall.h index 5f5d56e5..49c44216 100644 --- a/linux/syscall.h +++ b/linux/syscall.h @@ -96,6 +96,18 @@ int sys_clock_gettime(), sys_clock_getres(), sys_clock_nanosleep(); int sys_semtimedop(), sys_statfs64(), sys_fstatfs64(), sys_tgkill(); +/* OpenSSI cluster syscalls */ + +int sys_ssisys(), sys_rfork(), sys_rexecve(), sys_migrate(); + +/* Where are the silly numbers defined? */ + +#define SYS_ssisys 290 +#define SYS_rfork (SYS_ssisys + 1) +#define SYS_rexecve (SYS_ssisys + 2) +#define SYS_migrate (SYS_ssisys + 3) + + /* sys_socketcall subcalls */ int sys_socket(), sys_bind(), sys_connect(), sys_listen(); diff --git a/linux/syscallent.h b/linux/syscallent.h index 9b2250e0..c1ef5ee5 100644 --- a/linux/syscallent.h +++ b/linux/syscallent.h @@ -336,10 +336,11 @@ { 5, 0, printargs, "SYS_287" }, /* 287 */ { 5, 0, printargs, "SYS_288" }, /* 288 */ { 5, 0, printargs, "SYS_289" }, /* 289 */ - { 5, 0, printargs, "SYS_290" }, /* 290 */ - { 5, 0, printargs, "SYS_291" }, /* 291 */ - { 5, 0, printargs, "SYS_292" }, /* 292 */ - { 5, 0, printargs, "SYS_293" }, /* 293 */ + /* OpenSSI syscalls */ + { 2, 0, sys_ssisys, "ssisys" }, /* 290 */ + { 1, 0, sys_rfork, "rfork" }, /* 291 */ + { 4, 0, sys_rexecve, "rexecve" }, /* 292 */ + { 1, 0, sys_migrate, "migrate" }, /* 293 */ { 5, 0, printargs, "SYS_294" }, /* 294 */ { 5, 0, printargs, "SYS_295" }, /* 295 */ { 5, 0, printargs, "SYS_296" }, /* 296 */ diff --git a/process.c b/process.c index de7833f6..9ae689ea 100644 --- a/process.c +++ b/process.c @@ -610,6 +610,19 @@ struct tcb *tcp; return 0; } +int +sys_rfork(tcp) +struct tcb *tcp; +{ + if (entering(tcp)) { + tprintf ("%ld", tcp->u_arg[0]); + } + else { + return RVAL_UDECIMAL; + } + return 0; +} + int change_syscall(tcp, new) struct tcb *tcp; @@ -1683,7 +1696,6 @@ struct tcb *tcp; return 0; } -#if UNIXWARE > 2 int sys_rexecve(tcp) struct tcb *tcp; @@ -1695,7 +1707,6 @@ struct tcb *tcp; return 0; } -#endif int internal_exec(tcp) diff --git a/system.c b/system.c index 4c1aa594..7f22ddf1 100644 --- a/system.c +++ b/system.c @@ -2008,55 +2008,197 @@ struct tcb *tcp; return 0; } -#ifdef HAVE_SYS_NSCSYS_H +#endif /* UNIXWARE > 2 */ +#if defined (HAVE_SYS_NSCSYS_H) struct cred; #include +#define SSISYS 1 +#elif defined (HAVE_CLUSTER_SSISYS_H) +#include +#define SSISYS 1 +#endif + +#ifdef SSISYS static struct xlat ssi_cmd [] = { +#ifdef SSISYS_BADOP { SSISYS_BADOP, "SSISYS_BADOP" }, +#endif +#ifdef SSISYS_LDLVL_INIT { SSISYS_LDLVL_INIT,"SSISYS_LDLVL_INIT"}, +#endif +#ifdef SSISYS_LDLVL_GETVEC { SSISYS_LDLVL_GETVEC,"SSISYS_LDLVL_GETVEC"}, +#endif +#ifdef SSISYS_LDLVL_PUTVEC { SSISYS_LDLVL_PUTVEC,"SSISYS_LDLVL_PUTVEC"}, +#endif +#ifdef SSISYS_LDLVL_PUTRCMDS { SSISYS_LDLVL_PUTRCMDS,"SSISYS_LDLVL_PUTRCMDS"}, +#endif +#ifdef SSISYS_LDLVL_SETREXEC { SSISYS_LDLVL_SETREXEC,"SSISYS_LDLVL_SETREXEC"}, +#endif +#ifdef SSISYS_CMS_CLUSTERID { SSISYS_CMS_CLUSTERID,"SSISYS_CMS_CLUSTERID"}, +#endif +#ifdef SSISYS_CFS_STATVFS { SSISYS_CFS_STATVFS,"SSISYS_CFS_STATVFS"}, +#endif +#ifdef SSISYS_NODE_GETNUM { SSISYS_NODE_GETNUM,"SSISYS_NODE_GETNUM"}, +#endif +#ifdef SSISYS_NODE_TABLE { SSISYS_NODE_TABLE,"SSISYS_NODE_TABLE"}, +#endif +#ifdef SSISYS_NODE_DOWN { SSISYS_NODE_DOWN,"SSISYS_NODE_DOWN"}, +#endif +#ifdef SSISYS_RECLAIM_CHILD { SSISYS_RECLAIM_CHILD,"SSISYS_RECLAIM_CHILD"}, +#endif +#ifdef SSISYS_IPC_GETINFO { SSISYS_IPC_GETINFO,"SSISYS_IPC_GETINFO"}, +#endif +#ifdef SSISYS_ICS_TEST { SSISYS_ICS_TEST,"SSISYS_ICS_TEST"}, +#endif +#ifdef SSISYS_NODE_PID { SSISYS_NODE_PID,"SSISYS_NODE_PID"}, +#endif +#ifdef SSISYS_ISLOCAL { SSISYS_ISLOCAL,"SSISYS_ISLOCAL"}, +#endif +#ifdef SSISYS_CFS_ISSTACKED { SSISYS_CFS_ISSTACKED,"SSISYS_CFS_ISSTACKED"}, +#endif +#ifdef SSISYS_DNET_SYNC { SSISYS_DNET_SYNC,"SSISYS_DNET_SYNC"}, +#endif +#ifdef SSISYS_CFS_WAIT_MODE { SSISYS_CFS_WAIT_MODE,"SSISYS_CFS_WAIT_MODE"}, +#endif +#ifdef SSISYS_CFS_UMOUNT { SSISYS_CFS_UMOUNT,"SSISYS_CFS_UMOUNT"}, +#endif +#ifdef SSISYS_LLSTAT { SSISYS_LLSTAT,"SSISYS_LLSTAT" }, +#endif +#ifdef SSISYS_LTS_PERFTEST { SSISYS_LTS_PERFTEST,"SSISYS_LTS_PERFTEST"}, +#endif +#ifdef SSISYS_LTS_CONFIG { SSISYS_LTS_CONFIG,"SSISYS_LTS_CONFIG"}, +#endif +#ifdef SSISYS_SNET_PERFTEST { SSISYS_SNET_PERFTEST,"SSISYS_SNET_PERFTEST"}, +#endif +#ifdef SSISYS_IGNORE_HALFUP { SSISYS_IGNORE_HALFUP,"SSISYS_IGNORE_HALFUP"}, +#endif +#ifdef SSISYS_NODE_ROOTDEV { SSISYS_NODE_ROOTDEV,"SSISYS_NODE_ROOTDEV"}, +#endif +#ifdef SSISYS_GET_PRIMARY { SSISYS_GET_PRIMARY,"SSISYS_GET_PRIMARY"}, +#endif +#ifdef SSISYS_GET_SECONDARY { SSISYS_GET_SECONDARY,"SSISYS_GET_SECONDARY"}, +#endif +#ifdef SSISYS_GET_ROOTDISK { SSISYS_GET_ROOTDISK,"SSISYS_GET_ROOTDISK"}, +#endif +#ifdef SSISYS_CLUSTERNODE_NUM { SSISYS_CLUSTERNODE_NUM,"SSISYS_CLUSTERNODE_NUM"}, +#endif +#ifdef SSISYS_CLUSTER_MEMBERSHIP { SSISYS_CLUSTER_MEMBERSHIP,"SSISYS_CLUSTER_MEMBERSHIP"}, +#endif +#ifdef SSISYS_CLUSTER_DETAILEDTRANS { SSISYS_CLUSTER_DETAILEDTRANS,"SSISYS_CLUSTER_DETAILEDTRANS"}, +#endif +#ifdef SSISYS_CLUSTERNODE_INFO { SSISYS_CLUSTERNODE_INFO,"SSISYS_CLUSTERNODE_INFO"}, +#endif +#ifdef SSISYS_CLUSTERNODE_SETINFO { SSISYS_CLUSTERNODE_SETINFO,"SSISYS_CLUSTERNODE_SETINFO"}, +#endif +#ifdef SSISYS_CLUSTERNODE_AVAIL { SSISYS_CLUSTERNODE_AVAIL,"SSISYS_CLUSTERNODE_AVAIL"}, +#endif +#ifdef SSISYS_CLUSTER_MAXNODES { SSISYS_CLUSTER_MAXNODES,"SSISYS_CLUSTER_MAXNODES"}, +#endif +#ifdef SSISYS_SET_MEMPRIO { SSISYS_SET_MEMPRIO,"SSISYS_SET_MEMPRIO"}, +#endif +#ifdef SSISYS_GET_USERS { SSISYS_GET_USERS,"SSISYS_GET_USERS"}, +#endif +#ifdef SSISYS_FORCE_ROOT_NODE { SSISYS_FORCE_ROOT_NODE,"SSISYS_FORCE_ROOT_NODE"}, +#endif +#ifdef SSISYS_CVIP_SET { SSISYS_CVIP_SET,"SSISYS_CVIP_SET"}, +#endif +#ifdef SSISYS_CVIP_GET { SSISYS_CVIP_GET,"SSISYS_CVIP_GET"}, +#endif +#ifdef SSISYS_GET_NODE_COUNTS { SSISYS_GET_NODE_COUNTS,"SSISYS_GET_NODE_COUNTS"}, +#endif +#ifdef SSISYS_GET_TRANSPORT { SSISYS_GET_TRANSPORT,"SSISYS_GET_TRANSPORT"}, +#endif +#ifdef SSISYS_CLUSTER_SET_CONFIG + { SSISYS_CLUSTER_SET_CONFIG,"SSISYS_CLUSTER_SET_CONFIG"}, +#endif +#ifdef SSISYS_CLUSTER_INIT_PREROOT + { SSISYS_CLUSTER_INIT_PREROOT,"SSISYS_CLUSTER_INIT_PREROOT"}, +#endif +#ifdef SSISYS_CLUSTER_INIT_POSTROOT + { SSISYS_CLUSTER_INIT_POSTROOT,"SSISYS_CLUSTER_INIT_POSTROOT"}, +#endif +#ifdef SSISYS_CLUSTER_INITPROC + { SSISYS_CLUSTER_INITPROC,"SSISYS_CLUSTER_INITPROC"}, +#endif +#ifdef SSISYS_MOUNT_REMOTE_ROOT + { SSISYS_MOUNT_REMOTE_ROOT,"SSISYS_MOUNT_REMOTE_ROOT"}, +#endif +#ifdef SSISYS_DISCOVER_MOUNTS + { SSISYS_DISCOVER_MOUNTS,"SSISYS_DISCOVER_MOUNTS"}, +#endif +#ifdef SSISYS_CFS_MOUNT + { SSISYS_CFS_MOUNT,"SSISYS_CFS_MOUNT"}, +#endif +#ifdef SSISYS_SET_LVSDIRECTOR + { SSISYS_SET_LVSDIRECTOR,"SSISYS_SET_LVSDIRECTOR"}, +#endif +#ifdef SSISYS_CFS_REMOUNT + { SSISYS_CFS_REMOUNT,"SSISYS_CFS_REMOUNT"}, +#endif +#ifdef SSISYS_CFS_SETROOT + { SSISYS_CFS_SETROOT,"SSISYS_CFS_SETROOT"}, +#endif +#ifdef SSISYS_SET_NODE_CONTEXT + { SSISYS_SET_NODE_CONTEXT,"SSISYS_SET_NODE_CONTEXT"}, +#endif +#ifdef SSISYS_SET_NODENAME + { SSISYS_SET_NODENAME,"SSISYS_SET_NODENAME"}, +#endif +#ifdef SSISYS_SET_IPVSPORTWEIGHT + { SSISYS_SET_IPVSPORTWEIGHT,"SSISYS_SET_IPVSPORTWEIGHT"}, +#endif +#ifdef SSISYS_GET_NODENAME + { SSISYS_GET_NODENAME,"SSISYS_GET_NODENAME"}, +#endif +#ifdef SSISYS_SET_CLUSTERNAME + { SSISYS_SET_CLUSTERNAME,"SSISYS_SET_CLUSTERNAME"}, +#endif +#ifdef SSISYS_GET_CLUSTERNAME + { SSISYS_GET_CLUSTERNAME,"SSISYS_GET_CLUSTERNAME"}, +#endif { 0, NULL }, }; @@ -2066,6 +2208,7 @@ struct tcb *tcp; struct ssisys_iovec iov; cls_nodeinfo_args_t cni; clusternode_info_t info; + clusternode_t node; if (entering (tcp)) { ts_reclaim_child_inargs_t trc; @@ -2084,7 +2227,7 @@ struct tcb *tcp; umove (tcp, (long) iov.tio_udatain, &trc) < 0) goto bad; tprintf (", in={pid=%ld, start=%ld}", - trc.trc_pid, trc.trc_start); + (long) trc.trc_pid, trc.trc_start); break; case SSISYS_CLUSTERNODE_INFO: if (iov.tio_udatainlen != sizeof cni || @@ -2093,6 +2236,15 @@ struct tcb *tcp; tprintf (", in={node=%ld, len=%d}", cni.nodenum, cni.info_len); break; + case SSISYS_CLUSTERNODE_AVAIL: +#ifdef SSISYS_SET_NODE_CONTEXT + case SSISYS_SET_NODE_CONTEXT: +#endif + if (iov.tio_udatainlen != sizeof node || + umove (tcp, (long) iov.tio_udatain, &node) < 0) + goto bad; + tprintf (", node=%ld", node); + break; default: bad: if (iov.tio_udatainlen) { @@ -2111,7 +2263,7 @@ struct tcb *tcp; umove (tcp, (long) iov.tio_udatain, &cni) < 0) goto bad_out; if (cni.info_len != sizeof info || - iov.tio_udataoutlen != sizeof &info || + /* iov.tio_udataoutlen != sizeof info || */ umove (tcp, (long) iov.tio_udataout, &info) < 0) goto bad_out; tprintf (", out={node=%ld, cpus=%d, online=%d}", @@ -2132,9 +2284,8 @@ struct tcb *tcp; return 0; } -#endif +#endif /* SSISYS */ -#endif /* UNIXWARE > 2 */ #ifdef MIPS