| // SPDX-License-Identifier: GPL-2.0 | |
| // Copyright (c) 2018 Facebook | |
| #include <vmlinux.h> | |
| #include <bpf/bpf_helpers.h> | |
| #include <bpf/bpf_tracing.h> | |
| #ifndef PERF_MAX_STACK_DEPTH | |
| #define PERF_MAX_STACK_DEPTH 127 | |
| #endif | |
| typedef __u64 stack_trace_t[PERF_MAX_STACK_DEPTH]; | |
| struct { | |
| __uint(type, BPF_MAP_TYPE_STACK_TRACE); | |
| __uint(max_entries, 16384); | |
| __type(key, __u32); | |
| __type(value, stack_trace_t); | |
| } stackmap SEC(".maps"); | |
| extern bool CONFIG_UNWINDER_ORC __kconfig __weak; | |
| /* | |
| * This function is here to have CONFIG_UNWINDER_ORC | |
| * used and added to object BTF. | |
| */ | |
| int unused(void) | |
| { | |
| return CONFIG_UNWINDER_ORC ? 0 : 1; | |
| } | |
| __u32 stack_key; | |
| SEC("kprobe") | |
| int kprobe_test(struct pt_regs *ctx) | |
| { | |
| stack_key = bpf_get_stackid(ctx, &stackmap, 0); | |
| return 0; | |
| } | |
| SEC("kprobe.multi") | |
| int kprobe_multi_test(struct pt_regs *ctx) | |
| { | |
| stack_key = bpf_get_stackid(ctx, &stackmap, 0); | |
| return 0; | |
| } | |
| SEC("raw_tp/bpf_testmod_test_read") | |
| int rawtp_test(void *ctx) | |
| { | |
| /* Skip ebpf program entry in the stack. */ | |
| stack_key = bpf_get_stackid(ctx, &stackmap, 0); | |
| return 0; | |
| } | |
| SEC("fentry/bpf_testmod_stacktrace_test") | |
| int fentry_test(struct pt_regs *ctx) | |
| { | |
| /* | |
| * Skip 2 bpf_program/trampoline stack entries: | |
| * - bpf_prog_bd1f7a949f55fb03_fentry_test | |
| * - bpf_trampoline_182536277701 | |
| */ | |
| stack_key = bpf_get_stackid(ctx, &stackmap, 2); | |
| return 0; | |
| } | |
| SEC("fexit/bpf_testmod_stacktrace_test") | |
| int fexit_test(struct pt_regs *ctx) | |
| { | |
| /* Skip 2 bpf_program/trampoline stack entries, check fentry_test. */ | |
| stack_key = bpf_get_stackid(ctx, &stackmap, 2); | |
| return 0; | |
| } | |
| char _license[] SEC("license") = "GPL"; |