static int check_env(void) { int err; unsigned int kver_int; char license[] = "GPL"; struct bpf_insn insns[] = { BPF_MOV64_IMM(BPF_REG_0, 1), BPF_EXIT_INSN(), }; err = fetch_kernel_version(&kver_int, NULL, 0); if (err) { pr_debug("Unable to get kernel version\n"); return err; } err = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns, sizeof(insns) / sizeof(insns[0]), license, kver_int, NULL, 0); if (err < 0) { pr_err("Missing basic BPF support, skip this test: %s\n", strerror(errno)); return err; } close(err); return 0; }
static int detect_kbuild_dir(char **kbuild_dir) { const char *test_dir = llvm_param.kbuild_dir; const char *prefix_dir = ""; const char *suffix_dir = ""; char *autoconf_path; int err; if (!test_dir) { /* _UTSNAME_LENGTH is 65 */ char release[128]; err = fetch_kernel_version(NULL, release, sizeof(release)); if (err) return -EINVAL; test_dir = release; prefix_dir = "/lib/modules/"; suffix_dir = "/build"; } err = asprintf(&autoconf_path, "%s%s%s/include/generated/autoconf.h", prefix_dir, test_dir, suffix_dir); if (err < 0) return -ENOMEM; if (access(autoconf_path, R_OK) == 0) { free(autoconf_path); err = asprintf(kbuild_dir, "%s%s%s", prefix_dir, test_dir, suffix_dir); if (err < 0) return -ENOMEM; return 0; } free(autoconf_path); return -ENOENT; }