| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Functional tests for UCLASS_FFA class | |
| * | |
| * Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com> | |
| * | |
| * Authors: | |
| * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com> | |
| */ | |
| #include <charset.h> | |
| #include <u-boot/uuid.h> | |
| #include <test/lib.h> | |
| #include <test/test.h> | |
| #include <test/ut.h> | |
| #include <efi.h> | |
| /* test UUID */ | |
| #define TEST_SVC_UUID "ed32d533-4209-99e6-2d72-cdd998a79cc0" | |
| /* U-Boot default fw image namespace */ | |
| #define DEFAULT_FW_IMAGE_NAMESPACE "8c9f137e-91dc-427b-b2d6-b420faebaf2a" | |
| #define UUID_SIZE 16 | |
| /* The UUID binary data (little-endian format) */ | |
| static const u8 ref_uuid_bin[UUID_SIZE] = { | |
| 0x33, 0xd5, 0x32, 0xed, | |
| 0x09, 0x42, 0xe6, 0x99, | |
| 0x72, 0x2d, 0xc0, 0x9c, | |
| 0xa7, 0x98, 0xd9, 0xcd | |
| }; | |
| static int lib_test_uuid_to_le(struct unit_test_state *uts) | |
| { | |
| const char *uuid_str = TEST_SVC_UUID; | |
| u8 ret_uuid_bin[UUID_SIZE] = {0}; | |
| ut_assertok(uuid_str_to_le_bin(uuid_str, ret_uuid_bin)); | |
| ut_asserteq_mem(ref_uuid_bin, ret_uuid_bin, UUID_SIZE); | |
| return 0; | |
| } | |
| LIB_TEST(lib_test_uuid_to_le, 0); | |
| #if defined(CONFIG_RANDOM_UUID) || defined(CONFIG_CMD_UUID) | |
| /* Test UUID attribute bits (version, variant) */ | |
| static int lib_test_uuid_bits(struct unit_test_state *uts) | |
| { | |
| unsigned char uuid[16]; | |
| efi_guid_t guid; | |
| int i; | |
| /* | |
| * Reduce the chance of a randomly generated UUID disguising | |
| * a regression by testing multiple times. | |
| */ | |
| for (i = 0; i < 5; i++) { | |
| /* Test UUID v4 */ | |
| gen_rand_uuid((unsigned char *)&uuid); | |
| printf("v4 UUID: %pUb\n", (efi_guid_t *)uuid); | |
| /* version 4 */ | |
| ut_assert((uuid[6] & 0xf0) == 0x40); | |
| /* variant 1 */ | |
| ut_assert((uuid[8] & UUID_VARIANT_MASK) == (UUID_VARIANT << UUID_VARIANT_SHIFT)); | |
| /* Test v5, use the v4 UUID as the namespace */ | |
| gen_v5_guid((struct uuid *)uuid, | |
| &guid, "test", 4, NULL); | |
| printf("v5 GUID: %pUl\n", (efi_guid_t *)uuid); | |
| /* This is a GUID so bits 6 and 7 are swapped (little endian). Version 5 */ | |
| ut_assert((guid.b[7] & 0xf0) == 0x50); | |
| /* variant 1 */ | |
| ut_assert((guid.b[8] & UUID_VARIANT_MASK) == (UUID_VARIANT << UUID_VARIANT_SHIFT)); | |
| } | |
| return 0; | |
| } | |
| LIB_TEST(lib_test_uuid_bits, 0); | |
| #endif | |
| struct dynamic_uuid_test_data { | |
| const char *compatible; | |
| const u16 *images[4]; | |
| const char *expected_uuids[4]; | |
| }; | |
| static int lib_test_dynamic_uuid_case(struct unit_test_state *uts, | |
| const struct dynamic_uuid_test_data *data) | |
| { | |
| struct uuid namespace; | |
| int j; | |
| ut_assertok(uuid_str_to_bin(DEFAULT_FW_IMAGE_NAMESPACE, (unsigned char *)&namespace, | |
| UUID_STR_FORMAT_GUID)); | |
| for (j = 0; data->images[j]; j++) { | |
| const char *expected_uuid = data->expected_uuids[j]; | |
| const u16 *image = data->images[j]; | |
| efi_guid_t uuid; | |
| char uuid_str[37]; | |
| gen_v5_guid(&namespace, &uuid, | |
| data->compatible, strlen(data->compatible), | |
| image, u16_strlen(image) * sizeof(uint16_t), | |
| NULL); | |
| uuid_bin_to_str((unsigned char *)&uuid, uuid_str, UUID_STR_FORMAT_GUID); | |
| ut_asserteq_str(expected_uuid, uuid_str); | |
| } | |
| return 0; | |
| } | |
| static int lib_test_dynamic_uuid(struct unit_test_state *uts) | |
| { | |
| int ret, i; | |
| const struct dynamic_uuid_test_data test_data[] = { | |
| { | |
| .compatible = "sandbox", | |
| .images = { | |
| u"SANDBOX-UBOOT", | |
| u"SANDBOX-UBOOT-ENV", | |
| u"SANDBOX-FIT", | |
| NULL, | |
| }, | |
| .expected_uuids = { | |
| "985f2937-7c2e-5e9a-8a5e-8e063312964b", | |
| "9e339473-c2eb-530a-a69b-0cd6bbbed40e", | |
| "46610520-469e-59dc-a8dd-c11832b877ea", | |
| NULL, | |
| } | |
| }, | |
| { | |
| .compatible = "qcom,qrb4210-rb2", | |
| .images = { | |
| u"QUALCOMM-UBOOT", | |
| NULL, | |
| }, | |
| .expected_uuids = { | |
| "d5021fac-8dd0-5ed7-90c2-763c304aaf86", | |
| NULL, | |
| } | |
| }, | |
| }; | |
| for (i = 0; i < ARRAY_SIZE(test_data); i++) { | |
| ret = lib_test_dynamic_uuid_case(uts, &test_data[i]); | |
| if (ret) | |
| return ret; | |
| } | |
| return 0; | |
| } | |
| LIB_TEST(lib_test_dynamic_uuid, 0); |