Main features were described in the status report, for example now, tool can print out list of archs with total number of syscalls.
$ ./tools/asinfo/asinfo arm64 : 1080 aarch64 : 1080 arm : 453 x86_64 : 333 x32 : 548 * Makefile.am: Add subdir * configure.ac: Add new binary * tools/Makefile.am: New binary * tools/asinfo/Makefile.am: New binary * tools/asinfo/arch_list.h: List of architectures, in the future this file could be generated using some script * tools/asinfo/asinfo.*: Example of using disparchers.c libasinfo * tools/asinfo/dispatchers.*: All dispacthers are placed here * tools/asinfo/request_msgs.h: List of input parameters and structures for syscall_dispacther * tools/asinfo/xshortmalloc.c: Complementary file to work with memory It's the draft commit to assess the direction of development Signed-off-by: Edgar Kaziahmedov <e...@linux.com> --- Makefile.am | 2 +- configure.ac | 2 + tools/Makefile.am | 28 ++++++++ tools/asinfo/Makefile.am | 57 ++++++++++++++++ tools/asinfo/arch_list.h | 5 ++ tools/asinfo/asinfo.1 | 0 tools/asinfo/asinfo.c | 96 ++++++++++++++++++++++++++ tools/asinfo/asinfo.h | 95 ++++++++++++++++++++++++++ tools/asinfo/dispatchers.c | 159 ++++++++++++++++++++++++++++++++++++++++++++ tools/asinfo/dispatchers.h | 99 +++++++++++++++++++++++++++ tools/asinfo/request_msgs.h | 72 ++++++++++++++++++++ tools/asinfo/xshortmalloc.c | 59 ++++++++++++++++ 12 files changed, 673 insertions(+), 1 deletion(-) create mode 100644 tools/Makefile.am create mode 100644 tools/asinfo/Makefile.am create mode 100644 tools/asinfo/arch_list.h create mode 100644 tools/asinfo/asinfo.1 create mode 100644 tools/asinfo/asinfo.c create mode 100644 tools/asinfo/asinfo.h create mode 100644 tools/asinfo/dispatchers.c create mode 100644 tools/asinfo/dispatchers.h create mode 100644 tools/asinfo/request_msgs.h create mode 100644 tools/asinfo/xshortmalloc.c diff --git a/Makefile.am b/Makefile.am index 3d6eba1e..665ac915 100644 --- a/Makefile.am +++ b/Makefile.am @@ -35,7 +35,7 @@ endif if HAVE_MX32_RUNTIME TESTS_MX32 = tests-mx32 endif -SUBDIRS = tests $(TESTS_M32) $(TESTS_MX32) +SUBDIRS = tests $(TESTS_M32) $(TESTS_MX32) tools bin_PROGRAMS = strace man_MANS = strace.1 diff --git a/configure.ac b/configure.ac index 0d4679e1..e0817aa5 100644 --- a/configure.ac +++ b/configure.ac @@ -822,6 +822,8 @@ AC_CONFIG_FILES([Makefile tests/Makefile tests-m32/Makefile tests-mx32/Makefile + tools/Makefile + tools/asinfo/Makefile strace.spec debian/changelog]) AC_OUTPUT diff --git a/tools/Makefile.am b/tools/Makefile.am new file mode 100644 index 00000000..6044e9ae --- /dev/null +++ b/tools/Makefile.am @@ -0,0 +1,28 @@ +# Automake input for strace tools. +# +# Copyright (c) 2017 Edgar A. Kaziakhmedov <e...@linux.com> +# 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. + +SUBDIRS = asinfo diff --git a/tools/asinfo/Makefile.am b/tools/asinfo/Makefile.am new file mode 100644 index 00000000..40d0df53 --- /dev/null +++ b/tools/asinfo/Makefile.am @@ -0,0 +1,57 @@ +# Automake input for strace. +# +# Copyright (c) 2017 Edgar Kaziakhmedov <e...@linux.com> +# 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. + +bin_PROGRAMS = asinfo +man_MANS = asinfo.1 + +OS = linux +ARCH = @arch@ + +AM_CFLAGS = $(WARN_CFLAGS) +AM_CPPFLAGS = -I$(builddir) \ + -I$(top_builddir)/$(OS) \ + -I$(top_srcdir)/$(OS) \ + -I$(top_builddir) \ + -I$(top_srcdir) +asinfo_CPPFLAGS = $(AM_CPPFLAGS) +asinfo_CFLAGS = $(AM_CFLAGS) +asinfo_LDADD = libasinfo.a +noinst_LIBRARIES = libasinfo.a +LIBS = -L${top_builddir} -lstrace + +libasinfo_a_CPPFLAGS = $(asinfo_CPPFLAGS) +libasinfo_a_CFLAGS = $(asinfo_CFLAGS) +libasinfo_a_SOURCES = \ + dispatchers.c \ + dispatchers.h \ + xshortmalloc.c \ + #end of libasinfo_a_SOURCES + +asinfo_SOURCES = \ + asinfo.c \ + asinfo.h \ + #end of asinfo_SOURCES diff --git a/tools/asinfo/arch_list.h b/tools/asinfo/arch_list.h new file mode 100644 index 00000000..628d02e7 --- /dev/null +++ b/tools/asinfo/arch_list.h @@ -0,0 +1,5 @@ +[0] = { ARM64, "arm64", ARRAY_SIZE(aarch64_sysent0), aarch64_sysent0 }, +[1] = { AARCH64, "aarch64", ARRAY_SIZE(aarch64_sysent0), aarch64_sysent0 }, +[2] = { ARM, "arm", ARRAY_SIZE(arm_sysent0), arm_sysent0 }, +[3] = { x86_64, "x86_64", ARRAY_SIZE(x86_64_sysent0), x86_64_sysent0 }, +[4] = { x32, "x32", ARRAY_SIZE(x32_sysent0), x32_sysent0 }, diff --git a/tools/asinfo/asinfo.1 b/tools/asinfo/asinfo.1 new file mode 100644 index 00000000..e69de29b diff --git a/tools/asinfo/asinfo.c b/tools/asinfo/asinfo.c new file mode 100644 index 00000000..e82e954b --- /dev/null +++ b/tools/asinfo/asinfo.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2017 Edgar A. Kaziakhmedov <e...@linux.com> + * 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 "asinfo.h" +#include <stdarg.h> +#include <string.h> + +#include "dispatchers.h" +#include "request_msgs.h" + +static const char *progname; + +static unsigned ATTRIBUTE_NOINLINE +form_req(int argc, char *argv[]) +{ + progname = argv[0] ? argv[0] : "asinfo"; + return AD_REQ_LIST_ARCH; +} + +int +main(int argc, char* argv[]) { + unsigned requests = form_req(argc, argv); + ARCH_LIST_DEFINE(arch_dispatcher(requests, "NULL")); + int size; + ARCH_LIST_SIZE(size); + int i; + for (i = 0; i < size; i++) + fprintf(stderr, "%10s : %3u\n", ARCH_LIST_GET_NAME(i), + ARCH_LIST_GET_SNUM(i)); + ARCH_LIST_FREE; + return 0; +} + +static void verror_msg(int err_no, const char *fmt, va_list p) +{ + char *msg; + + fflush(NULL); + + /* We want to print entire message with single fprintf to ensure + * message integrity if stderr is shared with other programs. + * Thus we use vasprintf + single fprintf. + */ + msg = NULL; + if (vasprintf(&msg, fmt, p) >= 0) { + if (err_no) + fprintf(stderr, "%s: %s: %s\n", progname, msg, + strerror(err_no)); + else + fprintf(stderr, "%s: %s\n", progname, msg); + free(msg); + } else { + /* malloc in vasprintf failed, try it without malloc */ + fprintf(stderr, "%s: ", progname); + vfprintf(stderr, fmt, p); + if (err_no) + fprintf(stderr, ": %s\n", strerror(err_no)); + else + putc('\n', stderr); + } + /* We don't switch stderr to buffered, thus fprintf(stderr) + * always flushes its output and this is not necessary: */ + /* fflush(stderr); */ +} + +void error_msg_and_die(const char *fmt, ...) +{ + va_list p; + va_start(p, fmt); + verror_msg(0, fmt, p); + exit(1); +} diff --git a/tools/asinfo/asinfo.h b/tools/asinfo/asinfo.h new file mode 100644 index 00000000..fc6ef747 --- /dev/null +++ b/tools/asinfo/asinfo.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2017 Edgar A. Kaziakhmedov <e...@linux.com> + * 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. + */ + +#ifndef STRACE_ASINFO_H +#define STRACE_ASINFO_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <sys/types.h> +#include <sys/utsname.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> + +#include "kernel_types.h" +#include "gcc_compat.h" + + + +#ifndef offsetofend +# define offsetofend(type, member) \ + (offsetof(type, member) + sizeof(((type *)NULL)->member)) +#endif + +#define ARRAY_SIZE(arg) ((unsigned int) (sizeof(arg) / sizeof((arg)[0]))) +#define LENGTH_OF(arg) ((unsigned int) sizeof(arg) - 1) + +/* + * The kernel used to define 64-bit types on 64-bit systems on a per-arch + * basis. Some architectures would use unsigned long and others would use + * unsigned long long. These types were exported as part of the + * kernel-userspace ABI and now must be maintained forever. This matches + * what the kernel exports for each architecture so we don't need to cast + * every printing of __u64 or __s64 to stdint types. + */ +#if SIZEOF_LONG == 4 +# define PRI__64 "ll" +#elif defined ALPHA || defined IA64 || defined MIPS || defined POWERPC +# define PRI__64 "l" +#else +# define PRI__64 "ll" +#endif + +#define PRI__d64 PRI__64"d" +#define PRI__u64 PRI__64"u" +#define PRI__x64 PRI__64"x" + +#if WORDS_BIGENDIAN +# define LL_PAIR(HI, LO) (HI), (LO) +#else +# define LL_PAIR(HI, LO) (LO), (HI) +#endif +#define LL_VAL_TO_PAIR(llval) LL_PAIR((long) ((llval) >> 32), (long) (llval)) + +#define _STR(_arg) #_arg +#define ARG_STR(_arg) (_arg), #_arg +#define ARG_ULL_STR(_arg) _arg##ULL, #_arg + +void error_msg_and_die(const char *fmt, ...) + ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; +void die_out_of_memory(void) ATTRIBUTE_NORETURN; + +void *xmalloc(size_t size) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1)); +void *xcalloc(size_t nmemb, size_t size) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1, 2)); + +#endif /* !STRACE_ASINFO_H */ diff --git a/tools/asinfo/dispatchers.c b/tools/asinfo/dispatchers.c new file mode 100644 index 00000000..bca16d21 --- /dev/null +++ b/tools/asinfo/dispatchers.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2017 Edgar A. Kaziakhmedov <e...@linux.com> + * 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. + */ + +#define _GNU_SOURCE +#include <string.h> +#include <sys/utsname.h> + +#include "asinfo.h" +#include "dispatchers.h" +#include "request_msgs.h" +#include "sysent.h" + +/* Define these shorthand notations to simplify the syscallent files. */ +/* These flags could be useful to print group of syscalls */ +#define TD TRACE_DESC +#define TF TRACE_FILE +#define TI TRACE_IPC +#define TN TRACE_NETWORK +#define TP TRACE_PROCESS +#define TS TRACE_SIGNAL +#define TM TRACE_MEMORY +#define TST TRACE_STAT +#define TLST TRACE_LSTAT +#define TFST TRACE_FSTAT +#define TSTA TRACE_STAT_LIKE +#define TSF TRACE_STATFS +#define TFSF TRACE_FSTATFS +#define TSFA TRACE_STATFS_LIKE +#define NF SYSCALL_NEVER_FAILS +#define MA MAX_ARGS +#define SI STACKTRACE_INVALIDATE_CACHE +#define SE STACKTRACE_CAPTURE_ON_ENTER +#define CST COMPAT_SYSCALL_TYPES + +/* + * For the current functionality there is no need + * to use sen and (*sys_func)() fields in sysent struct + */ +#define SEN(syscall_name) 0, NULL + +struct_sysent aarch64_sysent0[] = { +#include "aarch64/syscallent.h" +}; + +struct_sysent arm_sysent0[] = { +#include "arm/syscallent.h" +}; + +struct_sysent x32_sysent0[] = { +#include "x32/syscallent.h" +}; + +struct_sysent x86_64_sysent0[] = { +#include "x86_64/syscallent.h" +}; + +#undef SEN +#undef TD +#undef TF +#undef TI +#undef TN +#undef TP +#undef TS +#undef TM +#undef TST +#undef TLST +#undef TFST +#undef TSTA +#undef TSF +#undef TFSF +#undef TSFA +#undef NF +#undef MA +#undef SI +#undef SE +#undef CST + +struct arch_descriptor architectures[] = { +#include "arch_list.h" +}; + +void +*syscall_dispatcher(char *arch, int request_type, void *data) +{ + // + return NULL; +} + +struct arch_descriptor +**arch_dispatcher(unsigned request_type, const char* arch) +{ + struct utsname info_uname; + const char* loc_arch; + unsigned i; + ARCH_LIST_DEFINE(NULL); + if ((!arch) && (request_type & AD_REQ_CHECK_ARCH)) { + goto fail; + } + + if (request_type & AD_REQ_GET_ARCH) { + uname(&info_uname); + for (i = 0; i < ARRAY_SIZE(architectures); i++) { + loc_arch = architectures[i].arch_name; + if (strcasestr(info_uname.machine, loc_arch) != NULL) { + ARCH_LIST_ALLOC(1); + ARCH_LIST_ADD(0, &(architectures[i])); + goto done; + } + } + } + + if (request_type & AD_REQ_CHECK_ARCH) { + for (i = 0; i < ARRAY_SIZE(architectures); i++) { + loc_arch = architectures[i].arch_name; + if (strcasestr(arch, loc_arch) != NULL) { + ARCH_LIST_ALLOC(1); + ARCH_LIST_ADD(0, &(architectures[i])); + goto done; + } + } + } + + if (request_type & AD_REQ_LIST_ARCH) { + ARCH_LIST_ALLOC(ARRAY_SIZE(architectures)); + for (i = 0; i < ARRAY_SIZE(architectures); i++) { + ARCH_LIST_ADD(i, &(architectures[i])); + } + goto done; + } + +fail: + ARCH_LIST_ALLOC(0); +done: + return GET_ARCH_LIST; +} diff --git a/tools/asinfo/dispatchers.h b/tools/asinfo/dispatchers.h new file mode 100644 index 00000000..bff225bc --- /dev/null +++ b/tools/asinfo/dispatchers.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2017 Edgar A. Kaziakhmedov <e...@linux.com> + * 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. + */ + +#ifndef STRACE_ASINFO_COM_SCALLENT +#define STRACE_ASINFO_COM_SCALLENT + +#include "sysent.h" +#include "asinfo.h" + +enum arch_types { + NO_ARCH, + ARM64, + AARCH64, + ARM, + x86_64, + x32 +}; + +struct arch_descriptor { + enum arch_types arch_num; + const char *arch_name; + int max_scn; + struct_sysent *list_of_syscall; +}; + +#define MAX_ARCH_LEN 10 + +/* These defines are such useful to work with array of + * struct arch_descriptor pointers + */ +#define ARCH_LIST_DEFINE(init_val) \ + struct arch_descriptor **arch_list = (init_val) \ + +#define ARCH_LIST_ALLOC(size) do { \ + arch_list = (struct arch_descriptor**)xcalloc(sizeof(*arch_list),\ + (size + 1)); \ + arch_list[size] = NULL; \ +} while(0) \ + +#define ARCH_LIST_ADD(pos, elem) do { \ + arch_list[(pos)] = elem; \ +} while(0) \ + +#define ARCH_LIST_FREE do { \ + free(arch_list); \ +} while(0) \ + +/* In the future, it will be possible to filter architectures, thus + * size could less than max number of supported archs */ +#define ARCH_LIST_SIZE(size) do { \ + int i = 0; \ + while (arch_list[i] != NULL) i++; \ + (size) = i; \ +} while(0) \ + +#define ARCH_LIST_GET_NAME(pos) arch_list[(pos)] ? \ + arch_list[(pos)]->arch_name : "NULL" \ + +#define ARCH_LIST_GET_SNUM(pos) arch_list[(pos)] ? \ + arch_list[(pos)]->max_scn : 0 \ + +#define GET_ARCH_LIST arch_list \ + +/* The main interaction with low-level structures, such as for now, + * struct_sysent, is happening here, the remaining processing should + * be done on the other levels. + */ +void *syscall_dispatcher(char *arch, int request_type, void *data); + +/* The function is purposed to interact with uname syscall + */ +struct arch_descriptor **arch_dispatcher(unsigned request_type, + const char* arch); + +#endif /* !STRACE_ASINFO_COM_SCALLENT */ diff --git a/tools/asinfo/request_msgs.h b/tools/asinfo/request_msgs.h new file mode 100644 index 00000000..73240dcb --- /dev/null +++ b/tools/asinfo/request_msgs.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017 Edgar A. Kaziakhmedov <e...@linux.com> + * 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. + */ + +#ifndef STRACE_ASINFO_REQ_MSGS +#define STRACE_ASINFO_REQ_MSGS + + +/* Request types for syscall_dispatcher, + * arch_dispatcher, and filter_dispatcher, + * which, in turn, could be combined + */ +enum { + SD_REQ_GET_NAME = 0x1LU, + SD_REQ_GET_NUMBER = 0x2LU, + SD_REQ_GET_NARGS = 0x4LU, + SD_REQ_GET_PROTO = 0x8LU, + SD_REQ_GET_KERNEL = 0x10LU, + SD_REQ_GET_LIST = 0x20LU, + /* Reserved */ + AD_REQ_SET_ARCH = 0x1LU<<16, + AD_REQ_GET_ARCH = 0x2LU<<16, + AD_REQ_LIST_ARCH = 0x4LU<<16, + AD_REQ_CHECK_ARCH = 0x8LU<<16, + /* Reserved */ + FD_SET_BASE_FILTER = 0x1LU<<24, + FD_SET_ADV_FILTER = 0x2LU<<24 +}; + +/* SD_REQ_GET_NAME, SD_REQ_GET_NUMBER */ +struct sc_base_info { + int sys_number; + char *sys_name; + int sys_flags; +}; + +/* SD_REQ_GET_NARGS */ +struct sc_nargs { + struct sc_base_info sys_bi; + int nargs; +}; + +/* FD_SET_BASE_FILTER */ +struct sc_filter { + struct sc_base_info sys_bi; + int filter_options; +}; + +#endif /* !STRACE_ASINFO_REQ_MSGS */ diff --git a/tools/asinfo/xshortmalloc.c b/tools/asinfo/xshortmalloc.c new file mode 100644 index 00000000..1ad9768f --- /dev/null +++ b/tools/asinfo/xshortmalloc.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 Dmitry V. Levin <l...@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 "asinfo.h" + +void die_out_of_memory(void) +{ + static bool recursed = false; + + if (recursed) + exit(1); + recursed = 1; + + error_msg_and_die("Out of memory"); +} + +void *xmalloc(size_t size) +{ + void *p = malloc(size); + + if (!p) + die_out_of_memory(); + + return p; +} + +void *xcalloc(size_t nmemb, size_t size) +{ + void *p = calloc(nmemb, size); + + if (!p) + die_out_of_memory(); + + return p; +} -- 2.11.0 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel