| // SPDX-License-Identifier: GPL-2.0 |
| /* Copyright (C) 2021. Huawei Technologies Co., Ltd */ |
| #include <linux/types.h> |
| #include <linux/bpf.h> |
| #include <bpf/bpf_helpers.h> |
| #include <bpf/bpf_tracing.h> |
| |
| #define STRNCMP_STR_SZ 4096 |
| |
| /* Will be updated by benchmark before program loading */ |
| const volatile unsigned int cmp_str_len = 1; |
| const char target[STRNCMP_STR_SZ]; |
| |
| long hits = 0; |
| char str[STRNCMP_STR_SZ]; |
| |
| char _license[] SEC("license") = "GPL"; |
| |
| static __always_inline int local_strncmp(const char *s1, unsigned int sz, |
| const char *s2) |
| { |
| int ret = 0; |
| unsigned int i; |
| |
| for (i = 0; i < sz; i++) { |
| /* E.g. 0xff > 0x31 */ |
| ret = (unsigned char)s1[i] - (unsigned char)s2[i]; |
| if (ret || !s1[i]) |
| break; |
| } |
| |
| return ret; |
| } |
| |
| SEC("tp/syscalls/sys_enter_getpgid") |
| int strncmp_no_helper(void *ctx) |
| { |
| if (local_strncmp(str, cmp_str_len + 1, target) < 0) |
| __sync_add_and_fetch(&hits, 1); |
| return 0; |
| } |
| |
| SEC("tp/syscalls/sys_enter_getpgid") |
| int strncmp_helper(void *ctx) |
| { |
| if (bpf_strncmp(str, cmp_str_len + 1, target) < 0) |
| __sync_add_and_fetch(&hits, 1); |
| return 0; |
| } |
| |