Import ACPICA 20181213.

This commit is contained in:
Jung-uk Kim 2018-12-13 19:04:25 +00:00
parent 4d4b15a0e8
commit d28459aaaf
46 changed files with 516 additions and 166 deletions

View File

@ -1,8 +1,69 @@
----------------------------------------
13 December 2018. Summary of changes for version 20181213:
1) ACPICA Kernel-resident Subsystem:
Fixed some buffer length issues with the GenericSerialBus, related to two
of the bidirectional protocols: AttribRawProcessBytes and AttribRawBytes,
which are rarely seen in the field. For these, the LEN field of the ASL
buffer is now ignored. Hans de Goede
Implemented a new object evaluation trace mechanism for control methods
and data objects. This includes nested control methods. It is
particularly useful for examining the ACPI execution during system
initialization since the output is relatively terse. The flag below
enables the output of the trace via the ACPI_DEBUG_PRINT_RAW interface:
#define ACPI_LV_EVALUATION 0x00080000
Examples:
Enter evaluation : _SB.PCI0._INI (Method)
Exit evaluation : _SB.PCI0._INI
Enter evaluation : _OSI (Method)
Exit evaluation : _OSI
Enter evaluation : _SB.PCI0.TEST (Method)
Nested method call : _SB.PCI0.NST1
Exit nested method : _SB.PCI0.NST1
Exit evaluation : _SB.PCI0.TEST
Added two recently-defined _OSI strings. See
https://docs.microsoft.com/en-us/windows-hardware/drivers/acpi/winacpi-
osi.
"Windows 2018"
"Windows 2018.2"
Update for buffer-to-string conversions via the ToHexString ASL operator.
A "0x" is now prepended to each of the hex values in the output string.
This provides compatibility with other ACPI implementations. The ACPI
specification is somewhat vague on this issue.
Example output string after conversion:
"0x01,0x02,0x03,0x04,0x05,0x06"
Return a run-time error for TermArg expressions within individual package
elements. Although this is technically supported by the ASL grammar,
other ACPI implementations do not support this either. Also, this fixes a
fault if this type of construct is ever encountered (it never has been).
2) iASL Compiler/Disassembler and Tools:
iASL: Implemented a new compile option (-ww) that will promote individual
warnings and remarks to errors. This is intended to enhance the firmware
build process.
AcpiExec: Implemented a new command-line option (-eo) to support the new
object evaluation trace mechanism described above.
Disassembler: Added support to disassemble OEMx tables as AML/ASL tables
instead of a "unknown table" message.
AcpiHelp: Improved support for the "special" predefined names such as
_Lxx, _Exx, _EJx, _T_x, etc. For these, any legal hex value can now be
used for "xx" and "x".
----------------------------------------
31 October 2018. Summary of changes for version 20181031:
This release is available at https://acpica.org/downloads
An Operation Region regression was fixed by properly adding address
ranges to a global list during initialization. This allows OS to

View File

@ -171,7 +171,7 @@
*/
const AH_PREDEFINED_NAME AslPredefinedInfo[] =
{
AH_PREDEF ("_ACx", "Active Cooling", "Returns the active cooling policy threshold values"),
AH_PREDEF ("_ACx", "Active Cooling, x=0-9", "Returns the active cooling policy threshold values"),
AH_PREDEF ("_ADR", "Address", "Returns address of a device on parent bus, and resource field"),
AH_PREDEF ("_AEI", "ACPI Event Interrupts", "Returns a list of GPIO events to be used as ACPI events"),
AH_PREDEF ("_ALC", "Ambient Light Chromaticity", "Returns the ambient light color chromaticity"),
@ -180,7 +180,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] =
AH_PREDEF ("_ALP", "Ambient Light Polling", "Returns the ambient light sensor polling frequency"),
AH_PREDEF ("_ALR", "Ambient Light Response", "Returns the ambient light brightness to display brightness mappings"),
AH_PREDEF ("_ALT", "Ambient Light Temperature", "Returns the ambient light color temperature"),
AH_PREDEF ("_ALx", "Active List", "Returns a list of active cooling device objects"),
AH_PREDEF ("_ALx", "Active List, x=0-9", "Returns a list of active cooling device objects"),
AH_PREDEF ("_ART", "Active Cooling Relationship Table", "Returns thermal relationship information between platform devices and fan devices"),
AH_PREDEF ("_ASI", "Address Space Id", "Resource Descriptor field"),
AH_PREDEF ("_ASZ", "Access Size", "Resource Descriptor field"),
@ -237,11 +237,11 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] =
AH_PREDEF ("_DSS", "Device Set State", "Sets the display device state"),
AH_PREDEF ("_DSW", "Device Sleep Wake", "Sets the sleep and wake transition states for a device"),
AH_PREDEF ("_DTI", "Device Temperature Indication", "Conveys native device temperature to the platform"),
AH_PREDEF ("_Exx", "Edge-Triggered GPE", "Method executed as a result of a general-purpose event"),
AH_PREDEF ("_Exx", "Edge-Triggered GPE, xx=0x00-0xFF", "Method executed as a result of a general-purpose event"),
AH_PREDEF ("_EC_", "Embedded Controller", "returns EC offset and query information"),
AH_PREDEF ("_EDL", "Eject Device List", "Returns a list of devices that are dependent on a device (docking)"),
AH_PREDEF ("_EJD", "Ejection Dependent Device", "Returns the name of dependent (parent) device (docking)"),
AH_PREDEF ("_EJx", "Eject Device", "Begin or cancel a device ejection request (docking)"),
AH_PREDEF ("_EJx", "Eject Device, x=0-9", "Begin or cancel a device ejection request (docking)"),
AH_PREDEF ("_END", "Endianness", "Endian orientation, Resource Descriptor field"),
AH_PREDEF ("_EVT", "Event", "Event method for GPIO events"),
AH_PREDEF ("_FDE", "Floppy Disk Enumerate", "Returns floppy disk configuration information"),
@ -281,7 +281,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] =
AH_PREDEF ("_INT", "Interrupts", "Interrupt mask bits, Resource Descriptor field"),
AH_PREDEF ("_IOR", "I/O Restriction", "Restriction type, Resource Descriptor field"),
AH_PREDEF ("_IRC", "Inrush Current", "Presence indicates that a device has a significant inrush current draw"),
AH_PREDEF ("_Lxx", "Level-Triggered GPE", "Control method executed as a result of a general-purpose event"),
AH_PREDEF ("_Lxx", "Level-Triggered GPE, xx=0x00-0xFF", "Control method executed as a result of a general-purpose event"),
AH_PREDEF ("_LCK", "Lock Device", "Locks or unlocks a device (docking)"),
AH_PREDEF ("_LEN", "Length", "Range length, Resource Descriptor field"),
AH_PREDEF ("_LID", "Lid Status", "Returns the open/closed status of the lid on a mobile system"),
@ -358,7 +358,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] =
AH_PREDEF ("_PTS", "Prepare To Sleep", "Inform the platform of an impending sleep transition"),
AH_PREDEF ("_PUR", "Processor Utilization Request", "Returns the number of processors that the platform would like to idle"),
AH_PREDEF ("_PXM", "Device Proximity", "Returns a device's proximity domain identifier"),
AH_PREDEF ("_Qxx", "EC Query", "Embedded Controller query and SMBus Alarm control method"),
AH_PREDEF ("_Qxx", "EC Query, xx=0x00-0xFF", "Embedded Controller query and SMBus Alarm control method"),
AH_PREDEF ("_RBO", "Register Bit Offset", "Resource Descriptor field"),
AH_PREDEF ("_RBW", "Register Bit Width", "Resource Descriptor field"),
AH_PREDEF ("_RDI", "Resource Dependencies for Idle", "Returns a list of dependencies for idle states"),
@ -413,7 +413,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] =
AH_PREDEF ("_SUB", "Subsystem ID", "Returns the subsystem ID for a device"),
AH_PREDEF ("_SUN", "Slot User Number", "Returns the slot unique ID number"),
AH_PREDEF ("_SWS", "System Wake Source", "Returns the source event that caused the system to wake"),
AH_PREDEF ("_T_x", "Emitted by ASL Compiler", "Reserved for use by ASL compilers"),
AH_PREDEF ("_T_x", "Emitted by ASL Compiler, x=0-9, A-Z", "Reserved for use by ASL compilers"),
AH_PREDEF ("_TC1", "Thermal Constant 1", "Returns TC1 for the passive cooling formula"),
AH_PREDEF ("_TC2", "Thermal Constant 2", "Returns TC2 for the passive cooling formula"),
AH_PREDEF ("_TDL", "T-State Depth Limit", "Returns the _TSS entry number of the lowest power throttling state"),
@ -447,7 +447,7 @@ const AH_PREDEFINED_NAME AslPredefinedInfo[] =
AH_PREDEF ("_VAL", "Pin Configuration Value", "Resource Descriptor field"),
AH_PREDEF ("_VEN", "Vendor Data", "Resource Descriptor field"),
AH_PREDEF ("_VPO", "Video Post Options", "Returns the implemented video post options"),
AH_PREDEF ("_Wxx", "Wake Event", "Method executed as a result of a wake event"),
AH_PREDEF ("_Wxx", "Wake Event, xx=0x00-0xFF", "Method executed as a result of a wake event"),
AH_PREDEF ("_WAK", "Wake", "Inform AML that the system has just awakened"),
AH_PREDEF ("_WPC", "Wireless Power Calibration", "Calibrate power and notify wireless device"),
AH_PREDEF ("_WPP", "Wireless Power Polling", "Get recommended polling interval"),

View File

@ -325,6 +325,8 @@ AcpiDmClearTempList (
* FUNCTION: AcpiDmIsSwitchBlock
*
* PARAMETERS: Op - While Object
* Temp - Where the compiler temp name is returned
* (_T_x)
*
* RETURN: TRUE if While block can be converted to a Switch/Case block
*
@ -550,6 +552,10 @@ AcpiDmIsSwitchBlock (
if (CurrentOp->Common.AmlOpcode == AML_ELSE_OP)
{
CurrentOp = CurrentOp->Common.Next;
if (!CurrentOp)
{
return (FALSE);
}
}
/* Ignore the Break Op */

View File

@ -773,12 +773,6 @@ CgWriteNode (
return;
}
if ((Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) &&
AslGbl_DoExternals == FALSE)
{
return;
}
Op->Asl.FinalAmlLength = 0;
switch (Op->Asl.AmlOpcode)

View File

@ -388,23 +388,20 @@ CmDoCompile (
/* Resolve External Declarations */
if (AslGbl_DoExternals)
{
Event = UtBeginEvent ("Resolve all Externals");
DbgPrint (ASL_DEBUG_OUTPUT, "\nResolve Externals\n\n");
Event = UtBeginEvent ("Resolve all Externals");
DbgPrint (ASL_DEBUG_OUTPUT, "\nResolve Externals\n\n");
if (AslGbl_DoExternalsInPlace)
{
TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
ExAmlExternalWalkBegin, NULL, NULL);
}
else
{
TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL);
}
UtEndEvent (Event);
if (AslGbl_DoExternalsInPlace)
{
TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
ExAmlExternalWalkBegin, NULL, NULL);
}
else
{
TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL);
}
UtEndEvent (Event);
/*
* Semantic analysis. This can happen only after the

View File

@ -474,6 +474,10 @@ ACPI_STATUS
AslExpectException (
char *MessageIdString);
ACPI_STATUS
AslElevateException (
char *MessageIdString);
ACPI_STATUS
AslDisableException (
char *MessageIdString);

View File

@ -201,6 +201,11 @@ AePrintSubError (
FILE *OutputFile,
ASL_ERROR_MSG *Enode);
static UINT8
GetModifiedLevel (
UINT8 Level,
UINT16 MessageId);
/*******************************************************************************
*
@ -968,11 +973,12 @@ AslLogNewError (
ASL_ERROR_MSG *SubError)
{
ASL_ERROR_MSG *Enode = NULL;
UINT8 ModifiedLevel = GetModifiedLevel (Level, MessageId);
AslInitEnode (&Enode, Level, MessageId, LineNumber, LogicalLineNumber,
LogicalByteOffset, Column, Filename, Message, SourceLine,
SubError);
AslInitEnode (&Enode, ModifiedLevel, MessageId, LineNumber,
LogicalLineNumber, LogicalByteOffset, Column, Filename, Message,
SourceLine, SubError);
/* Add the new node to the error node list */
@ -985,7 +991,7 @@ AslLogNewError (
AePrintException (ASL_FILE_STDERR, Enode, NULL);
}
AslGbl_ExceptionCount[Level]++;
AslGbl_ExceptionCount[ModifiedLevel]++;
if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
{
printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
@ -999,6 +1005,44 @@ AslLogNewError (
return;
}
/*******************************************************************************
*
* FUNCTION: GetModifiedLevel
*
* PARAMETERS: Level - Seriousness (Warning/error, etc.)
* MessageId - Index into global message buffer
*
* RETURN: UINT8 - modified level
*
* DESCRIPTION: Get the modified level of exception codes that are reported as
* errors from the -ww option.
*
******************************************************************************/
static UINT8
GetModifiedLevel (
UINT8 Level,
UINT16 MessageId)
{
UINT16 i;
UINT16 ExceptionCode;
ExceptionCode = AeBuildFullExceptionCode (Level, MessageId);
for (i = 0; i < AslGbl_ElevatedMessagesIndex; i++)
{
if (ExceptionCode == AslGbl_ElevatedMessages[i])
{
return (ASL_ERROR);
}
}
return (Level);
}
/*******************************************************************************
*
* FUNCTION: AslIsExceptionIgnored
@ -1155,6 +1199,51 @@ AslDisableException (
}
/*******************************************************************************
*
* FUNCTION: AslElevateException
*
* PARAMETERS: MessageIdString - ID of excepted exception during compile
*
* RETURN: Status
*
* DESCRIPTION: Enter a message ID into the global elevated exceptions table.
* These messages will be considered as compilation errors.
*
******************************************************************************/
ACPI_STATUS
AslElevateException (
char *MessageIdString)
{
UINT32 MessageId;
/* Convert argument to an integer and validate it */
MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
if (MessageId > 6999)
{
printf ("\"%s\" is not a valid warning/remark/erro ID\n",
MessageIdString);
return (AE_BAD_PARAMETER);
}
/* Insert value into the global expected message array */
if (AslGbl_ElevatedMessagesIndex >= ASL_MAX_ELEVATED_MESSAGES)
{
printf ("Too many messages have been registered as elevated (max %d)\n",
ASL_MAX_DISABLED_MESSAGES);
return (AE_LIMIT);
}
AslGbl_ElevatedMessages[AslGbl_ExpectedMessagesIndex] = MessageId;
AslGbl_ElevatedMessagesIndex++;
return (AE_OK);
}
/*******************************************************************************
*
* FUNCTION: AslIsExceptionDisabled

View File

@ -255,6 +255,7 @@ extern int AslCompilerdebug;
#define ASL_STRING_BUFFER_SIZE (1024 * 32) /* 32k */
#define ASL_MAX_DISABLED_MESSAGES 32
#define ASL_MAX_EXPECTED_MESSAGES 32
#define ASL_MAX_ELEVATED_MESSAGES 32
#define HEX_TABLE_LINE_SIZE 8
#define HEX_LISTING_LINE_SIZE 8
@ -319,7 +320,6 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_AllExceptionsDisable
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_PruneParseTree, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoTypechecking, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_EnableReferenceTypechecking, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoExternals, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoExternalsInPlace, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_DoAslConversion, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_OptimizeTrivialParseNodes, TRUE);
@ -394,6 +394,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentAmlOffset, 0)
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLine, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_DisabledMessagesIndex, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_ExpectedMessagesIndex, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_ElevatedMessagesIndex, 0);
ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_HexBytesWereWritten, FALSE);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_NumNamespaceObjects, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_ReservedMethods, 0);
@ -435,6 +436,7 @@ ASL_EXTERN char AslGbl_StringBuffer[ASL_STRING_BUFFER_SIZE];
ASL_EXTERN char AslGbl_StringBuffer2[ASL_STRING_BUFFER_SIZE];
ASL_EXTERN UINT32 AslGbl_DisabledMessages[ASL_MAX_DISABLED_MESSAGES];
ASL_EXTERN ASL_EXPECTED_MESSAGE AslGbl_ExpectedMessages[ASL_MAX_EXPECTED_MESSAGES];
ASL_EXTERN UINT32 AslGbl_ElevatedMessages[ASL_MAX_ELEVATED_MESSAGES];
#endif /* __ASLGLOBAL_H */

View File

@ -209,6 +209,7 @@ Usage (
ACPI_OPTION ("-vx <messageid>", "Expect a specific warning, remark, or error");
ACPI_OPTION ("-w <1|2|3>", "Set warning reporting level");
ACPI_OPTION ("-we", "Report warnings as errors");
ACPI_OPTION ("-ww <messageid>", "Report specific warning or remark as error");
printf ("\nAML Bytecode Generation (*.aml):\n");
ACPI_OPTION ("-oa", "Disable all optimizations (compatibility mode)");

View File

@ -519,10 +519,7 @@ CgGenerateAmlLengths (
case PARSEOP_EXTERNAL:
if (AslGbl_DoExternals == TRUE)
{
CgGenerateAmlOpcodeLength (Op);
}
CgGenerateAmlOpcodeLength (Op);
break;
default:

View File

@ -927,15 +927,6 @@ OpcGenerateAmlOpcode (
AslGbl_HasIncludeFiles = TRUE;
break;
case PARSEOP_EXTERNAL:
if (AslGbl_DoExternals == FALSE)
{
Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
Op->Asl.Child->Asl.Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
}
break;
case PARSEOP_TIMER:
if (AcpiGbl_IntegerBitWidth == 32)

View File

@ -982,6 +982,23 @@ AslDoOptions (
AslGbl_WarningsAsErrors = TRUE;
break;
case 'w':
/* Get the required argument */
if (AcpiGetoptArgument (argc, argv))
{
return (-1);
}
Status = AslElevateException (AcpiGbl_Optarg);
if (ACPI_FAILURE (Status))
{
return (-1);
}
break;
default:
printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);

View File

@ -460,11 +460,7 @@ TrTransformSubtree (
case PARSEOP_EXTERNAL:
if (AslGbl_DoExternals == TRUE)
{
ExDoExternal (Op);
}
ExDoExternal (Op);
break;
case PARSEOP___METHOD__:

View File

@ -720,6 +720,8 @@ AcpiDsCallControlMethod (
goto Cleanup;
}
NextWalkState->MethodNestingDepth = ThisWalkState->MethodNestingDepth + 1;
/*
* Delete the operands on the previous walkstate operand stack
* (they were copied to new objects)
@ -738,6 +740,16 @@ AcpiDsCallControlMethod (
"**** Begin nested execution of [%4.4s] **** WalkState=%p\n",
MethodNode->Name.Ascii, NextWalkState));
ThisWalkState->MethodPathname = AcpiNsGetNormalizedPathname (MethodNode, TRUE);
ThisWalkState->MethodIsNested = TRUE;
/* Optional object evaluation log */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION,
"%-26s: %*s%s\n", " Nested method call",
NextWalkState->MethodNestingDepth * 3, " ",
&ThisWalkState->MethodPathname[1]));
/* Invoke an internal method if necessary */
if (ObjDesc->Method.InfoFlags & ACPI_METHOD_INTERNAL_ONLY)

View File

@ -161,7 +161,6 @@
ACPI_MODULE_NAME ("dsobject")
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
*
* FUNCTION: AcpiDsBuildInternalObject
@ -460,7 +459,6 @@ AcpiDsCreateNode (
return_ACPI_STATUS (Status);
}
#endif /* ACPI_NO_METHOD_EXECUTION */
/*******************************************************************************
@ -571,9 +569,7 @@ AcpiDsInitObjectFromOp (
/* Truncate value if we are executing from a 32-bit ACPI table */
#ifndef ACPI_NO_METHOD_EXECUTION
(void) AcpiExTruncateFor32bitTable (ObjDesc);
#endif
break;
case AML_REVISION_OP:
@ -594,7 +590,6 @@ AcpiDsInitObjectFromOp (
ObjDesc->Integer.Value = Op->Common.Value.Integer;
#ifndef ACPI_NO_METHOD_EXECUTION
if (AcpiExTruncateFor32bitTable (ObjDesc))
{
/* Warn if we found a 64-bit constant in a 32-bit table */
@ -604,7 +599,6 @@ AcpiDsInitObjectFromOp (
ACPI_FORMAT_UINT64 (Op->Common.Value.Integer),
(UINT32) ObjDesc->Integer.Value));
}
#endif
break;
default:
@ -642,12 +636,10 @@ AcpiDsInitObjectFromOp (
ObjDesc->Reference.Value = ((UINT32) Opcode) - AML_FIRST_LOCAL_OP;
ObjDesc->Reference.Class = ACPI_REFCLASS_LOCAL;
#ifndef ACPI_NO_METHOD_EXECUTION
Status = AcpiDsMethodDataGetNode (ACPI_REFCLASS_LOCAL,
ObjDesc->Reference.Value, WalkState,
ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE,
&ObjDesc->Reference.Object));
#endif
break;
case AML_TYPE_METHOD_ARGUMENT:
@ -657,12 +649,10 @@ AcpiDsInitObjectFromOp (
ObjDesc->Reference.Value = ((UINT32) Opcode) - AML_FIRST_ARG_OP;
ObjDesc->Reference.Class = ACPI_REFCLASS_ARG;
#ifndef ACPI_NO_METHOD_EXECUTION
Status = AcpiDsMethodDataGetNode (ACPI_REFCLASS_ARG,
ObjDesc->Reference.Value, WalkState,
ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE,
&ObjDesc->Reference.Object));
#endif
break;
default: /* Object name or Debug object */

View File

@ -308,6 +308,32 @@ AcpiDsBuildInternalPackageObj (
{
if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
{
if (!Arg->Common.Node)
{
/*
* This is the case where an expression has returned a value.
* The use of expressions (TermArgs) within individual
* package elements is not supported by the AML interpreter,
* even though the ASL grammar supports it. Example:
*
* Name (INT1, 0x1234)
*
* Name (PKG3, Package () {
* Add (INT1, 0xAAAA0000)
* })
*
* 1) No known AML interpreter supports this type of construct
* 2) This fixes a fault if the construct is encountered
*/
ACPI_EXCEPTION ((AE_INFO, AE_SUPPORT,
"Expressions within package elements are not supported"));
/* Cleanup the return object, it is not needed */
AcpiUtRemoveReference (WalkState->Results->Results.ObjDesc[0]);
return_ACPI_STATUS (AE_SUPPORT);
}
if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
{
/*

View File

@ -209,7 +209,6 @@ AcpiDsClearImplicitReturn (
}
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
*
* FUNCTION: AcpiDsDoImplicitReturn
@ -583,7 +582,6 @@ AcpiDsClearOperands (
WalkState->NumOperands = 0;
return_VOID;
}
#endif
/*******************************************************************************

View File

@ -221,12 +221,10 @@ AcpiDsInitCallbacks (
/* Execution pass */
#ifndef ACPI_NO_METHOD_EXECUTION
WalkState->ParseFlags |= ACPI_PARSE_EXECUTE |
ACPI_PARSE_DELETE_TREE;
WalkState->DescendingCallback = AcpiDsExecBeginOp;
WalkState->AscendingCallback = AcpiDsExecEndOp;
#endif
break;
default:
@ -517,7 +515,7 @@ AcpiDsLoad1BeginOp (
/* Initialize the op */
#if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
#ifdef ACPI_CONSTANT_EVAL_ONLY
Op->Named.Path = Path;
#endif
@ -580,7 +578,6 @@ AcpiDsLoad1EndOp (
ObjectType = WalkState->OpInfo->ObjectType;
#ifndef ACPI_NO_METHOD_EXECUTION
if (WalkState->OpInfo->Flags & AML_FIELD)
{
/*
@ -626,7 +623,6 @@ AcpiDsLoad1EndOp (
}
}
}
#endif
if (Op->Common.AmlOpcode == AML_NAME_OP)
{

View File

@ -529,10 +529,8 @@ AcpiDsLoad2EndOp (
ACPI_NAMESPACE_NODE *Node;
ACPI_PARSE_OBJECT *Arg;
ACPI_NAMESPACE_NODE *NewNode;
#ifndef ACPI_NO_METHOD_EXECUTION
UINT32 i;
UINT8 RegionSpace;
#endif
ACPI_FUNCTION_TRACE (DsLoad2EndOp);
@ -622,7 +620,6 @@ AcpiDsLoad2EndOp (
switch (WalkState->OpInfo->Type)
{
#ifndef ACPI_NO_METHOD_EXECUTION
case AML_TYPE_CREATE_FIELD:
/*
@ -718,13 +715,11 @@ AcpiDsLoad2EndOp (
}
break;
#endif /* ACPI_NO_METHOD_EXECUTION */
case AML_TYPE_NAMED_COMPLEX:
switch (Op->Common.AmlOpcode)
{
#ifndef ACPI_NO_METHOD_EXECUTION
case AML_REGION_OP:
case AML_DATA_REGION_OP:
@ -809,7 +804,6 @@ AcpiDsLoad2EndOp (
}
break;
#endif /* ACPI_NO_METHOD_EXECUTION */
default:

View File

@ -733,7 +733,7 @@ AcpiDsCreateWalkState (
/* Init the method args/local */
#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
#ifndef ACPI_CONSTANT_EVAL_ONLY
AcpiDsMethodDataInit (WalkState);
#endif

View File

@ -496,7 +496,7 @@ AcpiExConvertToAscii (
/* HexLength: 2 ascii hex chars per data byte */
HexLength = ACPI_MUL_2 (DataWidth);
HexLength = (DataWidth * 2);
for (i = 0, j = (HexLength-1); i < HexLength; i++, j--)
{
/* Get one hex digit, most significant digits first */
@ -539,7 +539,8 @@ AcpiExConvertToAscii (
*
* RETURN: Status
*
* DESCRIPTION: Convert an ACPI Object to a string
* DESCRIPTION: Convert an ACPI Object to a string. Supports both implicit
* and explicit conversions and related rules.
*
******************************************************************************/
@ -574,9 +575,11 @@ AcpiExConvertToString (
switch (Type)
{
case ACPI_EXPLICIT_CONVERT_DECIMAL:
/* Make room for maximum decimal number */
/*
* From ToDecimalString, integer source.
*
* Make room for the maximum decimal number size
*/
StringLength = ACPI_MAX_DECIMAL_DIGITS;
Base = 10;
break;
@ -620,8 +623,10 @@ AcpiExConvertToString (
{
case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by ToDecimalString */
/*
* From ACPI: "If Data is a buffer, it is converted to a string of
* decimal values separated by commas."
* Explicit conversion from the ToDecimalString ASL operator.
*
* From ACPI: "If the input is a buffer, it is converted to a
* a string of decimal values separated by commas."
*/
Base = 10;
@ -648,20 +653,29 @@ AcpiExConvertToString (
case ACPI_IMPLICIT_CONVERT_HEX:
/*
* Implicit buffer-to-string conversion
*
* From the ACPI spec:
*"The entire contents of the buffer are converted to a string of
* "The entire contents of the buffer are converted to a string of
* two-character hexadecimal numbers, each separated by a space."
*
* Each hex number is prefixed with 0x (11/2018)
*/
Separator = ' ';
StringLength = (ObjDesc->Buffer.Length * 3);
StringLength = (ObjDesc->Buffer.Length * 5);
break;
case ACPI_EXPLICIT_CONVERT_HEX: /* Used by ToHexString */
case ACPI_EXPLICIT_CONVERT_HEX:
/*
* Explicit conversion from the ToHexString ASL operator.
*
* From ACPI: "If Data is a buffer, it is converted to a string of
* hexadecimal values separated by commas."
*
* Each hex number is prefixed with 0x (11/2018)
*/
StringLength = (ObjDesc->Buffer.Length * 3);
Separator = ',';
StringLength = (ObjDesc->Buffer.Length * 5);
break;
default:
@ -692,9 +706,20 @@ AcpiExConvertToString (
*/
for (i = 0; i < ObjDesc->Buffer.Length; i++)
{
if (Base == 16)
{
/* Emit 0x prefix for explict/implicit hex conversion */
*NewBuf++ = '0';
*NewBuf++ = 'x';
}
NewBuf += AcpiExConvertToAscii (
(UINT64) ObjDesc->Buffer.Pointer[i], Base, NewBuf, 1);
*NewBuf++ = Separator; /* each separated by a comma or space */
/* Each digit is separated by either a comma or space */
*NewBuf++ = Separator;
}
/*

View File

@ -161,7 +161,6 @@
ACPI_MODULE_NAME ("excreate")
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
*
* FUNCTION: AcpiExCreateAlias
@ -573,7 +572,6 @@ AcpiExCreatePowerResource (
AcpiUtRemoveReference (ObjDesc);
return_ACPI_STATUS (Status);
}
#endif
/*******************************************************************************

View File

@ -460,9 +460,9 @@ AcpiExOpcode_2A_1T_1R (
* NOTE: A length of zero is ok, and will create a zero-length, null
* terminated string.
*/
while ((Length < Operand[0]->Buffer.Length) &&
(Length < Operand[1]->Integer.Value) &&
(Operand[0]->Buffer.Pointer[Length]))
while ((Length < Operand[0]->Buffer.Length) && /* Length of input buffer */
(Length < Operand[1]->Integer.Value) && /* Length operand */
(Operand[0]->Buffer.Pointer[Length])) /* Null terminator */
{
Length++;
}

View File

@ -445,14 +445,12 @@ AcpiExWriteSerialBus (
case ACPI_ADR_SPACE_SMBUS:
BufferLength = ACPI_SMBUS_BUFFER_SIZE;
DataLength = ACPI_SMBUS_DATA_SIZE;
Function = ACPI_WRITE | (ObjDesc->Field.Attribute << 16);
break;
case ACPI_ADR_SPACE_IPMI:
BufferLength = ACPI_IPMI_BUFFER_SIZE;
DataLength = ACPI_IPMI_DATA_SIZE;
Function = ACPI_WRITE;
break;
@ -471,7 +469,6 @@ AcpiExWriteSerialBus (
/* Add header length to get the full size of the buffer */
BufferLength += ACPI_SERIAL_HEADER_SIZE;
DataLength = SourceDesc->Buffer.Pointer[1];
Function = ACPI_WRITE | (AccessorType << 16);
break;
@ -479,21 +476,6 @@ AcpiExWriteSerialBus (
return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID);
}
#if 0
OBSOLETE?
/* Check for possible buffer overflow */
if (DataLength > SourceDesc->Buffer.Length)
{
ACPI_ERROR ((AE_INFO,
"Length in buffer header (%u)(%u) is greater than "
"the physical buffer length (%u) and will overflow",
DataLength, BufferLength, SourceDesc->Buffer.Length));
return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);
}
#endif
/* Create the transfer/bidirectional/return buffer */
BufferDesc = AcpiUtCreateBufferObject (BufferLength);
@ -505,6 +487,8 @@ OBSOLETE?
/* Copy the input buffer data to the transfer buffer */
Buffer = BufferDesc->Buffer.Pointer;
DataLength = (BufferLength < SourceDesc->Buffer.Length ?
BufferLength : SourceDesc->Buffer.Length);
memcpy (Buffer, SourceDesc->Buffer.Pointer, DataLength);
/* Lock entire transaction if requested */

View File

@ -181,7 +181,6 @@ AcpiExDigitsNeeded (
UINT32 Base);
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
*
* FUNCTION: AcpiExEnterInterpreter
@ -615,4 +614,3 @@ AcpiIsValidSpaceId (
return (TRUE);
}
#endif

View File

@ -259,6 +259,12 @@ AcpiNsEvaluate (
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* Optional object evaluation log */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION,
"%-26s: %s (%s)\n", " Enter evaluation",
&Info->FullPathname[1], AcpiUtGetTypeName (Info->Node->Type)));
/* Count the number of arguments being passed in */
Info->ParamCount = 0;
@ -445,6 +451,12 @@ AcpiNsEvaluate (
Info->RelativePathname));
Cleanup:
/* Optional object evaluation log */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION,
"%-26s: %s\n", " Exit evaluation",
&Info->FullPathname[1]));
/*
* Namespace was unlocked by the handling AcpiNs* function, so we
* just free the pathname and return

View File

@ -173,7 +173,6 @@ AcpiNsDeleteSubtree (
#endif
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
*
* FUNCTION: AcpiNsLoadTable
@ -477,4 +476,3 @@ AcpiNsUnloadNamespace (
return_ACPI_STATUS (Status);
}
#endif
#endif

View File

@ -261,8 +261,18 @@ AcpiNsExecuteTable (
goto Cleanup;
}
/* Optional object evaluation log */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION,
"%-26s: (Definition Block level)\n", "Module-level evaluation"));
Status = AcpiPsExecuteTable (Info);
/* Optional object evaluation log */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION,
"%-26s: (Definition Block level)\n", "Module-level complete"));
Cleanup:
if (Info)
{

View File

@ -580,7 +580,7 @@ AcpiPsParseLoop (
ParserState = &WalkState->ParserState;
WalkState->ArgTypes = 0;
#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
#ifndef ACPI_CONSTANT_EVAL_ONLY
if (WalkState->WalkType & ACPI_WALK_METHOD_RESTART)
{

View File

@ -637,6 +637,18 @@ AcpiPsParseAml (
"Completed one call to walk loop, %s State=%p\n",
AcpiFormatException (Status), WalkState));
if (WalkState->MethodPathname && WalkState->MethodIsNested)
{
/* Optional object evaluation log */
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EVALUATION, "%-26s: %*s%s\n",
" Exit nested method",
(WalkState->MethodNestingDepth + 1) * 3, " ",
&WalkState->MethodPathname[1]));
ACPI_FREE (WalkState->MethodPathname);
WalkState->MethodIsNested = FALSE;
}
if (Status == AE_CTRL_TRANSFER)
{
/*

View File

@ -307,6 +307,9 @@ AcpiPsExecuteMethod (
goto Cleanup;
}
WalkState->MethodPathname = Info->FullPathname;
WalkState->MethodIsNested = FALSE;
if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL)
{
WalkState->ParseFlags |= ACPI_PARSE_MODULE_LEVEL;
@ -437,6 +440,9 @@ AcpiPsExecuteTable (
goto Cleanup;
}
WalkState->MethodPathname = Info->FullPathname;
WalkState->MethodIsNested = FALSE;
if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL)
{
WalkState->ParseFlags |= ACPI_PARSE_MODULE_LEVEL;

View File

@ -235,10 +235,7 @@ const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] =
{"_REV", ACPI_TYPE_INTEGER, ACPI_CAST_PTR (char, 2)},
{"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
{"_GL_", ACPI_TYPE_MUTEX, ACPI_CAST_PTR (char, 1)},
#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
{"_OSI", ACPI_TYPE_METHOD, ACPI_CAST_PTR (char, 1)},
#endif
/* Table terminator */

View File

@ -217,7 +217,8 @@ AcpiUtIsAmlTable (
if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT) ||
ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_PSDT) ||
ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT) ||
ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_OSDT))
ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_OSDT) ||
ACPI_IS_OEM_SIG (Table->Signature))
{
return (TRUE);
}

View File

@ -217,6 +217,8 @@ static ACPI_INTERFACE_INFO AcpiDefaultSupportedInterfaces[] =
{"Windows 2016", NULL, 0, ACPI_OSI_WIN_10_RS1}, /* Windows 10 version 1607 - Added 12/2017 */
{"Windows 2017", NULL, 0, ACPI_OSI_WIN_10_RS2}, /* Windows 10 version 1703 - Added 12/2017 */
{"Windows 2017.2", NULL, 0, ACPI_OSI_WIN_10_RS3}, /* Windows 10 version 1709 - Added 02/2018 */
{"Windows 2018", NULL, 0, ACPI_OSI_WIN_10_RS4}, /* Windows 10 version 1803 - Added 11/2018 */
{"Windows 2018.2", NULL, 0, ACPI_OSI_WIN_10_RS5}, /* Windows 10 version 1809 - Added 11/2018 */
/* Feature Group Strings */

View File

@ -317,11 +317,7 @@ ACPI_GLOBAL (BOOLEAN, AcpiGbl_DisableMemTracking);
*
****************************************************************************/
#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
#define NUM_PREDEFINED_NAMES 10
#else
#define NUM_PREDEFINED_NAMES 9
#endif
ACPI_GLOBAL (ACPI_NAMESPACE_NODE, AcpiGbl_RootNodeStruct);
ACPI_GLOBAL (ACPI_NAMESPACE_NODE *, AcpiGbl_RootNode);

View File

@ -216,7 +216,8 @@
#define ACPI_LV_RESOURCES 0x00010000
#define ACPI_LV_USER_REQUESTS 0x00020000
#define ACPI_LV_PACKAGE 0x00040000
#define ACPI_LV_VERBOSITY1 0x0007FF40 | ACPI_LV_ALL_EXCEPTIONS
#define ACPI_LV_EVALUATION 0x00080000
#define ACPI_LV_VERBOSITY1 0x000FFF40 | ACPI_LV_ALL_EXCEPTIONS
/* Trace verbosity level 2 [Function tracing and memory allocation] */
@ -285,6 +286,7 @@
#define ACPI_DB_INTERRUPTS ACPI_DEBUG_LEVEL (ACPI_LV_INTERRUPTS)
#define ACPI_DB_USER_REQUESTS ACPI_DEBUG_LEVEL (ACPI_LV_USER_REQUESTS)
#define ACPI_DB_PACKAGE ACPI_DEBUG_LEVEL (ACPI_LV_PACKAGE)
#define ACPI_DB_EVALUATION ACPI_DEBUG_LEVEL (ACPI_LV_EVALUATION)
#define ACPI_DB_MUTEX ACPI_DEBUG_LEVEL (ACPI_LV_MUTEX)
#define ACPI_DB_EVENTS ACPI_DEBUG_LEVEL (ACPI_LV_EVENTS)
@ -292,7 +294,7 @@
/* Defaults for DebugLevel, debug and normal */
#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR)
#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_EVALUATION | ACPI_LV_REPAIR)
#define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR)
#define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL)

View File

@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20181031
#define ACPI_CA_VERSION 0x20181213
#include "acconfig.h"
#include "actypes.h"

View File

@ -205,6 +205,8 @@ typedef struct acpi_walk_state
ACPI_PARSE_STATE ParserState; /* Current state of parser */
UINT32 PrevArgTypes;
UINT32 ArgCount; /* push for fixed or var args */
UINT16 MethodNestingDepth;
UINT8 MethodIsNested;
struct acpi_namespace_node Arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */
struct acpi_namespace_node LocalVariables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */
@ -219,7 +221,8 @@ typedef struct acpi_walk_state
struct acpi_namespace_node *MethodCallNode; /* Called method Node*/
ACPI_PARSE_OBJECT *MethodCallOp; /* MethodCall Op if running a method */
union acpi_operand_object *MethodDesc; /* Method descriptor if running a method */
struct acpi_namespace_node *MethodNode; /* Method node if running a method. */
struct acpi_namespace_node *MethodNode; /* Method node if running a method */
char *MethodPathname; /* Full pathname of running method */
ACPI_PARSE_OBJECT *Op; /* Current parser op */
const ACPI_OPCODE_INFO *OpInfo; /* Info on current opcode */
ACPI_PARSE_OBJECT *Origin; /* Start of walk [Obsolete] */

View File

@ -182,6 +182,7 @@
#define ACPI_SIG_XSDT "XSDT" /* Extended System Description Table */
#define ACPI_SIG_SSDT "SSDT" /* Secondary System Description Table */
#define ACPI_RSDP_NAME "RSDP" /* Short name for RSDP, not signature */
#define ACPI_OEM_NAME "OEM" /* Short name for OEM, not signature */
/*

View File

@ -678,6 +678,10 @@ typedef UINT64 ACPI_INTEGER;
#define ACPI_VALIDATE_RSDP_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
#define ACPI_MAKE_RSDP_SIG(dest) (memcpy (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
/* Support for OEMx signature (x can be any character) */
#define ACPI_IS_OEM_SIG(a) (!strncmp (ACPI_CAST_PTR (char, (a)), ACPI_OEM_NAME, 3) &&\
strnlen (a, ACPI_NAME_SIZE) == ACPI_NAME_SIZE)
/*
* Algorithm to obtain access bit width.
* Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
@ -1512,6 +1516,8 @@ typedef enum
#define ACPI_OSI_WIN_10_RS1 0x0E
#define ACPI_OSI_WIN_10_RS2 0x0F
#define ACPI_OSI_WIN_10_RS3 0x10
#define ACPI_OSI_WIN_10_RS4 0x11
#define ACPI_OSI_WIN_10_RS5 0x12
/* Definitions of getopt */

View File

@ -537,7 +537,11 @@ AbCompareAmlFiles (
printf ("Compare offset: %u\n", AbGbl_CompareOffset);
if (AbGbl_CompareOffset)
{
fseek (File2, AbGbl_CompareOffset, SEEK_CUR);
if (fseek (File2, AbGbl_CompareOffset, SEEK_CUR))
{
printf ("Seek error on file %s\n", File2Path);
goto Exit2;
}
}
Actual1 = fread (&Char1, 1, 1, File1);

View File

@ -266,6 +266,7 @@ usage (
ACPI_OPTION ("-ef", "Enable display of final memory statistics");
ACPI_OPTION ("-ei", "Enable additional tests for ACPICA interfaces");
ACPI_OPTION ("-el", "Enable loading of additional test tables");
ACPI_OPTION ("-eo", "Enable object evaluation log");
ACPI_OPTION ("-es", "Enable Interpreter Slack Mode");
ACPI_OPTION ("-et", "Enable debug semaphore timeout");
printf ("\n");
@ -406,6 +407,12 @@ AeDoOptions (
AcpiGbl_LoadTestTables = TRUE;
break;
case 'o':
AcpiDbgLevel |= ACPI_LV_EVALUATION;
AcpiGbl_DbConsoleDebugLevel |= ACPI_LV_EVALUATION;
break;
case 's':
AcpiGbl_EnableInterpreterSlack = TRUE;

View File

@ -167,6 +167,10 @@ static void
AhDisplayPredefinedInfo (
char *Name);
static void
AhDoSpecialNames (
char *Name);
static void
AhDisplayResourceName (
const ACPI_PREDEFINED_INFO *ThisName);
@ -293,15 +297,23 @@ AhFindPredefinedNames (
{
UINT32 Length;
BOOLEAN Found;
char Name[9];
char Name[ACPI_NAME_SIZE + 1];
if (!NamePrefix || (NamePrefix[0] == '*'))
if (!NamePrefix || (*NamePrefix == '*'))
{
Found = AhDisplayPredefinedName (NULL, 0);
return;
}
Length = strlen (NamePrefix);
if (Length > ACPI_NAME_SIZE)
{
printf ("%.8s: Predefined name must be 4 characters maximum\n",
NamePrefix);
return;
}
/* Contruct a local name or name prefix */
AcpiUtStrupr (NamePrefix);
@ -311,14 +323,13 @@ AhFindPredefinedNames (
}
Name[0] = '_';
AcpiUtSafeStrncpy (&Name[1], NamePrefix, 7);
AcpiUtSafeStrncpy (&Name[1], NamePrefix, 4);
Length = strlen (Name);
if (Length > ACPI_NAME_SIZE)
{
printf ("%.8s: Predefined name must be 4 characters maximum\n", Name);
return;
}
/* Check for special names such as _Exx, _ACx, etc. */
AhDoSpecialNames (Name);
/* Lookup and display the name(s) */
Found = AhDisplayPredefinedName (Name, Length);
if (!Found)
@ -328,6 +339,95 @@ AhFindPredefinedNames (
}
/*******************************************************************************
*
* FUNCTION: AhDoSpecialNames
*
* PARAMETERS: Name - Name or prefix to find
*
* RETURN: None
*
* DESCRIPTION: Detect and handle the "special" names such as _Exx, _ACx, etc.
*
* Current support:
* _EJx
* _Exx
* _Lxx
* _Qxx
* _Wxx
* _ACx
* _ALx
* _T_x
*
******************************************************************************/
static void
AhDoSpecialNames (
char *Name)
{
/*
* Check for the special names that have one or more numeric
* suffixes. For example, _Lxx can have 256 different flavors,
* from _L00 to _LFF.
*/
switch (Name[1])
{
case 'E':
if (Name[2] == 'J')
{
if (isdigit (Name[3]) || (Name[3] == 'X'))
{
/* _EJx */
Name[3] = 'x';
break;
}
}
/* Fallthrough */
case 'L':
case 'Q':
case 'W':
if ((isxdigit (Name[2]) && isxdigit (Name[3]))
||
((Name[2] == 'X') && (Name[3] == 'X')))
{
/* _Exx, _Lxx, _Qxx, or _Wxx */
Name[2] = 'x';
Name[3] = 'x';
}
break;
case 'A':
if ((Name[2] == 'C') || (Name[2] == 'L'))
{
if (isdigit (Name[3]) || (Name[3] == 'X'))
{
/* _ACx or _ALx */
Name[3] = 'x';
}
}
break;
case 'T':
if (Name[2] == '_')
{
/* _T_x (Reserved for iASL compiler */
Name[3] = 'x';
}
break;
default:
break;
}
}
/*******************************************************************************
*
* FUNCTION: AhDisplayPredefinedName
@ -420,7 +520,7 @@ AhDisplayPredefinedInfo (
/* NOTE: we check both tables always because there are some dupes */
/* Check against the predefine methods first */
/* Check against the predefined methods first */
ThisName = AcpiUtMatchPredefinedMethod (Name);
if (ThisName)

View File

@ -176,8 +176,8 @@ AxExtractTables (
{
FILE *InputFile;
FILE *OutputFile = NULL;
unsigned int BytesConverted;
unsigned int ThisTableBytesWritten = 0;
int BytesConverted;
int ThisTableBytesWritten = 0;
unsigned int FoundTable = 0;
unsigned int Instances = 0;
unsigned int ThisInstance;
@ -323,8 +323,7 @@ AxExtractTables (
/* Empty line or non-data line terminates the data block */
BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature,
ThisTableBytesWritten);
BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature);
switch (BytesConverted)
{
case 0:
@ -334,6 +333,7 @@ AxExtractTables (
case -1:
Status = -1;
goto CleanupAndExit; /* There was a write error */
default: /* Normal case, get next line */
@ -397,8 +397,8 @@ AxExtractToMultiAmlFile (
FILE *InputFile;
FILE *OutputFile;
int Status = 0;
unsigned int TotalBytesWritten = 0;
unsigned int ThisTableBytesWritten = 0;
int TotalBytesWritten = 0;
int ThisTableBytesWritten = 0;
unsigned int BytesConverted;
char ThisSignature[4];
unsigned int State = AX_STATE_FIND_HEADER;
@ -494,8 +494,7 @@ AxExtractToMultiAmlFile (
/* Empty line or non-data line terminates the data block */
BytesConverted = AxConvertAndWrite (
OutputFile, ThisSignature, ThisTableBytesWritten);
BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature);
switch (BytesConverted)
{
case 0:
@ -505,6 +504,7 @@ AxExtractToMultiAmlFile (
case -1:
Status = -1;
goto CleanupAndExit; /* There was a write error */
default: /* Normal case, get next line */
@ -561,6 +561,7 @@ AxListAllTables (
FILE *InputFile;
unsigned char Header[48];
UINT32 ByteCount = 0;
UINT32 ThisLineByteCount;
unsigned int State = AX_STATE_FIND_HEADER;
@ -633,7 +634,15 @@ AxListAllTables (
/* Convert header to hex and display it */
ByteCount += AxConvertToBinary (Gbl_LineBuffer, &Header[ByteCount]);
ThisLineByteCount = AxConvertToBinary (Gbl_LineBuffer,
&Header[ByteCount]);
if (ThisLineByteCount == EOF)
{
fclose (InputFile);
return (-1);
}
ByteCount += ThisLineByteCount;
if (ByteCount >= sizeof (ACPI_TABLE_HEADER))
{
AxDumpTableHeader (Header);

View File

@ -276,13 +276,12 @@ BOOLEAN
AxIsDataBlockHeader (
void);
long
int
AxConvertAndWrite (
FILE *OutputFile,
char *ThisSignature,
unsigned int ThisTableBytesWritten);
char *ThisSignature);
size_t
int
AxConvertToBinary (
char *InputLine,
unsigned char *OutputData);

View File

@ -427,7 +427,7 @@ AxNormalizeSignature (
*
******************************************************************************/
size_t
int
AxConvertToBinary (
char *InputLine,
unsigned char *OutputData)
@ -468,14 +468,22 @@ AxConvertToBinary (
&Converted[8], &Converted[9], &Converted[10], &Converted[11],
&Converted[12], &Converted[13], &Converted[14], &Converted[15]);
/* Pack converted data into a byte array */
if (BytesConverted == EOF)
{
printf ("EOF while converting ASCII line to binary\n");
return (-1);
}
/*
* Pack converted data into a byte array.
* Note: BytesConverted == 0 is acceptable.
*/
for (i = 0; i < BytesConverted; i++)
{
OutputData[i] = (unsigned char) Converted[i];
}
return ((size_t) BytesConverted);
return (BytesConverted);
}
@ -603,7 +611,6 @@ AxGetNextInstance (
*
* PARAMETERS: OutputFile - Where to write the binary data
* ThisSignature - Signature of current ACPI table
* ThisTableBytesWritten - Total count of data written
*
* RETURN: Length of the converted line
*
@ -616,27 +623,29 @@ AxGetNextInstance (
*
******************************************************************************/
long
int
AxConvertAndWrite (
FILE *OutputFile,
char *ThisSignature,
unsigned int ThisTableBytesWritten)
char *ThisSignature)
{
size_t BytesWritten;
size_t BytesConverted;
int BytesWritten;
int BytesConverted;
/* Convert one line of ascii hex data to binary */
BytesConverted = AxConvertToBinary (Gbl_LineBuffer, Gbl_BinaryData);
/* Write the binary data */
if (BytesConverted == EOF)
{
return (EOF);
}
if (!BytesConverted)
{
return (0);
}
/* Write the binary data */
BytesWritten = fwrite (Gbl_BinaryData, 1, BytesConverted, OutputFile);
if (BytesWritten != BytesConverted)
{