📄 aslutils.c
字号:
Gbl_InputByteCount, TotalKeywords); /* AML summary */ if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors)) { FlPrintFile (FileId, "AML Output: %s - %d bytes %d named objects %d executable opcodes\n\n", Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength, TotalNamedObjects, TotalExecutableOpcodes); } /* Error summary */ FlPrintFile (FileId, "Compilation complete. %d Errors, %d Warnings, %d Remarks, %d Optimizations\n", Gbl_ExceptionCount[ASL_ERROR], Gbl_ExceptionCount[ASL_WARNING] + Gbl_ExceptionCount[ASL_WARNING2] + Gbl_ExceptionCount[ASL_WARNING3], Gbl_ExceptionCount[ASL_REMARK], Gbl_ExceptionCount[ASL_OPTIMIZATION]);}/******************************************************************************* * * FUNCTION: UtDisplaySummary * * PARAMETERS: Op - Integer parse node * LowValue - Smallest allowed value * HighValue - Largest allowed value * * RETURN: Op if OK, otherwise NULL * * DESCRIPTION: Check integer for an allowable range * ******************************************************************************/ACPI_PARSE_OBJECT *UtCheckIntegerRange ( ACPI_PARSE_OBJECT *Op, UINT32 LowValue, UINT32 HighValue){ char *ParseError = NULL; char Buffer[64]; if (!Op) { return NULL; } if (Op->Asl.Value.Integer < LowValue) { ParseError = "Value below valid range"; Op->Asl.Value.Integer = LowValue; } if (Op->Asl.Value.Integer > HighValue) { ParseError = "Value above valid range"; Op->Asl.Value.Integer = HighValue; } if (ParseError) { sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue); AslCompilererror (Buffer); return NULL; } return Op;}/******************************************************************************* * * FUNCTION: UtGetStringBuffer * * PARAMETERS: Length - Size of buffer requested * * RETURN: Pointer to the buffer. Aborts on allocation failure * * DESCRIPTION: Allocate a string buffer. Bypass the local * dynamic memory manager for performance reasons (This has a * major impact on the speed of the compiler.) * ******************************************************************************/char *UtGetStringBuffer ( UINT32 Length){ char *Buffer; if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast) { Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length); Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE + Length; } Buffer = Gbl_StringCacheNext; Gbl_StringCacheNext += Length; return (Buffer);}/******************************************************************************* * * FUNCTION: UtInternalizeName * * PARAMETERS: ExternalName - Name to convert * ConvertedName - Where the converted name is returned * * RETURN: Status * * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name * ******************************************************************************/ACPI_STATUSUtInternalizeName ( char *ExternalName, char **ConvertedName){ ACPI_NAMESTRING_INFO Info; ACPI_STATUS Status; if (!ExternalName) { return (AE_OK); } /* Get the length of the new internal name */ Info.ExternalName = ExternalName; AcpiNsGetInternalNameLength (&Info); /* We need a segment to store the internal name */ Info.InternalName = UtGetStringBuffer (Info.Length); if (!Info.InternalName) { return (AE_NO_MEMORY); } /* Build the name */ Status = AcpiNsBuildInternalName (&Info); if (ACPI_FAILURE (Status)) { return (Status); } *ConvertedName = Info.InternalName; return (AE_OK);}/******************************************************************************* * * FUNCTION: UtPadNameWithUnderscores * * PARAMETERS: NameSeg - Input nameseg * PaddedNameSeg - Output padded nameseg * * RETURN: Padded nameseg. * * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full * ACPI_NAME. * ******************************************************************************/static voidUtPadNameWithUnderscores ( char *NameSeg, char *PaddedNameSeg){ UINT32 i; for (i = 0; (i < ACPI_NAME_SIZE); i++) { if (*NameSeg) { *PaddedNameSeg = *NameSeg; NameSeg++; } else { *PaddedNameSeg = '_'; } PaddedNameSeg++; }}/******************************************************************************* * * FUNCTION: UtAttachNameseg * * PARAMETERS: Op - Parent parse node * Name - Full ExternalName * * RETURN: None; Sets the NameSeg field in parent node * * DESCRIPTION: Extract the last nameseg of the ExternalName and store it * in the NameSeg field of the Op. * ******************************************************************************/static voidUtAttachNameseg ( ACPI_PARSE_OBJECT *Op, char *Name){ char *NameSeg; char PaddedNameSeg[4]; if (!Name) { return; } /* Look for the last dot in the namepath */ NameSeg = strrchr (Name, '.'); if (NameSeg) { /* Found last dot, we have also found the final nameseg */ NameSeg++; UtPadNameWithUnderscores (NameSeg, PaddedNameSeg); } else { /* No dots in the namepath, there is only a single nameseg. */ /* Handle prefixes */ while ((*Name == '\\') || (*Name == '^')) { Name++; } /* Remaing string should be one single nameseg */ UtPadNameWithUnderscores (Name, PaddedNameSeg); } strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4);}/******************************************************************************* * * FUNCTION: UtAttachNamepathToOwner * * PARAMETERS: Op - Parent parse node * NameOp - Node that contains the name * * RETURN: Sets the ExternalName and Namepath in the parent node * * DESCRIPTION: Store the name in two forms in the parent node: The original * (external) name, and the internalized name that is used within * the ACPI namespace manager. * ******************************************************************************/voidUtAttachNamepathToOwner ( ACPI_PARSE_OBJECT *Op, ACPI_PARSE_OBJECT *NameOp){ ACPI_STATUS Status; /* Full external path */ Op->Asl.ExternalName = NameOp->Asl.Value.String; /* Save the NameOp for possible error reporting later */ Op->Asl.ParentMethod = (void *) NameOp; /* Last nameseg of the path */ UtAttachNameseg (Op, Op->Asl.ExternalName); /* Create internalized path */ Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath); if (ACPI_FAILURE (Status)) { /* TBD: abort on no memory */ }}/******************************************************************************* * * FUNCTION: UtDoConstant * * PARAMETERS: String - Hex, Octal, or Decimal string * * RETURN: Converted Integer * * DESCRIPTION: Convert a string to an integer. With error checking. * ******************************************************************************/ACPI_INTEGERUtDoConstant ( char *String){ ACPI_STATUS Status; ACPI_INTEGER Converted; char ErrBuf[64]; Status = UtStrtoul64 (String, 0, &Converted); if (ACPI_FAILURE (Status)) { sprintf (ErrBuf, "%s %s\n", "Conversion error:", AcpiFormatException (Status)); AslCompilererror (ErrBuf); } return (Converted);}/* TBD: use version in ACPI CA main code base? *//******************************************************************************* * * FUNCTION: UtStrtoul64 * * PARAMETERS: String - Null terminated string * Terminater - Where a pointer to the terminating byte is * returned * Base - Radix of the string * * RETURN: Converted value * * DESCRIPTION: Convert a string into an unsigned value. * ******************************************************************************/static ACPI_STATUSUtStrtoul64 ( char *String, UINT32 Base, ACPI_INTEGER *RetInteger){ UINT32 Index; UINT32 Sign; ACPI_INTEGER ReturnValue = 0; ACPI_STATUS Status = AE_OK; *RetInteger = 0; switch (Base) { case 0: case 8: case 10: case 16: break; default: /* * The specified Base parameter is not in the domain of * this function: */ return (AE_BAD_PARAMETER); } /* Skip over any white space in the buffer: */ while (isspace (*String) || *String == '\t') { ++String; } /* * The buffer may contain an optional plus or minus sign. * If it does, then skip over it but remember what is was: */ if (*String == '-') { Sign = NEGATIVE; ++String; } else if (*String == '+') { ++String; Sign = POSITIVE; } else { Sign = POSITIVE; } /* * If the input parameter Base is zero, then we need to * determine if it is octal, decimal, or hexadecimal: */ if (Base == 0) { if (*String == '0') { if (tolower (*(++String)) == 'x') { Base = 16; ++String; } else { Base = 8; } } else { Base = 10; } } /* * For octal and hexadecimal bases, skip over the leading * 0 or 0x, if they are present. */ if (Base == 8 && *String == '0') { String++; } if (Base == 16 && *String == '0' && tolower (*(++String)) == 'x') { String++; } /* Main loop: convert the string to an unsigned long */ while (*String) { if (isdigit (*String)) { Index = ((UINT8) *String) - '0'; } else { Index = (UINT8) toupper (*String); if (isupper ((char) Index)) { Index = Index - 'A' + 10; } else { goto ErrorExit; } } if (Index >= Base) { goto ErrorExit; } /* Check to see if value is out of range: */ if (ReturnValue > ((ACPI_INTEGER_MAX - (ACPI_INTEGER) Index) / (ACPI_INTEGER) Base)) { goto ErrorExit; } else { ReturnValue *= Base; ReturnValue += Index; } ++String; } /* If a minus sign was present, then "the conversion is negated": */ if (Sign == NEGATIVE) { ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1; } *RetInteger = ReturnValue; return (Status);ErrorExit: switch (Base) { case 8: Status = AE_BAD_OCTAL_CONSTANT; break; case 10: Status = AE_BAD_DECIMAL_CONSTANT; break; case 16: Status = AE_BAD_HEX_CONSTANT; break; default: /* Base validated above */ break; } return (Status);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -