Merge ACPICA 20180810.

This commit is contained in:
Jung-uk Kim 2018-08-13 16:26:26 +00:00
commit 51f42bad71
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=337713
21 changed files with 231 additions and 40 deletions

View File

@ -1,3 +1,50 @@
----------------------------------------
10 August 2018. Summary of changes for version 20180810:
1) ACPICA kernel-resident subsystem:
Initial ACPI table loading: Attempt to continue loading ACPI tables
regardless of malformed AML. Since migrating table initialization to the
new module-level code support, the AML interpreter rejected tables upon
any ACPI error encountered during table load. This is a problem because
non-serious ACPI errors during table load do not necessarily mean that
the entire definition block (DSDT or SSDT) is invalid. This change
improves the table loading by ignoring some types of errors that can be
generated by incorrect AML. This can range from object type errors, scope
errors, and index errors.
Suspend/Resume support: Update to stop unconditionally clearing ACPI IRQs
during suspend/resume. The status of ACPI events is no longer cleared
when entering the ACPI S5 system state (power off) which caused some
systems to power up immediately after turning off power in certain
situations. This was a functional regression. It was fixed by clearing
the status of all ACPI events again when entering S5 (for system-wide
suspend or hibernation the clearing of the status of all events is not
desirable, as it might cause the kernel to miss wakeup events sometimes).
Rafael Wysocki.
2) iASL Compiler/Disassembler and Tools:
AcpiExec: Enhanced the -fi option (Namespace initialization file). Field
elements listed in the initialization file were previously initialized
after the table load and before executing module-level code blocks.
Recent changes in the module-level code support means that the table load
becomes a large control method execution. If fields are used within
module-level code and we are executing with the -fi option, the
initialization values were used to initialize the namespace object(s)
only after the table was finished loading. This change Provides an early
initialization of objects specified in the initialization file so that
field unit values are populated during the table load (not after the
load).
AcpiExec: Fixed a small memory leak regression that could result in
warnings during exit of the utility. These warnings were similar to
these:
0002D690 Length 0x0006 nsnames-0502 [Not a Descriptor - too small]
0002CD70 Length 0x002C utcache-0453 [Operand] Integer RefCount 0x0001
----------------------------------------
29 June 2018. Summary of changes for version 20180629:

View File

@ -969,7 +969,11 @@ AcpiDbCommandDispatch (
case CMD_DISASSEMBLE:
case CMD_DISASM:
#ifdef ACPI_DISASSEMBLER
(void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
#else
AcpiOsPrintf ("The AML Disassembler is not configured/present\n");
#endif
break;
case CMD_DUMP:
@ -1083,7 +1087,11 @@ AcpiDbCommandDispatch (
case CMD_LIST:
AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
#ifdef ACPI_DISASSEMBLER
AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);;
#else
AcpiOsPrintf ("The AML Disassembler is not configured/present\n");
#endif
break;
case CMD_LOCKS:

View File

@ -393,6 +393,7 @@ AcpiDbSetMethodData (
}
#ifdef ACPI_DISASSEMBLER
/*******************************************************************************
*
* FUNCTION: AcpiDbDisassembleAml
@ -426,9 +427,7 @@ AcpiDbDisassembleAml (
NumStatements = strtoul (Statements, NULL, 0);
}
#ifdef ACPI_DISASSEMBLER
AcpiDmDisassemble (NULL, Op, NumStatements);
#endif
}
@ -511,8 +510,6 @@ AcpiDbDisassembleMethod (
WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
Status = AcpiPsParseAml (WalkState);
#ifdef ACPI_DISASSEMBLER
(void) AcpiDmParseDeferredOps (Op);
/* Now we can disassemble the method */
@ -520,7 +517,6 @@ AcpiDbDisassembleMethod (
AcpiGbl_DmOpt_Verbose = FALSE;
AcpiDmDisassemble (NULL, Op, 0);
AcpiGbl_DmOpt_Verbose = TRUE;
#endif
AcpiPsDeleteParseTree (Op);
@ -531,6 +527,7 @@ AcpiDbDisassembleMethod (
AcpiUtReleaseOwnerId (&ObjDesc->Method.OwnerId);
return (AE_OK);
}
#endif
/*******************************************************************************

View File

@ -154,6 +154,7 @@
#include <contrib/dev/acpica/include/amlcode.h>
#include <contrib/dev/acpica/include/acdebug.h>
#include <contrib/dev/acpica/include/acinterp.h>
#include <contrib/dev/acpica/include/acparser.h>
#define _COMPONENT ACPI_CA_DEBUGGER
@ -435,10 +436,17 @@ AcpiDbSingleStep (
}
}
/* Now we can display it */
/* Now we can disassemble and display it */
#ifdef ACPI_DISASSEMBLER
AcpiDmDisassemble (WalkState, DisplayOp, ACPI_UINT32_MAX);
#else
/*
* The AML Disassembler is not configured - at least we can
* display the opcode value and name
*/
AcpiOsPrintf ("AML Opcode: %4.4X %s\n", Op->Common.AmlOpcode,
AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
#endif
if ((Op->Common.AmlOpcode == AML_IF_OP) ||

View File

@ -157,6 +157,10 @@
#include <contrib/dev/acpica/include/acnamesp.h>
#include <contrib/dev/acpica/include/acparser.h>
#if !defined(ACPI_DB_APP) && defined(ACPI_EXEC_APP)
#include "aecommon.h"
#endif
#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dsfield")
@ -430,6 +434,13 @@ AcpiDsGetFieldNames (
UINT64 Position;
ACPI_PARSE_OBJECT *Child;
#if !defined(ACPI_DB_APP) && defined(ACPI_EXEC_APP)
UINT64 Value = 0;
ACPI_OPERAND_OBJECT *ResultDesc;
ACPI_OPERAND_OBJECT *ObjDesc;
char *NamePath;
#endif
ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info);
@ -564,6 +575,18 @@ AcpiDsGetFieldNames (
{
return_ACPI_STATUS (Status);
}
#if !defined(ACPI_DB_APP) && defined(ACPI_EXEC_APP)
NamePath = AcpiNsGetExternalPathname (Info->FieldNode);
ObjDesc = AcpiUtCreateIntegerObject (Value);
if (ACPI_SUCCESS (AeLookupInitFileEntry (NamePath, &Value)))
{
AcpiExWriteDataToField (ObjDesc,
AcpiNsGetAttachedObject (Info->FieldNode),
&ResultDesc);
}
AcpiUtRemoveReference (ObjDesc);
ACPI_FREE (NamePath);
#endif
}
}
@ -756,6 +779,9 @@ AcpiDsInitFieldObjects (
Flags |= ACPI_NS_TEMPORARY;
}
#ifdef ACPI_EXEC_APP
Flags |= ACPI_NS_OVERRIDE_IF_FOUND;
#endif
/*
* Walk the list of entries in the FieldList
* Note: FieldList can be of zero length. In this case, Arg will be NULL.

View File

@ -724,13 +724,20 @@ AcpiHwRegisterRead (
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPm2ControlBlock);
Value = (UINT32) Value64;
if (ACPI_SUCCESS (Status))
{
Value = (UINT32) Value64;
}
break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
Status = AcpiHwRead (&Value64, &AcpiGbl_FADT.XPmTimerBlock);
Value = (UINT32) Value64;
if (ACPI_SUCCESS (Status))
{
Value = (UINT32) Value64;
}
break;
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */

View File

@ -198,17 +198,28 @@ AcpiHwLegacySleep (
return_ACPI_STATUS (Status);
}
/*
* 1) Disable all GPEs
* 2) Enable all wakeup GPEs
*/
/* Disable all GPEs */
Status = AcpiHwDisableAllGpes ();
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
/*
* If the target sleep state is S5, clear all GPEs and fixed events too
*/
if (SleepState == ACPI_STATE_S5)
{
Status = AcpiHwClearAcpiStatus();
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
}
}
AcpiGbl_SystemAwakeAndRunning = FALSE;
/* Enable all wakeup GPEs */
Status = AcpiHwEnableAllWakeupGpes ();
if (ACPI_FAILURE (Status))
{

View File

@ -724,6 +724,15 @@ AcpiNsLookup (
CurrentNode));
}
#ifdef ACPI_EXEC_APP
if ((Status == AE_ALREADY_EXISTS) &&
(ThisNode->Flags & ANOBJ_NODE_EARLY_INIT))
{
ThisNode->Flags &= ~ANOBJ_NODE_EARLY_INIT;
Status = AE_OK;
}
#endif
#ifdef ACPI_ASL_COMPILER
/*
* If this ACPI name already exists within the namespace as an
@ -845,6 +854,13 @@ AcpiNsLookup (
}
}
#ifdef ACPI_EXEC_APP
if (Flags & ACPI_NS_EARLY_INIT)
{
ThisNode->Flags |= ANOBJ_NODE_EARLY_INIT;
}
#endif
*ReturnNode = ThisNode;
return_ACPI_STATUS (AE_OK);
}

View File

@ -164,6 +164,7 @@
#include <contrib/dev/acpica/include/acdispat.h>
#include <contrib/dev/acpica/include/amlcode.h>
#include <contrib/dev/acpica/include/acconvert.h>
#include <contrib/dev/acpica/include/acnamesp.h>
#define _COMPONENT ACPI_PARSER
ACPI_MODULE_NAME ("psloop")
@ -645,6 +646,18 @@ AcpiPsParseLoop (
Status = AcpiPsCreateOp (WalkState, AmlOpStart, &Op);
if (ACPI_FAILURE (Status))
{
/*
* ACPI_PARSE_MODULE_LEVEL means that we are loading a table by
* executing it as a control method. However, if we encounter
* an error while loading the table, we need to keep trying to
* load the table rather than aborting the table load. Set the
* status to AE_OK to proceed with the table load.
*/
if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) &&
Status == AE_ALREADY_EXISTS)
{
Status = AE_OK;
}
if (Status == AE_CTRL_PARSE_CONTINUE)
{
continue;
@ -665,18 +678,20 @@ AcpiPsParseLoop (
{
return_ACPI_STATUS (Status);
}
if (WalkState->Opcode == AML_SCOPE_OP)
if (AcpiNsOpensScope (
AcpiPsGetOpcodeInfo (WalkState->Opcode)->ObjectType))
{
/*
* If the scope op fails to parse, skip the body of the
* scope op because the parse failure indicates that the
* device may not exist.
* If the scope/device op fails to parse, skip the body of
* the scope op because the parse failure indicates that
* the device may not exist.
*/
ACPI_ERROR ((AE_INFO, "Skip parsing opcode %s",
AcpiPsGetOpcodeName (WalkState->Opcode)));
WalkState->ParserState.Aml = WalkState->Aml + 1;
WalkState->ParserState.Aml =
AcpiPsGetNextPackageEnd(&WalkState->ParserState);
WalkState->Aml = WalkState->ParserState.Aml;
ACPI_ERROR ((AE_INFO, "Skipping Scope block"));
}
continue;
@ -834,6 +849,22 @@ AcpiPsParseLoop (
{
Status = AE_OK;
}
else if ((WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL) &&
(ACPI_AML_EXCEPTION(Status) || Status == AE_ALREADY_EXISTS ||
Status == AE_NOT_FOUND))
{
/*
* ACPI_PARSE_MODULE_LEVEL flag means that we are currently
* loading a table by executing it as a control method.
* However, if we encounter an error while loading the table,
* we need to keep trying to load the table rather than
* aborting the table load (setting the status to AE_OK
* continues the table load). If we get a failure at this
* point, it means that the dispatcher got an error while
* trying to execute the Op.
*/
Status = AE_OK;
}
}
Status = AcpiPsCompleteOp (WalkState, &Op, Status);

View File

@ -711,9 +711,9 @@ AcpiTbVerifyTempTable (
{
if (Status != AE_CTRL_TERMINATE)
{
ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
ACPI_EXCEPTION ((AE_INFO, Status,
"%4.4s 0x%8.8X%8.8X"
" Table is duplicated",
" Table is already loaded",
AcpiUtValidNameseg (TableDesc->Signature.Ascii) ?
TableDesc->Signature.Ascii : "????",
ACPI_FORMAT_UINT64 (TableDesc->Address)));

View File

@ -520,6 +520,7 @@ AcpiUtUpdateRefCount (
UINT16 OriginalCount;
UINT16 NewCount = 0;
ACPI_CPU_FLAGS LockFlags;
char *Message;
ACPI_FUNCTION_NAME (UtUpdateRefCount);
@ -560,6 +561,7 @@ AcpiUtUpdateRefCount (
"Obj %p Type %.2X [%s] Refs %.2X [Incremented]\n",
Object, Object->Common.Type,
AcpiUtGetObjectTypeName (Object), NewCount));
Message = "Incremement";
break;
case REF_DECREMENT:
@ -591,6 +593,7 @@ AcpiUtUpdateRefCount (
{
AcpiUtDeleteInternalObj (Object);
}
Message = "Decrement";
break;
default:
@ -608,8 +611,8 @@ AcpiUtUpdateRefCount (
if (NewCount > ACPI_MAX_REFERENCE_COUNT)
{
ACPI_WARNING ((AE_INFO,
"Large Reference Count (0x%X) in object %p, Type=0x%.2X",
NewCount, Object, Object->Common.Type));
"Large Reference Count (0x%X) in object %p, Type=0x%.2X Operation=%s",
NewCount, Object, Object->Common.Type, Message));
}
}

View File

@ -352,19 +352,19 @@ AcpiUtPrefixedNamespaceError (
{
case AE_ALREADY_EXISTS:
AcpiOsPrintf ("\n" ACPI_MSG_BIOS_ERROR);
AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
Message = "Failure creating";
break;
case AE_NOT_FOUND:
AcpiOsPrintf ("\n" ACPI_MSG_BIOS_ERROR);
AcpiOsPrintf (ACPI_MSG_BIOS_ERROR);
Message = "Could not resolve";
break;
default:
AcpiOsPrintf ("\n" ACPI_MSG_ERROR);
AcpiOsPrintf (ACPI_MSG_ERROR);
Message = "Failure resolving";
break;
}

View File

@ -419,15 +419,39 @@ BOOLEAN
AcpiUtDetectHexPrefix (
char **String)
{
char *InitialPosition = *String;
AcpiUtRemoveHexPrefix (String);
if (*String != InitialPosition)
{
return (TRUE); /* String is past leading 0x */
}
return (FALSE); /* Not a hex string */
}
/*******************************************************************************
*
* FUNCTION: AcpiUtRemoveHexPrefix
*
* PARAMETERS: String - Pointer to input ASCII string
*
* RETURN: none
*
* DESCRIPTION: Remove a hex "0x" prefix
*
******************************************************************************/
void
AcpiUtRemoveHexPrefix (
char **String)
{
if ((**String == ACPI_ASCII_ZERO) &&
(tolower ((int) *(*String + 1)) == 'x'))
{
*String += 2; /* Go past the leading 0x */
return (TRUE);
}
return (FALSE); /* Not a hex string */
}

View File

@ -383,7 +383,7 @@ AcpiUtImplicitStrtoul64 (
* implicit conversions, and the "0x" prefix is "not allowed".
* However, allow a "0x" prefix as an ACPI extension.
*/
AcpiUtDetectHexPrefix (&String);
AcpiUtRemoveHexPrefix (&String);
if (!AcpiUtRemoveLeadingZeros (&String))
{

View File

@ -233,7 +233,7 @@
/* Maximum object reference count (detects object deletion issues) */
#define ACPI_MAX_REFERENCE_COUNT 0x800
#define ACPI_MAX_REFERENCE_COUNT 0x4000
/* Default page size for use in mapping memory for operation regions */

View File

@ -204,6 +204,13 @@ typedef struct acpi_exception_info
#define AE_OK (ACPI_STATUS) 0x0000
#define ACPI_ENV_EXCEPTION(Status) (Status & AE_CODE_ENVIRONMENTAL)
#define ACPI_AML_EXCEPTION(Status) (Status & AE_CODE_AML)
#define ACPI_PROG_EXCEPTION(Status) (Status & AE_CODE_PROGRAMMER)
#define ACPI_TABLE_EXCEPTION(Status) (Status & AE_CODE_ACPI_TABLES)
#define ACPI_CNTL_EXCEPTION(Status) (Status & AE_CODE_CONTROL)
/*
* Environmental exceptions
*/

View File

@ -327,6 +327,7 @@ typedef struct acpi_namespace_node
#define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */
#define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */
#define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (InstallMethod) */
#define ANOBJ_NODE_EARLY_INIT 0x80 /* AcpiExec only: Node was create via init file (-fi) */
#define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */
#define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */

View File

@ -168,14 +168,15 @@
/* Flags for AcpiNsLookup, AcpiNsSearchAndEnter */
#define ACPI_NS_NO_UPSEARCH 0
#define ACPI_NS_SEARCH_PARENT 0x01
#define ACPI_NS_DONT_OPEN_SCOPE 0x02
#define ACPI_NS_NO_PEER_SEARCH 0x04
#define ACPI_NS_ERROR_IF_FOUND 0x08
#define ACPI_NS_PREFIX_IS_SCOPE 0x10
#define ACPI_NS_EXTERNAL 0x20
#define ACPI_NS_TEMPORARY 0x40
#define ACPI_NS_OVERRIDE_IF_FOUND 0x80
#define ACPI_NS_SEARCH_PARENT 0x0001
#define ACPI_NS_DONT_OPEN_SCOPE 0x0002
#define ACPI_NS_NO_PEER_SEARCH 0x0004
#define ACPI_NS_ERROR_IF_FOUND 0x0008
#define ACPI_NS_PREFIX_IS_SCOPE 0x0010
#define ACPI_NS_EXTERNAL 0x0020
#define ACPI_NS_TEMPORARY 0x0040
#define ACPI_NS_OVERRIDE_IF_FOUND 0x0080
#define ACPI_NS_EARLY_INIT 0x0100
/* Flags for AcpiNsWalkNamespace */

View File

@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20180629
#define ACPI_CA_VERSION 0x20180810
#include <contrib/dev/acpica/include/acconfig.h>
#include <contrib/dev/acpica/include/actypes.h>

View File

@ -362,6 +362,10 @@ BOOLEAN
AcpiUtDetectHexPrefix (
char **String);
void
AcpiUtRemoveHexPrefix (
char **String);
BOOLEAN
AcpiUtDetectOctalPrefix (
char **String);

View File

@ -76,7 +76,7 @@ SRCS+= osgendbg.c osunixxf.c
MAN= acpidb.8
WARNS?= 3
CFLAGS+= -DACPI_EXEC_APP -fno-strict-aliasing
CFLAGS+= -DACPI_DB_APP -DACPI_EXEC_APP -fno-strict-aliasing
LIBADD= pthread
.include <bsd.prog.mk>