X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=tests%2Futils%2Ftestapp%2Fgen-syscall-events-callstack%2Fgen-syscall-events-callstack.c;fp=tests%2Futils%2Ftestapp%2Fgen-syscall-events-callstack%2Fgen-syscall-events-callstack.c;h=48210fab07008553775f08522d0d4b9d7f996162;hp=0000000000000000000000000000000000000000;hb=591ee332c58988222f58c6eadb047890707e7a35;hpb=373148e9cedd5ec0b2302f4afe3ecd543e405f4f diff --git a/tests/utils/testapp/gen-syscall-events-callstack/gen-syscall-events-callstack.c b/tests/utils/testapp/gen-syscall-events-callstack/gen-syscall-events-callstack.c new file mode 100644 index 000000000..48210fab0 --- /dev/null +++ b/tests/utils/testapp/gen-syscall-events-callstack/gen-syscall-events-callstack.c @@ -0,0 +1,118 @@ +/* + * Copyright (C) - 2017 Francis Deslauriers + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +/** + * The process waits for the creation of a file passed as argument from an + * external processes to execute a syscall and exiting. This is useful for tests + * in combinaison with LTTng's PID tracker feature where we can trace the kernel + * events generated by our test process only. + */ + +volatile int val = 0; + +long __attribute__ ((noinline)) +my_gettid(void) +{ + long ret; +#ifdef __x86_64 + asm volatile + ( + "syscall" + : "=a" (ret) + : "0"(__NR_gettid) + : "cc", "rcx", "r11", "memory" + ); +#elif __i386 + asm volatile + ( + "int $0x80" + : "=a" (ret) + : "0"(__NR_gettid) + : "cc", "edi", "esi", "memory" + ); +#else +#error "Userspace callstack test not supported for this architecture." +#endif + return ret; +} + +int __attribute__ ((noinline)) +fct_c(void) +{ + return my_gettid(); +} + +int __attribute__ ((noinline)) +fct_b(void) +{ + val += fct_c(); + return val; +} + +int __attribute__ ((noinline)) +fct_a(void) +{ + val += fct_b(); + return val; +} + +int main(int argc, char **argv) +{ + int ret = 0; + char *start_file; + + if (argc != 2) { + fprintf(stderr, "Error: Missing argument\n"); + fprintf(stderr, "USAGE: %s PATH_WAIT_FILE\n", argv[0]); + ret = -1; + goto error; + } + + start_file = argv[1]; + + /* + * Wait for the start_file to be created by an external process + * (typically the test script) before executing the syscall + */ + ret = wait_on_file(start_file); + if (ret != 0) { + goto error; + } + + /* Start the callchain to the syscall */ + ret = fct_a(); + + /* Return success */ + if (ret >= 0) { + ret = 0; + } + +error: + return ret; +}