From: Mathieu Desnoyers Date: Wed, 15 Jun 2016 18:39:41 +0000 (-0400) Subject: Fix: annotate bytecode interpreter for kernel stack validator X-Git-Tag: v2.9.0-rc1~49 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=63155590d2c1a2183028d536e338886411f8f50d;p=lttng-modules.git Fix: annotate bytecode interpreter for kernel stack validator With gcc 6.1.1, kernel 4.6, with CONFIG_STACK_VALIDATION=y, building lttng-modules master at commit 6c09dd94 gives this warning: lttng-modules/lttng-filter-interpreter.o: warning: objtool: lttng_filter_interpret_bytecode()+0x58: sibling call from callable instruction with changed frame pointer This object implements a bytecode interpreter using an explicit jump table. If we define "INTERPRETER_USE_SWITCH" at the top of the file, thus using the switch-case fallback implementation, the warning vanishes. We use an explicit jump table rather than a switch case whenever possible for performance reasons. Unfortunately objtool doesn't know how to validate this type of jump table. So to avoid the warning we need to add an annotation to tell objtool to ignore it. Kernel developers has to annotate __bpf_prog_run() in the kernel for the same reason. Signed-off-by: Mathieu Desnoyers --- diff --git a/lttng-filter-interpreter.c b/lttng-filter-interpreter.c index c7e9f1f1..d9605cb2 100644 --- a/lttng-filter-interpreter.c +++ b/lttng-filter-interpreter.c @@ -21,9 +21,12 @@ */ #include +#include #include +LTTNG_STACK_FRAME_NON_STANDARD(lttng_filter_interpret_bytecode); + /* * get_char should be called with page fault handler disabled if it is expected * to handle user-space read. diff --git a/wrapper/frame.h b/wrapper/frame.h new file mode 100644 index 00000000..ac8f4967 --- /dev/null +++ b/wrapper/frame.h @@ -0,0 +1,39 @@ +#ifndef _LTTNG_WRAPPER_FRAME_H +#define _LTTNG_WRAPPER_FRAME_H + +/* + * wrapper/frame.h + * + * Copyright (C) 2016 Mathieu Desnoyers + * + * 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; only + * 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 + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)) + +#include + +#define LTTNG_STACK_FRAME_NON_STANDARD(func) \ + STACK_FRAME_NON_STANDARD(func) + +#else + +#define LTTNG_STACK_FRAME_NON_STANDARD(func) + +#endif + +#endif /* _LTTNG_WRAPPER_FRAME_H */