]>
git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Acpi/AcpiTableDxe/AmlString.c
2 ACPI Sdt Protocol Driver
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "AcpiTable.h"
18 Check if it is AML Root name
20 @param[in] Buffer AML path.
22 @retval TRUE AML path is root.
23 @retval FALSE AML path is not root.
30 if ((Buffer
[0] == AML_ROOT_CHAR
) && (Buffer
[1] == 0)) {
38 Check if it is AML LeadName.
42 @retval TRUE Char is AML LeadName.
43 @retval FALSE Char is not AML LeadName.
50 if ((Ch
== '_') || (Ch
>= 'A' && Ch
<= 'Z')) {
58 Check if it is AML Name.
62 @retval TRUE Char is AML Name.
63 @retval FALSE Char is not AML Name.
70 if (AmlIsLeadName (Ch
) || (Ch
>= '0' && Ch
<= '9')) {
78 Return is buffer is AML NameSeg.
80 @param[in] Buffer AML NameSement.
82 @retval TRUE It is AML NameSegment.
83 @retval FALSE It is not AML NameSegment.
91 if (!AmlIsLeadName (Buffer
[0])) {
94 for (Index
= 1; Index
< AML_NAME_SEG_SIZE
; Index
++) {
95 if (!AmlIsName (Buffer
[Index
])) {
103 Get AML NameString size.
105 @param[in] Buffer AML NameString.
106 @param[out] BufferSize AML NameString size
108 @retval EFI_SUCCESS Success.
109 @retval EFI_INVALID_PARAMETER Buffer does not refer to a valid AML NameString.
112 AmlGetNameStringSize (
114 OUT UINTN
*BufferSize
124 // Parse root or parent prefix
126 if (*Buffer
== AML_ROOT_CHAR
) {
129 } else if (*Buffer
== AML_PARENT_PREFIX_CHAR
) {
133 } while (*Buffer
== AML_PARENT_PREFIX_CHAR
);
137 // Parse name segment
139 if (*Buffer
== AML_DUAL_NAME_PREFIX
) {
143 } else if (*Buffer
== AML_MULTI_NAME_PREFIX
) {
149 } else if (*Buffer
== 0) {
151 // NULL Name, only for Root
155 if ((Length
== 1) && (*Buffer
== AML_ROOT_CHAR
)) {
159 return EFI_INVALID_PARAMETER
;
170 if (!AmlIsNameSeg (Buffer
)) {
171 return EFI_INVALID_PARAMETER
;
173 Buffer
+= AML_NAME_SEG_SIZE
;
174 Length
+= AML_NAME_SEG_SIZE
;
176 } while (Index
< SegCount
);
178 *BufferSize
= Length
;
183 Check if it is ASL LeadName.
187 @retval TRUE Char is ASL LeadName.
188 @retval FALSE Char is not ASL LeadName.
195 if (AmlIsLeadName (Ch
) || (Ch
>= 'a' && Ch
<= 'z')) {
203 Check if it is ASL Name.
207 @retval TRUE Char is ASL Name.
208 @retval FALSE Char is not ASL Name.
215 if (AmlIsAslLeadName (Ch
) || (Ch
>= '0' && Ch
<= '9')) {
223 Get ASL NameString size.
225 @param[in] Buffer ASL NameString.
227 @return ASL NameString size.
230 AmlGetAslNameSegLength (
245 if (AmlIsAslLeadName (*Buffer
)) {
249 if ((*Buffer
== 0) || (*Buffer
== '.')) {
255 for (Index
= 0; Index
< 3; Index
++) {
256 if (AmlIsAslName (*Buffer
)) {
260 if ((*Buffer
== 0) || (*Buffer
== '.')) {
272 Get ASL NameString size.
274 @param[in] Buffer ASL NameString.
275 @param[out] Root On return, points to Root char number.
276 @param[out] Parent On return, points to Parent char number.
277 @param[out] SegCount On return, points to Segment count.
279 @return ASL NameString size.
282 AmlGetAslNameStringSize (
297 if (*Buffer
== AML_ROOT_CHAR
) {
300 } else if (*Buffer
== AML_PARENT_PREFIX_CHAR
) {
304 } while (*Buffer
== AML_PARENT_PREFIX_CHAR
);
310 while (*Buffer
!= 0) {
311 NameLength
= AmlGetAslNameSegLength (Buffer
);
312 if ((NameLength
== 0) || (NameLength
> AML_NAME_SEG_SIZE
)) {
316 Buffer
+= NameLength
;
326 if (*SegCount
> 0xFF) {
331 // Calculate total length
333 TotalLength
= *Root
+ *Parent
+ (*SegCount
) * AML_NAME_SEG_SIZE
;
336 } else if (*SegCount
== 2) {
349 Copy mem, and cast all the char in dest to be upper case.
351 @param[in] DstBuffer Destination buffer.
352 @param[in] SrcBuffer Source buffer.
353 @param[in] Length Buffer length.
356 AmlUpperCaseCopyMem (
364 for (Index
= 0; Index
< Length
; Index
++) {
365 if (SrcBuffer
[Index
] >= 'a' && SrcBuffer
[Index
] <= 'z') {
366 DstBuffer
[Index
] = (UINT8
)(SrcBuffer
[Index
] - 'a' + 'A');
368 DstBuffer
[Index
] = SrcBuffer
[Index
];
374 Return AML name according to ASL name.
375 The caller need free the AmlName returned.
377 @param[in] AslPath ASL name.
395 TotalLength
= AmlGetAslNameStringSize (AslPath
, &Root
, &Parent
, &SegCount
);
396 if (TotalLength
== 0) {
400 AmlPath
= AllocatePool (TotalLength
);
401 ASSERT (AmlPath
!= NULL
);
407 // Handle Root and Parent
410 *AmlBuffer
= AML_ROOT_CHAR
;
413 } else if (Parent
> 0) {
414 SetMem (AmlBuffer
, Parent
, AML_PARENT_PREFIX_CHAR
);
423 *AmlBuffer
= AML_MULTI_NAME_PREFIX
;
425 *AmlBuffer
= (UINT8
)SegCount
;
427 } else if (SegCount
== 2) {
428 *AmlBuffer
= AML_DUAL_NAME_PREFIX
;
435 while (*Buffer
!= 0) {
436 NameLength
= AmlGetAslNameSegLength (Buffer
);
437 ASSERT ((NameLength
!= 0) && (NameLength
<= AML_NAME_SEG_SIZE
));
438 AmlUpperCaseCopyMem (AmlBuffer
, Buffer
, NameLength
);
439 SetMem (AmlBuffer
+ NameLength
, AML_NAME_SEG_SIZE
- NameLength
, AML_NAME_CHAR__
);
440 Buffer
+= NameLength
;
441 AmlBuffer
+= AML_NAME_SEG_SIZE
;
451 AmlPath
[TotalLength
- 1] = 0;
459 @param[in] Buffer AML NameSeg.
466 DEBUG ((EFI_D_ERROR
, "%c", Buffer
[0]));
467 if ((Buffer
[1] == '_') && (Buffer
[2] == '_') && (Buffer
[3] == '_')) {
470 DEBUG ((EFI_D_ERROR
, "%c", Buffer
[1]));
471 if ((Buffer
[2] == '_') && (Buffer
[3] == '_')) {
474 DEBUG ((EFI_D_ERROR
, "%c", Buffer
[2]));
475 if (Buffer
[3] == '_') {
478 DEBUG ((EFI_D_ERROR
, "%c", Buffer
[3]));
483 Print AML NameString.
485 @param[in] Buffer AML NameString.
495 if (*Buffer
== AML_ROOT_CHAR
) {
500 DEBUG ((EFI_D_ERROR
, "\\"));
501 } else if (*Buffer
== AML_PARENT_PREFIX_CHAR
) {
507 DEBUG ((EFI_D_ERROR
, "^"));
508 } while (*Buffer
== AML_PARENT_PREFIX_CHAR
);
511 if (*Buffer
== AML_DUAL_NAME_PREFIX
) {
517 } else if (*Buffer
== AML_MULTI_NAME_PREFIX
) {
524 } else if (*Buffer
== 0) {
536 AmlPrintNameSeg (Buffer
);
537 Buffer
+= AML_NAME_SEG_SIZE
;
538 for (Index
= 0; Index
< SegCount
- 1; Index
++) {
539 DEBUG ((EFI_D_ERROR
, "."));
540 AmlPrintNameSeg (Buffer
);
541 Buffer
+= AML_NAME_SEG_SIZE
;