From: Edgar Kaziahmedov <e...@linux.com> The first version of asinfo tool. The asinfo tool has the following architecture: architecture dispatcher->system call dispatcher->filter dispatcher
As for arch. dispatcher, the asinfo has get-arch, list-arch, set-arch %name_of_arch options, arch_dispatcher is purposed to process them. Now, to find out the main principle of working, let’s consider the next one case: $ asinfo list-syscall set-filter signal Firstly, arch_dispatcher will return the current architecture, after that syscall_dispatcher will provide the list of system calls (struct sc_base_info) for this architecture, finally filter_dispatcher, working with syscallent’s database, will drop all system calls, which are not signal-related. For now, tool is able to show syscall typing its sequence number. * Makefile.am (SUBDIRS): Add tools directory. * configure.ac (AC_CONFIG_FILES): Add Makefile's. * tools/Makefile.am: New file. * tools/asinfo/Makefile.am: New file. * tools/asinfo/arch_list.h: New file. * tools/asinfo/dispatchers.h: New file. Prototype syscall_dispatcher and arch_dispatcher. * tools/asinfo/dispatchers.c: New file. Implement arch_dispatcher. Import syscallent.h files. * tools/asinfo/arch_interface.h: New file. Prototype methods to simplify work with the list of arch_descriptor. Introduce struct arch_descriptor. * tools/asinfo/arch_interface.c: New file. Implement them. * tools/asinfo/request_msgs.h: New file. Introduce main type of requests. Introduce structures for syscall_dispatcher. * tools/asinfo/asinfo.c: New file. Implement support of all arch options and initial support of syscall options. * tools/asinfo/asinfo.1: New file. Empty man. Signed-off-by: Edgar Kaziahmedov <e...@linux.com> --- Makefile.am | 2 +- configure.ac | 2 + tools/Makefile.am | 28 ++++++ tools/asinfo/Makefile.am | 56 ++++++++++++ tools/asinfo/arch_interface.c | 101 ++++++++++++++++++++++ tools/asinfo/arch_interface.h | 75 +++++++++++++++++ tools/asinfo/arch_list.h | 4 + tools/asinfo/asinfo.1 | 0 tools/asinfo/asinfo.c | 192 ++++++++++++++++++++++++++++++++++++++++++ tools/asinfo/dispatchers.c | 184 ++++++++++++++++++++++++++++++++++++++++ tools/asinfo/dispatchers.h | 54 ++++++++++++ tools/asinfo/request_msgs.h | 80 ++++++++++++++++++ 12 files changed, 777 insertions(+), 1 deletion(-) create mode 100644 tools/Makefile.am create mode 100644 tools/asinfo/Makefile.am create mode 100644 tools/asinfo/arch_interface.c create mode 100644 tools/asinfo/arch_interface.h 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/dispatchers.c create mode 100644 tools/asinfo/dispatchers.h create mode 100644 tools/asinfo/request_msgs.h diff --git a/Makefile.am b/Makefile.am index 233796b6..3dc78eb5 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 bc7b637d..55fb978d 100644 --- a/configure.ac +++ b/configure.ac @@ -825,6 +825,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..195dfe84 --- /dev/null +++ b/tools/asinfo/Makefile.am @@ -0,0 +1,56 @@ +# 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_SOURCES = \ + arch_interface.c \ + arch_interface.h \ + arch_list.h \ + asinfo.c \ + dispatchers.c \ + dispatchers.h \ + ../../error_prints.c \ + ../../error_prints.h \ + ../../macros.h \ + requests_msgs.h \ + ../../xmalloc.c \ + ../../xmalloc.h \ + #end of asinfo_SOURCES diff --git a/tools/asinfo/arch_interface.c b/tools/asinfo/arch_interface.c new file mode 100644 index 00000000..3c11beae --- /dev/null +++ b/tools/asinfo/arch_interface.c @@ -0,0 +1,101 @@ +/* + * 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 <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "arch_interface.h" +#include "xmalloc.h" + +struct arch_service *arch_list_create(unsigned size) +{ + struct arch_service *as = (struct arch_service *) \ + xcalloc(sizeof(*as), 1); + if (size) { + as->arch_list = (struct arch_descriptor **) \ + xcalloc(sizeof(*(as->arch_list)), size); + } + as->capacity = size; + as->next_free = 0; + return as; +} + +int arch_list_push(struct arch_service *m, struct arch_descriptor *element) +{ + if (m->next_free >= m->capacity) { + return -1; + } + m->arch_list[m->next_free] = element; + (m->next_free)++; + return 0; +} + +struct arch_descriptor *arch_list_get(struct arch_service *m, unsigned index) +{ + if (index >= m->next_free) { + return NULL; + } + return m->arch_list[index]; +} + +unsigned arch_list_size(struct arch_service *m) +{ + return m->next_free; +} + +void arch_list_free(struct arch_service *m) +{ + free(m->arch_list); + free(m); +} + +const char* arch_list_name(struct arch_service *m, unsigned index) +{ + return m->arch_list[index]->arch_name; +} + +int arch_list_snum(struct arch_service *m, unsigned index) +{ + return m->arch_list[index]->max_scn; +} + +void arch_list_print(struct arch_service *m, const char *delim) +{ + unsigned i = 0; + unsigned max_len = 0; + for (i = 0; i < arch_list_size(m); i++) { + unsigned temp = strlen(m->arch_list[i]->arch_name); + if (temp > max_len) { + max_len = temp; + } + } + for (i = 0; i < arch_list_size(m); i++) { + printf("[%u] %*s %s %d\n", i + 1, max_len, arch_list_name(m, i), + delim, arch_list_snum(m, i)); + } +} diff --git a/tools/asinfo/arch_interface.h b/tools/asinfo/arch_interface.h new file mode 100644 index 00000000..5e9a8256 --- /dev/null +++ b/tools/asinfo/arch_interface.h @@ -0,0 +1,75 @@ +/* + * 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 ASINFO_ARCH_INTERFACE +#define ASINFO_ARCH_INTERFACE + +#include "sysent.h" + +enum arch_types { + 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; +}; + +/* To provide push-back interface with arch_list */ +struct arch_service { + struct arch_descriptor **arch_list; + unsigned capacity; + unsigned next_free; +}; + +#define ARCH_LIST_DEFINE(name) \ + struct arch_service *(name) + +/* Push-back interface is purposed to simplify interaction with + array of struct arch_descriptor's pointers */ + +struct arch_service *arch_list_create(unsigned size); + +int arch_list_push(struct arch_service *m, struct arch_descriptor *element); + +struct arch_descriptor *arch_list_get(struct arch_service *m, unsigned index); + +unsigned arch_list_size(struct arch_service *m); + +void arch_list_free(struct arch_service *m); + +const char* arch_list_name(struct arch_service *m, unsigned index); + +int arch_list_snum(struct arch_service *m, unsigned index); + +void arch_list_print(struct arch_service *m, const char *delim); + +#endif /* !ASINFO_ARCH_INTERFACE */ diff --git a/tools/asinfo/arch_list.h b/tools/asinfo/arch_list.h new file mode 100644 index 00000000..4a7accf7 --- /dev/null +++ b/tools/asinfo/arch_list.h @@ -0,0 +1,4 @@ +[0] = { AARCH64, "aarch64", ARRAY_SIZE(aarch64_sysent0), aarch64_sysent0 }, +[1] = { ARM, "arm", ARRAY_SIZE(arm_sysent0), arm_sysent0 }, +[2] = { x86_64, "x86_64", ARRAY_SIZE(x86_64_sysent0), x86_64_sysent0 }, +[3] = { 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..020ef7c8 --- /dev/null +++ b/tools/asinfo/asinfo.c @@ -0,0 +1,192 @@ +/* + * 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 <stdarg.h> +#include <stdbool.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <limits.h> + +#include "arch_interface.h" +#include "dispatchers.h" +#include "error_prints.h" +#include "macros.h" +#include "request_msgs.h" +#include "xmalloc.h" + +const char *progname; +static const char *def_delim = ":"; + +void ATTRIBUTE_NOINLINE +die(void) +{ + exit(1); +} + +/* To calculate sequence number of set bit */ +static inline unsigned +fsbit_num(unsigned flag) +{ + unsigned i = 0; + while ((flag >>= 1) != 0) i++; + return i; +} + +static unsigned +option_to_request(char *option) +{ + const struct opt_to_req requests[] = { + [ 0] = { AD_REQ_SET_ARCH, "set-arch" }, + [ 1] = { AD_REQ_GET_ARCH, "get-arch" }, + [ 2] = { AD_REQ_LIST_ARCH, "list-arch" }, + [ 3] = { SD_REQ_GET_NAME, "get-name" }, + //[ 4] = { SD_REQ_GET_NUMBER, "get-num" }, + //[ 5] = { SD_REQ_GET_NARGS, "get-nargs" }, + //[ 6] = { SD_REQ_GET_PROTO, "get-proto" }, + //[ 7] = { SD_REQ_GET_KERNEL, "get-kernel" }, + //[ 8] = { SD_REQ_GET_LIST, "list-syscall" }, + //[ 9] = { FD_SET_BASE_FILTER, "set-filter" }, + //[10] = { FD_SET_ADV_FILTER, "set-adv-filter" } + }; + unsigned i; + + for (i = 0; i < ARRAY_SIZE(requests); i++) { + if (strcasecmp(option, requests[i].option) == 0) + return requests[i].req_t; + } + return 0; +} + +static unsigned ATTRIBUTE_NOINLINE +form_req(int argc, char *argv[], char *args[]) +{ + progname = argv[0] ? argv[0] : "asinfo"; + int i; + unsigned ret_val = 0; + unsigned temp_ret = 0; + unsigned bit_pos = 0; + + for (i = 1; i < argc; i++) { + if ((temp_ret = option_to_request(argv[i])) != 0) { + if ((ret_val & temp_ret) || + (!(temp_ret & (SD_REQ_GET_LIST + + AD_REQ_LIST_ARCH + + AD_REQ_GET_ARCH)) && + (i + 1 >= argc))) { + error_msg_and_help("option '%s' requires " + "argument", argv[i]); + } + ret_val |= temp_ret; + bit_pos = fsbit_num(temp_ret); + if (!(temp_ret & (SD_REQ_GET_LIST + AD_REQ_LIST_ARCH + + AD_REQ_GET_ARCH))) { + args[bit_pos] = argv[i + 1]; + i += 1; + } + } else { + error_msg_and_help("unrecognized option '%s'", argv[i]); + } + } + return ret_val; +} + +static int +check_req(unsigned *request, char *args[]) +{ + int a_flag = *request & (AD_REQ_MASK ^ AD_REQ_SET_ARCH); + int s_flag = *request & SD_REQ_MASK; + int dump = 1; + /* Check arch flags */ + if (!(*request & AD_REQ_MASK)) { + *request |= AD_REQ_GET_ARCH; + dump = 0; + } + if (*request & AD_REQ_SET_ARCH) { + dump = 0; + } + /* Check for ambiguity */ + if (!((*request & AD_REQ_MASK) == AD_REQ_SET_ARCH || + (*request & AD_REQ_MASK) == AD_REQ_GET_ARCH || + (*request & AD_REQ_MASK) == AD_REQ_LIST_ARCH)) { + return -1; + } + if (a_flag != 0 && s_flag != 0) { + return -1; + } + /* Check syscall flags, ambiguity */ + if (!(*request & SD_REQ_MASK)) { + *request |= SD_REQ_GET_LIST; + } + if (!((*request & SD_REQ_MASK) == SD_REQ_GET_NAME || + (*request & SD_REQ_MASK) == SD_REQ_GET_NUMBER || + (*request & SD_REQ_MASK) == SD_REQ_GET_LIST)) { + return -1; + } + return dump; +} + +int +main(int argc, char *argv[]) +{ + char **input_args = (char**)xcalloc(sizeof(char*), + sizeof(unsigned) * CHAR_BIT); + unsigned requests; + int dump; + + if ((requests = form_req(argc, argv, input_args)) == 0) + error_msg_and_help("must have OPTIONS"); + if ((dump = check_req(&requests, input_args)) == -1) + error_msg_and_help("ambiguous options"); + + /* arch_dispatcher work */ + ARCH_LIST_DEFINE(arch_list); + arch_list = arch_dispatcher(requests, + input_args[fsbit_num(AD_REQ_SET_ARCH)]); + if (dump) { + arch_list_print(arch_list, def_delim); + goto done; + } + if (arch_list_size(arch_list) == 0) { + error_msg_and_help("unrecognized architecture '%s'", + input_args[fsbit_num(AD_REQ_SET_ARCH)]); + } + /* syscall_dispatcher work */ + SYSCALL_LIST_DEFINE(syscall_list); + syscall_list = syscall_dispatcher(arch_list, requests, + input_args[fsbit_num(requests & SD_REQ_MASK)]); + if (syscall_list[0].sys_name != NULL) { + printf("%s\n", syscall_list[0].sys_name); + } else { + error_msg_and_help("unrecognized syscall number '%s'", + input_args[fsbit_num(requests & SD_REQ_MASK)]); + } +done: + arch_list_free(arch_list); + free(input_args); + return 0; +} diff --git a/tools/asinfo/dispatchers.c b/tools/asinfo/dispatchers.c new file mode 100644 index 00000000..95ca4923 --- /dev/null +++ b/tools/asinfo/dispatchers.c @@ -0,0 +1,184 @@ +/* + * 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/utsname.h> + +#include "arch_interface.h" +#include "dispatchers.h" +#include "macros.h" +#include "request_msgs.h" +#include "sysent.h" +#include "xmalloc.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" +}; + +struct sc_base_info * +syscall_dispatcher(struct arch_service *arch, int request_type, + const char *data) +{ + SYSCALL_LIST_DEFINE(syscall_list); + + if (request_type & SD_REQ_GET_NAME) { + long int nsys; + char *endptr; + nsys = strtol(data, &endptr, 10); + if (*endptr != '\0' || nsys < 0 || + nsys >= arch->arch_list[0]->max_scn) { + goto fail; + } + SYSCALL_LIST_ALLOC(syscall_list, 1); + syscall_list[0].sys_name = + arch->arch_list[0]->list_of_syscall[nsys].sys_name; + goto done; + } + +fail: + SYSCALL_LIST_ALLOC(syscall_list, 0); +done: + return syscall_list; +} + +struct arch_service * +arch_dispatcher(unsigned request_type, const char* arch) +{ + struct utsname info_uname; + const char *loc_arch; + unsigned i; + ARCH_LIST_DEFINE(arch_list); + if ((!arch) && (request_type & AD_REQ_SET_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 = arch_list_create(1); + arch_list_push(arch_list, &(architectures[i])); + goto done; + } + } + } + + if (request_type & AD_REQ_SET_ARCH) { + for (i = 0; i < ARRAY_SIZE(architectures); i++) { + loc_arch = architectures[i].arch_name; + if (strcasestr(arch, loc_arch) != NULL) { + arch_list = arch_list_create(1); + arch_list_push(arch_list, &(architectures[i])); + goto done; + } + } + } + + if (request_type & AD_REQ_LIST_ARCH) { + arch_list = arch_list_create(ARRAY_SIZE(architectures)); + for (i = 0; i < ARRAY_SIZE(architectures); i++) { + arch_list_push(arch_list, &(architectures[i])); + } + goto done; + } + +fail: + arch_list = arch_list_create(0); +done: + return arch_list; +} diff --git a/tools/asinfo/dispatchers.h b/tools/asinfo/dispatchers.h new file mode 100644 index 00000000..a60f1595 --- /dev/null +++ b/tools/asinfo/dispatchers.h @@ -0,0 +1,54 @@ +/* + * 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 "arch_interface.h" +#include "request_msgs.h" +#include "sysent.h" + +#define SYSCALL_LIST_DEFINE(name) \ + struct sc_base_info *(name) + +#define SYSCALL_LIST_ALLOC(name, size) \ + (name) = (struct sc_base_info*) xcalloc(sizeof(*(name)), (size + 1)) + +/* 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. + */ +struct sc_base_info *syscall_dispatcher(struct arch_service *arch, + int request_type, + const char *arg); + +/* The function is purposed to interact with uname syscall + */ +struct arch_service *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..575e2735 --- /dev/null +++ b/tools/asinfo/request_msgs.h @@ -0,0 +1,80 @@ +/* + * 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 request_types { + SD_REQ_GET_NAME = 0x1<<0, + SD_REQ_GET_NUMBER = 0x1<<1, + SD_REQ_GET_NARGS = 0x1<<2, + SD_REQ_GET_PROTO = 0x1<<3, + SD_REQ_GET_KERNEL = 0x1<<4, + SD_REQ_GET_LIST = 0x1<<5, + /* Reserved */ + AD_REQ_SET_ARCH = 0x1<<16, + AD_REQ_GET_ARCH = 0x1<<17, + AD_REQ_LIST_ARCH = 0x1<<18, + /* Reserved */ + FD_SET_BASE_FILTER = 0x1<<24, + FD_SET_ADV_FILTER = 0x1<<25 +}; + +#define SD_REQ_MASK (0x0000FFFFU) +#define AD_REQ_MASK (0x00FF0000U) +#define FD_REQ_MASK (0xFF000000U) + +/* To convert options to req_types */ +struct opt_to_req { + enum request_types req_t; + const char *option; +}; + +/* SD_REQ_GET_NAME, SD_REQ_GET_NUMBER */ +struct sc_base_info { + int sys_number; + const 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 */ -- 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