TianoCore EDK2 master
Loading...
Searching...
No Matches
AmlString.c
Go to the documentation of this file.
1
9#include "AcpiTable.h"
10
19BOOLEAN
21 IN UINT8 *Buffer
22 )
23{
24 if ((Buffer[0] == AML_ROOT_CHAR) && (Buffer[1] == 0)) {
25 return TRUE;
26 } else {
27 return FALSE;
28 }
29}
30
39BOOLEAN
41 IN CHAR8 Ch
42 )
43{
44 if ((Ch == '_') || ((Ch >= 'A') && (Ch <= 'Z'))) {
45 return TRUE;
46 } else {
47 return FALSE;
48 }
49}
50
59BOOLEAN
61 IN CHAR8 Ch
62 )
63{
64 if (AmlIsLeadName (Ch) || ((Ch >= '0') && (Ch <= '9'))) {
65 return TRUE;
66 } else {
67 return FALSE;
68 }
69}
70
79BOOLEAN
81 IN UINT8 *Buffer
82 )
83{
84 UINTN Index;
85
86 if (!AmlIsLeadName (Buffer[0])) {
87 return FALSE;
88 }
89
90 for (Index = 1; Index < AML_NAME_SEG_SIZE; Index++) {
91 if (!AmlIsName (Buffer[Index])) {
92 return FALSE;
93 }
94 }
95
96 return TRUE;
97}
98
110 IN UINT8 *Buffer,
111 OUT UINTN *BufferSize
112 )
113{
114 UINTN SegCount;
115 UINTN Length;
116 UINTN Index;
117
118 Length = 0;
119
120 //
121 // Parse root or parent prefix
122 //
123 if (*Buffer == AML_ROOT_CHAR) {
124 Buffer++;
125 Length++;
126 } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {
127 do {
128 Buffer++;
129 Length++;
130 } while (*Buffer == AML_PARENT_PREFIX_CHAR);
131 }
132
133 //
134 // Parse name segment
135 //
136 if (*Buffer == AML_DUAL_NAME_PREFIX) {
137 Buffer++;
138 Length++;
139 SegCount = 2;
140 } else if (*Buffer == AML_MULTI_NAME_PREFIX) {
141 Buffer++;
142 Length++;
143 SegCount = *Buffer;
144 Buffer++;
145 Length++;
146 } else if (*Buffer == 0) {
147 //
148 // NULL Name, only for Root
149 //
150 SegCount = 0;
151 Buffer--;
152 if ((Length == 1) && (*Buffer == AML_ROOT_CHAR)) {
153 *BufferSize = 2;
154 return EFI_SUCCESS;
155 } else {
156 return EFI_INVALID_PARAMETER;
157 }
158 } else {
159 //
160 // NameSeg
161 //
162 SegCount = 1;
163 }
164
165 Index = 0;
166 do {
167 if (!AmlIsNameSeg (Buffer)) {
168 return EFI_INVALID_PARAMETER;
169 }
170
171 Buffer += AML_NAME_SEG_SIZE;
172 Length += AML_NAME_SEG_SIZE;
173 Index++;
174 } while (Index < SegCount);
175
176 *BufferSize = Length;
177 return EFI_SUCCESS;
178}
179
188BOOLEAN
190 IN CHAR8 Ch
191 )
192{
193 if (AmlIsLeadName (Ch) || ((Ch >= 'a') && (Ch <= 'z'))) {
194 return TRUE;
195 } else {
196 return FALSE;
197 }
198}
199
208BOOLEAN
210 IN CHAR8 Ch
211 )
212{
213 if (AmlIsAslLeadName (Ch) || ((Ch >= '0') && (Ch <= '9'))) {
214 return TRUE;
215 } else {
216 return FALSE;
217 }
218}
219
227UINTN
229 IN UINT8 *Buffer
230 )
231{
232 UINTN Length;
233 UINTN Index;
234
235 if (*Buffer == 0) {
236 return 0;
237 }
238
239 Length = 0;
240 //
241 // 1st
242 //
243 if (AmlIsAslLeadName (*Buffer)) {
244 Length++;
245 Buffer++;
246 }
247
248 if ((*Buffer == 0) || (*Buffer == '.')) {
249 return Length;
250 }
251
252 //
253 // 2, 3, 4 name char
254 //
255 for (Index = 0; Index < 3; Index++) {
256 if (AmlIsAslName (*Buffer)) {
257 Length++;
258 Buffer++;
259 }
260
261 if ((*Buffer == 0) || (*Buffer == '.')) {
262 return Length;
263 }
264 }
265
266 //
267 // Invalid ASL name
268 //
269 return 0;
270}
271
282UINTN
284 IN UINT8 *Buffer,
285 OUT UINTN *Root,
286 OUT UINTN *Parent,
287 OUT UINTN *SegCount
288 )
289{
290 UINTN NameLength;
291 UINTN TotalLength;
292
293 *Root = 0;
294 *Parent = 0;
295 *SegCount = 0;
296 TotalLength = 0;
297 NameLength = 0;
298 if (*Buffer == AML_ROOT_CHAR) {
299 *Root = 1;
300 Buffer++;
301 } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {
302 do {
303 Buffer++;
304 (*Parent)++;
305 } while (*Buffer == AML_PARENT_PREFIX_CHAR);
306 }
307
308 //
309 // Now parse name
310 //
311 while (*Buffer != 0) {
312 NameLength = AmlGetAslNameSegLength (Buffer);
313 if ((NameLength == 0) || (NameLength > AML_NAME_SEG_SIZE)) {
314 return 0;
315 }
316
317 (*SegCount)++;
318 Buffer += NameLength;
319 if (*Buffer == 0) {
320 break;
321 }
322
323 Buffer++;
324 }
325
326 //
327 // Check SegCoount
328 //
329 if (*SegCount > 0xFF) {
330 return 0;
331 }
332
333 //
334 // Calculate total length
335 //
336 TotalLength = *Root + *Parent + (*SegCount) * AML_NAME_SEG_SIZE;
337 if (*SegCount > 2) {
338 TotalLength += 2;
339 } else if (*SegCount == 2) {
340 TotalLength += 1;
341 }
342
343 //
344 // Add NULL char
345 //
346 TotalLength++;
347
348 return TotalLength;
349}
350
358VOID
360 IN UINT8 *DstBuffer,
361 IN UINT8 *SrcBuffer,
362 IN UINTN Length
363 )
364{
365 UINTN Index;
366
367 for (Index = 0; Index < Length; Index++) {
368 if ((SrcBuffer[Index] >= 'a') && (SrcBuffer[Index] <= 'z')) {
369 DstBuffer[Index] = (UINT8)(SrcBuffer[Index] - 'a' + 'A');
370 } else {
371 DstBuffer[Index] = SrcBuffer[Index];
372 }
373 }
374}
375
384UINT8 *
386 IN UINT8 *AslPath
387 )
388{
389 UINTN Root;
390 UINTN Parent;
391 UINTN SegCount;
392 UINTN TotalLength;
393 UINTN NameLength;
394 UINT8 *Buffer;
395 UINT8 *AmlPath;
396 UINT8 *AmlBuffer;
397
398 TotalLength = AmlGetAslNameStringSize (AslPath, &Root, &Parent, &SegCount);
399 if (TotalLength == 0) {
400 return NULL;
401 }
402
403 AmlPath = AllocatePool (TotalLength);
404 if (AmlPath == NULL) {
405 ASSERT (AmlPath != NULL);
406 return NULL;
407 }
408
409 AmlBuffer = AmlPath;
410 Buffer = AslPath;
411
412 //
413 // Handle Root and Parent
414 //
415 if (Root == 1) {
416 *AmlBuffer = AML_ROOT_CHAR;
417 AmlBuffer++;
418 Buffer++;
419 } else if (Parent > 0) {
420 SetMem (AmlBuffer, Parent, AML_PARENT_PREFIX_CHAR);
421 AmlBuffer += Parent;
422 Buffer += Parent;
423 }
424
425 //
426 // Handle SegCount
427 //
428 if (SegCount > 2) {
429 *AmlBuffer = AML_MULTI_NAME_PREFIX;
430 AmlBuffer++;
431 *AmlBuffer = (UINT8)SegCount;
432 AmlBuffer++;
433 } else if (SegCount == 2) {
434 *AmlBuffer = AML_DUAL_NAME_PREFIX;
435 AmlBuffer++;
436 }
437
438 //
439 // Now to name
440 //
441 while (*Buffer != 0) {
442 NameLength = AmlGetAslNameSegLength (Buffer);
443 ASSERT ((NameLength != 0) && (NameLength <= AML_NAME_SEG_SIZE));
444 AmlUpperCaseCopyMem (AmlBuffer, Buffer, NameLength);
445 SetMem (AmlBuffer + NameLength, AML_NAME_SEG_SIZE - NameLength, AML_NAME_CHAR__);
446 Buffer += NameLength;
447 AmlBuffer += AML_NAME_SEG_SIZE;
448 if (*Buffer == 0) {
449 break;
450 }
451
452 Buffer++;
453 }
454
455 //
456 // Add NULL
457 //
458 AmlPath[TotalLength - 1] = 0;
459
460 return AmlPath;
461}
462
468VOID
470 IN UINT8 *Buffer
471 )
472{
473 DEBUG ((DEBUG_ERROR, "%c", Buffer[0]));
474 if ((Buffer[1] == '_') && (Buffer[2] == '_') && (Buffer[3] == '_')) {
475 return;
476 }
477
478 DEBUG ((DEBUG_ERROR, "%c", Buffer[1]));
479 if ((Buffer[2] == '_') && (Buffer[3] == '_')) {
480 return;
481 }
482
483 DEBUG ((DEBUG_ERROR, "%c", Buffer[2]));
484 if (Buffer[3] == '_') {
485 return;
486 }
487
488 DEBUG ((DEBUG_ERROR, "%c", Buffer[3]));
489 return;
490}
491
497VOID
499 IN UINT8 *Buffer
500 )
501{
502 UINT8 SegCount;
503 UINT8 Index;
504
505 if (*Buffer == AML_ROOT_CHAR) {
506 //
507 // RootChar
508 //
509 Buffer++;
510 DEBUG ((DEBUG_ERROR, "\\"));
511 } else if (*Buffer == AML_PARENT_PREFIX_CHAR) {
512 //
513 // ParentPrefixChar
514 //
515 do {
516 Buffer++;
517 DEBUG ((DEBUG_ERROR, "^"));
518 } while (*Buffer == AML_PARENT_PREFIX_CHAR);
519 }
520
521 if (*Buffer == AML_DUAL_NAME_PREFIX) {
522 //
523 // DualName
524 //
525 Buffer++;
526 SegCount = 2;
527 } else if (*Buffer == AML_MULTI_NAME_PREFIX) {
528 //
529 // MultiName
530 //
531 Buffer++;
532 SegCount = *Buffer;
533 Buffer++;
534 } else if (*Buffer == 0) {
535 //
536 // NULL Name
537 //
538 return;
539 } else {
540 //
541 // NameSeg
542 //
543 SegCount = 1;
544 }
545
546 AmlPrintNameSeg (Buffer);
547 Buffer += AML_NAME_SEG_SIZE;
548 for (Index = 0; Index < SegCount - 1; Index++) {
549 DEBUG ((DEBUG_ERROR, "."));
550 AmlPrintNameSeg (Buffer);
551 Buffer += AML_NAME_SEG_SIZE;
552 }
553
554 return;
555}
UINT64 UINTN
VOID *EFIAPI SetMem(OUT VOID *Buffer, IN UINTN Length, IN UINT8 Value)
Definition: SetMemWrapper.c:38
BOOLEAN EFIAPI AmlIsRootPath(IN CONST CHAR8 *Buffer)
Definition: AmlString.c:112
EFI_STATUS EFIAPI AmlGetNameStringSize(IN CONST CHAR8 *AmlPath, OUT UINT32 *AmlPathSizePtr)
Definition: AmlString.c:547
BOOLEAN EFIAPI AmlIsNameSeg(IN CONST CHAR8 *AmlBuffer)
Definition: AmlString.c:244
UINTN AmlGetAslNameStringSize(IN UINT8 *Buffer, OUT UINTN *Root, OUT UINTN *Parent, OUT UINTN *SegCount)
Definition: AmlString.c:283
VOID AmlPrintNameString(IN UINT8 *Buffer)
Definition: AmlString.c:498
BOOLEAN AmlIsLeadName(IN CHAR8 Ch)
Definition: AmlString.c:40
BOOLEAN AmlIsName(IN CHAR8 Ch)
Definition: AmlString.c:60
BOOLEAN AmlIsAslLeadName(IN CHAR8 Ch)
Definition: AmlString.c:189
UINTN AmlGetAslNameSegLength(IN UINT8 *Buffer)
Definition: AmlString.c:228
BOOLEAN AmlIsAslName(IN CHAR8 Ch)
Definition: AmlString.c:209
VOID AmlUpperCaseCopyMem(IN UINT8 *DstBuffer, IN UINT8 *SrcBuffer, IN UINTN Length)
Definition: AmlString.c:359
UINT8 * AmlNameFromAslName(IN UINT8 *AslPath)
Definition: AmlString.c:385
VOID AmlPrintNameSeg(IN UINT8 *Buffer)
Definition: AmlString.c:469
#define NULL
Definition: Base.h:319
#define VOID
Definition: Base.h:269
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define DEBUG(Expression)
Definition: DebugLib.h:435
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
#define EFI_SUCCESS
Definition: UefiBaseType.h:112