1 | // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 |
2 | /****************************************************************************** |
3 | * |
4 | * Module Name: utuuid -- UUID support functions |
5 | * |
6 | * Copyright (C) 2000 - 2023, Intel Corp. |
7 | * |
8 | *****************************************************************************/ |
9 | |
10 | #include <acpi/acpi.h> |
11 | #include "accommon.h" |
12 | |
13 | #define _COMPONENT ACPI_COMPILER |
14 | ACPI_MODULE_NAME("utuuid" ) |
15 | |
16 | #if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP || defined ACPI_HELP_APP) |
17 | /* |
18 | * UUID support functions. |
19 | * |
20 | * This table is used to convert an input UUID ascii string to a 16 byte |
21 | * buffer and the reverse. The table maps a UUID buffer index 0-15 to |
22 | * the index within the 36-byte UUID string where the associated 2-byte |
23 | * hex value can be found. |
24 | * |
25 | * 36-byte UUID strings are of the form: |
26 | * aabbccdd-eeff-gghh-iijj-kkllmmnnoopp |
27 | * Where aa-pp are one byte hex numbers, made up of two hex digits |
28 | * |
29 | * Note: This table is basically the inverse of the string-to-offset table |
30 | * found in the ACPI spec in the description of the to_UUID macro. |
31 | */ |
32 | const u8 acpi_gbl_map_to_uuid_offset[UUID_BUFFER_LENGTH] = { |
33 | 6, 4, 2, 0, 11, 9, 16, 14, 19, 21, 24, 26, 28, 30, 32, 34 |
34 | }; |
35 | |
36 | /******************************************************************************* |
37 | * |
38 | * FUNCTION: acpi_ut_convert_string_to_uuid |
39 | * |
40 | * PARAMETERS: in_string - 36-byte formatted UUID string |
41 | * uuid_buffer - Where the 16-byte UUID buffer is returned |
42 | * |
43 | * RETURN: None. Output data is returned in the uuid_buffer |
44 | * |
45 | * DESCRIPTION: Convert a 36-byte formatted UUID string to 16-byte UUID buffer |
46 | * |
47 | ******************************************************************************/ |
48 | |
49 | void acpi_ut_convert_string_to_uuid(char *in_string, u8 *uuid_buffer) |
50 | { |
51 | u32 i; |
52 | |
53 | for (i = 0; i < UUID_BUFFER_LENGTH; i++) { |
54 | uuid_buffer[i] = |
55 | (acpi_ut_ascii_char_to_hex |
56 | (in_string[acpi_gbl_map_to_uuid_offset[i]]) << 4); |
57 | |
58 | uuid_buffer[i] |= |
59 | acpi_ut_ascii_char_to_hex(in_string |
60 | [acpi_gbl_map_to_uuid_offset[i] + |
61 | 1]); |
62 | } |
63 | } |
64 | |
65 | /******************************************************************************* |
66 | * |
67 | * FUNCTION: acpi_ut_convert_uuid_to_string |
68 | * |
69 | * PARAMETERS: uuid_buffer - 16-byte UUID buffer |
70 | * out_string - 36-byte formatted UUID string |
71 | * |
72 | * RETURN: Status |
73 | * |
74 | * DESCRIPTION: Convert 16-byte UUID buffer to 36-byte formatted UUID string |
75 | * out_string must be 37 bytes to include null terminator. |
76 | * |
77 | ******************************************************************************/ |
78 | |
79 | acpi_status acpi_ut_convert_uuid_to_string(char *uuid_buffer, char *out_string) |
80 | { |
81 | u32 i; |
82 | |
83 | if (!uuid_buffer || !out_string) { |
84 | return (AE_BAD_PARAMETER); |
85 | } |
86 | |
87 | for (i = 0; i < UUID_BUFFER_LENGTH; i++) { |
88 | out_string[acpi_gbl_map_to_uuid_offset[i]] = |
89 | acpi_ut_hex_to_ascii_char(uuid_buffer[i], 4); |
90 | |
91 | out_string[acpi_gbl_map_to_uuid_offset[i] + 1] = |
92 | acpi_ut_hex_to_ascii_char(uuid_buffer[i], 0); |
93 | } |
94 | |
95 | /* Insert required hyphens (dashes) */ |
96 | |
97 | out_string[UUID_HYPHEN1_OFFSET] = |
98 | out_string[UUID_HYPHEN2_OFFSET] = |
99 | out_string[UUID_HYPHEN3_OFFSET] = |
100 | out_string[UUID_HYPHEN4_OFFSET] = '-'; |
101 | |
102 | out_string[UUID_STRING_LENGTH] = 0; /* Null terminate */ |
103 | return (AE_OK); |
104 | } |
105 | #endif |
106 | |