From 3268a48572878704c6b00ee4e97ff435ae87a1c2 Mon Sep 17 00:00:00 2001 From: Dave Thaler Date: Mon, 5 Feb 2024 08:37:52 -0800 Subject: [PATCH 1/3] Add conformance test for callx instruction (#195) Signed-off-by: Dave Thaler --- include/bpf_conformance.h | 1 + src/bpf_assembler.cc | 11 +++++++++-- src/bpf_conformance.cc | 2 +- src/opcode_names.h | 1 + src/runner.cc | 2 ++ tests/callx.data | 12 ++++++++++++ 6 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/callx.data diff --git a/include/bpf_conformance.h b/include/bpf_conformance.h index 75065f4..ffb7cc0 100644 --- a/include/bpf_conformance.h +++ b/include/bpf_conformance.h @@ -23,6 +23,7 @@ typedef enum class _bpf_conformance_test_cpu_version v2 = 2, v3 = 3, v4 = 4, + vnext = 100, unknown = -1, } bpf_conformance_test_cpu_version_t; diff --git a/src/bpf_assembler.cc b/src/bpf_assembler.cc index aa7761f..a0e793e 100644 --- a/src/bpf_assembler.cc +++ b/src/bpf_assembler.cc @@ -309,8 +309,15 @@ typedef class _bpf_assembler auto target = operands[1]; // Mode determines if this is a helper function, a local call, or a call to a runtime function. if (mode == "helper") { - inst.imm = _decode_imm32(target); - inst.src = 0; + if (target.starts_with('%')) { + inst.opcode |= EBPF_SRC_REG; + inst.imm = 0; + inst.src = _decode_register(target); + } else { + inst.opcode |= EBPF_SRC_IMM; + inst.imm = _decode_imm32(target); + inst.src = 0; + } } else if (mode == "local") { inst.imm = _decode_jump_target(target); inst.src = 1; diff --git a/src/bpf_conformance.cc b/src/bpf_conformance.cc index 9cc19f5..ac495b2 100644 --- a/src/bpf_conformance.cc +++ b/src/bpf_conformance.cc @@ -213,7 +213,7 @@ bpf_conformance_options( instructions_used.insert(bpf_conformance_instruction_t(required_cpu_version, inst)); } - // If the caller requires this as a XDP program, then add the prolog instructions. + // If the caller requires this as an XDP program, then add the prolog instructions. if (options.xdp_prolog && input_memory.size() > 0) { auto prolog_instructions = _generate_xdp_prolog(input_memory.size()); byte_code.insert(byte_code.begin(), prolog_instructions.begin(), prolog_instructions.end()); diff --git a/src/opcode_names.h b/src/opcode_names.h index 1dcdd86..b50a011 100644 --- a/src/opcode_names.h +++ b/src/opcode_names.h @@ -291,6 +291,7 @@ static const std::set instructions_from_ {bpf_conformance_test_cpu_version_t::v3, 0x85, 0x01}, {bpf_conformance_test_cpu_version_t::v3, 0x85, 0x02}, {bpf_conformance_test_cpu_version_t::v1, 0x87}, + {bpf_conformance_test_cpu_version_t::vnext, 0x8d, 0x00}, {bpf_conformance_test_cpu_version_t::v1, 0x94, 0x00, 0x00, 0x00}, {bpf_conformance_test_cpu_version_t::v4, 0x94, 0x00, 0x00, 0x01}, {bpf_conformance_test_cpu_version_t::v1, 0x95}, diff --git a/src/runner.cc b/src/runner.cc index c03777a..fbb6202 100644 --- a/src/runner.cc +++ b/src/runner.cc @@ -123,6 +123,8 @@ main(int argc, char** argv) cpu_version = bpf_conformance_test_cpu_version_t::v3; } else if (cpu_version_string == "v4") { cpu_version = bpf_conformance_test_cpu_version_t::v4; + } else if (cpu_version_string == "vnext") { + cpu_version = bpf_conformance_test_cpu_version_t::vnext; } else { std::cout << "Invalid CPU version" << std::endl; return 1; diff --git a/tests/callx.data b/tests/callx.data new file mode 100644 index 0000000..7d83a23 --- /dev/null +++ b/tests/callx.data @@ -0,0 +1,12 @@ +# Copyright (c) Big Switch Networks, Inc +# SPDX-License-Identifier: Apache-2.0 +-- asm +mov %r1, -1 +mov %r2, 5 +call %r2 +mov %r0, 2 +exit +-- result +0x2 +-- no register offset +call instruction From 05abeb55b924737d015da28b715ca0a25617a557 Mon Sep 17 00:00:00 2001 From: Dave Thaler Date: Fri, 9 Feb 2024 08:16:11 -0800 Subject: [PATCH 2/3] Add support for conformance groups (#196) * Move callx to cpu v1 Because clang generates it when using -mcpu=v1 Signed-off-by: Dave Thaler * Add support for conformance groups Signed-off-by: Dave Thaler --------- Signed-off-by: Dave Thaler --- include/bpf_conformance.h | 45 ++++- src/CMakeLists.txt | 10 +- src/bpf_conformance.cc | 24 ++- src/opcode_names.h | 341 ++++++++++++++++++++------------------ src/runner.cc | 67 +++++++- 5 files changed, 298 insertions(+), 189 deletions(-) diff --git a/include/bpf_conformance.h b/include/bpf_conformance.h index ffb7cc0..e3e67fc 100644 --- a/include/bpf_conformance.h +++ b/include/bpf_conformance.h @@ -23,10 +23,52 @@ typedef enum class _bpf_conformance_test_cpu_version v2 = 2, v3 = 3, v4 = 4, - vnext = 100, unknown = -1, } bpf_conformance_test_cpu_version_t; +typedef enum class _bpf_conformance_groups +{ + none = 0x00000000, + base32 = 0x00000001, + base64 = 0x00000002, + atomic32 = 0x00000004, + atomic64 = 0x00000008, + divmul32 = 0x00000010, + divmul64 = 0x00000020, + packet = 0x00000040, + callx = 0x00000080, +} bpf_conformance_groups_t; + +inline bpf_conformance_groups_t +operator~(bpf_conformance_groups_t a) +{ + return static_cast(~static_cast(a)); +} + +inline bpf_conformance_groups_t +operator|(bpf_conformance_groups_t a, bpf_conformance_groups_t b) +{ + return static_cast(static_cast(a) | static_cast(b)); +} + +inline bpf_conformance_groups_t& +operator|=(bpf_conformance_groups_t& a, bpf_conformance_groups_t b) +{ + return a = a | b; +} + +inline bpf_conformance_groups_t +operator&(bpf_conformance_groups_t a, bpf_conformance_groups_t b) +{ + return static_cast(static_cast(a) & static_cast(b)); +} + +inline bpf_conformance_groups_t& +operator&=(bpf_conformance_groups_t& a, bpf_conformance_groups_t b) +{ + return a = a & b; +} + // Add typedef for backwards compatibility. typedef bpf_conformance_test_cpu_version_t bpf_conformance_test_CPU_version_t; @@ -43,6 +85,7 @@ typedef struct _bpf_conformance_options std::optional include_test_regex; std::optional exclude_test_regex; bpf_conformance_test_cpu_version_t cpu_version; + bpf_conformance_groups_t groups; bpf_conformance_list_instructions_t list_instructions_option; bool debug; bool xdp_prolog; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a1d0cc..1a33f50 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -81,27 +81,27 @@ enable_testing() add_test( NAME cpu_v1 - COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v1 --exclude_regex "imm-" + COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v1 --exclude_regex "imm-" --exclude_groups callx ) add_test( NAME cpu_v2 - COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v2 --exclude_regex "imm-" + COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v2 --exclude_regex "imm-" --exclude_groups callx ) add_test( NAME cpu_v3 - COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v3 --debug true --list_instructions true --exclude_regex "imm-" + COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v3 --debug true --list_instructions true --exclude_regex "imm-" --exclude_groups callx ) add_test( NAME elf_format - COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --debug true --list_instructions true --elf true --exclude_regex "(call_local*|imm-)" + COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_directory ${PROJECT_BINARY_DIR}/tests --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v3 --debug true --list_instructions true --elf true --exclude_regex "(call_local*|imm-)" --exclude_groups callx ) add_test( NAME no_bpf_bytecode - COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_path ${PROJECT_SOURCE_DIR}/negative/empty.data --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --debug true + COMMAND sudo ${PROJECT_BINARY_DIR}/bin/bpf_conformance_runner --test_file_path ${PROJECT_SOURCE_DIR}/negative/empty.data --plugin_path ${PROJECT_BINARY_DIR}/bin/libbpf_plugin --xdp_prolog true --cpu_version v3 --debug true --exclude_groups callx ) set_tests_properties( diff --git a/src/bpf_conformance.cc b/src/bpf_conformance.cc index ac495b2..9c2b236 100644 --- a/src/bpf_conformance.cc +++ b/src/bpf_conformance.cc @@ -130,8 +130,8 @@ _generate_xdp_prolog(size_t size) }; } -bpf_conformance_test_cpu_version_t -get_instruction_cpu_version(ebpf_inst inst) +std::optional +get_instruction_conformance_info(ebpf_inst inst) { auto instruction = std::find_if(instructions_from_spec.begin(), instructions_from_spec.end(), [&](const auto &instruction) { return (instruction.opcode == inst.opcode) && @@ -140,9 +140,9 @@ get_instruction_cpu_version(ebpf_inst inst) (!needs_offset(inst.opcode) || instruction.offset == inst.offset); }); if (instruction == instructions_from_spec.end()) { - return bpf_conformance_test_cpu_version_t::unknown; + return {}; } - return instruction->cpu_version; + return *instruction; } std::map> @@ -189,20 +189,25 @@ bpf_conformance_options( } bpf_conformance_test_cpu_version_t required_cpu_version = bpf_conformance_test_cpu_version_t::v1; + bpf_conformance_groups_t required_conformance_groups{}; // Determine the required CPU version for the test. for (size_t i = 0; i < byte_code.size(); i++) { auto inst = byte_code[i]; - bpf_conformance_test_cpu_version_t cpu_version = get_instruction_cpu_version(inst); - required_cpu_version = std::max(required_cpu_version, cpu_version); + if (auto instruction = get_instruction_conformance_info(inst)) { + bpf_conformance_test_cpu_version_t cpu_version = instruction->cpu_version; + required_cpu_version = std::max(required_cpu_version, cpu_version); + required_conformance_groups |= instruction->groups; + } if (inst.opcode == EBPF_OP_LDDW) { // Instruction has a 64-bit immediate and takes two instructions slots. i++; } } - // If the test requires a CPU version that is not supported by the current CPU version, then skip the test. - if (required_cpu_version > options.cpu_version) { + // If the test requires a CPU version that is not supported by the current CPU version, + // or an unsupported conformance group, then skip the test. + if (required_cpu_version > options.cpu_version || (required_conformance_groups & ~options.groups) != bpf_conformance_groups_t::none) { test_results[test] = { bpf_conformance_test_result_t::TEST_RESULT_SKIP, "Test file contains unsupported instructions."}; _log_debug_result(test_results, test); @@ -210,7 +215,8 @@ bpf_conformance_options( } for (const auto& inst : byte_code) { - instructions_used.insert(bpf_conformance_instruction_t(required_cpu_version, inst)); + instructions_used.insert( + bpf_conformance_instruction_t(required_cpu_version, required_conformance_groups, inst)); } // If the caller requires this as an XDP program, then add the prolog instructions. diff --git a/src/opcode_names.h b/src/opcode_names.h index b50a011..b7a888a 100644 --- a/src/opcode_names.h +++ b/src/opcode_names.h @@ -33,26 +33,31 @@ class bpf_conformance_instruction_t public: bpf_conformance_instruction_t( bpf_conformance_test_cpu_version_t cpu_version, + bpf_conformance_groups_t groups, uint8_t opcode, uint8_t src = 0, uint32_t imm = 0, int16_t offset = 0) { this->cpu_version = cpu_version; + this->groups = groups; this->opcode = opcode; this->src = src; this->imm = imm; this->offset = offset; } - bpf_conformance_instruction_t(bpf_conformance_test_cpu_version_t cpu_version, ebpf_inst inst) + bpf_conformance_instruction_t( + bpf_conformance_test_cpu_version_t cpu_version, bpf_conformance_groups_t groups, ebpf_inst inst) { opcode = inst.opcode; this->cpu_version = cpu_version; + this->groups = groups; src = needs_src(opcode) ? inst.src : 0; imm = needs_imm(opcode) ? inst.imm : 0; offset = needs_offset(opcode) ? inst.offset : 0; } bpf_conformance_test_cpu_version_t cpu_version; + bpf_conformance_groups_t groups; uint8_t opcode; uint8_t src = {}; uint32_t imm = {}; @@ -200,170 +205,176 @@ static const std::map opcode_names = { // List of opcodes from the BPF ISA spec. static const std::set instructions_from_spec = { - {bpf_conformance_test_cpu_version_t::v1, 0x00}, - {bpf_conformance_test_cpu_version_t::v1, 0x04}, - {bpf_conformance_test_cpu_version_t::v1, 0x05}, - {bpf_conformance_test_cpu_version_t::v4, 0x06}, - {bpf_conformance_test_cpu_version_t::v1, 0x07}, - {bpf_conformance_test_cpu_version_t::v1, 0x0c}, - {bpf_conformance_test_cpu_version_t::v1, 0x0f}, - {bpf_conformance_test_cpu_version_t::v1, 0x14}, - {bpf_conformance_test_cpu_version_t::v1, 0x15}, - {bpf_conformance_test_cpu_version_t::v3, 0x16}, - {bpf_conformance_test_cpu_version_t::v1, 0x17}, - {bpf_conformance_test_cpu_version_t::v1, 0x18, 0x00}, - {bpf_conformance_test_cpu_version_t::v1, 0x18, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x18, 0x02}, - {bpf_conformance_test_cpu_version_t::v1, 0x18, 0x03}, - {bpf_conformance_test_cpu_version_t::v1, 0x18, 0x04}, - {bpf_conformance_test_cpu_version_t::v1, 0x18, 0x05}, - {bpf_conformance_test_cpu_version_t::v1, 0x18, 0x06}, - {bpf_conformance_test_cpu_version_t::v1, 0x1c}, - {bpf_conformance_test_cpu_version_t::v1, 0x1d}, - {bpf_conformance_test_cpu_version_t::v3, 0x1e}, - {bpf_conformance_test_cpu_version_t::v1, 0x1f}, - {bpf_conformance_test_cpu_version_t::v1, 0x24}, - {bpf_conformance_test_cpu_version_t::v1, 0x25}, - {bpf_conformance_test_cpu_version_t::v3, 0x26}, - {bpf_conformance_test_cpu_version_t::v1, 0x27}, - {bpf_conformance_test_cpu_version_t::v1, 0x2c}, - {bpf_conformance_test_cpu_version_t::v1, 0x2d}, - {bpf_conformance_test_cpu_version_t::v3, 0x2e}, - {bpf_conformance_test_cpu_version_t::v1, 0x2f}, - {bpf_conformance_test_cpu_version_t::v1, 0x34, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x34, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x35}, - {bpf_conformance_test_cpu_version_t::v3, 0x36}, - {bpf_conformance_test_cpu_version_t::v1, 0x37, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x37, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x3c, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x3c, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x3d}, - {bpf_conformance_test_cpu_version_t::v3, 0x3e}, - {bpf_conformance_test_cpu_version_t::v1, 0x3f, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x3f, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x44}, - {bpf_conformance_test_cpu_version_t::v1, 0x45}, - {bpf_conformance_test_cpu_version_t::v3, 0x46}, - {bpf_conformance_test_cpu_version_t::v1, 0x47}, - {bpf_conformance_test_cpu_version_t::v1, 0x4c}, - {bpf_conformance_test_cpu_version_t::v1, 0x4d}, - {bpf_conformance_test_cpu_version_t::v3, 0x4e}, - {bpf_conformance_test_cpu_version_t::v1, 0x4f}, - {bpf_conformance_test_cpu_version_t::v1, 0x54}, - {bpf_conformance_test_cpu_version_t::v1, 0x55}, - {bpf_conformance_test_cpu_version_t::v3, 0x56}, - {bpf_conformance_test_cpu_version_t::v1, 0x57}, - {bpf_conformance_test_cpu_version_t::v1, 0x5c}, - {bpf_conformance_test_cpu_version_t::v1, 0x5d}, - {bpf_conformance_test_cpu_version_t::v3, 0x5e}, - {bpf_conformance_test_cpu_version_t::v1, 0x5f}, - {bpf_conformance_test_cpu_version_t::v1, 0x61}, - {bpf_conformance_test_cpu_version_t::v1, 0x62}, - {bpf_conformance_test_cpu_version_t::v1, 0x63}, - {bpf_conformance_test_cpu_version_t::v1, 0x64}, - {bpf_conformance_test_cpu_version_t::v1, 0x65}, - {bpf_conformance_test_cpu_version_t::v3, 0x66}, - {bpf_conformance_test_cpu_version_t::v1, 0x67}, - {bpf_conformance_test_cpu_version_t::v1, 0x69}, - {bpf_conformance_test_cpu_version_t::v1, 0x6a}, - {bpf_conformance_test_cpu_version_t::v1, 0x6b}, - {bpf_conformance_test_cpu_version_t::v1, 0x6c}, - {bpf_conformance_test_cpu_version_t::v1, 0x6d}, - {bpf_conformance_test_cpu_version_t::v3, 0x6e}, - {bpf_conformance_test_cpu_version_t::v1, 0x6f}, - {bpf_conformance_test_cpu_version_t::v1, 0x71}, - {bpf_conformance_test_cpu_version_t::v1, 0x72}, - {bpf_conformance_test_cpu_version_t::v1, 0x73}, - {bpf_conformance_test_cpu_version_t::v1, 0x74}, - {bpf_conformance_test_cpu_version_t::v1, 0x75}, - {bpf_conformance_test_cpu_version_t::v3, 0x76}, - {bpf_conformance_test_cpu_version_t::v1, 0x77}, - {bpf_conformance_test_cpu_version_t::v1, 0x79}, - {bpf_conformance_test_cpu_version_t::v1, 0x7a}, - {bpf_conformance_test_cpu_version_t::v1, 0x7b}, - {bpf_conformance_test_cpu_version_t::v1, 0x7c}, - {bpf_conformance_test_cpu_version_t::v1, 0x7d}, - {bpf_conformance_test_cpu_version_t::v3, 0x7e}, - {bpf_conformance_test_cpu_version_t::v1, 0x7f}, - {bpf_conformance_test_cpu_version_t::v1, 0x84}, - {bpf_conformance_test_cpu_version_t::v1, 0x85, 0x00}, - {bpf_conformance_test_cpu_version_t::v3, 0x85, 0x01}, - {bpf_conformance_test_cpu_version_t::v3, 0x85, 0x02}, - {bpf_conformance_test_cpu_version_t::v1, 0x87}, - {bpf_conformance_test_cpu_version_t::vnext, 0x8d, 0x00}, - {bpf_conformance_test_cpu_version_t::v1, 0x94, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x94, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x95}, - {bpf_conformance_test_cpu_version_t::v1, 0x97, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x97, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x9c, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x9c, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0x9f, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0x9f, 0x00, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v1, 0xa4}, - {bpf_conformance_test_cpu_version_t::v2, 0xa5}, - {bpf_conformance_test_cpu_version_t::v3, 0xa6}, - {bpf_conformance_test_cpu_version_t::v1, 0xa7}, - {bpf_conformance_test_cpu_version_t::v1, 0xac}, - {bpf_conformance_test_cpu_version_t::v2, 0xad}, - {bpf_conformance_test_cpu_version_t::v3, 0xae}, - {bpf_conformance_test_cpu_version_t::v1, 0xaf}, - {bpf_conformance_test_cpu_version_t::v1, 0xb4, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v2, 0xb5}, - {bpf_conformance_test_cpu_version_t::v3, 0xb6}, - {bpf_conformance_test_cpu_version_t::v1, 0xb7, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v1, 0xbc, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0xbc, 0x00, 0x00, 0x08}, - {bpf_conformance_test_cpu_version_t::v4, 0xbc, 0x00, 0x00, 0x10}, - {bpf_conformance_test_cpu_version_t::v2, 0xbd}, - {bpf_conformance_test_cpu_version_t::v3, 0xbe}, - {bpf_conformance_test_cpu_version_t::v1, 0xbf, 0x00, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v4, 0xbf, 0x00, 0x00, 0x08}, - {bpf_conformance_test_cpu_version_t::v4, 0xbf, 0x00, 0x00, 0x10}, - {bpf_conformance_test_cpu_version_t::v4, 0xbf, 0x00, 0x00, 0x20}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0x40}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0x41}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0x50}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0x51}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0xa0}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0xa1}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0xe1}, - {bpf_conformance_test_cpu_version_t::v3, 0xc3, 0x00, 0xf1}, - {bpf_conformance_test_cpu_version_t::v1, 0xc4}, - {bpf_conformance_test_cpu_version_t::v2, 0xc5}, - {bpf_conformance_test_cpu_version_t::v3, 0xc6}, - {bpf_conformance_test_cpu_version_t::v1, 0xc7}, - {bpf_conformance_test_cpu_version_t::v1, 0xcc}, - {bpf_conformance_test_cpu_version_t::v2, 0xcd}, - {bpf_conformance_test_cpu_version_t::v3, 0xce}, - {bpf_conformance_test_cpu_version_t::v1, 0xcf}, - {bpf_conformance_test_cpu_version_t::v1, 0xd4, 0x00, 0x10}, - {bpf_conformance_test_cpu_version_t::v1, 0xd4, 0x00, 0x20}, - {bpf_conformance_test_cpu_version_t::v1, 0xd4, 0x00, 0x40}, - {bpf_conformance_test_cpu_version_t::v2, 0xd5}, - {bpf_conformance_test_cpu_version_t::v3, 0xd6}, - {bpf_conformance_test_cpu_version_t::v4, 0xd7, 0x00, 0x10}, - {bpf_conformance_test_cpu_version_t::v4, 0xd7, 0x00, 0x20}, - {bpf_conformance_test_cpu_version_t::v4, 0xd7, 0x00, 0x40}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0x00}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0x01}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0x40}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0x41}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0x50}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0x51}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0x50}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0xa0}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0xa1}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0xe1}, - {bpf_conformance_test_cpu_version_t::v3, 0xdb, 0x00, 0xf1}, - {bpf_conformance_test_cpu_version_t::v1, 0xdc, 0x00, 0x10}, - {bpf_conformance_test_cpu_version_t::v1, 0xdc, 0x00, 0x20}, - {bpf_conformance_test_cpu_version_t::v1, 0xdc, 0x00, 0x40}, - {bpf_conformance_test_cpu_version_t::v2, 0xdd}, - {bpf_conformance_test_cpu_version_t::v3, 0xde}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x00}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x04}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x05}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base32, 0x06}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x07}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x0c}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x0f}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x14}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x15}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x16}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x17}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x18, 0x00}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x18, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x18, 0x02}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x18, 0x03}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x18, 0x04}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x18, 0x05}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x18, 0x06}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x1c}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x1d}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x1e}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x1f}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::packet, 0x20}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul32, 0x24}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x25}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x26}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul64, 0x27}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::packet, 0x28}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul32, 0x2c}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x2d}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x2e}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul64, 0x2f}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::packet, 0x30}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul32, 0x34, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul32, 0x34, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x35}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x36}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul64, 0x37, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul64, 0x37, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul32, 0x3c, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul32, 0x3c, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x3d}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x3e}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul64, 0x3f, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul64, 0x3f, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::packet, 0x40}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x44}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x45}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x46}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x47}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::packet, 0x48}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x4c}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x4d}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x4e}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x4f}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::packet, 0x50}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x54}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x55}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x56}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x57}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x5c}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x5d}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x5e}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x5f}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x61}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x62}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x63}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x64}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x65}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x66}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x67}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x69}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x6a}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x6b}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x6c}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x6d}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x6e}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x6f}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x71}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x72}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x73}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x74}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x75}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x76}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x77}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x79}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x7a}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x7b}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x7c}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x7d}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x7e}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0x7f}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x84}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x85, 0x00}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x85, 0x01}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0x85, 0x02}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x87}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::callx, 0x8d, 0x00}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul32, 0x94, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul32, 0x94, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0x95}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul64, 0x97, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul64, 0x97, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul32, 0x9c, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul32, 0x9c, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::divmul64, 0x9f, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::divmul64, 0x9f, 0x00, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xa4}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xa5}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xa6}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xa7}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xac}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xad}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xae}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xaf}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xb4, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xb5}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xb6}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xb7, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xbc, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base32, 0xbc, 0x00, 0x00, 0x08}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base32, 0xbc, 0x00, 0x00, 0x10}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xbd}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xbe}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xbf, 0x00, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base64, 0xbf, 0x00, 0x00, 0x08}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base64, 0xbf, 0x00, 0x00, 0x10}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base64, 0xbf, 0x00, 0x00, 0x20}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0x40}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0x41}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0x50}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0x51}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0xa0}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0xa1}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0xe1}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic32, 0xc3, 0x00, 0xf1}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xc4}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xc5}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xc6}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xc7}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xcc}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xcd}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xce}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xcf}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xd4, 0x00, 0x10}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xd4, 0x00, 0x20}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xd4, 0x00, 0x40}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xd5}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xd6}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base32, 0xd7, 0x00, 0x10}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base32, 0xd7, 0x00, 0x20}, + {bpf_conformance_test_cpu_version_t::v4, bpf_conformance_groups_t::base64, 0xd7, 0x00, 0x40}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0x00}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0x01}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0x40}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0x41}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0x50}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0x51}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0x50}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0xa0}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0xa1}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0xe1}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::atomic64, 0xdb, 0x00, 0xf1}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xdc, 0x00, 0x10}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base32, 0xdc, 0x00, 0x20}, + {bpf_conformance_test_cpu_version_t::v1, bpf_conformance_groups_t::base64, 0xdc, 0x00, 0x40}, + {bpf_conformance_test_cpu_version_t::v2, bpf_conformance_groups_t::base64, 0xdd}, + {bpf_conformance_test_cpu_version_t::v3, bpf_conformance_groups_t::base32, 0xde}, }; /** diff --git a/src/runner.cc b/src/runner.cc index fbb6202..25771cf 100644 --- a/src/runner.cc +++ b/src/runner.cc @@ -60,6 +60,25 @@ _get_test_files(const std::filesystem::path& test_file_directory) return result; } +static const std::map _conformance_groups = { + {"atomic32", bpf_conformance_groups_t::atomic32}, + {"atomic64", bpf_conformance_groups_t::atomic64}, + {"base32", bpf_conformance_groups_t::base32}, + {"base64", bpf_conformance_groups_t::base64}, + {"callx", bpf_conformance_groups_t::callx}, + {"divmul32", bpf_conformance_groups_t::divmul32}, + {"divmul64", bpf_conformance_groups_t::divmul64}, + {"packet", bpf_conformance_groups_t::packet}}; + +static std::optional +_get_conformance_group_by_name(std::string group) +{ + if (!_conformance_groups.contains(group)) { + return {}; + } + return _conformance_groups.find(group)->second; +} + int main(int argc, char** argv) { @@ -80,6 +99,12 @@ main(int argc, char** argv) "xdp_prolog", boost::program_options::value(), "XDP prolog")( "elf", boost::program_options::value(), "ELF format")( "cpu_version", boost::program_options::value(), "CPU version")( + "include_groups", + boost::program_options::value>()->multitoken(), + "Include conformance groups")( + "exclude_groups", + boost::program_options::value>()->multitoken(), + "Exclude conformance groups")( "include_regex", boost::program_options::value(), "Include regex")( "exclude_regex", boost::program_options::value(), "Exclude regex"); @@ -103,7 +128,8 @@ main(int argc, char** argv) } std::string plugin_path = vm["plugin_path"].as(); - std::stringstream plugin_options_stream(vm.count("plugin_options") ? vm["plugin_options"].as() : ""); + std::stringstream plugin_options_stream( + vm.count("plugin_options") ? vm["plugin_options"].as() : ""); std::vector plugin_options; std::string option; @@ -123,14 +149,41 @@ main(int argc, char** argv) cpu_version = bpf_conformance_test_cpu_version_t::v3; } else if (cpu_version_string == "v4") { cpu_version = bpf_conformance_test_cpu_version_t::v4; - } else if (cpu_version_string == "vnext") { - cpu_version = bpf_conformance_test_cpu_version_t::vnext; } else { std::cout << "Invalid CPU version" << std::endl; return 1; } } + // Enable default conformance groups, which don't include callx or packet. + bpf_conformance_groups_t groups = bpf_conformance_groups_t::base32 | bpf_conformance_groups_t::base64 | + bpf_conformance_groups_t::divmul32 | bpf_conformance_groups_t::divmul64; + if (cpu_version >= bpf_conformance_test_cpu_version_t::v3) { + groups |= bpf_conformance_groups_t::atomic32 | bpf_conformance_groups_t::atomic64; + } + if (vm.count("include_groups")) { + auto include_groups = vm["include_groups"].as>(); + for (std::string group_name : include_groups) { + if (auto group = _get_conformance_group_by_name(group_name)) { + groups |= *group; + } else { + std::cout << "Invalid group: " << group_name << std::endl; + return 1; + } + } + } + if (vm.count("exclude_groups")) { + auto exclude_groups = vm["exclude_groups"].as>(); + for (std::string group_name : exclude_groups) { + if (auto group = _get_conformance_group_by_name(group_name)) { + groups &= ~(*group); + } else { + std::cout << "Invalid group: " << group_name << std::endl; + return 1; + } + } + } + std::optional include_regex = vm.count("include_regex") ? std::make_optional(vm["include_regex"].as()) : std::nullopt; std::optional exclude_regex = vm.count("exclude_regex") ? std::make_optional(vm["exclude_regex"].as()) : std::nullopt; @@ -163,18 +216,14 @@ main(int argc, char** argv) options.include_test_regex = include_regex; options.exclude_test_regex = exclude_regex; options.cpu_version = cpu_version; + options.groups = groups; options.list_instructions_option = list_instructions; options.debug = debug; options.xdp_prolog = xdp_prolog; options.elf_format = elf_format; std::map> test_results; - if (options.elf_format == false && options.xdp_prolog == false) { - test_results = bpf_conformance(tests, plugin_path, plugin_options, include_regex, exclude_regex, cpu_version, list_instructions, debug); - } - else { - test_results = bpf_conformance_options(tests, plugin_path, plugin_options, options); - } + test_results = bpf_conformance_options(tests, plugin_path, plugin_options, options); // At the end of all the tests, print a summary of the results. std::cout << "Test results:" << std::endl; From 4526e434c876823a509372d9533711b38a2d795d Mon Sep 17 00:00:00 2001 From: Will Hawkins Date: Fri, 9 Feb 2024 11:29:59 -0500 Subject: [PATCH 3/3] Change immediate to be signed (#197) Most (all?) ebpf libraries store the immediate value is a signed 32-bit int. In fact, our internal struct does that, too. Make it consistent throughout the codebase. Signed-off-by: Will Hawkins Co-authored-by: Alan Jowett --- src/opcode_names.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opcode_names.h b/src/opcode_names.h index b7a888a..1756d5d 100644 --- a/src/opcode_names.h +++ b/src/opcode_names.h @@ -36,7 +36,7 @@ class bpf_conformance_instruction_t bpf_conformance_groups_t groups, uint8_t opcode, uint8_t src = 0, - uint32_t imm = 0, + int32_t imm = 0, int16_t offset = 0) { this->cpu_version = cpu_version; @@ -60,7 +60,7 @@ class bpf_conformance_instruction_t bpf_conformance_groups_t groups; uint8_t opcode; uint8_t src = {}; - uint32_t imm = {}; + int32_t imm = {}; int16_t offset = {}; };