output_autoconf(s, o, "autoconf-walk-stack.c", "STAPCONF_WALK_STACK", NULL);
output_autoconf(s, o, "autoconf-stacktrace_ops-warning.c",
"STAPCONF_STACKTRACE_OPS_WARNING", NULL);
+ output_autoconf(s, o, "autoconf-stacktrace_ops-int-address.c",
+ "STAPCONF_STACKTRACE_OPS_INT_ADDRESS", NULL);
output_autoconf(s, o, "autoconf-mm-context-vdso.c", "STAPCONF_MM_CONTEXT_VDSO", NULL);
output_autoconf(s, o, "autoconf-mm-context-vdso-base.c", "STAPCONF_MM_CONTEXT_VDSO_BASE", NULL);
output_autoconf(s, o, "autoconf-blk-types.c", "STAPCONF_BLK_TYPES", NULL);
--- /dev/null
+#include <linux/sched.h>
+#include <asm/stacktrace.h>
+
+// check for 4.6 patch which changed the function signature of
+// stacktrace_ops 'address' member.
+
+int print_stack_address(void *data __attribute__ ((unused)),
+ unsigned long addr __attribute__ ((unused)),
+ int reliable __attribute__ ((unused)))
+{
+ return 0;
+}
+
+struct stacktrace_ops ops __attribute__ ((unused)) = {.address=print_stack_address};
return -1;
}
+#ifdef STAPCONF_STACKTRACE_OPS_INT_ADDRESS
+static int print_stack_address(void *data, unsigned long addr, int reliable)
+#else
static void print_stack_address(void *data, unsigned long addr, int reliable)
+#endif
{
struct print_stack_data *sdata = data;
if (sdata->skip > 0)
NULL);
sdata->levels--;
}
+#ifdef STAPCONF_STACKTRACE_OPS_INT_ADDRESS
+ return 0;
+#endif
}
static const struct stacktrace_ops print_stack_ops = {