diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/btf.c')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/btf.c | 153 | 
1 files changed, 131 insertions, 22 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/btf.c b/tools/testing/selftests/bpf/prog_tests/btf.c index ba5bde53d418..edb387163baa 100644 --- a/tools/testing/selftests/bpf/prog_tests/btf.c +++ b/tools/testing/selftests/bpf/prog_tests/btf.c @@ -2897,26 +2897,6 @@ static struct btf_raw_test raw_tests[] = {  },  { -	.descr = "invalid enum kind_flag", -	.raw_types = { -		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */ -		BTF_TYPE_ENC(0, BTF_INFO_ENC(BTF_KIND_ENUM, 1, 1), 4),	/* [2] */ -		BTF_ENUM_ENC(NAME_TBD, 0), -		BTF_END_RAW, -	}, -	BTF_STR_SEC("\0A"), -	.map_type = BPF_MAP_TYPE_ARRAY, -	.map_name = "enum_type_check_btf", -	.key_size = sizeof(int), -	.value_size = sizeof(int), -	.key_type_id = 1, -	.value_type_id = 1, -	.max_entries = 4, -	.btf_load_err = true, -	.err_str = "Invalid btf_info kind_flag", -}, - -{  	.descr = "valid fwd kind_flag",  	.raw_types = {  		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),		/* [1] */ @@ -4072,6 +4052,42 @@ static struct btf_raw_test raw_tests[] = {  	.btf_load_err = true,  	.err_str = "Type tags don't precede modifiers",  }, +{ +	.descr = "enum64 test #1, unsigned, size 8", +	.raw_types = { +		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */ +		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8),	/* [2] */ +		BTF_ENUM64_ENC(NAME_TBD, 0, 0), +		BTF_ENUM64_ENC(NAME_TBD, 1, 1), +		BTF_END_RAW, +	}, +	BTF_STR_SEC("\0a\0b\0c"), +	.map_type = BPF_MAP_TYPE_ARRAY, +	.map_name = "tag_type_check_btf", +	.key_size = sizeof(int), +	.value_size = 8, +	.key_type_id = 1, +	.value_type_id = 2, +	.max_entries = 1, +}, +{ +	.descr = "enum64 test #2, signed, size 4", +	.raw_types = { +		BTF_TYPE_INT_ENC(0, BTF_INT_SIGNED, 0, 32, 4),			/* [1] */ +		BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 1, 2), 4),	/* [2] */ +		BTF_ENUM64_ENC(NAME_TBD, -1, 0), +		BTF_ENUM64_ENC(NAME_TBD, 1, 0), +		BTF_END_RAW, +	}, +	BTF_STR_SEC("\0a\0b\0c"), +	.map_type = BPF_MAP_TYPE_ARRAY, +	.map_name = "tag_type_check_btf", +	.key_size = sizeof(int), +	.value_size = 4, +	.key_type_id = 1, +	.value_type_id = 2, +	.max_entries = 1, +},  }; /* struct btf_raw_test raw_tests[] */ @@ -7000,9 +7016,12 @@ static struct btf_dedup_test dedup_tests[] = {  			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] decl_tag */  			BTF_DECL_TAG_ENC(NAME_TBD, 7, -1),				/* [17] decl_tag */  			BTF_TYPE_TAG_ENC(NAME_TBD, 8),					/* [18] type_tag */ +			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8),	/* [19] enum64 */ +				BTF_ENUM64_ENC(NAME_TBD, 0, 0), +				BTF_ENUM64_ENC(NAME_TBD, 1, 1),  			BTF_END_RAW,  		}, -		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R"), +		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R\0S\0T\0U"),  	},  	.expect = {  		.raw_types = { @@ -7030,9 +7049,12 @@ static struct btf_dedup_test dedup_tests[] = {  			BTF_DECL_TAG_ENC(NAME_TBD, 13, 1),				/* [16] decl_tag */  			BTF_DECL_TAG_ENC(NAME_TBD, 7, -1),				/* [17] decl_tag */  			BTF_TYPE_TAG_ENC(NAME_TBD, 8),					/* [18] type_tag */ +			BTF_TYPE_ENC(NAME_TBD, BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 2), 8),	/* [19] enum64 */ +				BTF_ENUM64_ENC(NAME_TBD, 0, 0), +				BTF_ENUM64_ENC(NAME_TBD, 1, 1),  			BTF_END_RAW,  		}, -		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R"), +		BTF_STR_SEC("\0A\0B\0C\0D\0E\0F\0G\0H\0I\0J\0K\0L\0M\0N\0O\0P\0Q\0R\0S\0T\0U"),  	},  },  { @@ -7493,6 +7515,91 @@ static struct btf_dedup_test dedup_tests[] = {  		BTF_STR_SEC("\0tag1\0t\0m"),  	},  }, +{ +	.descr = "dedup: enum64, standalone", +	.input = { +		.raw_types = { +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val"), +	}, +	.expect = { +		.raw_types = { +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val"), +	}, +}, +{ +	.descr = "dedup: enum64, fwd resolution", +	.input = { +		.raw_types = { +			/* [1] fwd enum64 'e1' before full enum */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), +			/* [2] full enum64 'e1' after fwd */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), +			/* [3] full enum64 'e2' before fwd */ +			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(4), 0, 456), +			/* [4] fwd enum64 'e2' after full enum */ +			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 0), 8), +			/* [5] incompatible full enum64 with different value */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(2), 0, 321), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), +	}, +	.expect = { +		.raw_types = { +			/* [1] full enum64 'e1' */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(2), 1, 123), +			/* [2] full enum64 'e2' */ +			BTF_TYPE_ENC(NAME_NTH(3), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(4), 0, 456), +			/* [3] incompatible full enum64 with different value */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 8), +				BTF_ENUM64_ENC(NAME_NTH(2), 0, 321), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val\0e2\0e2_val"), +	}, +}, +{ +	.descr = "dedup: enum and enum64, no dedup", +	.input = { +		.raw_types = { +			/* [1] enum 'e1' */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(2), 1), +			/* [2] enum64 'e1' */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4), +				BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val"), +	}, +	.expect = { +		.raw_types = { +			/* [1] enum 'e1' */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM, 0, 1), 4), +				BTF_ENUM_ENC(NAME_NTH(2), 1), +			/* [2] enum64 'e1' */ +			BTF_TYPE_ENC(NAME_NTH(1), BTF_INFO_ENC(BTF_KIND_ENUM64, 0, 1), 4), +				BTF_ENUM64_ENC(NAME_NTH(2), 1, 0), +			BTF_END_RAW, +		}, +		BTF_STR_SEC("\0e1\0e1_val"), +	}, +},  }; @@ -7517,6 +7624,8 @@ static int btf_type_size(const struct btf_type *t)  		return base_size + sizeof(__u32);  	case BTF_KIND_ENUM:  		return base_size + vlen * sizeof(struct btf_enum); +	case BTF_KIND_ENUM64: +		return base_size + vlen * sizeof(struct btf_enum64);  	case BTF_KIND_ARRAY:  		return base_size + sizeof(struct btf_array);  	case BTF_KIND_STRUCT:  |