]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlString.c
MdeModulePkg: Change use of EFI_D_* to DEBUG_*
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / AcpiTableDxe / AmlString.c
CommitLineData
3dc8585e
JY
1/** @file\r
2 ACPI Sdt Protocol Driver\r
3\r
d1102dba 4 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR>\r
9d510e61 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
3dc8585e
JY
6\r
7**/\r
8\r
9#include "AcpiTable.h"\r
10\r
11/**\r
12 Check if it is AML Root name\r
13\r
14 @param[in] Buffer AML path.\r
d1102dba 15\r
3dc8585e
JY
16 @retval TRUE AML path is root.\r
17 @retval FALSE AML path is not root.\r
18**/\r
19BOOLEAN\r
20AmlIsRootPath (\r
21 IN UINT8 *Buffer\r
22 )\r
23{\r
24 if ((Buffer[0] == AML_ROOT_CHAR) && (Buffer[1] == 0)) {\r
25 return TRUE;\r
26 } else {\r
27 return FALSE;\r
28 }\r
29}\r
30\r
31/**\r
32 Check if it is AML LeadName.\r
33\r
34 @param[in] Ch Char.\r
d1102dba 35\r
3dc8585e
JY
36 @retval TRUE Char is AML LeadName.\r
37 @retval FALSE Char is not AML LeadName.\r
38**/\r
39BOOLEAN\r
40AmlIsLeadName (\r
41 IN CHAR8 Ch\r
42 )\r
43{\r
44 if ((Ch == '_') || (Ch >= 'A' && Ch <= 'Z')) {\r
45 return TRUE;\r
46 } else {\r
47 return FALSE;\r
48 }\r
49}\r
50\r
51/**\r
52 Check if it is AML Name.\r
53\r
54 @param[in] Ch Char.\r
d1102dba 55\r
3dc8585e
JY
56 @retval TRUE Char is AML Name.\r
57 @retval FALSE Char is not AML Name.\r
58**/\r
59BOOLEAN\r
60AmlIsName (\r
61 IN CHAR8 Ch\r
62 )\r
63{\r
64 if (AmlIsLeadName (Ch) || (Ch >= '0' && Ch <= '9')) {\r
65 return TRUE;\r
66 } else {\r
67 return FALSE;\r
68 }\r
69}\r
70\r
71/**\r
72 Return is buffer is AML NameSeg.\r
73\r
74 @param[in] Buffer AML NameSement.\r
d1102dba 75\r
3dc8585e
JY
76 @retval TRUE It is AML NameSegment.\r
77 @retval FALSE It is not AML NameSegment.\r
78**/\r
79BOOLEAN\r
80AmlIsNameSeg (\r
81 IN UINT8 *Buffer\r
82 )\r
83{\r
84 UINTN Index;\r
85 if (!AmlIsLeadName (Buffer[0])) {\r
86 return FALSE;\r
87 }\r
88 for (Index = 1; Index < AML_NAME_SEG_SIZE; Index++) {\r
89 if (!AmlIsName (Buffer[Index])) {\r
90 return FALSE;\r
91 }\r
92 }\r
93 return TRUE;\r
94}\r
95\r
96/**\r
97 Get AML NameString size.\r
98\r
99 @param[in] Buffer AML NameString.\r
d1102dba
LG
100 @param[out] BufferSize AML NameString size\r
101\r
3dc8585e
JY
102 @retval EFI_SUCCESS Success.\r
103 @retval EFI_INVALID_PARAMETER Buffer does not refer to a valid AML NameString.\r
104**/\r
105EFI_STATUS\r
106AmlGetNameStringSize (\r
107 IN UINT8 *Buffer,\r
108 OUT UINTN *BufferSize\r
109 )\r
110{\r
111 UINTN SegCount;\r
112 UINTN Length;\r
113 UINTN Index;\r
3dc8585e 114\r
3dc8585e
JY
115 Length = 0;\r
116\r
117 //\r
118 // Parse root or parent prefix\r
119 //\r
120 if (*Buffer == AML_ROOT_CHAR) {\r
121 Buffer ++;\r
122 Length ++;\r
123 } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {\r
124 do {\r
125 Buffer ++;\r
126 Length ++;\r
127 } while (*Buffer == AML_PARENT_PREFIX_CHAR);\r
128 }\r
129\r
130 //\r
131 // Parse name segment\r
132 //\r
133 if (*Buffer == AML_DUAL_NAME_PREFIX) {\r
134 Buffer ++;\r
135 Length ++;\r
136 SegCount = 2;\r
137 } else if (*Buffer == AML_MULTI_NAME_PREFIX) {\r
138 Buffer ++;\r
139 Length ++;\r
140 SegCount = *Buffer;\r
141 Buffer ++;\r
142 Length ++;\r
143 } else if (*Buffer == 0) {\r
144 //\r
145 // NULL Name, only for Root\r
146 //\r
147 SegCount = 0;\r
148 Buffer --;\r
149 if ((Length == 1) && (*Buffer == AML_ROOT_CHAR)) {\r
150 *BufferSize = 2;\r
151 return EFI_SUCCESS;\r
152 } else {\r
153 return EFI_INVALID_PARAMETER;\r
154 }\r
155 } else {\r
156 //\r
157 // NameSeg\r
158 //\r
159 SegCount = 1;\r
160 }\r
161\r
162 Index = 0;\r
163 do {\r
164 if (!AmlIsNameSeg (Buffer)) {\r
165 return EFI_INVALID_PARAMETER;\r
166 }\r
167 Buffer += AML_NAME_SEG_SIZE;\r
168 Length += AML_NAME_SEG_SIZE;\r
169 Index ++;\r
170 } while (Index < SegCount);\r
171\r
172 *BufferSize = Length;\r
173 return EFI_SUCCESS;\r
174}\r
175\r
176/**\r
177 Check if it is ASL LeadName.\r
178\r
179 @param[in] Ch Char.\r
d1102dba 180\r
3dc8585e
JY
181 @retval TRUE Char is ASL LeadName.\r
182 @retval FALSE Char is not ASL LeadName.\r
183**/\r
184BOOLEAN\r
185AmlIsAslLeadName (\r
186 IN CHAR8 Ch\r
187 )\r
188{\r
189 if (AmlIsLeadName (Ch) || (Ch >= 'a' && Ch <= 'z')) {\r
190 return TRUE;\r
191 } else {\r
192 return FALSE;\r
193 }\r
194}\r
195\r
196/**\r
197 Check if it is ASL Name.\r
198\r
199 @param[in] Ch Char.\r
d1102dba 200\r
3dc8585e
JY
201 @retval TRUE Char is ASL Name.\r
202 @retval FALSE Char is not ASL Name.\r
203**/\r
204BOOLEAN\r
205AmlIsAslName (\r
206 IN CHAR8 Ch\r
207 )\r
208{\r
209 if (AmlIsAslLeadName (Ch) || (Ch >= '0' && Ch <= '9')) {\r
210 return TRUE;\r
211 } else {\r
212 return FALSE;\r
213 }\r
214}\r
215\r
216/**\r
217 Get ASL NameString size.\r
218\r
219 @param[in] Buffer ASL NameString.\r
d1102dba 220\r
3dc8585e
JY
221 @return ASL NameString size.\r
222**/\r
223UINTN\r
224AmlGetAslNameSegLength (\r
225 IN UINT8 *Buffer\r
226 )\r
227{\r
228 UINTN Length;\r
229 UINTN Index;\r
230\r
231 if (*Buffer == 0) {\r
232 return 0;\r
233 }\r
d1102dba 234\r
3dc8585e
JY
235 Length = 0;\r
236 //\r
237 // 1st\r
238 //\r
239 if (AmlIsAslLeadName (*Buffer)) {\r
240 Length ++;\r
241 Buffer ++;\r
242 }\r
243 if ((*Buffer == 0) || (*Buffer == '.')) {\r
244 return Length;\r
245 }\r
246 //\r
247 // 2, 3, 4 name char\r
248 //\r
249 for (Index = 0; Index < 3; Index++) {\r
250 if (AmlIsAslName (*Buffer)) {\r
251 Length ++;\r
252 Buffer ++;\r
253 }\r
254 if ((*Buffer == 0) || (*Buffer == '.')) {\r
255 return Length;\r
256 }\r
257 }\r
258\r
259 //\r
260 // Invalid ASL name\r
261 //\r
262 return 0;\r
263}\r
264\r
265/**\r
266 Get ASL NameString size.\r
267\r
268 @param[in] Buffer ASL NameString.\r
269 @param[out] Root On return, points to Root char number.\r
270 @param[out] Parent On return, points to Parent char number.\r
271 @param[out] SegCount On return, points to Segment count.\r
d1102dba 272\r
3dc8585e
JY
273 @return ASL NameString size.\r
274**/\r
275UINTN\r
276AmlGetAslNameStringSize (\r
277 IN UINT8 *Buffer,\r
278 OUT UINTN *Root,\r
279 OUT UINTN *Parent,\r
280 OUT UINTN *SegCount\r
281 )\r
282{\r
283 UINTN NameLength;\r
284 UINTN TotalLength;\r
285\r
286 *Root = 0;\r
287 *Parent = 0;\r
288 *SegCount = 0;\r
289 TotalLength = 0;\r
290 NameLength = 0;\r
291 if (*Buffer == AML_ROOT_CHAR) {\r
292 *Root = 1;\r
293 Buffer ++;\r
294 } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {\r
295 do {\r
296 Buffer ++;\r
297 (*Parent) ++;\r
298 } while (*Buffer == AML_PARENT_PREFIX_CHAR);\r
299 }\r
300\r
301 //\r
302 // Now parse name\r
303 //\r
304 while (*Buffer != 0) {\r
305 NameLength = AmlGetAslNameSegLength (Buffer);\r
306 if ((NameLength == 0) || (NameLength > AML_NAME_SEG_SIZE)) {\r
307 return 0;\r
308 }\r
309 (*SegCount) ++;\r
310 Buffer += NameLength;\r
311 if (*Buffer == 0) {\r
312 break;\r
313 }\r
314 Buffer ++;\r
315 }\r
316\r
317 //\r
318 // Check SegCoount\r
319 //\r
320 if (*SegCount > 0xFF) {\r
321 return 0;\r
322 }\r
323\r
324 //\r
325 // Calculate total length\r
326 //\r
327 TotalLength = *Root + *Parent + (*SegCount) * AML_NAME_SEG_SIZE;\r
328 if (*SegCount > 2) {\r
329 TotalLength += 2;\r
330 } else if (*SegCount == 2) {\r
331 TotalLength += 1;\r
332 }\r
333\r
334 //\r
335 // Add NULL char\r
336 //\r
337 TotalLength ++;\r
338\r
339 return TotalLength;\r
340}\r
341\r
342/**\r
343 Copy mem, and cast all the char in dest to be upper case.\r
344\r
345 @param[in] DstBuffer Destination buffer.\r
346 @param[in] SrcBuffer Source buffer.\r
347 @param[in] Length Buffer length.\r
348**/\r
349VOID\r
350AmlUpperCaseCopyMem (\r
351 IN UINT8 *DstBuffer,\r
352 IN UINT8 *SrcBuffer,\r
353 IN UINTN Length\r
354 )\r
355{\r
356 UINTN Index;\r
357\r
358 for (Index = 0; Index < Length; Index++) {\r
359 if (SrcBuffer[Index] >= 'a' && SrcBuffer[Index] <= 'z') {\r
360 DstBuffer[Index] = (UINT8)(SrcBuffer[Index] - 'a' + 'A');\r
361 } else {\r
362 DstBuffer[Index] = SrcBuffer[Index];\r
363 }\r
364 }\r
365}\r
366\r
367/**\r
368 Return AML name according to ASL name.\r
369 The caller need free the AmlName returned.\r
370\r
371 @param[in] AslPath ASL name.\r
372\r
373 @return AmlName\r
374**/\r
375UINT8 *\r
376AmlNameFromAslName (\r
377 IN UINT8 *AslPath\r
378 )\r
379{\r
380 UINTN Root;\r
381 UINTN Parent;\r
382 UINTN SegCount;\r
383 UINTN TotalLength;\r
384 UINTN NameLength;\r
385 UINT8 *Buffer;\r
386 UINT8 *AmlPath;\r
387 UINT8 *AmlBuffer;\r
388\r
389 TotalLength = AmlGetAslNameStringSize (AslPath, &Root, &Parent, &SegCount);\r
390 if (TotalLength == 0) {\r
391 return NULL;\r
392 }\r
393\r
394 AmlPath = AllocatePool (TotalLength);\r
395 ASSERT (AmlPath != NULL);\r
396\r
397 AmlBuffer = AmlPath;\r
398 Buffer = AslPath;\r
399\r
400 //\r
401 // Handle Root and Parent\r
402 //\r
403 if (Root == 1) {\r
404 *AmlBuffer = AML_ROOT_CHAR;\r
405 AmlBuffer ++;\r
406 Buffer ++;\r
407 } else if (Parent > 0) {\r
408 SetMem (AmlBuffer, Parent, AML_PARENT_PREFIX_CHAR);\r
409 AmlBuffer += Parent;\r
410 Buffer += Parent;\r
411 }\r
412\r
413 //\r
414 // Handle SegCount\r
415 //\r
416 if (SegCount > 2) {\r
417 *AmlBuffer = AML_MULTI_NAME_PREFIX;\r
418 AmlBuffer ++;\r
419 *AmlBuffer = (UINT8)SegCount;\r
420 AmlBuffer ++;\r
421 } else if (SegCount == 2) {\r
422 *AmlBuffer = AML_DUAL_NAME_PREFIX;\r
423 AmlBuffer ++;\r
424 }\r
425\r
426 //\r
427 // Now to name\r
428 //\r
429 while (*Buffer != 0) {\r
430 NameLength = AmlGetAslNameSegLength (Buffer);\r
431 ASSERT ((NameLength != 0) && (NameLength <= AML_NAME_SEG_SIZE));\r
432 AmlUpperCaseCopyMem (AmlBuffer, Buffer, NameLength);\r
433 SetMem (AmlBuffer + NameLength, AML_NAME_SEG_SIZE - NameLength, AML_NAME_CHAR__);\r
434 Buffer += NameLength;\r
435 AmlBuffer += AML_NAME_SEG_SIZE;\r
436 if (*Buffer == 0) {\r
437 break;\r
438 }\r
439 Buffer ++;\r
440 }\r
441\r
442 //\r
443 // Add NULL\r
444 //\r
445 AmlPath[TotalLength - 1] = 0;\r
446\r
447 return AmlPath;\r
448}\r
449\r
450/**\r
451 Print AML NameSeg.\r
452\r
453 @param[in] Buffer AML NameSeg.\r
454**/\r
455VOID\r
456AmlPrintNameSeg (\r
457 IN UINT8 *Buffer\r
458 )\r
459{\r
87000d77 460 DEBUG ((DEBUG_ERROR, "%c", Buffer[0]));\r
3dc8585e
JY
461 if ((Buffer[1] == '_') && (Buffer[2] == '_') && (Buffer[3] == '_')) {\r
462 return ;\r
463 }\r
87000d77 464 DEBUG ((DEBUG_ERROR, "%c", Buffer[1]));\r
3dc8585e
JY
465 if ((Buffer[2] == '_') && (Buffer[3] == '_')) {\r
466 return ;\r
467 }\r
87000d77 468 DEBUG ((DEBUG_ERROR, "%c", Buffer[2]));\r
3dc8585e
JY
469 if (Buffer[3] == '_') {\r
470 return ;\r
471 }\r
87000d77 472 DEBUG ((DEBUG_ERROR, "%c", Buffer[3]));\r
3dc8585e
JY
473 return ;\r
474}\r
475\r
476/**\r
477 Print AML NameString.\r
478\r
479 @param[in] Buffer AML NameString.\r
480**/\r
481VOID\r
482AmlPrintNameString (\r
483 IN UINT8 *Buffer\r
484 )\r
485{\r
486 UINT8 SegCount;\r
487 UINT8 Index;\r
7538d536 488\r
3dc8585e
JY
489 if (*Buffer == AML_ROOT_CHAR) {\r
490 //\r
491 // RootChar\r
492 //\r
493 Buffer ++;\r
87000d77 494 DEBUG ((DEBUG_ERROR, "\\"));\r
3dc8585e
JY
495 } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {\r
496 //\r
497 // ParentPrefixChar\r
498 //\r
499 do {\r
500 Buffer ++;\r
87000d77 501 DEBUG ((DEBUG_ERROR, "^"));\r
3dc8585e
JY
502 } while (*Buffer == AML_PARENT_PREFIX_CHAR);\r
503 }\r
504\r
505 if (*Buffer == AML_DUAL_NAME_PREFIX) {\r
506 //\r
507 // DualName\r
508 //\r
509 Buffer ++;\r
510 SegCount = 2;\r
511 } else if (*Buffer == AML_MULTI_NAME_PREFIX) {\r
512 //\r
513 // MultiName\r
514 //\r
515 Buffer ++;\r
516 SegCount = *Buffer;\r
517 Buffer ++;\r
518 } else if (*Buffer == 0) {\r
519 //\r
520 // NULL Name\r
521 //\r
522 return ;\r
523 } else {\r
524 //\r
525 // NameSeg\r
526 //\r
527 SegCount = 1;\r
528 }\r
d1102dba 529\r
3dc8585e
JY
530 AmlPrintNameSeg (Buffer);\r
531 Buffer += AML_NAME_SEG_SIZE;\r
532 for (Index = 0; Index < SegCount - 1; Index++) {\r
87000d77 533 DEBUG ((DEBUG_ERROR, "."));\r
3dc8585e
JY
534 AmlPrintNameSeg (Buffer);\r
535 Buffer += AML_NAME_SEG_SIZE;\r
536 }\r
537\r
538 return ;\r
539}\r