Commit f4db3dd5 authored by Yonghong Song's avatar Yonghong Song Committed by Alexei Starovoitov
Browse files

selftests/bpf: Add a test for enum64 value relocations



Add a test for enum64 value relocations.
The test will be skipped if clang version is 14 or lower
since enum64 is only supported from version 15.

Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarYonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/r/20220607062718.3726307-1-yhs@fb.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent adc26d13
Loading
Loading
Loading
Loading
+58 −0
Original line number Diff line number Diff line
@@ -363,6 +363,25 @@ static int duration = 0;
	.fails = true,							\
}

#define ENUM64VAL_CASE_COMMON(name)					\
	.case_name = #name,						\
	.bpf_obj_file = "test_core_reloc_enum64val.o",			\
	.btf_src_file = "btf__core_reloc_" #name ".o",			\
	.raw_tp_name = "sys_enter",					\
	.prog_name = "test_core_enum64val"

#define ENUM64VAL_CASE(name, ...) {					\
	ENUM64VAL_CASE_COMMON(name),					\
	.output = STRUCT_TO_CHAR_PTR(core_reloc_enum64val_output)	\
			__VA_ARGS__,					\
	.output_len = sizeof(struct core_reloc_enum64val_output),	\
}

#define ENUM64VAL_ERR_CASE(name) {					\
	ENUM64VAL_CASE_COMMON(name),					\
	.fails = true,							\
}

struct core_reloc_test_case;

typedef int (*setup_test_fn)(struct core_reloc_test_case *test);
@@ -831,6 +850,45 @@ static const struct core_reloc_test_case test_cases[] = {
		.anon_val2 = 0x222,
	}),
	ENUMVAL_ERR_CASE(enumval___err_missing),

	/* 64bit enumerator value existence and value relocations */
	ENUM64VAL_CASE(enum64val, {
		.unsigned_val1_exists = true,
		.unsigned_val2_exists = true,
		.unsigned_val3_exists = true,
		.signed_val1_exists = true,
		.signed_val2_exists = true,
		.signed_val3_exists = true,
		.unsigned_val1 = 0x1ffffffffULL,
		.unsigned_val2 = 0x2,
		.signed_val1 = 0x1ffffffffLL,
		.signed_val2 = -2,
	}),
	ENUM64VAL_CASE(enum64val___diff, {
		.unsigned_val1_exists = true,
		.unsigned_val2_exists = true,
		.unsigned_val3_exists = true,
		.signed_val1_exists = true,
		.signed_val2_exists = true,
		.signed_val3_exists = true,
		.unsigned_val1 = 0x101ffffffffULL,
		.unsigned_val2 = 0x202ffffffffULL,
		.signed_val1 = -101,
		.signed_val2 = -202,
	}),
	ENUM64VAL_CASE(enum64val___val3_missing, {
		.unsigned_val1_exists = true,
		.unsigned_val2_exists = true,
		.unsigned_val3_exists = false,
		.signed_val1_exists = true,
		.signed_val2_exists = true,
		.signed_val3_exists = false,
		.unsigned_val1 = 0x111ffffffffULL,
		.unsigned_val2 = 0x222,
		.signed_val1 = 0x111ffffffffLL,
		.signed_val2 = -222,
	}),
	ENUM64VAL_ERR_CASE(enum64val___err_missing),
};

struct data {
+3 −0
Original line number Diff line number Diff line
#include "core_reloc_types.h"

void f(struct core_reloc_enum64val x) {}
+3 −0
Original line number Diff line number Diff line
#include "core_reloc_types.h"

void f(struct core_reloc_enum64val___diff x) {}
+3 −0
Original line number Diff line number Diff line
#include "core_reloc_types.h"

void f(struct core_reloc_enum64val___err_missing x) {}
+3 −0
Original line number Diff line number Diff line
#include "core_reloc_types.h"

void f(struct core_reloc_enum64val___val3_missing x) {}
Loading