// SPDX-License-Identifier: GPL-2.0-only #include "hwprobe.h" #include "../../kselftest.h" int main(int argc, char **argv) { struct riscv_hwprobe pairs[8]; unsigned long cpus; long out; ksft_print_header(); ksft_set_plan(5); /* Fake the CPU_SET ops. */ cpus = -1; /* * Just run a basic test: pass enough pairs to get up to the base * behavior, and then check to make sure it's sane. */ for (long i = 0; i < 8; i++) pairs[i].key = i; out = riscv_hwprobe(pairs, 8, 1, &cpus, 0); if (out != 0) ksft_exit_fail_msg("hwprobe() failed with %ld\n", out); for (long i = 0; i < 4; ++i) { /* Fail if the kernel claims not to recognize a base key. */ if ((i < 4) && (pairs[i].key != i)) ksft_exit_fail_msg("Failed to recognize base key: key != i, " "key=%lld, i=%ld\n", pairs[i].key, i); if (pairs[i].key != RISCV_HWPROBE_KEY_BASE_BEHAVIOR) continue; if (pairs[i].value & RISCV_HWPROBE_BASE_BEHAVIOR_IMA) continue; ksft_exit_fail_msg("Unexpected pair: (%lld, %llu)\n", pairs[i].key, pairs[i].value); } out = riscv_hwprobe(pairs, 8, 0, 0, 0); ksft_test_result(out == 0, "NULL CPU set\n"); out = riscv_hwprobe(pairs, 8, 0, &cpus, 0); ksft_test_result(out != 0, "Bad CPU set\n"); out = riscv_hwprobe(pairs, 8, 1, 0, 0); ksft_test_result(out != 0, "NULL CPU set with non-zero size\n"); pairs[0].key = RISCV_HWPROBE_KEY_BASE_BEHAVIOR; out = riscv_hwprobe(pairs, 1, 1, &cpus, 0); ksft_test_result(out == 0 && pairs[0].key == RISCV_HWPROBE_KEY_BASE_BEHAVIOR, "Existing key is maintained\n"); pairs[0].key = 0x5555; pairs[1].key = 1; pairs[1].value = 0xAAAA; out = riscv_hwprobe(pairs, 2, 0, 0, 0); ksft_test_result(out == 0 && pairs[0].key == -1 && pairs[1].key == 1 && pairs[1].value != 0xAAAA, "Unknown key overwritten with -1 and doesn't block other elements\n"); ksft_finished(); }