Index: tests/sys/kern/libkern_crc32.c =================================================================== --- tests/sys/kern/libkern_crc32.c +++ tests/sys/kern/libkern_crc32.c @@ -33,8 +33,23 @@ #include -#if !defined(__amd64__) && !defined(__i386__) && !defined(__aarch64__) -#error These tests are not supported on this platform +uint32_t calculate_crc32c(uint32_t crc32c, const unsigned char *buffer, + unsigned int length); +#include "../../../sys/libkern/gsb_crc32.c" + +#if defined(__amd64__) || defined(__i386__) +#include +#include + +static bool +have_sse42(void) +{ + u_int cpu_registers[4]; + + do_cpuid(1, cpu_registers); + + return ((cpu_registers[2] & CPUID2_SSE42) != 0); +} #endif ATF_TC_WITHOUT_HEAD(crc32c_basic_correctness); @@ -83,15 +98,30 @@ for (i = 0; i < nitems(inputs); i++) { #if defined(__amd64__) || defined(__i386__) - act = sse42_crc32c(~0, (const void *)&inputs[i], - sizeof(inputs[0])); + if (have_sse42()) { + act = sse42_crc32c(~0, (const void *)&inputs[i], + sizeof(inputs[0])); + ATF_REQUIRE_MSG(act == results[i], + "sse42_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)inputs[i], results[i], act); + } #else act = armv8_crc32c(~0, (const void *)&inputs[i], sizeof(inputs[0])); + ATF_REQUIRE_MSG(act == results[i], + "armv8_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)inputs[i], results[i], act); #endif + act = singletable_crc32c(~0, (const void *)&inputs[i], + sizeof(inputs[0])); + ATF_REQUIRE_MSG(act == results[i], + "singletable_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)inputs[i], results[i], act); + act = multitable_crc32c(~0, (const void *)&inputs[i], + sizeof(inputs[0])); ATF_REQUIRE_MSG(act == results[i], - "crc32c(0x%jx) = 0x%08x, got 0x%08x", (uintmax_t)inputs[i], - results[i], act); + "multitable_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)inputs[i], results[i], act); } } @@ -104,18 +134,33 @@ size_t i; uint32_t act; - for (i = 1; i < 8; i++) { memcpy(&buf[i], &input, sizeof(input)); #if defined(__amd64__) || defined(__i386__) - act = sse42_crc32c(~0, (const void *)&buf[i], sizeof(input)); + if (have_sse42()) { + act = sse42_crc32c(~0, (const void *)&buf[i], + sizeof(input)); + ATF_REQUIRE_MSG(act == result, + "sse42_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)input, result, act); + } #else act = armv8_crc32c(~0, (const void *)&buf[i], sizeof(input)); + ATF_REQUIRE_MSG(act == result, + "armv8_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)input, result, act); #endif + act = singletable_crc32c(~0, (const void *)&buf[i], + sizeof(input)); + ATF_REQUIRE_MSG(act == result, + "singletable_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)input, result, act); + act = multitable_crc32c(~0, (const void *)&buf[i], + sizeof(input)); ATF_REQUIRE_MSG(act == result, - "crc32c(0x%jx) = 0x%08x, got 0x%08x", (uintmax_t)input, - result, act); + "multitable_crc32c(0x%jx) = 0x%08x, got 0x%08x", + (uintmax_t)input, result, act); } } @@ -130,12 +175,22 @@ uint32_t act; #if defined(__amd64__) || defined(__i386__) - act = sse42_crc32c(~0, input, sizeof(input)); + if (have_sse42()) { + act = sse42_crc32c(~0, input, sizeof(input)); + ATF_REQUIRE_MSG(act == result, + "sse42_crc32c expected 0x%08x, got 0x%08x", result, act); + } #else act = armv8_crc32c(~0, input, sizeof(input)); + ATF_REQUIRE_MSG(act == result, + "armv8_crc32c expected 0x%08x, got 0x%08x", result, act); #endif - ATF_REQUIRE_MSG(act == result, "expected 0x%08x, got 0x%08x", result, - act); + act = singletable_crc32c(~0, input, sizeof(input)); + ATF_REQUIRE_MSG(act == result, + "singletable_crc32c expected 0x%08x, got 0x%08x", result, act); + act = multitable_crc32c(~0, input, sizeof(input)); + ATF_REQUIRE_MSG(act == result, + "multitable_crc32c expected 0x%08x, got 0x%08x", result, act); } ATF_TP_ADD_TCS(tp)