summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2017-07-28 17:44:36 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2017-07-28 17:44:36 +0000
commit834d4c5613e9c57c0b9fba46fa717fd7fb9d5891 (patch)
tree610a3598ffcd1fdcb97c475a59bccac84f41bbdd
parent744d47ba98ced2e2a7d3aff2f894136544386e34 (diff)
downloadsrc-test2-vendor/acpica/20170728.tar.gz
src-test2-vendor/acpica/20170728.zip
Import ACPICA 20170728.vendor/acpica/20170728
-rw-r--r--changes.txt82
-rw-r--r--generate/unix/Makefile.config8
-rw-r--r--generate/unix/acpiexamples/Makefile1
-rw-r--r--generate/unix/acpiexec/Makefile1
-rw-r--r--generate/unix/acpinames/Makefile1
-rw-r--r--generate/unix/iasl/Makefile1
-rw-r--r--source/common/ahtable.c1
-rw-r--r--source/common/dmtable.c1
-rw-r--r--source/common/dmtbinfo.c11
-rw-r--r--source/compiler/aslcompile.c1
-rw-r--r--source/compiler/aslcompiler.h10
-rw-r--r--source/compiler/aslcompiler.l2
-rw-r--r--source/compiler/aslerror.c165
-rw-r--r--source/compiler/aslglobal.h3
-rw-r--r--source/compiler/aslhelp.c1
-rw-r--r--source/compiler/aslmessages.c3
-rw-r--r--source/compiler/aslmessages.h1
-rw-r--r--source/compiler/asloptions.c16
-rw-r--r--source/compiler/aslparseop.c16
-rw-r--r--source/compiler/aslrules.y1
-rw-r--r--source/compiler/asltokens.y1
-rw-r--r--source/compiler/asltransform.c31
-rw-r--r--source/compiler/asltypes.h9
-rw-r--r--source/compiler/aslutils.c67
-rw-r--r--source/compiler/dtcompile.c21
-rw-r--r--source/compiler/dtcompiler.h1
-rw-r--r--source/compiler/dttemplate.h9
-rw-r--r--source/compiler/dtutils.c2
-rw-r--r--source/compiler/prmacros.c2
-rw-r--r--source/components/debugger/dbdisply.c33
-rw-r--r--source/components/dispatcher/dsfield.c4
-rw-r--r--source/components/dispatcher/dsobject.c392
-rw-r--r--source/components/dispatcher/dsopcode.c10
-rw-r--r--source/components/dispatcher/dspkginit.c635
-rw-r--r--source/components/executer/excreate.c55
-rw-r--r--source/components/executer/exdump.c41
-rw-r--r--source/components/executer/exmisc.c9
-rw-r--r--source/components/executer/exoparg2.c2
-rw-r--r--source/components/hardware/hwregs.c2
-rw-r--r--source/components/namespace/nsaccess.c19
-rw-r--r--source/components/namespace/nsarguments.c22
-rw-r--r--source/components/namespace/nsinit.c14
-rw-r--r--source/components/namespace/nsnames.c9
-rw-r--r--source/components/namespace/nsprepkg.c2
-rw-r--r--source/components/parser/psloop.c10
-rw-r--r--source/components/resources/rsxface.c7
-rw-r--r--source/components/tables/tbdata.c2
-rw-r--r--source/components/tables/tbxface.c4
-rw-r--r--source/components/utilities/utclib.c2
-rw-r--r--source/components/utilities/uthex.c4
-rw-r--r--source/components/utilities/utmath.c261
-rw-r--r--source/components/utilities/utmisc.c13
-rw-r--r--source/components/utilities/utobject.c4
-rw-r--r--source/components/utilities/utprint.c8
-rw-r--r--source/components/utilities/utresrc.c11
-rw-r--r--source/components/utilities/utstate.c2
-rw-r--r--source/components/utilities/utstrtoul64.c8
-rw-r--r--source/components/utilities/uttrack.c10
-rw-r--r--source/include/acdisasm.h2
-rw-r--r--source/include/acdispat.h17
-rw-r--r--source/include/aclocal.h2
-rw-r--r--source/include/acnames.h1
-rw-r--r--source/include/acobject.h4
-rw-r--r--source/include/acpi.h4
-rw-r--r--source/include/acpixf.h2
-rw-r--r--source/include/actbl2.h16
-rw-r--r--source/include/actypes.h8
-rw-r--r--source/include/acutils.h20
-rw-r--r--source/include/platform/accygwin.h1
-rw-r--r--source/include/platform/acdragonfly.h1
-rw-r--r--source/include/platform/acefi.h70
-rw-r--r--source/include/platform/acefiex.h103
-rw-r--r--source/include/platform/acfreebsd.h1
-rw-r--r--source/include/platform/acgcc.h4
-rw-r--r--source/include/platform/achaiku.h1
-rw-r--r--source/include/platform/aclinux.h2
-rw-r--r--source/include/platform/acmsvc.h76
-rw-r--r--source/include/platform/acnetbsd.h2
-rw-r--r--source/include/platform/acos2.h1
-rw-r--r--source/include/platform/acqnx.h1
-rw-r--r--source/include/platform/acwin.h26
-rw-r--r--source/include/platform/acwin64.h24
-rw-r--r--source/os_specific/service_layers/oslinuxtbl.c93
-rw-r--r--source/tools/acpidump/apfiles.c2
-rw-r--r--source/tools/acpidump/apmain.c2
-rw-r--r--source/tools/acpihelp/ahaslkey.c1
-rw-r--r--source/tools/efihello/efihello.c2
-rw-r--r--tests/misc/grammar.asl2
88 files changed, 1978 insertions, 577 deletions
diff --git a/changes.txt b/changes.txt
index f7eee1d568f0..d0fe928c1acb 100644
--- a/changes.txt
+++ b/changes.txt
@@ -1,4 +1,86 @@
----------------------------------------
+28 July 2017. Summary of changes for version 20170728:
+
+
+1) ACPICA kernel-resident subsystem:
+
+Fixed a regression seen with small resource descriptors that could cause
+an inadvertent AE_AML_NO_RESOURCE_END_TAG exception.
+
+AML interpreter: Implemented a new feature that allows forward references
+from individual named references within package objects that are
+contained within blocks of "module-level code". This provides
+compatibility with other ACPI implementations and supports existing
+firmware that depends on this feature. Example:
+
+ Name (ABCD, 1)
+ If (ABCD) /* An If() at module-level */
+ {
+ Name (PKG1, Package()
+ {
+ INT1 /* Forward reference to object INT1
+*/
+ })
+ Name (INT1, 0x1234)
+ }
+
+AML Interpreter: Fixed a problem with the Alias() operator where aliases
+to some ASL objects were not handled properly. Objects affected are:
+Mutex, Event, and OperationRegion.
+
+AML Debugger: Enhanced to properly handle AML Alias objects. These
+objects have one level of indirection which was not fully supported by
+the debugger.
+
+Table Manager: Added support to detect and ignore duplicate SSDTs within
+the XSDT/RSDT. This error in the XSDT has been seen in the field.
+
+EFI and EDK2 support:
+ Enabled /WX flag for MSVC builds
+ Added support for AcpiOsStall, AcpiOsSleep, and AcpiOsGetTimer
+ Added local support for 64-bit multiply and shift operations
+ Added support to compile acpidump.efi on Windows
+ Added OSL function stubs for interfaces not used under EFI
+
+Added additional support for the _DMA predefined name. _DMA returns a
+buffer containing a resource template. This change add support within the
+resource manager (AcpiWalkResourceBuffer) to walk and parse this list of
+resource descriptors. Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+iASL: Fixed a problem where the internal input line buffer(s) could
+overflow if there are very long lines in the input ASL source code file.
+Implemented buffer management that automatically increases the size of
+the buffers as necessary.
+
+iASL: Added an option (-vx) to "expect" particular remarks, warnings and
+errors. If the specified exception is not raised during compilation, the
+compiler emits an error. This is intended to support the ASL test suite,
+but may be useful in other contexts.
+
+iASL: Implemented a new predefined macro, __METHOD__, which returns a
+string containing the name of the current control method that is being
+compiled.
+
+iASL: Implemented debugger and table compiler support for the SDEI ACPI
+table (Software Delegated Exception Interface). James Morse
+<james.morse@arm.com>
+
+Unix/Linux makefiles: Added an option to disable compile optimizations.
+The disable occurs when the NOOPT flag is set to TRUE.
+theracermaster@gmail.com
+
+Acpidump: Added support for multiple DSDT and FACS tables. This can occur
+when there are different tables for 32-bit versus 64-bit.
+
+Enhanced error reporting for the ASL test suite (ASLTS) by removing
+unnecessary/verbose text, and emit the actual line number where an error
+has occurred. These changes are intended to improve the usefulness of the
+test suite.
+
+----------------------------------------
29 June 2017. Summary of changes for version 20170629:
diff --git a/generate/unix/Makefile.config b/generate/unix/Makefile.config
index 4d4f1829340b..9707be32d23c 100644
--- a/generate/unix/Makefile.config
+++ b/generate/unix/Makefile.config
@@ -43,7 +43,7 @@ CC = gcc
OBJDIR = obj
BINDIR = bin
COMPILEOBJ = $(CC) -c $(CFLAGS) $(OPT_CFLAGS) -o $@ $<
-LINKPROG = $(CC) $(OBJECTS) -o $(PROG) $(LDFLAGS)
+LINKPROG = $(CC) $(OBJECTS) -o $(PROG) $(LDFLAGS) $(OPT_LDFLAGS)
PREFIX ?= /usr
INSTALLDIR = $(PREFIX)/bin
UNAME_S := $(shell uname -s)
@@ -162,6 +162,8 @@ endif
#
ifneq ($(NOOPT),TRUE)
OPT_CFLAGS += -O2
+else
+OPT_CFLAGS += -O0
endif
#
@@ -176,14 +178,14 @@ CFLAGS += \
-D$(HOST)\
-D_GNU_SOURCE\
-I$(ACPICA_INCLUDE)
-
+
#
# QNX requires __EXT to enable most functions in its C library, analogous
# to _GNU_SOURCE.
#
ifeq ($(HOST), _QNX)
CFLAGS+=-D__EXT
-endif
+endif
#
# Common compiler warning flags. The warning flags in addition
diff --git a/generate/unix/acpiexamples/Makefile b/generate/unix/acpiexamples/Makefile
index 691b65b77d4a..6aa2ba94e692 100644
--- a/generate/unix/acpiexamples/Makefile
+++ b/generate/unix/acpiexamples/Makefile
@@ -47,6 +47,7 @@ OBJECTS = \
$(OBJDIR)/dsmthdat.o\
$(OBJDIR)/dsobject.o\
$(OBJDIR)/dsopcode.o\
+ $(OBJDIR)/dspkginit.o\
$(OBJDIR)/dsutils.o\
$(OBJDIR)/dswexec.o\
$(OBJDIR)/dswload.o\
diff --git a/generate/unix/acpiexec/Makefile b/generate/unix/acpiexec/Makefile
index 9ed3f5fb7d86..fcb638b40ad3 100644
--- a/generate/unix/acpiexec/Makefile
+++ b/generate/unix/acpiexec/Makefile
@@ -85,6 +85,7 @@ OBJECTS = \
$(OBJDIR)/dsmthdat.o\
$(OBJDIR)/dsobject.o\
$(OBJDIR)/dsopcode.o\
+ $(OBJDIR)/dspkginit.o\
$(OBJDIR)/dsutils.o\
$(OBJDIR)/dswexec.o\
$(OBJDIR)/dswload.o\
diff --git a/generate/unix/acpinames/Makefile b/generate/unix/acpinames/Makefile
index fd263a01a7a9..7bc69e86e52e 100644
--- a/generate/unix/acpinames/Makefile
+++ b/generate/unix/acpinames/Makefile
@@ -43,6 +43,7 @@ OBJECTS = \
$(OBJDIR)/dsinit.o\
$(OBJDIR)/dsmthdat.o\
$(OBJDIR)/dsobject.o\
+ $(OBJDIR)/dspkginit.o\
$(OBJDIR)/dsutils.o\
$(OBJDIR)/dswload.o\
$(OBJDIR)/dswload2.o\
diff --git a/generate/unix/iasl/Makefile b/generate/unix/iasl/Makefile
index 1487b4e011dd..b3025724cc95 100644
--- a/generate/unix/iasl/Makefile
+++ b/generate/unix/iasl/Makefile
@@ -134,6 +134,7 @@ OBJECTS = \
$(OBJDIR)/dsfield.o\
$(OBJDIR)/dsobject.o\
$(OBJDIR)/dsopcode.o\
+ $(OBJDIR)/dspkginit.o\
$(OBJDIR)/dsutils.o\
$(OBJDIR)/dswexec.o\
$(OBJDIR)/dswload.o\
diff --git a/source/common/ahtable.c b/source/common/ahtable.c
index 38c1ea20e72c..7aee3c669be8 100644
--- a/source/common/ahtable.c
+++ b/source/common/ahtable.c
@@ -239,6 +239,7 @@ const AH_TABLE Gbl_AcpiSupportedTables[] =
{ACPI_SIG_RSDT, "Root System Description Table"},
{ACPI_SIG_S3PT, "S3 Performance Table"},
{ACPI_SIG_SBST, "Smart Battery Specification Table"},
+ {ACPI_SIG_SDEI, "Software Delegated Exception Interface Table"},
{ACPI_SIG_SLIC, "Software Licensing Description Table"},
{ACPI_SIG_SLIT, "System Locality Information Table"},
{ACPI_SIG_SPCR, "Serial Port Console Redirection table"},
diff --git a/source/common/dmtable.c b/source/common/dmtable.c
index b85bb0c3aa75..38248c2c4536 100644
--- a/source/common/dmtable.c
+++ b/source/common/dmtable.c
@@ -493,6 +493,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] =
{ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt},
{ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt},
{ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst},
+ {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei},
{ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic},
{ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit},
{ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr},
diff --git a/source/common/dmtbinfo.c b/source/common/dmtbinfo.c
index 56dd5539f5ea..4b902b9647fb 100644
--- a/source/common/dmtbinfo.c
+++ b/source/common/dmtbinfo.c
@@ -218,6 +218,7 @@
#define ACPI_RASF_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_RASF,f)
#define ACPI_S3PT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_S3PT,f)
#define ACPI_SBST_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SBST,f)
+#define ACPI_SDEI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEI,f)
#define ACPI_SLIT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIT,f)
#define ACPI_SPCR_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SPCR,f)
#define ACPI_SPMI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SPMI,f)
@@ -2767,6 +2768,16 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPmtt2[] =
ACPI_DMT_TERMINATOR
};
+/*******************************************************************************
+ *
+ * SDEI - Software Delegated Execption Interface Descriptor Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSdei[] =
+{
+ ACPI_DMT_TERMINATOR
+};
/*******************************************************************************
*
diff --git a/source/compiler/aslcompile.c b/source/compiler/aslcompile.c
index 181fc364c745..385684401392 100644
--- a/source/compiler/aslcompile.c
+++ b/source/compiler/aslcompile.c
@@ -815,6 +815,7 @@ CmCleanupAndExit (
BOOLEAN DeleteAmlFile = FALSE;
+ AslCheckExpectedExceptions ();
AePrintErrorLog (ASL_FILE_STDERR);
if (Gbl_DebugFlag)
{
diff --git a/source/compiler/aslcompiler.h b/source/compiler/aslcompiler.h
index c3794246ec94..fdf4dbf7de52 100644
--- a/source/compiler/aslcompiler.h
+++ b/source/compiler/aslcompiler.h
@@ -413,12 +413,20 @@ AslError (
ACPI_PARSE_OBJECT *Op,
char *ExtraMessage);
+void
+AslCheckExpectedExceptions (
+ void);
+
+ACPI_STATUS
+AslExpectException (
+ char *MessageIdString);
+
ACPI_STATUS
AslDisableException (
char *MessageIdString);
BOOLEAN
-AslIsExceptionDisabled (
+AslIsExceptionIgnored (
UINT8 Level,
UINT16 MessageId);
diff --git a/source/compiler/aslcompiler.l b/source/compiler/aslcompiler.l
index 4b36058b6ea7..b49233be7f14 100644
--- a/source/compiler/aslcompiler.l
+++ b/source/compiler/aslcompiler.l
@@ -809,7 +809,7 @@ NamePathTail [.]{NameSeg}
"__FILE__" { count (0); return (PARSEOP___FILE__); }
"__LINE__" { count (0); return (PARSEOP___LINE__); }
"__PATH__" { count (0); return (PARSEOP___PATH__); }
-
+"__METHOD__" { count (0); return (PARSEOP___METHOD__); }
{NameSeg} { char *s;
count (0);
diff --git a/source/compiler/aslerror.c b/source/compiler/aslerror.c
index b6f7ee7dd9c2..ec91ca3e7d06 100644
--- a/source/compiler/aslerror.c
+++ b/source/compiler/aslerror.c
@@ -160,6 +160,16 @@ static void
AeAddToErrorLog (
ASL_ERROR_MSG *Enode);
+static BOOLEAN
+AslIsExceptionExpected (
+ UINT8 Level,
+ UINT16 MessageId);
+
+static BOOLEAN
+AslIsExceptionDisabled (
+ UINT8 Level,
+ UINT16 MessageId);
+
/*******************************************************************************
*
@@ -806,6 +816,115 @@ AslCommonError (
return;
}
+/*******************************************************************************
+ *
+ * FUNCTION: AslIsExceptionIgnored
+ *
+ * PARAMETERS: Level - Seriousness (Warning/error, etc.)
+ * MessageId - Index into global message buffer
+ *
+ * RETURN: BOOLEAN
+ *
+ * DESCRIPTION: Check if a particular exception is ignored. In this case it
+ * means that the exception is (expected or disabled.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AslIsExceptionIgnored (
+ UINT8 Level,
+ UINT16 MessageId)
+{
+ BOOLEAN ExceptionIgnored;
+
+
+ /* Note: this allows exception to be disabled and expected */
+
+ ExceptionIgnored = AslIsExceptionDisabled (Level, MessageId);
+ ExceptionIgnored |= AslIsExceptionExpected (Level, MessageId);
+
+ return (Gbl_AllExceptionsDisabled || ExceptionIgnored);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslCheckExpectException
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Check the global expected messages table and raise an error
+ * for each message that has not been received.
+ *
+ ******************************************************************************/
+
+void
+AslCheckExpectedExceptions (
+ void)
+{
+ UINT8 i;
+
+ for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i)
+ {
+ if (!Gbl_ExpectedMessages[i].MessageReceived)
+ {
+ AslError (ASL_ERROR, ASL_MSG_EXCEPTION_NOT_RECEIVED, NULL,
+ Gbl_ExpectedMessages[i].MessageIdStr);
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslExpectException
+ *
+ * PARAMETERS: MessageIdString - ID of excepted exception during compile
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enter a message ID into the global expected messages table
+ * If these messages are not raised during the compilation, throw
+ * an error.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AslExpectException (
+ 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 (Gbl_ExpectedMessagesIndex >= ASL_MAX_EXPECTED_MESSAGES)
+ {
+ printf ("Too many messages have been registered as expected (max %u)\n",
+ ASL_MAX_DISABLED_MESSAGES);
+ return (AE_LIMIT);
+ }
+
+ Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageId = MessageId;
+ Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageIdStr = MessageIdString;
+ Gbl_ExpectedMessages[Gbl_ExpectedMessagesIndex].MessageReceived = FALSE;
+ Gbl_ExpectedMessagesIndex++;
+ return (AE_OK);
+}
+
/*******************************************************************************
*
@@ -866,7 +985,48 @@ AslDisableException (
*
******************************************************************************/
-BOOLEAN
+static BOOLEAN
+AslIsExceptionExpected (
+ UINT8 Level,
+ UINT16 MessageId)
+{
+ UINT32 EncodedMessageId;
+ UINT32 i;
+
+
+ /*
+ * Mark this exception as received
+ */
+ EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
+ for (i = 0; i < Gbl_ExpectedMessagesIndex; i++)
+ {
+ /* Simple implementation via fixed array */
+
+ if (EncodedMessageId == Gbl_ExpectedMessages[i].MessageId)
+ {
+ return (Gbl_ExpectedMessages[i].MessageReceived = TRUE);
+ }
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslIsExceptionDisabled
+ *
+ * PARAMETERS: Level - Seriousness (Warning/error, etc.)
+ * MessageId - Index into global message buffer
+ *
+ * RETURN: TRUE if exception/message should be ignored
+ *
+ * DESCRIPTION: Check if the user has specified options such that this
+ * exception should be ignored
+ *
+ ******************************************************************************/
+
+static BOOLEAN
AslIsExceptionDisabled (
UINT8 Level,
UINT16 MessageId)
@@ -940,8 +1100,7 @@ AslError (
/* Check if user wants to ignore this exception */
- if (Gbl_AllExceptionsDisabled ||
- AslIsExceptionDisabled (Level, MessageId))
+ if (AslIsExceptionIgnored (Level, MessageId))
{
return;
}
diff --git a/source/compiler/aslglobal.h b/source/compiler/aslglobal.h
index 0c58041ffb18..169b25e745ec 100644
--- a/source/compiler/aslglobal.h
+++ b/source/compiler/aslglobal.h
@@ -252,6 +252,7 @@ extern int AslCompilerdebug;
#define ASL_DEFAULT_LINE_BUFFER_SIZE (1024 * 32) /* 32K */
#define ASL_MSG_BUFFER_SIZE (1024 * 32) /* 32k */
#define ASL_MAX_DISABLED_MESSAGES 32
+#define ASL_MAX_EXPECTED_MESSAGES 32
#define HEX_TABLE_LINE_SIZE 8
#define HEX_LISTING_LINE_SIZE 8
@@ -396,6 +397,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentHexColumn, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentAmlOffset, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentLine, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_DisabledMessagesIndex, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_ExpectedMessagesIndex, 0);
ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_HexBytesWereWritten, FALSE);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_NumNamespaceObjects, 0);
ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_ReservedMethods, 0);
@@ -438,6 +440,7 @@ ASL_EXTERN char MsgBuffer[ASL_MSG_BUFFER_SIZE];
ASL_EXTERN char StringBuffer[ASL_MSG_BUFFER_SIZE];
ASL_EXTERN char StringBuffer2[ASL_MSG_BUFFER_SIZE];
ASL_EXTERN UINT32 Gbl_DisabledMessages[ASL_MAX_DISABLED_MESSAGES];
+ASL_EXTERN ASL_EXPECTED_MESSAGE Gbl_ExpectedMessages[ASL_MAX_EXPECTED_MESSAGES];
#endif /* __ASLGLOBAL_H */
diff --git a/source/compiler/aslhelp.c b/source/compiler/aslhelp.c
index 2b0dc7632e83..18eab858c213 100644
--- a/source/compiler/aslhelp.c
+++ b/source/compiler/aslhelp.c
@@ -205,6 +205,7 @@ Usage (
ACPI_OPTION ("-vi", "Less verbose errors and warnings for use with IDEs");
ACPI_OPTION ("-vr", "Disable remarks");
ACPI_OPTION ("-vw <messageid>", "Disable specific warning or remark");
+ 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");
diff --git a/source/compiler/aslmessages.c b/source/compiler/aslmessages.c
index eb3d23dd9dfa..b87d54991f7b 100644
--- a/source/compiler/aslmessages.c
+++ b/source/compiler/aslmessages.c
@@ -348,7 +348,8 @@ const char *AslCompilerMsgs [] =
/* ASL_MSG_ARG_AS_LOCAL_NOT_USED */ "Method Argument (as a local) is set but never used",
/* ASL_MSG_ARG_NOT_USED */ "Method Argument is never used",
/* ASL_MSG_CONSTANT_REQUIRED */ "Non-reducible expression",
-/* ASL_MSG_CROSS_TABLE_SCOPE */ "Illegal open scope on external object from within DSDT"
+/* ASL_MSG_CROSS_TABLE_SCOPE */ "Illegal open scope on external object from within DSDT",
+/* ASL_MSG_EXCEPTION_NOT_RECEIVED */ "Expected remark, warning, or error did not occur. Message ID:"
};
/* Table compiler */
diff --git a/source/compiler/aslmessages.h b/source/compiler/aslmessages.h
index 86fb16317d1b..68216e5c0756 100644
--- a/source/compiler/aslmessages.h
+++ b/source/compiler/aslmessages.h
@@ -351,6 +351,7 @@ typedef enum
ASL_MSG_ARG_NOT_USED,
ASL_MSG_CONSTANT_REQUIRED,
ASL_MSG_CROSS_TABLE_SCOPE,
+ ASL_MSG_EXCEPTION_NOT_RECEIVED,
/* These messages are used by the Data Table compiler only */
diff --git a/source/compiler/asloptions.c b/source/compiler/asloptions.c
index 2dcd49402e04..6d39f6d25492 100644
--- a/source/compiler/asloptions.c
+++ b/source/compiler/asloptions.c
@@ -954,6 +954,22 @@ AslDoOptions (
}
break;
+ case 'x':
+
+ /* Get the required argument */
+
+ if (AcpiGetoptArgument (argc, argv))
+ {
+ return (-1);
+ }
+
+ Status = AslExpectException (AcpiGbl_Optarg);
+ if (ACPI_FAILURE (Status))
+ {
+ return (-1);
+ }
+ break;
+
default:
printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
diff --git a/source/compiler/aslparseop.c b/source/compiler/aslparseop.c
index 4e6e5a16276c..41badcee5211 100644
--- a/source/compiler/aslparseop.c
+++ b/source/compiler/aslparseop.c
@@ -685,10 +685,10 @@ TrCreateNullTargetOp (
* DESCRIPTION: Create a leaf op (no children or peers) for one of the
* special constants - __LINE__, __FILE__, and __DATE__.
*
- * Note: An implemenation of __FUNC__ cannot happen here because we don't
- * have a full parse tree at this time and cannot find the parent control
- * method. If it is ever needed, __FUNC__ must be implemented later, after
- * the parse tree has been fully constructed.
+ * Note: The fullimplemenation of __METHOD__ cannot happen here because we
+ * don't have a full parse tree at this time and cannot find the parent
+ * control method. __METHOD__ must be implemented later, after the parse
+ * tree has been fully constructed.
*
******************************************************************************/
@@ -711,6 +711,14 @@ TrCreateConstantLeafOp (
Op->Asl.Value.Integer = Op->Asl.LineNumber;
break;
+ case PARSEOP___METHOD__:
+
+ /* Will become a string literal later */
+
+ Op = TrAllocateOp (PARSEOP___METHOD__);
+ Op->Asl.Value.String = NULL;
+ break;
+
case PARSEOP___PATH__:
Op = TrAllocateOp (PARSEOP_STRING_LITERAL);
diff --git a/source/compiler/aslrules.y b/source/compiler/aslrules.y
index eb7850697b41..f26ea874b3ab 100644
--- a/source/compiler/aslrules.y
+++ b/source/compiler/aslrules.y
@@ -592,6 +592,7 @@ ConstExprTerm
| PARSEOP___FILE__ {$$ = TrCreateConstantLeafOp (PARSEOP___FILE__);}
| PARSEOP___LINE__ {$$ = TrCreateConstantLeafOp (PARSEOP___LINE__);}
| PARSEOP___PATH__ {$$ = TrCreateConstantLeafOp (PARSEOP___PATH__);}
+ | PARSEOP___METHOD__ {$$ = TrCreateConstantLeafOp (PARSEOP___METHOD__);}
;
Integer
diff --git a/source/compiler/asltokens.y b/source/compiler/asltokens.y
index e6e9006d0475..38c55c186bbd 100644
--- a/source/compiler/asltokens.y
+++ b/source/compiler/asltokens.y
@@ -637,3 +637,4 @@ NoEcho('
%token <i> PARSEOP___FILE__
%token <i> PARSEOP___LINE__
%token <i> PARSEOP___PATH__
+%token <i> PARSEOP___METHOD__
diff --git a/source/compiler/asltransform.c b/source/compiler/asltransform.c
index d3ed53a14dcd..daaca947ff45 100644
--- a/source/compiler/asltransform.c
+++ b/source/compiler/asltransform.c
@@ -430,6 +430,8 @@ static void
TrTransformSubtree (
ACPI_PARSE_OBJECT *Op)
{
+ ACPI_PARSE_OBJECT *MethodOp;
+
if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
{
@@ -465,6 +467,35 @@ TrTransformSubtree (
break;
+ case PARSEOP___METHOD__:
+
+ /* Transform to a string op containing the parent method name */
+
+ Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
+ UtSetParseOpName (Op);
+
+ /* Find the parent control method op */
+
+ MethodOp = Op;
+ while (MethodOp)
+ {
+ if (MethodOp->Asl.ParseOpcode == PARSEOP_METHOD)
+ {
+ /* First child contains the method name */
+
+ MethodOp = MethodOp->Asl.Child;
+ Op->Asl.Value.String = MethodOp->Asl.Value.String;
+ return;
+ }
+
+ MethodOp = MethodOp->Asl.Parent;
+ }
+
+ /* At the root, invocation not within a control method */
+
+ Op->Asl.Value.String = "\\";
+ break;
+
default:
/* Nothing to do here for other opcodes */
diff --git a/source/compiler/asltypes.h b/source/compiler/asltypes.h
index 4c2a27729fd1..e4250871fd12 100644
--- a/source/compiler/asltypes.h
+++ b/source/compiler/asltypes.h
@@ -355,6 +355,15 @@ typedef struct asl_error_msg
} ASL_ERROR_MSG;
+/* An entry in the expected messages array */
+typedef struct asl_expected_message
+{
+ UINT32 MessageId;
+ char *MessageIdStr;
+ BOOLEAN MessageReceived;
+
+} ASL_EXPECTED_MESSAGE;
+
/* An entry in the listing file stack (for include files) */
diff --git a/source/compiler/aslutils.c b/source/compiler/aslutils.c
index fd91baeb20e5..c5ff42c0156c 100644
--- a/source/compiler/aslutils.c
+++ b/source/compiler/aslutils.c
@@ -174,6 +174,12 @@ UtAttachNameseg (
ACPI_PARSE_OBJECT *Op,
char *Name);
+static void
+UtReallocLineBuffers (
+ char **Buffer,
+ UINT32 OldSize,
+ UINT32 NewSize);
+
/*******************************************************************************
*
@@ -733,43 +739,48 @@ UtExpandLineBuffers (
Gbl_LineBufferSize, NewSize);
}
- Gbl_CurrentLineBuffer = realloc (Gbl_CurrentLineBuffer, NewSize);
+ UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize);
+ UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize);
+ UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize);
+ UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize);
+
Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
- if (!Gbl_CurrentLineBuffer)
- {
- goto ErrorExit;
- }
+ Gbl_LineBufferSize = NewSize;
+}
- Gbl_MainTokenBuffer = realloc (Gbl_MainTokenBuffer, NewSize);
- if (!Gbl_MainTokenBuffer)
- {
- goto ErrorExit;
- }
- Gbl_MacroTokenBuffer = realloc (Gbl_MacroTokenBuffer, NewSize);
- if (!Gbl_MacroTokenBuffer)
- {
- goto ErrorExit;
- }
+/******************************************************************************
+ *
+ * FUNCTION: UtReallocLineBuffers
+ *
+ * PARAMETERS: Buffer - Buffer to realloc
+ * OldSize - Old size of Buffer
+ * NewSize - New size of Buffer
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Reallocate and initialize Buffer
+ *
+ *****************************************************************************/
+
+static void
+UtReallocLineBuffers (
+ char **Buffer,
+ UINT32 OldSize,
+ UINT32 NewSize)
+{
- Gbl_ExpressionTokenBuffer = realloc (Gbl_ExpressionTokenBuffer, NewSize);
- if (!Gbl_ExpressionTokenBuffer)
+ *Buffer = realloc (*Buffer, NewSize);
+ if (*Buffer)
{
- goto ErrorExit;
+ memset (*Buffer + OldSize, 0, NewSize - OldSize);
+ return;
}
- Gbl_LineBufferSize = NewSize;
- return;
-
-
- /* On error above, simply issue error messages and abort, cannot continue */
-
-ErrorExit:
printf ("Could not increase line buffer size from %u to %u\n",
- Gbl_LineBufferSize, Gbl_LineBufferSize * 2);
+ OldSize, NewSize);
- AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION,
- NULL, NULL);
+ AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL);
AslAbort ();
}
diff --git a/source/compiler/dtcompile.c b/source/compiler/dtcompile.c
index 45274168c543..e74fed517315 100644
--- a/source/compiler/dtcompile.c
+++ b/source/compiler/dtcompile.c
@@ -486,18 +486,21 @@ DtCompileDataTable (
}
else if (TableData->TableInfo)
{
- /* Simple table, just walk the info table */
+ /* Simple table, just walk the info table, unless its empty */
- Subtable = NULL;
- Status = DtCompileTable (FieldList, TableData->TableInfo,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
+ if (FieldList && *FieldList)
{
- return (Status);
- }
+ Subtable = NULL;
+ Status = DtCompileTable (FieldList, TableData->TableInfo,
+ &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
- DtInsertSubtable (Gbl_RootTable, Subtable);
- DtPopSubtable ();
+ DtInsertSubtable (Gbl_RootTable, Subtable);
+ DtPopSubtable ();
+ }
}
else
{
diff --git a/source/compiler/dtcompiler.h b/source/compiler/dtcompiler.h
index 61b40b4a93ef..1e81c5800c5c 100644
--- a/source/compiler/dtcompiler.h
+++ b/source/compiler/dtcompiler.h
@@ -726,6 +726,7 @@ extern const unsigned char TemplateRasf[];
extern const unsigned char TemplateRsdt[];
extern const unsigned char TemplateS3pt[];
extern const unsigned char TemplateSbst[];
+extern const unsigned char TemplateSdei[];
extern const unsigned char TemplateSlic[];
extern const unsigned char TemplateSlit[];
extern const unsigned char TemplateSpcr[];
diff --git a/source/compiler/dttemplate.h b/source/compiler/dttemplate.h
index bb4dded4e634..8d27359d9ad0 100644
--- a/source/compiler/dttemplate.h
+++ b/source/compiler/dttemplate.h
@@ -1178,6 +1178,15 @@ const unsigned char TemplateSbst[] =
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /* 00000028 "........" */
};
+const unsigned char TemplateSdei[] =
+{
+ 0x53,0x44,0x45,0x49,0x3e,0x00,0x00,0x00, /* 00000000 "SDEI>..." */
+ 0x01,0x59,0x41,0x52,0x4d,0x20,0x20,0x20, /* 00000008 ".mARM " */
+ 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */
+ 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
+ 0x30,0x09,0x16,0x20 /* 00000028 "0.. " */
+};
+
const unsigned char TemplateSlic[] =
{
0x53,0x4C,0x49,0x43,0x76,0x01,0x00,0x00, /* 00000000 "SLICv..." */
diff --git a/source/compiler/dtutils.c b/source/compiler/dtutils.c
index 8807217510b8..6edcf637c3fd 100644
--- a/source/compiler/dtutils.c
+++ b/source/compiler/dtutils.c
@@ -190,7 +190,7 @@ DtError (
/* Check if user wants to ignore this exception */
- if (AslIsExceptionDisabled (Level, MessageId))
+ if (AslIsExceptionIgnored (Level, MessageId))
{
return;
}
diff --git a/source/compiler/prmacros.c b/source/compiler/prmacros.c
index 55aab4668124..675d4522cb93 100644
--- a/source/compiler/prmacros.c
+++ b/source/compiler/prmacros.c
@@ -483,7 +483,7 @@ PrAddMacro (
{
/* Search the macro arg list for matching arg */
- for (i = 0; Args[i].Name && (i < PR_MAX_MACRO_ARGS); i++)
+ for (i = 0; ((i < PR_MAX_MACRO_ARGS) && Args[i].Name); i++)
{
/*
* Save argument offset within macro body. This is the mechanism
diff --git a/source/components/debugger/dbdisply.c b/source/components/debugger/dbdisply.c
index 2c5ef74a4796..751989519d5f 100644
--- a/source/components/debugger/dbdisply.c
+++ b/source/components/debugger/dbdisply.c
@@ -451,7 +451,7 @@ DumpNode:
else
{
- AcpiOsPrintf ("Object (%p) Pathname: %s\n",
+ AcpiOsPrintf ("Object %p: Namespace Node - Pathname: %s\n",
Node, (char *) RetBuf.Pointer);
}
@@ -468,7 +468,7 @@ DumpNode:
ObjDesc = AcpiNsGetAttachedObject (Node);
if (ObjDesc)
{
- AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc);
+ AcpiOsPrintf ("\nAttached Object %p:", ObjDesc);
if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)))
{
AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n",
@@ -476,8 +476,33 @@ DumpNode:
return;
}
- AcpiUtDebugDumpBuffer ((void *) ObjDesc,
- sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
+ if (ACPI_GET_DESCRIPTOR_TYPE (
+ ((ACPI_NAMESPACE_NODE *) ObjDesc)) == ACPI_DESC_TYPE_NAMED)
+ {
+ AcpiOsPrintf (" Namespace Node - ");
+ Status = AcpiGetName ((ACPI_NAMESPACE_NODE *) ObjDesc,
+ ACPI_FULL_PATHNAME_NO_TRAILING, &RetBuf);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not convert name to pathname\n");
+ }
+ else
+ {
+ AcpiOsPrintf ("Pathname: %s",
+ (char *) RetBuf.Pointer);
+ }
+
+ AcpiOsPrintf ("\n");
+ AcpiUtDebugDumpBuffer ((void *) ObjDesc,
+ sizeof (ACPI_NAMESPACE_NODE), Display, ACPI_UINT32_MAX);
+ }
+ else
+ {
+ AcpiOsPrintf ("\n");
+ AcpiUtDebugDumpBuffer ((void *) ObjDesc,
+ sizeof (ACPI_OPERAND_OBJECT), Display, ACPI_UINT32_MAX);
+ }
+
AcpiExDumpObjectDescriptor (ObjDesc, 1);
}
}
diff --git a/source/components/dispatcher/dsfield.c b/source/components/dispatcher/dsfield.c
index bfa45b3e84b5..fe9d0605e58f 100644
--- a/source/components/dispatcher/dsfield.c
+++ b/source/components/dispatcher/dsfield.c
@@ -313,6 +313,8 @@ AcpiDsCreateBufferField (
if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
{
+ ACPI_ERROR ((AE_INFO,
+ "Parse execute mode is not set"));
return_ACPI_STATUS (AE_AML_INTERNAL);
}
@@ -701,6 +703,8 @@ AcpiDsInitFieldObjects (
return_ACPI_STATUS (AE_OK);
}
+ ACPI_ERROR ((AE_INFO,
+ "Parse deferred mode is not set"));
return_ACPI_STATUS (AE_AML_INTERNAL);
}
diff --git a/source/components/dispatcher/dsobject.c b/source/components/dispatcher/dsobject.c
index 5be9c8fdd90f..4cbd8f78877d 100644
--- a/source/components/dispatcher/dsobject.c
+++ b/source/components/dispatcher/dsobject.c
@@ -160,14 +160,6 @@
#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME ("dsobject")
-/* Local prototypes */
-
-static ACPI_STATUS
-AcpiDsBuildInternalObject (
- ACPI_WALK_STATE *WalkState,
- ACPI_PARSE_OBJECT *Op,
- ACPI_OPERAND_OBJECT **ObjDescPtr);
-
#ifndef ACPI_NO_METHOD_EXECUTION
/*******************************************************************************
@@ -185,7 +177,7 @@ AcpiDsBuildInternalObject (
*
******************************************************************************/
-static ACPI_STATUS
+ACPI_STATUS
AcpiDsBuildInternalObject (
ACPI_WALK_STATE *WalkState,
ACPI_PARSE_OBJECT *Op,
@@ -193,7 +185,6 @@ AcpiDsBuildInternalObject (
{
ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_STATUS Status;
- ACPI_OBJECT_TYPE Type;
ACPI_FUNCTION_TRACE (DsBuildInternalObject);
@@ -204,129 +195,43 @@ AcpiDsBuildInternalObject (
{
/*
* This is a named object reference. If this name was
- * previously looked up in the namespace, it was stored in this op.
- * Otherwise, go ahead and look it up now
+ * previously looked up in the namespace, it was stored in
+ * this op. Otherwise, go ahead and look it up now
*/
if (!Op->Common.Node)
{
- Status = AcpiNsLookup (WalkState->ScopeInfo,
- Op->Common.Value.String,
- ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
- ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
- ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
- if (ACPI_FAILURE (Status))
- {
- /* Check if we are resolving a named reference within a package */
-
- if ((Status == AE_NOT_FOUND) && (AcpiGbl_EnableInterpreterSlack) &&
-
- ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
- (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP)))
- {
- /*
- * We didn't find the target and we are populating elements
- * of a package - ignore if slack enabled. Some ASL code
- * contains dangling invalid references in packages and
- * expects that no exception will be issued. Leave the
- * element as a null element. It cannot be used, but it
- * can be overwritten by subsequent ASL code - this is
- * typically the case.
- */
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
- "Ignoring unresolved reference in package [%4.4s]\n",
- WalkState->ScopeInfo->Scope.Node->Name.Ascii));
-
- return_ACPI_STATUS (AE_OK);
- }
- else
- {
- ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
- }
-
- return_ACPI_STATUS (Status);
- }
- }
-
- /* Special object resolution for elements of a package */
-
- if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
- (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
- {
- /*
- * Attempt to resolve the node to a value before we insert it into
- * the package. If this is a reference to a common data type,
- * resolve it immediately. According to the ACPI spec, package
- * elements can only be "data objects" or method references.
- * Attempt to resolve to an Integer, Buffer, String or Package.
- * If cannot, return the named reference (for things like Devices,
- * Methods, etc.) Buffer Fields and Fields will resolve to simple
- * objects (int/buf/str/pkg).
- *
- * NOTE: References to things like Devices, Methods, Mutexes, etc.
- * will remain as named references. This behavior is not described
- * in the ACPI spec, but it appears to be an oversight.
- */
- ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Op->Common.Node);
-
- Status = AcpiExResolveNodeToValue (
- ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc),
- WalkState);
- if (ACPI_FAILURE (Status))
- {
- return_ACPI_STATUS (Status);
- }
+ /* Check if we are resolving a named reference within a package */
- /*
- * Special handling for Alias objects. We need to setup the type
- * and the Op->Common.Node to point to the Alias target. Note,
- * Alias has at most one level of indirection internally.
- */
- Type = Op->Common.Node->Type;
- if (Type == ACPI_TYPE_LOCAL_ALIAS)
+ if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
{
- Type = ObjDesc->Common.Type;
- Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
- Op->Common.Node->Object);
- }
-
- switch (Type)
- {
- /*
- * For these types, we need the actual node, not the subobject.
- * However, the subobject did not get an extra reference count above.
- *
- * TBD: should ExResolveNodeToValue be changed to fix this?
- */
- case ACPI_TYPE_DEVICE:
- case ACPI_TYPE_THERMAL:
-
- AcpiUtAddReference (Op->Common.Node->Object);
-
- /*lint -fallthrough */
- /*
- * For these types, we need the actual node, not the subobject.
- * The subobject got an extra reference count in ExResolveNodeToValue.
- */
- case ACPI_TYPE_MUTEX:
- case ACPI_TYPE_METHOD:
- case ACPI_TYPE_POWER:
- case ACPI_TYPE_PROCESSOR:
- case ACPI_TYPE_EVENT:
- case ACPI_TYPE_REGION:
-
- /* We will create a reference object for these types below */
- break;
-
- default:
/*
- * All other types - the node was resolved to an actual
- * object, we are done.
+ * We won't resolve package elements here, we will do this
+ * after all ACPI tables are loaded into the namespace. This
+ * behavior supports both forward references to named objects
+ * and external references to objects in other tables.
*/
- goto Exit;
+ goto CreateNewObject;
+ }
+ else
+ {
+ Status = AcpiNsLookup (WalkState->ScopeInfo,
+ Op->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
+ ACPI_CAST_INDIRECT_PTR (
+ ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
+ return_ACPI_STATUS (Status);
+ }
}
}
}
+CreateNewObject:
+
/* Create and init a new internal ACPI object */
ObjDesc = AcpiUtCreateInternalObject (
@@ -344,7 +249,28 @@ AcpiDsBuildInternalObject (
return_ACPI_STATUS (Status);
}
-Exit:
+ /*
+ * Handling for unresolved package reference elements.
+ * These are elements that are namepaths.
+ */
+ if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
+ {
+ ObjDesc->Reference.Resolved = TRUE;
+
+ if ((Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+ !ObjDesc->Reference.Node)
+ {
+ /*
+ * Name was unresolved above.
+ * Get the prefix node for later lookup
+ */
+ ObjDesc->Reference.Node = WalkState->ScopeInfo->Scope.Node;
+ ObjDesc->Reference.Aml = Op->Common.Aml;
+ ObjDesc->Reference.Resolved = FALSE;
+ }
+ }
+
*ObjDescPtr = ObjDesc;
return_ACPI_STATUS (Status);
}
@@ -466,209 +392,6 @@ AcpiDsBuildInternalBufferObj (
return_ACPI_STATUS (AE_OK);
}
-
-/*******************************************************************************
- *
- * FUNCTION: AcpiDsBuildInternalPackageObj
- *
- * PARAMETERS: WalkState - Current walk state
- * Op - Parser object to be translated
- * ElementCount - Number of elements in the package - this is
- * the NumElements argument to Package()
- * ObjDescPtr - Where the ACPI internal object is returned
- *
- * RETURN: Status
- *
- * DESCRIPTION: Translate a parser Op package object to the equivalent
- * namespace object
- *
- * NOTE: The number of elements in the package will be always be the NumElements
- * count, regardless of the number of elements in the package list. If
- * NumElements is smaller, only that many package list elements are used.
- * if NumElements is larger, the Package object is padded out with
- * objects of type Uninitialized (as per ACPI spec.)
- *
- * Even though the ASL compilers do not allow NumElements to be smaller
- * than the Package list length (for the fixed length package opcode), some
- * BIOS code modifies the AML on the fly to adjust the NumElements, and
- * this code compensates for that. This also provides compatibility with
- * other AML interpreters.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiDsBuildInternalPackageObj (
- ACPI_WALK_STATE *WalkState,
- ACPI_PARSE_OBJECT *Op,
- UINT32 ElementCount,
- ACPI_OPERAND_OBJECT **ObjDescPtr)
-{
- ACPI_PARSE_OBJECT *Arg;
- ACPI_PARSE_OBJECT *Parent;
- ACPI_OPERAND_OBJECT *ObjDesc = NULL;
- ACPI_STATUS Status = AE_OK;
- UINT32 i;
- UINT16 Index;
- UINT16 ReferenceCount;
-
-
- ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
-
-
- /* Find the parent of a possibly nested package */
-
- Parent = Op->Common.Parent;
- while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
- (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
- {
- Parent = Parent->Common.Parent;
- }
-
- /*
- * If we are evaluating a Named package object "Name (xxxx, Package)",
- * the package object already exists, otherwise it must be created.
- */
- ObjDesc = *ObjDescPtr;
- if (!ObjDesc)
- {
- ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
- *ObjDescPtr = ObjDesc;
- if (!ObjDesc)
- {
- return_ACPI_STATUS (AE_NO_MEMORY);
- }
-
- ObjDesc->Package.Node = Parent->Common.Node;
- }
-
- /*
- * Allocate the element array (array of pointers to the individual
- * objects) based on the NumElements parameter. Add an extra pointer slot
- * so that the list is always null terminated.
- */
- ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
- ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
-
- if (!ObjDesc->Package.Elements)
- {
- AcpiUtDeleteObjectDesc (ObjDesc);
- return_ACPI_STATUS (AE_NO_MEMORY);
- }
-
- ObjDesc->Package.Count = ElementCount;
-
- /*
- * Initialize the elements of the package, up to the NumElements count.
- * Package is automatically padded with uninitialized (NULL) elements
- * if NumElements is greater than the package list length. Likewise,
- * Package is truncated if NumElements is less than the list length.
- */
- Arg = Op->Common.Value.Arg;
- Arg = Arg->Common.Next;
- for (i = 0; Arg && (i < ElementCount); i++)
- {
- if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
- {
- if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
- {
- /*
- * A method reference "looks" to the parser to be a method
- * invocation, so we special case it here
- */
- Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
- Status = AcpiDsBuildInternalObject (
- WalkState, Arg, &ObjDesc->Package.Elements[i]);
- }
- else
- {
- /* This package element is already built, just get it */
-
- ObjDesc->Package.Elements[i] =
- ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
- }
- }
- else
- {
- Status = AcpiDsBuildInternalObject (
- WalkState, Arg, &ObjDesc->Package.Elements[i]);
- }
-
- if (*ObjDescPtr)
- {
- /* Existing package, get existing reference count */
-
- ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
- if (ReferenceCount > 1)
- {
- /* Make new element ref count match original ref count */
-
- for (Index = 0; Index < (ReferenceCount - 1); Index++)
- {
- AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
- }
- }
- }
-
- Arg = Arg->Common.Next;
- }
-
- /* Check for match between NumElements and actual length of PackageList */
-
- if (Arg)
- {
- /*
- * NumElements was exhausted, but there are remaining elements in the
- * PackageList. Truncate the package to NumElements.
- *
- * Note: technically, this is an error, from ACPI spec: "It is an error
- * for NumElements to be less than the number of elements in the
- * PackageList". However, we just print a message and
- * no exception is returned. This provides Windows compatibility. Some
- * BIOSs will alter the NumElements on the fly, creating this type
- * of ill-formed package object.
- */
- while (Arg)
- {
- /*
- * We must delete any package elements that were created earlier
- * and are not going to be used because of the package truncation.
- */
- if (Arg->Common.Node)
- {
- AcpiUtRemoveReference (
- ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
- Arg->Common.Node = NULL;
- }
-
- /* Find out how many elements there really are */
-
- i++;
- Arg = Arg->Common.Next;
- }
-
- ACPI_INFO ((
- "Actual Package length (%u) is larger than "
- "NumElements field (%u), truncated",
- i, ElementCount));
- }
- else if (i < ElementCount)
- {
- /*
- * Arg list (elements) was exhausted, but we did not reach NumElements count.
- * Note: this is not an error, the package is padded out with NULLs.
- */
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
- "Package List length (%u) smaller than NumElements "
- "count (%u), padded with null elements\n",
- i, ElementCount));
- }
-
- ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
- Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
- return_ACPI_STATUS (Status);
-}
-
-
/*******************************************************************************
*
* FUNCTION: AcpiDsCreateNode
@@ -796,10 +519,20 @@ AcpiDsInitObjectFromOp (
case ACPI_TYPE_PACKAGE:
/*
- * Defer evaluation of Package TermArg operand
+ * Defer evaluation of Package TermArg operand and all
+ * package elements. (01/2017): We defer the element
+ * resolution to allow forward references from the package
+ * in order to provide compatibility with other ACPI
+ * implementations.
*/
ObjDesc->Package.Node = ACPI_CAST_PTR (
ACPI_NAMESPACE_NODE, WalkState->Operands[0]);
+
+ if (!Op->Named.Data)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
ObjDesc->Package.AmlStart = Op->Named.Data;
ObjDesc->Package.AmlLength = Op->Named.Length;
break;
@@ -940,8 +673,11 @@ AcpiDsInitObjectFromOp (
/* Node was saved in Op */
ObjDesc->Reference.Node = Op->Common.Node;
- ObjDesc->Reference.Object = Op->Common.Node->Object;
ObjDesc->Reference.Class = ACPI_REFCLASS_NAME;
+ if (Op->Common.Node)
+ {
+ ObjDesc->Reference.Object = Op->Common.Node->Object;
+ }
break;
case AML_DEBUG_OP:
diff --git a/source/components/dispatcher/dsopcode.c b/source/components/dispatcher/dsopcode.c
index 3ceec94b17e2..5ba414d3448b 100644
--- a/source/components/dispatcher/dsopcode.c
+++ b/source/components/dispatcher/dsopcode.c
@@ -747,6 +747,16 @@ AcpiDsEvalDataObjectOperands (
*/
WalkState->OperandIndex = WalkState->NumOperands;
+ /* Ignore if child is not valid */
+
+ if (!Op->Common.Value.Arg)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Dispatch: Missing child while executing TermArg for %X",
+ Op->Common.AmlOpcode));
+ return_ACPI_STATUS (AE_OK);
+ }
+
Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
if (ACPI_FAILURE (Status))
{
diff --git a/source/components/dispatcher/dspkginit.c b/source/components/dispatcher/dspkginit.c
new file mode 100644
index 000000000000..14e34b092368
--- /dev/null
+++ b/source/components/dispatcher/dspkginit.c
@@ -0,0 +1,635 @@
+/******************************************************************************
+ *
+ * Module Name: dspkginit - Completion of deferred package initialization
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * substantially similar to the "NO WARRANTY" disclaimer below
+ * ("Disclaimer") and any redistribution must be conditioned upon
+ * including a substantially similar Disclaimer requirement for further
+ * binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ * of any contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Alternatively, you may choose to be licensed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ *****************************************************************************/
+
+#include "acpi.h"
+#include "accommon.h"
+#include "acnamesp.h"
+#include "amlcode.h"
+#include "acdispat.h"
+#include "acinterp.h"
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("dspkginit")
+
+
+/* Local prototypes */
+
+static void
+AcpiDsResolvePackageElement (
+ ACPI_OPERAND_OBJECT **Element);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsBuildInternalPackageObj
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Op - Parser object to be translated
+ * ElementCount - Number of elements in the package - this is
+ * the NumElements argument to Package()
+ * ObjDescPtr - Where the ACPI internal object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a parser Op package object to the equivalent
+ * namespace object
+ *
+ * NOTE: The number of elements in the package will be always be the NumElements
+ * count, regardless of the number of elements in the package list. If
+ * NumElements is smaller, only that many package list elements are used.
+ * if NumElements is larger, the Package object is padded out with
+ * objects of type Uninitialized (as per ACPI spec.)
+ *
+ * Even though the ASL compilers do not allow NumElements to be smaller
+ * than the Package list length (for the fixed length package opcode), some
+ * BIOS code modifies the AML on the fly to adjust the NumElements, and
+ * this code compensates for that. This also provides compatibility with
+ * other AML interpreters.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsBuildInternalPackageObj (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 ElementCount,
+ ACPI_OPERAND_OBJECT **ObjDescPtr)
+{
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_PARSE_OBJECT *Parent;
+ ACPI_OPERAND_OBJECT *ObjDesc = NULL;
+ ACPI_STATUS Status = AE_OK;
+ UINT16 ReferenceCount;
+ UINT32 Index;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
+
+
+ /* Find the parent of a possibly nested package */
+
+ Parent = Op->Common.Parent;
+ while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Parent->Common.AmlOpcode == AML_VARIABLE_PACKAGE_OP))
+ {
+ Parent = Parent->Common.Parent;
+ }
+
+ /*
+ * If we are evaluating a Named package object of the form:
+ * Name (xxxx, Package)
+ * the package object already exists, otherwise it must be created.
+ */
+ ObjDesc = *ObjDescPtr;
+ if (!ObjDesc)
+ {
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
+ *ObjDescPtr = ObjDesc;
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ObjDesc->Package.Node = Parent->Common.Node;
+ }
+
+ if (ObjDesc->Package.Flags & AOPOBJ_DATA_VALID) /* Just in case */
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Allocate the element array (array of pointers to the individual
+ * objects) based on the NumElements parameter. Add an extra pointer slot
+ * so that the list is always null terminated.
+ */
+ ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
+ ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
+
+ if (!ObjDesc->Package.Elements)
+ {
+ AcpiUtDeleteObjectDesc (ObjDesc);
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ObjDesc->Package.Count = ElementCount;
+ Arg = Op->Common.Value.Arg;
+ Arg = Arg->Common.Next;
+
+ if (Arg)
+ {
+ ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
+ }
+
+ /*
+ * Initialize the elements of the package, up to the NumElements count.
+ * Package is automatically padded with uninitialized (NULL) elements
+ * if NumElements is greater than the package list length. Likewise,
+ * Package is truncated if NumElements is less than the list length.
+ */
+ for (i = 0; Arg && (i < ElementCount); i++)
+ {
+ if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
+ {
+ if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
+ {
+ /*
+ * A method reference "looks" to the parser to be a method
+ * invocation, so we special case it here
+ */
+ Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
+ Status = AcpiDsBuildInternalObject (
+ WalkState, Arg, &ObjDesc->Package.Elements[i]);
+ }
+ else
+ {
+ /* This package element is already built, just get it */
+
+ ObjDesc->Package.Elements[i] =
+ ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
+ }
+ }
+ else
+ {
+ Status = AcpiDsBuildInternalObject (
+ WalkState, Arg, &ObjDesc->Package.Elements[i]);
+ if (Status == AE_NOT_FOUND)
+ {
+ ACPI_ERROR ((AE_INFO, "%-48s", "****DS namepath not found"));
+ }
+
+ /*
+ * Initialize this package element. This function handles the
+ * resolution of named references within the package.
+ */
+ AcpiDsInitPackageElement (0, ObjDesc->Package.Elements[i],
+ NULL, &ObjDesc->Package.Elements[i]);
+ }
+
+ if (*ObjDescPtr)
+ {
+ /* Existing package, get existing reference count */
+
+ ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
+ if (ReferenceCount > 1)
+ {
+ /* Make new element ref count match original ref count */
+ /* TBD: Probably need an AcpiUtAddReferences function */
+
+ for (Index = 0; Index < ((UINT32) ReferenceCount - 1); Index++)
+ {
+ AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
+ }
+ }
+ }
+
+ Arg = Arg->Common.Next;
+ }
+
+ /* Check for match between NumElements and actual length of PackageList */
+
+ if (Arg)
+ {
+ /*
+ * NumElements was exhausted, but there are remaining elements in
+ * the PackageList. Truncate the package to NumElements.
+ *
+ * Note: technically, this is an error, from ACPI spec: "It is an
+ * error for NumElements to be less than the number of elements in
+ * the PackageList". However, we just print a message and no
+ * exception is returned. This provides compatibility with other
+ * ACPI implementations. Some firmware implementations will alter
+ * the NumElements on the fly, possibly creating this type of
+ * ill-formed package object.
+ */
+ while (Arg)
+ {
+ /*
+ * We must delete any package elements that were created earlier
+ * and are not going to be used because of the package truncation.
+ */
+ if (Arg->Common.Node)
+ {
+ AcpiUtRemoveReference (
+ ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node));
+ Arg->Common.Node = NULL;
+ }
+
+ /* Find out how many elements there really are */
+
+ i++;
+ Arg = Arg->Common.Next;
+ }
+
+ ACPI_INFO ((
+ "Actual Package length (%u) is larger than "
+ "NumElements field (%u), truncated",
+ i, ElementCount));
+ }
+ else if (i < ElementCount)
+ {
+ /*
+ * Arg list (elements) was exhausted, but we did not reach
+ * NumElements count.
+ *
+ * Note: this is not an error, the package is padded out
+ * with NULLs.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Package List length (%u) smaller than NumElements "
+ "count (%u), padded with null elements\n",
+ i, ElementCount));
+ }
+
+ ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
+ Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitPackageElement
+ *
+ * PARAMETERS: ACPI_PKG_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Resolve a named reference element within a package object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitPackageElement (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context)
+{
+ ACPI_OPERAND_OBJECT **ElementPtr;
+
+
+ if (!SourceObject)
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * The following code is a bit of a hack to workaround a (current)
+ * limitation of the ACPI_PKG_CALLBACK interface. We need a pointer
+ * to the location within the element array because a new object
+ * may be created and stored there.
+ */
+ if (Context)
+ {
+ /* A direct call was made to this function */
+
+ ElementPtr = (ACPI_OPERAND_OBJECT **) Context;
+ }
+ else
+ {
+ /* Call came from AcpiUtWalkPackageTree */
+
+ ElementPtr = State->Pkg.ThisTargetObj;
+ }
+
+ /* We are only interested in reference objects/elements */
+
+ if (SourceObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)
+ {
+ /* Attempt to resolve the (named) reference to a namespace node */
+
+ AcpiDsResolvePackageElement (ElementPtr);
+ }
+ else if (SourceObject->Common.Type == ACPI_TYPE_PACKAGE)
+ {
+ SourceObject->Package.Flags |= AOPOBJ_DATA_VALID;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsResolvePackageElement
+ *
+ * PARAMETERS: ElementPtr - Pointer to a reference object
+ *
+ * RETURN: Possible new element is stored to the indirect ElementPtr
+ *
+ * DESCRIPTION: Resolve a package element that is a reference to a named
+ * object.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDsResolvePackageElement (
+ ACPI_OPERAND_OBJECT **ElementPtr)
+{
+ ACPI_STATUS Status;
+ ACPI_GENERIC_STATE ScopeInfo;
+ ACPI_OPERAND_OBJECT *Element = *ElementPtr;
+ ACPI_NAMESPACE_NODE *ResolvedNode;
+ char *ExternalPath = NULL;
+ ACPI_OBJECT_TYPE Type;
+
+
+ ACPI_FUNCTION_TRACE (DsResolvePackageElement);
+
+
+ /* Check if reference element is already resolved */
+
+ if (Element->Reference.Resolved)
+ {
+ return_VOID;
+ }
+
+ /* Element must be a reference object of correct type */
+
+ ScopeInfo.Scope.Node = Element->Reference.Node; /* Prefix node */
+
+ Status = AcpiNsLookup (&ScopeInfo,
+ (char *) Element->Reference.Aml, /* Pointer to AML path */
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+ NULL, &ResolvedNode);
+ if (ACPI_FAILURE (Status))
+ {
+ Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
+ (char *) Element->Reference.Aml,
+ NULL, &ExternalPath);
+
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not find/resolve named package element: %s", ExternalPath));
+
+ ACPI_FREE (ExternalPath);
+ *ElementPtr = NULL;
+ return_VOID;
+ }
+ else if (ResolvedNode->Type == ACPI_TYPE_ANY)
+ {
+ /* Named reference not resolved, return a NULL package element */
+
+ ACPI_ERROR ((AE_INFO,
+ "Could not resolve named package element [%4.4s] in [%4.4s]",
+ ResolvedNode->Name.Ascii, ScopeInfo.Scope.Node->Name.Ascii));
+ *ElementPtr = NULL;
+ return_VOID;
+ }
+#if 0
+ else if (ResolvedNode->Flags & ANOBJ_TEMPORARY)
+ {
+ /*
+ * A temporary node found here indicates that the reference is
+ * to a node that was created within this method. We are not
+ * going to allow it (especially if the package is returned
+ * from the method) -- the temporary node will be deleted out
+ * from under the method. (05/2017).
+ */
+ ACPI_ERROR ((AE_INFO,
+ "Package element refers to a temporary name [%4.4s], "
+ "inserting a NULL element",
+ ResolvedNode->Name.Ascii));
+ *ElementPtr = NULL;
+ return_VOID;
+ }
+#endif
+
+ /*
+ * Special handling for Alias objects. We need ResolvedNode to point
+ * to the Alias target. This effectively "resolves" the alias.
+ */
+ if (ResolvedNode->Type == ACPI_TYPE_LOCAL_ALIAS)
+ {
+ ResolvedNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+ ResolvedNode->Object);
+ }
+
+ /* Update the reference object */
+
+ Element->Reference.Resolved = TRUE;
+ Element->Reference.Node = ResolvedNode;
+ Type = Element->Reference.Node->Type;
+
+ /*
+ * Attempt to resolve the node to a value before we insert it into
+ * the package. If this is a reference to a common data type,
+ * resolve it immediately. According to the ACPI spec, package
+ * elements can only be "data objects" or method references.
+ * Attempt to resolve to an Integer, Buffer, String or Package.
+ * If cannot, return the named reference (for things like Devices,
+ * Methods, etc.) Buffer Fields and Fields will resolve to simple
+ * objects (int/buf/str/pkg).
+ *
+ * NOTE: References to things like Devices, Methods, Mutexes, etc.
+ * will remain as named references. This behavior is not described
+ * in the ACPI spec, but it appears to be an oversight.
+ */
+ Status = AcpiExResolveNodeToValue (&ResolvedNode, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+
+#if 0
+/* TBD - alias support */
+ /*
+ * Special handling for Alias objects. We need to setup the type
+ * and the Op->Common.Node to point to the Alias target. Note,
+ * Alias has at most one level of indirection internally.
+ */
+ Type = Op->Common.Node->Type;
+ if (Type == ACPI_TYPE_LOCAL_ALIAS)
+ {
+ Type = ObjDesc->Common.Type;
+ Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+ Op->Common.Node->Object);
+ }
+#endif
+
+ switch (Type)
+ {
+ /*
+ * These object types are a result of named references, so we will
+ * leave them as reference objects. In other words, these types
+ * have no intrinsic "value".
+ */
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_THERMAL:
+
+ /* TBD: This may not be necesssary */
+
+ AcpiUtAddReference (ResolvedNode->Object);
+ break;
+
+ case ACPI_TYPE_MUTEX:
+ case ACPI_TYPE_METHOD:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_EVENT:
+ case ACPI_TYPE_REGION:
+
+ break;
+
+ default:
+ /*
+ * For all other types - the node was resolved to an actual
+ * operand object with a value, return the object
+ */
+ *ElementPtr = (ACPI_OPERAND_OBJECT *) ResolvedNode;
+ break;
+ }
+
+ return_VOID;
+}
diff --git a/source/components/executer/excreate.c b/source/components/executer/excreate.c
index 15b38574a1da..a2cce00ac8f4 100644
--- a/source/components/executer/excreate.c
+++ b/source/components/executer/excreate.c
@@ -204,70 +204,39 @@ AcpiExCreateAlias (
}
/* Ensure that the target node is valid */
+
if (!TargetNode)
{
return_ACPI_STATUS (AE_NULL_OBJECT);
}
- /*
- * For objects that can never change (i.e., the NS node will
- * permanently point to the same object), we can simply attach
- * the object to the new NS node. For other objects (such as
- * Integers, buffers, etc.), we have to point the Alias node
- * to the original Node.
- */
+ /* Construct the alias object (a namespace node) */
+
switch (TargetNode->Type)
{
-
- /* For these types, the sub-object can change dynamically via a Store */
-
- case ACPI_TYPE_INTEGER:
- case ACPI_TYPE_STRING:
- case ACPI_TYPE_BUFFER:
- case ACPI_TYPE_PACKAGE:
- case ACPI_TYPE_BUFFER_FIELD:
- /*
- * These types open a new scope, so we need the NS node in order to access
- * any children.
- */
- case ACPI_TYPE_DEVICE:
- case ACPI_TYPE_POWER:
- case ACPI_TYPE_PROCESSOR:
- case ACPI_TYPE_THERMAL:
- case ACPI_TYPE_LOCAL_SCOPE:
- /*
- * The new alias has the type ALIAS and points to the original
- * NS node, not the object itself.
- */
- AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
- AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
- break;
-
case ACPI_TYPE_METHOD:
/*
- * Control method aliases need to be differentiated
+ * Control method aliases need to be differentiated with
+ * a special type
*/
AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
- AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
break;
default:
-
- /* Attach the original source object to the new Alias Node */
-
/*
- * The new alias assumes the type of the target, and it points
- * to the same object. The reference count of the object has an
- * additional reference to prevent deletion out from under either the
- * target node or the alias Node
+ * All other object types.
+ *
+ * The new alias has the type ALIAS and points to the original
+ * NS node, not the object itself.
*/
- Status = AcpiNsAttachObject (AliasNode,
- AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
+ AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
+ AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
break;
}
/* Since both operands are Nodes, we don't need to delete them */
+ AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
return_ACPI_STATUS (Status);
}
diff --git a/source/components/executer/exdump.c b/source/components/executer/exdump.c
index 2b23881f16cd..c1069b2c9f5d 100644
--- a/source/components/executer/exdump.c
+++ b/source/components/executer/exdump.c
@@ -229,7 +229,7 @@ static ACPI_EXDUMP_INFO AcpiExDumpPackage[6] =
{ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage), NULL},
{ACPI_EXD_NODE, ACPI_EXD_OFFSET (Package.Node), "Parent Node"},
{ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Package.Flags), "Flags"},
- {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Package.Count), "Elements"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Package.Count), "Element Count"},
{ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Package.Elements), "Element List"},
{ACPI_EXD_PACKAGE, 0, NULL}
};
@@ -510,6 +510,11 @@ AcpiExDumpObject (
while (Count)
{
+ if (!ObjDesc)
+ {
+ return;
+ }
+
Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
Name = Info->Name;
@@ -522,7 +527,8 @@ AcpiExDumpObject (
case ACPI_EXD_TYPE:
AcpiOsPrintf ("%20s : %2.2X [%s]\n", "Type",
- ObjDesc->Common.Type, AcpiUtGetObjectTypeName (ObjDesc));
+ ObjDesc->Common.Type,
+ AcpiUtGetObjectTypeName (ObjDesc));
break;
case ACPI_EXD_UINT8:
@@ -588,10 +594,10 @@ AcpiExDumpObject (
Start = *ACPI_CAST_PTR (void *, Target);
Next = Start;
- AcpiOsPrintf ("%20s : %p", Name, Next);
+ AcpiOsPrintf ("%20s : %p ", Name, Next);
if (Next)
{
- AcpiOsPrintf ("(%s %2.2X)",
+ AcpiOsPrintf ("%s (Type %2.2X)",
AcpiUtGetObjectTypeName (Next), Next->Common.Type);
while (Next->Common.NextObject)
@@ -614,6 +620,10 @@ AcpiExDumpObject (
}
}
}
+ else
+ {
+ AcpiOsPrintf ("- No attached objects");
+ }
AcpiOsPrintf ("\n");
break;
@@ -1294,7 +1304,8 @@ AcpiExDumpPackageObj (
default:
- AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type);
+ AcpiOsPrintf ("[%s] Type: %2.2X\n",
+ AcpiUtGetTypeName (ObjDesc->Common.Type), ObjDesc->Common.Type);
break;
}
}
@@ -1338,10 +1349,19 @@ AcpiExDumpObjectDescriptor (
{
AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
- AcpiOsPrintf ("\nAttached Object (%p):\n",
- ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
-
ObjDesc = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object;
+ if (!ObjDesc)
+ {
+ return_VOID;
+ }
+
+ AcpiOsPrintf ("\nAttached Object %p", ObjDesc);
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
+ {
+ AcpiOsPrintf (" - Namespace Node");
+ }
+
+ AcpiOsPrintf (":\n");
goto DumpObject;
}
@@ -1365,6 +1385,11 @@ AcpiExDumpObjectDescriptor (
DumpObject:
+ if (!ObjDesc)
+ {
+ return_VOID;
+ }
+
/* Common Fields */
AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
diff --git a/source/components/executer/exmisc.c b/source/components/executer/exmisc.c
index b1fc02d2ab79..dfa4421ac773 100644
--- a/source/components/executer/exmisc.c
+++ b/source/components/executer/exmisc.c
@@ -401,6 +401,8 @@ AcpiExDoLogicalNumericOp (
default:
+ ACPI_ERROR ((AE_INFO,
+ "Invalid numeric logical opcode: %X", Opcode));
Status = AE_AML_INTERNAL;
break;
}
@@ -486,6 +488,9 @@ AcpiExDoLogicalOp (
default:
+ ACPI_ERROR ((AE_INFO,
+ "Invalid object type for logical operator: %X",
+ Operand0->Common.Type));
Status = AE_AML_INTERNAL;
break;
}
@@ -535,6 +540,8 @@ AcpiExDoLogicalOp (
default:
+ ACPI_ERROR ((AE_INFO,
+ "Invalid comparison opcode: %X", Opcode));
Status = AE_AML_INTERNAL;
break;
}
@@ -613,6 +620,8 @@ AcpiExDoLogicalOp (
default:
+ ACPI_ERROR ((AE_INFO,
+ "Invalid comparison opcode: %X", Opcode));
Status = AE_AML_INTERNAL;
break;
}
diff --git a/source/components/executer/exoparg2.c b/source/components/executer/exoparg2.c
index 3ce965a6db4f..f4bf9c17d70d 100644
--- a/source/components/executer/exoparg2.c
+++ b/source/components/executer/exoparg2.c
@@ -556,6 +556,8 @@ AcpiExOpcode_2A_1T_1R (
default:
+ ACPI_ERROR ((AE_INFO,
+ "Invalid object type: %X", (Operand[0])->Common.Type));
Status = AE_AML_INTERNAL;
goto Cleanup;
}
diff --git a/source/components/hardware/hwregs.c b/source/components/hardware/hwregs.c
index e90fd14829ee..b5b23831fe9d 100644
--- a/source/components/hardware/hwregs.c
+++ b/source/components/hardware/hwregs.c
@@ -228,7 +228,7 @@ AcpiHwGetAccessBitWidth (
}
else if (Reg->AccessWidth)
{
- AccessBitWidth = (1 << (Reg->AccessWidth + 2));
+ AccessBitWidth = ACPI_ACCESS_BIT_WIDTH (Reg->AccessWidth);
}
else
{
diff --git a/source/components/namespace/nsaccess.c b/source/components/namespace/nsaccess.c
index 89d766b4bdd3..0ae1fbdd0875 100644
--- a/source/components/namespace/nsaccess.c
+++ b/source/components/namespace/nsaccess.c
@@ -410,6 +410,7 @@ AcpiNsLookup (
{
ACPI_STATUS Status;
char *Path = Pathname;
+ char *ExternalPath;
ACPI_NAMESPACE_NODE *PrefixNode;
ACPI_NAMESPACE_NODE *CurrentNode = NULL;
ACPI_NAMESPACE_NODE *ThisNode = NULL;
@@ -556,11 +557,21 @@ AcpiNsLookup (
ThisNode = ThisNode->Parent;
if (!ThisNode)
{
- /* Current scope has no parent scope */
+ /*
+ * Current scope has no parent scope. Externalize
+ * the internal path for error message.
+ */
+ Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Pathname,
+ NULL, &ExternalPath);
+ if (ACPI_SUCCESS (Status))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "%s: Path has too many parent prefixes (^)",
+ ExternalPath));
+
+ ACPI_FREE (ExternalPath);
+ }
- ACPI_ERROR ((AE_INFO,
- "%s: Path has too many parent prefixes (^) "
- "- reached beyond root node", Pathname));
return_ACPI_STATUS (AE_NOT_FOUND);
}
}
diff --git a/source/components/namespace/nsarguments.c b/source/components/namespace/nsarguments.c
index 0412672aee85..0a7fa3d9de78 100644
--- a/source/components/namespace/nsarguments.c
+++ b/source/components/namespace/nsarguments.c
@@ -183,9 +183,14 @@ AcpiNsCheckArgumentTypes (
UINT32 i;
- /* If not a predefined name, cannot typecheck args */
-
- if (!Info->Predefined)
+ /*
+ * If not a predefined name, cannot typecheck args, because
+ * we have no idea what argument types are expected.
+ * Also, ignore typecheck if warnings/errors if this method
+ * has already been evaluated at least once -- in order
+ * to suppress repetitive messages.
+ */
+ if (!Info->Predefined || (Info->Node->Flags & ANOBJ_EVALUATED))
{
return;
}
@@ -207,6 +212,10 @@ AcpiNsCheckArgumentTypes (
"Found [%s], ACPI requires [%s]", (i + 1),
AcpiUtGetTypeName (UserArgType),
AcpiUtGetTypeName (ArgType)));
+
+ /* Prevent any additional typechecking for this method */
+
+ Info->Node->Flags |= ANOBJ_EVALUATED;
}
}
}
@@ -238,7 +247,7 @@ AcpiNsCheckAcpiCompliance (
UINT32 RequiredParamCount;
- if (!Predefined)
+ if (!Predefined || (Node->Flags & ANOBJ_EVALUATED))
{
return;
}
@@ -332,6 +341,11 @@ AcpiNsCheckArgumentCount (
UINT32 RequiredParamCount;
+ if (Node->Flags & ANOBJ_EVALUATED)
+ {
+ return;
+ }
+
if (!Predefined)
{
/*
diff --git a/source/components/namespace/nsinit.c b/source/components/namespace/nsinit.c
index d4286bf80656..2786e24c926e 100644
--- a/source/components/namespace/nsinit.c
+++ b/source/components/namespace/nsinit.c
@@ -535,6 +535,20 @@ AcpiNsInitOneObject (
Info->PackageInit++;
Status = AcpiDsGetPackageArguments (ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+
+ /*
+ * Resolve all named references in package objects (and all
+ * sub-packages). This action has been deferred until the entire
+ * namespace has been loaded, in order to support external and
+ * forward references from individual package elements (05/2017).
+ */
+ Status = AcpiUtWalkPackageTree (ObjDesc, NULL,
+ AcpiDsInitPackageElement, NULL);
+ ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
break;
default:
diff --git a/source/components/namespace/nsnames.c b/source/components/namespace/nsnames.c
index f68fbc1ed547..fb74c44c3395 100644
--- a/source/components/namespace/nsnames.c
+++ b/source/components/namespace/nsnames.c
@@ -208,8 +208,15 @@ AcpiNsGetPathnameLength (
ACPI_SIZE Size;
- ACPI_FUNCTION_ENTRY ();
+ /* Validate the Node */
+ if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Invalid/cached reference target node: %p, descriptor type %d",
+ Node, ACPI_GET_DESCRIPTOR_TYPE (Node)));
+ return (0);
+ }
Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE);
return (Size);
diff --git a/source/components/namespace/nsprepkg.c b/source/components/namespace/nsprepkg.c
index 848568173529..6ad53d61c263 100644
--- a/source/components/namespace/nsprepkg.c
+++ b/source/components/namespace/nsprepkg.c
@@ -722,6 +722,8 @@ AcpiNsCheckPackageList (
default: /* Should not get here, type was validated by caller */
+ ACPI_ERROR ((AE_INFO, "Invalid Package type: %X",
+ Package->RetInfo.Type));
return (AE_AML_INTERNAL);
}
diff --git a/source/components/parser/psloop.c b/source/components/parser/psloop.c
index 649f0276eb9f..fe7fe6d0cfe4 100644
--- a/source/components/parser/psloop.c
+++ b/source/components/parser/psloop.c
@@ -282,6 +282,9 @@ AcpiPsGetArguments (
INCREMENT_ARG_LIST (WalkState->ArgTypes);
}
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Final argument count: %u pass %u\n",
+ WalkState->ArgCount, WalkState->PassNumber));
/*
* Handle executable code at "module-level". This refers to
@@ -380,6 +383,10 @@ AcpiPsGetArguments (
(Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
(WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
{
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Setup Package/Buffer: Pass %u, AML Ptr: %p\n",
+ WalkState->PassNumber, AmlOpStart));
+
/*
* Skip parsing of Buffers and Packages because we don't have
* enough info in the first pass to parse them correctly.
@@ -689,6 +696,9 @@ AcpiPsParseLoop (
/* Check for arguments that need to be processed */
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Parseloop: argument count: %u\n", WalkState->ArgCount));
+
if (WalkState->ArgCount)
{
/*
diff --git a/source/components/resources/rsxface.c b/source/components/resources/rsxface.c
index 5e3f7352750e..2c27eaf59ac4 100644
--- a/source/components/resources/rsxface.c
+++ b/source/components/resources/rsxface.c
@@ -796,7 +796,7 @@ ACPI_EXPORT_SYMBOL (AcpiWalkResourceBuffer)
* device we are querying
* Name - Method name of the resources we want.
* (METHOD_NAME__CRS, METHOD_NAME__PRS, or
- * METHOD_NAME__AEI)
+ * METHOD_NAME__AEI or METHOD_NAME__DMA)
* UserFunction - Called for each resource
* Context - Passed to UserFunction
*
@@ -827,12 +827,13 @@ AcpiWalkResources (
if (!DeviceHandle || !UserFunction || !Name ||
(!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
!ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS) &&
- !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI)))
+ !ACPI_COMPARE_NAME (Name, METHOD_NAME__AEI) &&
+ !ACPI_COMPARE_NAME (Name, METHOD_NAME__DMA)))
{
return_ACPI_STATUS (AE_BAD_PARAMETER);
}
- /* Get the _CRS/_PRS/_AEI resource list */
+ /* Get the _CRS/_PRS/_AEI/_DMA resource list */
Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer);
diff --git a/source/components/tables/tbdata.c b/source/components/tables/tbdata.c
index 47096186fa1c..18e58f9d4c6f 100644
--- a/source/components/tables/tbdata.c
+++ b/source/components/tables/tbdata.c
@@ -648,6 +648,8 @@ AcpiTbCheckDuplication (
*
* DESCRIPTION: This function is called to validate and verify the table, the
* returned table descriptor is in "VALIDATED" state.
+ * Note that 'TableIndex' is required to be set to !NULL to
+ * enable duplication check.
*
*****************************************************************************/
diff --git a/source/components/tables/tbxface.c b/source/components/tables/tbxface.c
index 5fd178f55a89..d8cb6b18c4a4 100644
--- a/source/components/tables/tbxface.c
+++ b/source/components/tables/tbxface.c
@@ -293,7 +293,7 @@ AcpiReallocateRootTable (
{
ACPI_STATUS Status;
ACPI_TABLE_DESC *TableDesc;
- UINT32 i;
+ UINT32 i, j;
ACPI_FUNCTION_TRACE (AcpiReallocateRootTable);
@@ -339,7 +339,7 @@ AcpiReallocateRootTable (
TableDesc = &AcpiGbl_RootTableList.Tables[i];
if (!(TableDesc->Flags & ACPI_TABLE_IS_VERIFIED))
{
- Status = AcpiTbVerifyTempTable (TableDesc, NULL, NULL);
+ Status = AcpiTbVerifyTempTable (TableDesc, NULL, &j);
if (ACPI_FAILURE (Status))
{
AcpiTbUninstallTable (TableDesc);
diff --git a/source/components/utilities/utclib.c b/source/components/utilities/utclib.c
index 2e9cb5cf022d..e9cb1bee4ade 100644
--- a/source/components/utilities/utclib.c
+++ b/source/components/utilities/utclib.c
@@ -762,7 +762,7 @@ strstr (
char *String1,
char *String2)
{
- UINT32 Length;
+ ACPI_SIZE Length;
Length = strlen (String2);
diff --git a/source/components/utilities/uthex.c b/source/components/utilities/uthex.c
index 7f507697b6ca..8c7bcccc2f4e 100644
--- a/source/components/utilities/uthex.c
+++ b/source/components/utilities/uthex.c
@@ -183,8 +183,10 @@ AcpiUtHexToAsciiChar (
UINT64 Integer,
UINT32 Position)
{
+ UINT64 Index;
- return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
+ AcpiUtShortShiftRight (Integer, Position, &Index);
+ return (AcpiGbl_HexToAscii[Index & 0xF]);
}
diff --git a/source/components/utilities/utmath.c b/source/components/utilities/utmath.c
index 1da5f9adf064..4aa940251d18 100644
--- a/source/components/utilities/utmath.c
+++ b/source/components/utilities/utmath.c
@@ -156,16 +156,6 @@
#define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME ("utmath")
-/*
- * Optional support for 64-bit double-precision integer divide. This code
- * is configurable and is implemented in order to support 32-bit kernel
- * environments where a 64-bit double-precision math library is not available.
- *
- * Support for a more normal 64-bit divide/modulo (with check for a divide-
- * by-zero) appears after this optional section of code.
- */
-#ifndef ACPI_USE_NATIVE_DIVIDE
-
/* Structures used only for 64-bit divide */
typedef struct uint64_struct
@@ -182,6 +172,257 @@ typedef union uint64_overlay
} UINT64_OVERLAY;
+/*
+ * Optional support for 64-bit double-precision integer multiply and shift.
+ * This code is configurable and is implemented in order to support 32-bit
+ * kernel environments where a 64-bit double-precision math library is not
+ * available.
+ */
+#ifndef ACPI_USE_NATIVE_MATH64
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortMultiply
+ *
+ * PARAMETERS: Multiplicand - 64-bit multiplicand
+ * Multiplier - 32-bit multiplier
+ * OutProduct - Pointer to where the product is returned
+ *
+ * DESCRIPTION: Perform a short multiply.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortMultiply (
+ UINT64 Multiplicand,
+ UINT32 Multiplier,
+ UINT64 *OutProduct)
+{
+ UINT64_OVERLAY MultiplicandOvl;
+ UINT64_OVERLAY Product;
+ UINT32 Carry32;
+
+
+ ACPI_FUNCTION_TRACE (UtShortMultiply);
+
+
+ MultiplicandOvl.Full = Multiplicand;
+
+ /*
+ * The Product is 64 bits, the carry is always 32 bits,
+ * and is generated by the second multiply.
+ */
+ ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Hi, Multiplier,
+ Product.Part.Hi, Carry32);
+
+ ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Lo, Multiplier,
+ Product.Part.Lo, Carry32);
+
+ Product.Part.Hi += Carry32;
+
+ /* Return only what was requested */
+
+ if (OutProduct)
+ {
+ *OutProduct = Product.Full;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortShiftLeft
+ *
+ * PARAMETERS: Operand - 64-bit shift operand
+ * Count - 32-bit shift count
+ * OutResult - Pointer to where the result is returned
+ *
+ * DESCRIPTION: Perform a short left shift.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+ UINT64 Operand,
+ UINT32 Count,
+ UINT64 *OutResult)
+{
+ UINT64_OVERLAY OperandOvl;
+
+
+ ACPI_FUNCTION_TRACE (UtShortShiftLeft);
+
+
+ OperandOvl.Full = Operand;
+
+ if ((Count & 63) >= 32)
+ {
+ OperandOvl.Part.Hi = OperandOvl.Part.Lo;
+ OperandOvl.Part.Lo ^= OperandOvl.Part.Lo;
+ Count = (Count & 63) - 32;
+ }
+ ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi,
+ OperandOvl.Part.Lo, Count);
+
+ /* Return only what was requested */
+
+ if (OutResult)
+ {
+ *OutResult = OperandOvl.Full;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortShiftRight
+ *
+ * PARAMETERS: Operand - 64-bit shift operand
+ * Count - 32-bit shift count
+ * OutResult - Pointer to where the result is returned
+ *
+ * DESCRIPTION: Perform a short right shift.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+ UINT64 Operand,
+ UINT32 Count,
+ UINT64 *OutResult)
+{
+ UINT64_OVERLAY OperandOvl;
+
+
+ ACPI_FUNCTION_TRACE (UtShortShiftRight);
+
+
+ OperandOvl.Full = Operand;
+
+ if ((Count & 63) >= 32)
+ {
+ OperandOvl.Part.Lo = OperandOvl.Part.Hi;
+ OperandOvl.Part.Hi ^= OperandOvl.Part.Hi;
+ Count = (Count & 63) - 32;
+ }
+ ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi,
+ OperandOvl.Part.Lo, Count);
+
+ /* Return only what was requested */
+
+ if (OutResult)
+ {
+ *OutResult = OperandOvl.Full;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+#else
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortMultiply
+ *
+ * PARAMETERS: See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortMultiply function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortMultiply (
+ UINT64 Multiplicand,
+ UINT32 Multiplier,
+ UINT64 *OutProduct)
+{
+
+ ACPI_FUNCTION_TRACE (UtShortMultiply);
+
+
+ /* Return only what was requested */
+
+ if (OutProduct)
+ {
+ *OutProduct = Multiplicand * Multiplier;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortShiftLeft
+ *
+ * PARAMETERS: See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortShiftLeft function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+ UINT64 Operand,
+ UINT32 Count,
+ UINT64 *OutResult)
+{
+
+ ACPI_FUNCTION_TRACE (UtShortShiftLeft);
+
+
+ /* Return only what was requested */
+
+ if (OutResult)
+ {
+ *OutResult = Operand << Count;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortShiftRight
+ *
+ * PARAMETERS: See function headers above
+ *
+ * DESCRIPTION: Native version of the UtShortShiftRight function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+ UINT64 Operand,
+ UINT32 Count,
+ UINT64 *OutResult)
+{
+
+ ACPI_FUNCTION_TRACE (UtShortShiftRight);
+
+
+ /* Return only what was requested */
+
+ if (OutResult)
+ {
+ *OutResult = Operand >> Count;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+#endif
+
+/*
+ * Optional support for 64-bit double-precision integer divide. This code
+ * is configurable and is implemented in order to support 32-bit kernel
+ * environments where a 64-bit double-precision math library is not available.
+ *
+ * Support for a more normal 64-bit divide/modulo (with check for a divide-
+ * by-zero) appears after this optional section of code.
+ */
+#ifndef ACPI_USE_NATIVE_DIVIDE
+
/*******************************************************************************
*
diff --git a/source/components/utilities/utmisc.c b/source/components/utilities/utmisc.c
index 33e51f5c2b8f..7280bca7e4c6 100644
--- a/source/components/utilities/utmisc.c
+++ b/source/components/utilities/utmisc.c
@@ -363,7 +363,7 @@ AcpiUtCreateUpdateStateAndPush (
*
* RETURN: Status
*
- * DESCRIPTION: Walk through a package
+ * DESCRIPTION: Walk through a package, including subpackages
*
******************************************************************************/
@@ -377,8 +377,8 @@ AcpiUtWalkPackageTree (
ACPI_STATUS Status = AE_OK;
ACPI_GENERIC_STATE *StateList = NULL;
ACPI_GENERIC_STATE *State;
- UINT32 ThisIndex;
ACPI_OPERAND_OBJECT *ThisSourceObj;
+ UINT32 ThisIndex;
ACPI_FUNCTION_TRACE (UtWalkPackageTree);
@@ -395,8 +395,10 @@ AcpiUtWalkPackageTree (
/* Get one element of the package */
ThisIndex = State->Pkg.Index;
- ThisSourceObj = (ACPI_OPERAND_OBJECT *)
+ ThisSourceObj =
State->Pkg.SourceObject->Package.Elements[ThisIndex];
+ State->Pkg.ThisTargetObj =
+ &State->Pkg.SourceObject->Package.Elements[ThisIndex];
/*
* Check for:
@@ -412,7 +414,7 @@ AcpiUtWalkPackageTree (
(ThisSourceObj->Common.Type != ACPI_TYPE_PACKAGE))
{
Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
- State, Context);
+ State, Context);
if (ACPI_FAILURE (Status))
{
return_ACPI_STATUS (Status);
@@ -485,6 +487,9 @@ AcpiUtWalkPackageTree (
/* We should never get here */
+ ACPI_ERROR ((AE_INFO,
+ "State list did not terminate correctly"));
+
return_ACPI_STATUS (AE_AML_INTERNAL);
}
diff --git a/source/components/utilities/utobject.c b/source/components/utilities/utobject.c
index a94c882eddba..65aae85f6d53 100644
--- a/source/components/utilities/utobject.c
+++ b/source/components/utilities/utobject.c
@@ -651,6 +651,10 @@ AcpiUtGetSimpleObjectSize (
{
/* A namespace node should never get here */
+ ACPI_ERROR ((AE_INFO,
+ "Received a namespace node [%4.4s] "
+ "where an operand object is required",
+ ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, InternalObject)->Name.Ascii));
return_ACPI_STATUS (AE_AML_INTERNAL);
}
diff --git a/source/components/utilities/utprint.c b/source/components/utilities/utprint.c
index 500f7a5fe546..b656af336791 100644
--- a/source/components/utilities/utprint.c
+++ b/source/components/utilities/utprint.c
@@ -331,7 +331,7 @@ AcpiUtScanNumber (
while (isdigit ((int) *String))
{
- Number *= 10;
+ AcpiUtShortMultiply (Number, 10, &Number);
Number += *(String++) - '0';
}
@@ -463,7 +463,7 @@ AcpiUtFormatNumber (
/* Generate full string in reverse order */
Pos = AcpiUtPutNumber (ReversedString, Number, Base, Upper);
- i = ACPI_PTR_DIFF (Pos, ReversedString);
+ i = (INT32) ACPI_PTR_DIFF (Pos, ReversedString);
/* Printing 100 using %2d gives "100", not "00" */
@@ -695,7 +695,7 @@ vsnprintf (
{
s = "<NULL>";
}
- Length = AcpiUtBoundStringLength (s, Precision);
+ Length = (INT32) AcpiUtBoundStringLength (s, Precision);
if (!(Type & ACPI_FORMAT_LEFT))
{
while (Length < Width--)
@@ -815,7 +815,7 @@ vsnprintf (
}
}
- return (ACPI_PTR_DIFF (Pos, String));
+ return ((int) ACPI_PTR_DIFF (Pos, String));
}
diff --git a/source/components/utilities/utresrc.c b/source/components/utilities/utresrc.c
index e34662c809d1..da4fdc4366a6 100644
--- a/source/components/utilities/utresrc.c
+++ b/source/components/utilities/utresrc.c
@@ -360,14 +360,11 @@ AcpiUtWalkAmlResources (
}
/*
- * The EndTag opcode must be followed by a zero byte.
- * Although this byte is technically defined to be a checksum,
- * in practice, all ASL compilers set this byte to zero.
+ * Don't attempt to perform any validation on the 2nd byte.
+ * Although all known ASL compilers insert a zero for the 2nd
+ * byte, it can also be a checksum (as per the ACPI spec),
+ * and this is occasionally seen in the field. July 2017.
*/
- if (*(Aml + 1) != 0)
- {
- return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
- }
/* Return the pointer to the EndTag if requested */
diff --git a/source/components/utilities/utstate.c b/source/components/utilities/utstate.c
index 2d75c89422ab..8effe5baa368 100644
--- a/source/components/utilities/utstate.c
+++ b/source/components/utilities/utstate.c
@@ -363,7 +363,7 @@ ACPI_GENERIC_STATE *
AcpiUtCreatePkgState (
void *InternalObject,
void *ExternalObject,
- UINT16 Index)
+ UINT32 Index)
{
ACPI_GENERIC_STATE *State;
diff --git a/source/components/utilities/utstrtoul64.c b/source/components/utilities/utstrtoul64.c
index a3c52b9e7010..d91e9084264c 100644
--- a/source/components/utilities/utstrtoul64.c
+++ b/source/components/utilities/utstrtoul64.c
@@ -419,8 +419,8 @@ AcpiUtStrtoulBase10 (
/* Convert and insert (add) the decimal digit */
- NextValue =
- (ReturnValue * 10) + (AsciiDigit - ACPI_ASCII_ZERO);
+ AcpiUtShortMultiply (ReturnValue, 10, &NextValue);
+ NextValue += (AsciiDigit - ACPI_ASCII_ZERO);
/* Check for overflow (32 or 64 bit) - return current converted value */
@@ -486,8 +486,8 @@ AcpiUtStrtoulBase16 (
/* Convert and insert the hex digit */
- ReturnValue =
- (ReturnValue << 4) | AcpiUtAsciiCharToHex (AsciiDigit);
+ AcpiUtShortShiftLeft (ReturnValue, 4, &ReturnValue);
+ ReturnValue |= AcpiUtAsciiCharToHex (AsciiDigit);
String++;
ValidDigits++;
diff --git a/source/components/utilities/uttrack.c b/source/components/utilities/uttrack.c
index 3ac6a3815649..a88a4a3de880 100644
--- a/source/components/utilities/uttrack.c
+++ b/source/components/utilities/uttrack.c
@@ -776,6 +776,11 @@ AcpiUtDumpAllocations (
return_VOID;
}
+ if (!AcpiGbl_GlobalList)
+ {
+ goto Exit;
+ }
+
Element = AcpiGbl_GlobalList->ListHead;
while (Element)
{
@@ -787,7 +792,7 @@ AcpiUtDumpAllocations (
if (Element->Size < sizeof (ACPI_COMMON_DESCRIPTOR))
{
- AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u "
+ AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u "
"[Not a Descriptor - too small]\n",
Descriptor, Element->Size, Element->Module,
Element->Line);
@@ -799,7 +804,7 @@ AcpiUtDumpAllocations (
if (ACPI_GET_DESCRIPTOR_TYPE (Descriptor) !=
ACPI_DESC_TYPE_CACHED)
{
- AcpiOsPrintf ("%p Length 0x%04X %9.9s-%u [%s] ",
+ AcpiOsPrintf ("%p Length 0x%04X %9.9s-%4.4u [%s] ",
Descriptor, Element->Size, Element->Module,
Element->Line, AcpiUtGetDescriptorName (Descriptor));
@@ -875,6 +880,7 @@ AcpiUtDumpAllocations (
Element = Element->Next;
}
+Exit:
(void) AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
/* Print summary */
diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h
index 5beec2d4fb48..26d4f47b709c 100644
--- a/source/include/acdisasm.h
+++ b/source/include/acdisasm.h
@@ -271,6 +271,7 @@ typedef enum
ACPI_DMT_PCCT,
ACPI_DMT_PMTT,
ACPI_DMT_PPTT,
+ ACPI_DMT_SDEI,
ACPI_DMT_SLIC,
ACPI_DMT_SRAT,
@@ -527,6 +528,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3ptHdr[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3pt0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3pt1[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdei[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlit[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpcr[];
diff --git a/source/include/acdispat.h b/source/include/acdispat.h
index 1c294c3a2d52..bae3d79472d3 100644
--- a/source/include/acdispat.h
+++ b/source/include/acdispat.h
@@ -409,6 +409,12 @@ AcpiDsInitializeObjects (
* dsobject - Parser/Interpreter interface - object initialization and conversion
*/
ACPI_STATUS
+AcpiDsBuildInternalObject (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT **ObjDescPtr);
+
+ACPI_STATUS
AcpiDsBuildInternalBufferObj (
ACPI_WALK_STATE *WalkState,
ACPI_PARSE_OBJECT *Op,
@@ -437,6 +443,17 @@ AcpiDsCreateNode (
/*
+ * dspkginit - Package object initialization
+ */
+ACPI_STATUS
+AcpiDsInitPackageElement (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context);
+
+
+/*
* dsutils - Parser/Interpreter interface utility routines
*/
void
diff --git a/source/include/aclocal.h b/source/include/aclocal.h
index 399e4c0691ca..00be20ede3e7 100644
--- a/source/include/aclocal.h
+++ b/source/include/aclocal.h
@@ -813,7 +813,7 @@ typedef struct acpi_update_state
typedef struct acpi_pkg_state
{
ACPI_STATE_COMMON
- UINT16 Index;
+ UINT32 Index;
union acpi_operand_object *SourceObject;
union acpi_operand_object *DestObject;
struct acpi_walk_state *WalkState;
diff --git a/source/include/acnames.h b/source/include/acnames.h
index 27b0b9703f06..69f88844062f 100644
--- a/source/include/acnames.h
+++ b/source/include/acnames.h
@@ -162,6 +162,7 @@
#define METHOD_NAME__CLS "_CLS"
#define METHOD_NAME__CRS "_CRS"
#define METHOD_NAME__DDN "_DDN"
+#define METHOD_NAME__DMA "_DMA"
#define METHOD_NAME__HID "_HID"
#define METHOD_NAME__INI "_INI"
#define METHOD_NAME__PLD "_PLD"
diff --git a/source/include/acobject.h b/source/include/acobject.h
index f03760977ea0..7dce4cee3e2c 100644
--- a/source/include/acobject.h
+++ b/source/include/acobject.h
@@ -546,11 +546,12 @@ typedef struct acpi_object_reference
ACPI_OBJECT_COMMON_HEADER
UINT8 Class; /* Reference Class */
UINT8 TargetType; /* Used for Index Op */
- UINT8 Reserved;
+ UINT8 Resolved; /* Reference has been resolved to a value */
void *Object; /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
ACPI_NAMESPACE_NODE *Node; /* RefOf or Namepath */
union acpi_operand_object **Where; /* Target of Index */
UINT8 *IndexPointer; /* Used for Buffers and Strings */
+ UINT8 *Aml; /* Used for deferred resolution of the ref */
UINT32 Value; /* Used for Local/Arg/Index/DdbHandle */
} ACPI_OBJECT_REFERENCE;
@@ -571,7 +572,6 @@ typedef enum
} ACPI_REFERENCE_CLASSES;
-
/*
* Extra object is used as additional storage for types that
* have AML code in their declarations (TermArgs) that must be
diff --git a/source/include/acpi.h b/source/include/acpi.h
index 46d75eb7c619..8c4152b82d29 100644
--- a/source/include/acpi.h
+++ b/source/include/acpi.h
@@ -162,14 +162,14 @@
* Note: The order of these include files is important.
*/
#include "platform/acenv.h" /* Environment-specific items */
-#include "acnames.h" /* Common ACPI names and strings */
#include "actypes.h" /* ACPICA data types and structures */
+#include "platform/acenvex.h" /* Extra environment-specific items */
+#include "acnames.h" /* Common ACPI names and strings */
#include "acexcep.h" /* ACPICA exceptions */
#include "actbl.h" /* ACPI table definitions */
#include "acoutput.h" /* Error output and Debug macros */
#include "acrestyp.h" /* Resource Descriptor structs */
#include "acpiosxf.h" /* OSL interfaces (ACPICA-to-OS) */
#include "acpixf.h" /* ACPI core subsystem external interfaces */
-#include "platform/acenvex.h" /* Extra environment-specific items */
#endif /* __ACPI_H__ */
diff --git a/source/include/acpixf.h b/source/include/acpixf.h
index 7aad838661fd..7a24391df2fb 100644
--- a/source/include/acpixf.h
+++ b/source/include/acpixf.h
@@ -154,7 +154,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
-#define ACPI_CA_VERSION 0x20170629
+#define ACPI_CA_VERSION 0x20170728
#include "acconfig.h"
#include "actypes.h"
diff --git a/source/include/actbl2.h b/source/include/actbl2.h
index 1e91ffc51699..18cfdd465754 100644
--- a/source/include/actbl2.h
+++ b/source/include/actbl2.h
@@ -186,6 +186,7 @@
#define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */
#define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */
#define ACPI_SIG_MTMR "MTMR" /* MID Timer table */
+#define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */
#define ACPI_SIG_SLIC "SLIC" /* Software Licensing Description Table */
#define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */
#define ACPI_SIG_SPMI "SPMI" /* Server Platform Management Interface table */
@@ -1422,6 +1423,21 @@ typedef struct acpi_mtmr_entry
} ACPI_MTMR_ENTRY;
+/*******************************************************************************
+ *
+ * SDEI - Software Delegated Exception Interface Descriptor Table
+ *
+ * Conforms to "Software Delegated Exception Interface (SDEI)" ARM DEN0054A,
+ * May 8th, 2017. Copyright 2017 ARM Ltd.
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_sdei
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+
+} ACPI_TABLE_SDEI;
+
/*******************************************************************************
*
diff --git a/source/include/actypes.h b/source/include/actypes.h
index 843adec7f6b5..1839f936e4e5 100644
--- a/source/include/actypes.h
+++ b/source/include/actypes.h
@@ -276,6 +276,7 @@ typedef UINT64 ACPI_PHYSICAL_ADDRESS;
#define ACPI_MAX_PTR ACPI_UINT64_MAX
#define ACPI_SIZE_MAX ACPI_UINT64_MAX
#define ACPI_USE_NATIVE_DIVIDE /* Has native 64-bit integer support */
+#define ACPI_USE_NATIVE_MATH64 /* Has native 64-bit integer support */
/*
* In the case of the Itanium Processor Family (IPF), the hardware does not
@@ -675,6 +676,13 @@ 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))
+/*
+ * Algorithm to obtain access bit width.
+ * Can be used with AccessWidth of ACPI_GENERIC_ADDRESS and AccessSize of
+ * ACPI_RESOURCE_GENERIC_REGISTER.
+ */
+#define ACPI_ACCESS_BIT_WIDTH(size) (1 << ((size) + 2))
+
/*******************************************************************************
*
diff --git a/source/include/acutils.h b/source/include/acutils.h
index 46588a408115..bca4a94cd74e 100644
--- a/source/include/acutils.h
+++ b/source/include/acutils.h
@@ -845,7 +845,7 @@ ACPI_GENERIC_STATE *
AcpiUtCreatePkgState (
void *InternalObject,
void *ExternalObject,
- UINT16 Index);
+ UINT32 Index);
ACPI_STATUS
AcpiUtCreateUpdateStateAndPush (
@@ -879,6 +879,24 @@ AcpiUtShortDivide (
UINT64 *OutQuotient,
UINT32 *OutRemainder);
+ACPI_STATUS
+AcpiUtShortMultiply (
+ UINT64 InMultiplicand,
+ UINT32 Multiplier,
+ UINT64 *Outproduct);
+
+ACPI_STATUS
+AcpiUtShortShiftLeft (
+ UINT64 Operand,
+ UINT32 Count,
+ UINT64 *OutResult);
+
+ACPI_STATUS
+AcpiUtShortShiftRight (
+ UINT64 Operand,
+ UINT32 Count,
+ UINT64 *OutResult);
+
/*
* utmisc
diff --git a/source/include/platform/accygwin.h b/source/include/platform/accygwin.h
index c066e0f39565..2921c3436500 100644
--- a/source/include/platform/accygwin.h
+++ b/source/include/platform/accygwin.h
@@ -180,6 +180,7 @@
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#endif
#ifndef __cdecl
diff --git a/source/include/platform/acdragonfly.h b/source/include/platform/acdragonfly.h
index e8fe53ea1e68..c2dc09103b26 100644
--- a/source/include/platform/acdragonfly.h
+++ b/source/include/platform/acdragonfly.h
@@ -159,6 +159,7 @@
#else
#define ACPI_MACHINE_WIDTH 32
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#endif
#define ACPI_UINTPTR_T uintptr_t
diff --git a/source/include/platform/acefi.h b/source/include/platform/acefi.h
index 8437576b470f..648730377315 100644
--- a/source/include/platform/acefi.h
+++ b/source/include/platform/acefi.h
@@ -152,11 +152,24 @@
#ifndef __ACEFI_H__
#define __ACEFI_H__
+/*
+ * Single threaded environment where Mutex/Event/Sleep are fake. This model is
+ * sufficient for pre-boot AcpiExec.
+ */
+#ifndef DEBUGGER_THREADING
+#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED
+#endif /* !DEBUGGER_THREADING */
+
/* EDK2 EFI environemnt */
#if defined(_EDK2_EFI)
-#define _GNU_EFI
+#ifdef USE_STDLIB
+#define ACPI_USE_STANDARD_HEADERS
+#define ACPI_USE_SYSTEM_CLIBRARY
+#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
+#endif
#endif
@@ -194,8 +207,10 @@
#endif
+#ifndef USE_STDLIB
#define UINTN uint64_t
#define INTN int64_t
+#endif
#define ACPI_EFI_ERR(a) (0x8000000000000000 | a)
@@ -203,8 +218,10 @@
#define ACPI_MACHINE_WIDTH 32
+#ifndef USE_STDLIB
#define UINTN uint32_t
#define INTN int32_t
+#endif
#define ACPI_EFI_ERR(a) (0x80000000 | a)
@@ -326,26 +343,59 @@ UINT64 efi_call10(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
#endif
-/* GNU EFI definitions */
-
-#if defined(_GNU_EFI)
+/* EFI math64 definitions */
+#if defined(_GNU_EFI) || defined(_EDK2_EFI)
/*
- * Math helpers
+ * Math helpers, GNU EFI provided a platform independent 64-bit math
+ * support.
*/
-#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
+#ifndef ACPI_DIV_64_BY_32
+#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
+ do { \
+ UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
+ (q32) = (UINT32) DivU64x32 ((__n), (d32), &(r32)); \
+ } while (0)
+#endif
+
+#ifndef ACPI_MUL_64_BY_32
+#define ACPI_MUL_64_BY_32(n_hi, n_lo, m32, p32, c32) \
+ do { \
+ UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
+ UINT64 __p = MultU64x32 (__n, (m32)); \
+ (p32) = (UINT32) __p; \
+ (c32) = (UINT32) (__p >> 32); \
+ } while (0)
+#endif
+
+#ifndef ACPI_SHIFT_LEFT_64_by_32
+#define ACPI_SHIFT_LEFT_64_BY_32(n_hi, n_lo, s32) \
+ do { \
+ UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
+ UINT64 __r = LShiftU64 (__n, (s32)); \
+ (n_lo) = (UINT32) __r; \
+ (n_hi) = (UINT32) (__r >> 32); \
+ } while (0)
+#endif
+
+#ifndef ACPI_SHIFT_RIGHT_64_BY_32
+#define ACPI_SHIFT_RIGHT_64_BY_32(n_hi, n_lo, s32) \
do { \
UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
- (q32) = DivU64x32 ((__n), (d32), &(r32)); \
+ UINT64 __r = RShiftU64 (__n, (s32)); \
+ (n_lo) = (UINT32) __r; \
+ (n_hi) = (UINT32) (__r >> 32); \
} while (0)
+#endif
+#ifndef ACPI_SHIFT_RIGHT_64
#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
do { \
(n_lo) >>= 1; \
(n_lo) |= (((n_hi) & 1) << 31); \
(n_hi) >>= 1; \
} while (0)
-
+#endif
#endif
struct _ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE;
@@ -353,17 +403,21 @@ struct _ACPI_SIMPLE_INPUT_INTERFACE;
struct _ACPI_EFI_FILE_IO_INTERFACE;
struct _ACPI_EFI_FILE_HANDLE;
struct _ACPI_EFI_BOOT_SERVICES;
+struct _ACPI_EFI_RUNTIME_SERVICES;
struct _ACPI_EFI_SYSTEM_TABLE;
struct _ACPI_EFI_PCI_IO;
extern struct _ACPI_EFI_SYSTEM_TABLE *ST;
extern struct _ACPI_EFI_BOOT_SERVICES *BS;
+extern struct _ACPI_EFI_RUNTIME_SERVICES *RT;
+#ifndef USE_STDLIB
typedef union acpi_efi_file ACPI_EFI_FILE;
#define FILE ACPI_EFI_FILE
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
+#endif
#endif /* __ACEFI_H__ */
diff --git a/source/include/platform/acefiex.h b/source/include/platform/acefiex.h
index 2afde26b4698..a392fd269f50 100644
--- a/source/include/platform/acefiex.h
+++ b/source/include/platform/acefiex.h
@@ -597,6 +597,11 @@ ACPI_EFI_STATUS
typedef
ACPI_EFI_STATUS
+(ACPI_EFI_API *ACPI_EFI_STALL) (
+ UINTN Microseconds);
+
+typedef
+ACPI_EFI_STATUS
(ACPI_EFI_API *ACPI_EFI_SET_WATCHDOG_TIMER) (
UINTN Timeout,
UINT64 WatchdogCode,
@@ -665,6 +670,27 @@ ACPI_EFI_STATUS
/*
+ * EFI Time
+ */
+typedef struct {
+ UINT32 Resolution;
+ UINT32 Accuracy;
+ BOOLEAN SetsToZero;
+} ACPI_EFI_TIME_CAPABILITIES;
+
+typedef
+ACPI_EFI_STATUS
+(ACPI_EFI_API *ACPI_EFI_GET_TIME) (
+ ACPI_EFI_TIME *Time,
+ ACPI_EFI_TIME_CAPABILITIES *Capabilities);
+
+typedef
+ACPI_EFI_STATUS
+(ACPI_EFI_API *ACPI_EFI_SET_TIME) (
+ ACPI_EFI_TIME *Time);
+
+
+/*
* Protocol handler functions
*/
typedef enum {
@@ -890,12 +916,11 @@ typedef struct _ACPI_EFI_BOOT_SERVICES {
#if 0
ACPI_EFI_EXIT_BOOT_SERVICES ExitBootServices;
ACPI_EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount;
- ACPI_EFI_STALL Stall;
#else
ACPI_EFI_UNKNOWN_INTERFACE ExitBootServices;
ACPI_EFI_UNKNOWN_INTERFACE GetNextMonotonicCount;
- ACPI_EFI_UNKNOWN_INTERFACE Stall;
#endif
+ ACPI_EFI_STALL Stall;
ACPI_EFI_SET_WATCHDOG_TIMER SetWatchdogTimer;
#if 0
@@ -929,6 +954,54 @@ typedef struct _ACPI_EFI_BOOT_SERVICES {
/*
+ * EFI Runtime Services Table
+ */
+#define ACPI_EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
+#define ACPI_EFI_RUNTIME_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
+
+typedef struct _ACPI_EFI_RUNTIME_SERVICES {
+ ACPI_EFI_TABLE_HEADER Hdr;
+
+ ACPI_EFI_GET_TIME GetTime;
+ ACPI_EFI_SET_TIME SetTime;
+#if 0
+ ACPI_EFI_GET_WAKEUP_TIME GetWakeupTime;
+ ACPI_EFI_SET_WAKEUP_TIME SetWakeupTime;
+#else
+ ACPI_EFI_UNKNOWN_INTERFACE GetWakeupTime;
+ ACPI_EFI_UNKNOWN_INTERFACE SetWakeupTime;
+#endif
+
+#if 0
+ ACPI_EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap;
+ ACPI_EFI_CONVERT_POINTER ConvertPointer;
+#else
+ ACPI_EFI_UNKNOWN_INTERFACE SetVirtualAddressMap;
+ ACPI_EFI_UNKNOWN_INTERFACE ConvertPointer;
+#endif
+
+#if 0
+ ACPI_EFI_GET_VARIABLE GetVariable;
+ ACPI_EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName;
+ ACPI_EFI_SET_VARIABLE SetVariable;
+#else
+ ACPI_EFI_UNKNOWN_INTERFACE GetVariable;
+ ACPI_EFI_UNKNOWN_INTERFACE GetNextVariableName;
+ ACPI_EFI_UNKNOWN_INTERFACE SetVariable;
+#endif
+
+#if 0
+ ACPI_EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount;
+ ACPI_EFI_RESET_SYSTEM ResetSystem;
+#else
+ ACPI_EFI_UNKNOWN_INTERFACE GetNextHighMonotonicCount;
+ ACPI_EFI_UNKNOWN_INTERFACE ResetSystem;
+#endif
+
+} ACPI_EFI_RUNTIME_SERVICES;
+
+
+/*
* EFI System Table
*/
@@ -964,11 +1037,7 @@ typedef struct _ACPI_EFI_SYSTEM_TABLE {
ACPI_EFI_HANDLE StandardErrorHandle;
ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr;
-#if 0
ACPI_EFI_RUNTIME_SERVICES *RuntimeServices;
-#else
- ACPI_EFI_HANDLE *RuntimeServices;
-#endif
ACPI_EFI_BOOT_SERVICES *BootServices;
UINTN NumberOfTableEntries;
@@ -1051,19 +1120,34 @@ union acpi_efi_file {
};
-/* GNU EFI definitions */
+/* EFI definitions */
-#if defined(_GNU_EFI)
+#if defined(_GNU_EFI) || defined(_EDK2_EFI)
/*
* This is needed to hide platform specific code from ACPICA
*/
-UINT64
+UINT64 ACPI_EFI_API
DivU64x32 (
UINT64 Dividend,
UINTN Divisor,
UINTN *Remainder);
+UINT64 ACPI_EFI_API
+MultU64x32 (
+ UINT64 Multiplicand,
+ UINTN Multiplier);
+
+UINT64 ACPI_EFI_API
+LShiftU64 (
+ UINT64 Operand,
+ UINTN Count);
+
+UINT64 ACPI_EFI_API
+RShiftU64 (
+ UINT64 Operand,
+ UINTN Count);
+
/*
* EFI specific prototypes
*/
@@ -1077,7 +1161,6 @@ acpi_main (
int argc,
char *argv[]);
-
#endif
extern ACPI_EFI_GUID AcpiGbl_LoadedImageProtocol;
diff --git a/source/include/platform/acfreebsd.h b/source/include/platform/acfreebsd.h
index 40e58ab637d0..dc8aaa053ff5 100644
--- a/source/include/platform/acfreebsd.h
+++ b/source/include/platform/acfreebsd.h
@@ -169,6 +169,7 @@
#define ACPI_USE_DO_WHILE_0
#define ACPI_USE_LOCAL_CACHE
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#define ACPI_USE_SYSTEM_CLIBRARY
#ifdef _KERNEL
diff --git a/source/include/platform/acgcc.h b/source/include/platform/acgcc.h
index da719a7da97e..74c7108b4d91 100644
--- a/source/include/platform/acgcc.h
+++ b/source/include/platform/acgcc.h
@@ -192,4 +192,8 @@ typedef __builtin_va_list va_list;
#define COMPILER_VA_MACRO 1
+/* GCC supports native multiply/shift on 32-bit platforms */
+
+#define ACPI_USE_NATIVE_MATH64
+
#endif /* __ACGCC_H__ */
diff --git a/source/include/platform/achaiku.h b/source/include/platform/achaiku.h
index 150901584e74..0b948f02977f 100644
--- a/source/include/platform/achaiku.h
+++ b/source/include/platform/achaiku.h
@@ -166,6 +166,7 @@ struct mutex;
#define ACPI_MUTEX struct mutex *
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
/* #define ACPI_THREAD_ID thread_id */
diff --git a/source/include/platform/aclinux.h b/source/include/platform/aclinux.h
index b287e4d9373f..75b1d827bcf9 100644
--- a/source/include/platform/aclinux.h
+++ b/source/include/platform/aclinux.h
@@ -237,6 +237,7 @@
/* Host-dependent types and defines for in-kernel ACPICA */
#define ACPI_MACHINE_WIDTH BITS_PER_LONG
+#define ACPI_USE_NATIVE_MATH64
#define ACPI_EXPORT_SYMBOL(symbol) EXPORT_SYMBOL(symbol);
#define strtoul simple_strtoul
@@ -325,6 +326,7 @@
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#endif
#ifndef __cdecl
diff --git a/source/include/platform/acmsvc.h b/source/include/platform/acmsvc.h
index f540c7e5291d..315456be4351 100644
--- a/source/include/platform/acmsvc.h
+++ b/source/include/platform/acmsvc.h
@@ -161,30 +161,6 @@
* out if these are actually defined.
*/
-/*
- * Map low I/O functions for MS. This allows us to disable MS language
- * extensions for maximum portability.
- */
-#define open _open
-#define read _read
-#define write _write
-#define close _close
-#define stat _stat
-#define fstat _fstat
-#define mkdir _mkdir
-#define snprintf _snprintf
-#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
-#define vsnprintf _vsnprintf
-#endif
-#define O_RDONLY _O_RDONLY
-#define O_BINARY _O_BINARY
-#define O_CREAT _O_CREAT
-#define O_WRONLY _O_WRONLY
-#define O_TRUNC _O_TRUNC
-#define S_IREAD _S_IREAD
-#define S_IWRITE _S_IWRITE
-#define S_IFDIR _S_IFDIR
-
/* Eliminate warnings for "old" (non-secure) versions of clib functions */
#ifndef _CRT_SECURE_NO_WARNINGS
@@ -217,11 +193,11 @@
/* Do not maintain the architecture specific stuffs for the EFI ports */
-#if !defined(_EDK2_EFI) && !defined(_GNU_EFI)
-#ifndef _LINT
+#if defined(__i386__) && !defined(_GNU_EFI) && !defined(_EDK2_EFI)
/*
* Math helper functions
*/
+#ifndef ACPI_DIV_64_BY_32
#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
{ \
__asm mov edx, n_hi \
@@ -230,26 +206,52 @@
__asm mov q32, eax \
__asm mov r32, edx \
}
+#endif
-#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
+#ifndef ACPI_MUL_64_BY_32
+#define ACPI_MUL_64_BY_32(n_hi, n_lo, m32, p32, c32) \
{ \
- __asm shr n_hi, 1 \
- __asm rcr n_lo, 1 \
+ __asm mov edx, n_hi \
+ __asm mov eax, n_lo \
+ __asm mul m32 \
+ __asm mov p32, eax \
+ __asm mov c32, edx \
}
-#else
+#endif
-/* Fake versions to make lint happy */
+#ifndef ACPI_SHIFT_LEFT_64_BY_32
+#define ACPI_SHIFT_LEFT_64_BY_32(n_hi, n_lo, s32) \
+{ \
+ __asm mov edx, n_hi \
+ __asm mov eax, n_lo \
+ __asm mov ecx, s32 \
+ __asm and ecx, 31 \
+ __asm shld edx, eax, cl \
+ __asm shl eax, cl \
+ __asm mov n_hi, edx \
+ __asm mov n_lo, eax \
+}
+#endif
-#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
-{ \
- q32 = n_hi / d32; \
- r32 = n_lo / d32; \
+#ifndef ACPI_SHIFT_RIGHT_64_BY_32
+#define ACPI_SHIFT_RIGHT_64_BY_32(n_hi, n_lo, s32) \
+{ \
+ __asm mov edx, n_hi \
+ __asm mov eax, n_lo \
+ __asm mov ecx, s32 \
+ __asm and ecx, 31 \
+ __asm shrd eax, edx, cl \
+ __asm shr edx, cl \
+ __asm mov n_hi, edx \
+ __asm mov n_lo, eax \
}
+#endif
+#ifndef ACPI_SHIFT_RIGHT_64
#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
{ \
- n_hi >>= 1; \
- n_lo >>= 1; \
+ __asm shr n_hi, 1 \
+ __asm rcr n_lo, 1 \
}
#endif
#endif
diff --git a/source/include/platform/acnetbsd.h b/source/include/platform/acnetbsd.h
index 5c91c78c1976..893d12ff0270 100644
--- a/source/include/platform/acnetbsd.h
+++ b/source/include/platform/acnetbsd.h
@@ -178,6 +178,7 @@
#define asm __asm
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#define ACPI_SYSTEM_XFACE
#define ACPI_EXTERNAL_XFACE
@@ -215,5 +216,6 @@
/* Always use NetBSD code over our local versions */
#define ACPI_USE_SYSTEM_CLIBRARY
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#endif /* __ACNETBSD_H__ */
diff --git a/source/include/platform/acos2.h b/source/include/platform/acos2.h
index f77e46ca182c..f291037388af 100644
--- a/source/include/platform/acos2.h
+++ b/source/include/platform/acos2.h
@@ -164,6 +164,7 @@
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#define ACPI_SYSTEM_XFACE APIENTRY
#define ACPI_EXTERNAL_XFACE APIENTRY
diff --git a/source/include/platform/acqnx.h b/source/include/platform/acqnx.h
index 4a9bf9654d81..a40286e0be3e 100644
--- a/source/include/platform/acqnx.h
+++ b/source/include/platform/acqnx.h
@@ -174,5 +174,6 @@
#define __cdecl
#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#endif /* __ACQNX_H__ */
diff --git a/source/include/platform/acwin.h b/source/include/platform/acwin.h
index babea6b62344..c39eeec65d3e 100644
--- a/source/include/platform/acwin.h
+++ b/source/include/platform/acwin.h
@@ -156,6 +156,8 @@
#define ACPI_USE_SYSTEM_CLIBRARY
#define ACPI_MACHINE_WIDTH 32
+#define ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_NATIVE_MATH64
#ifdef ACPI_DEFINE_ALTERNATE_TYPES
/*
@@ -170,6 +172,30 @@ typedef unsigned int u32;
typedef COMPILER_DEPENDENT_UINT64 u64;
#endif
+/*
+ * Map low I/O functions for MS. This allows us to disable MS language
+ * extensions for maximum portability.
+ */
+#define open _open
+#define read _read
+#define write _write
+#define close _close
+#define stat _stat
+#define fstat _fstat
+#define mkdir _mkdir
+#define snprintf _snprintf
+#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
+#define vsnprintf _vsnprintf
+#endif
+#define O_RDONLY _O_RDONLY
+#define O_BINARY _O_BINARY
+#define O_CREAT _O_CREAT
+#define O_WRONLY _O_WRONLY
+#define O_TRUNC _O_TRUNC
+#define S_IREAD _S_IREAD
+#define S_IWRITE _S_IWRITE
+#define S_IFDIR _S_IFDIR
+
/*
* Handle platform- and compiler-specific assembly language differences.
diff --git a/source/include/platform/acwin64.h b/source/include/platform/acwin64.h
index be6db5cd40ed..f7a5906782d7 100644
--- a/source/include/platform/acwin64.h
+++ b/source/include/platform/acwin64.h
@@ -158,6 +158,30 @@
#define ACPI_MACHINE_WIDTH 64
/*
+ * Map low I/O functions for MS. This allows us to disable MS language
+ * extensions for maximum portability.
+ */
+#define open _open
+#define read _read
+#define write _write
+#define close _close
+#define stat _stat
+#define fstat _fstat
+#define mkdir _mkdir
+#define snprintf _snprintf
+#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
+#define vsnprintf _vsnprintf
+#endif
+#define O_RDONLY _O_RDONLY
+#define O_BINARY _O_BINARY
+#define O_CREAT _O_CREAT
+#define O_WRONLY _O_WRONLY
+#define O_TRUNC _O_TRUNC
+#define S_IREAD _S_IREAD
+#define S_IWRITE _S_IWRITE
+#define S_IFDIR _S_IFDIR
+
+/*
* Handle platform- and compiler-specific assembly language differences.
*
* Notes:
diff --git a/source/os_specific/service_layers/oslinuxtbl.c b/source/os_specific/service_layers/oslinuxtbl.c
index 4d2952e334dd..c36ea695143f 100644
--- a/source/os_specific/service_layers/oslinuxtbl.c
+++ b/source/os_specific/service_layers/oslinuxtbl.c
@@ -988,7 +988,7 @@ OslListBiosTables (
/* Skip NULL entries in RSDT/XSDT */
- if (!TableAddress)
+ if (TableAddress == 0)
{
continue;
}
@@ -1041,7 +1041,8 @@ OslGetBiosTable (
UINT8 NumberOfTables;
UINT8 ItemSize;
UINT32 CurrentInstance = 0;
- ACPI_PHYSICAL_ADDRESS TableAddress = 0;
+ ACPI_PHYSICAL_ADDRESS TableAddress;
+ ACPI_PHYSICAL_ADDRESS FirstTableAddress = 0;
UINT32 TableLength = 0;
ACPI_STATUS Status = AE_OK;
UINT32 i;
@@ -1055,10 +1056,10 @@ OslGetBiosTable (
ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) ||
ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
{
- if (Instance > 0)
- {
- return (AE_LIMIT);
- }
+
+FindNextInstance:
+
+ TableAddress = 0;
/*
* Get the appropriate address, either 32-bit or 64-bit. Be very
@@ -1067,28 +1068,34 @@ OslGetBiosTable (
*/
if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT))
{
- if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XDSDT) &&
- Gbl_Fadt->XDsdt)
+ if (CurrentInstance < 2)
{
- TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XDsdt;
- }
- else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_DSDT) &&
- Gbl_Fadt->Dsdt)
- {
- TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Dsdt;
+ if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XDSDT) &&
+ Gbl_Fadt->XDsdt && CurrentInstance == 0)
+ {
+ TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XDsdt;
+ }
+ else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_DSDT) &&
+ Gbl_Fadt->Dsdt != FirstTableAddress)
+ {
+ TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Dsdt;
+ }
}
}
else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
{
- if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XFACS) &&
- Gbl_Fadt->XFacs)
+ if (CurrentInstance < 2)
{
- TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XFacs;
- }
- else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_FACS) &&
- Gbl_Fadt->Facs)
- {
- TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Facs;
+ if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XFACS) &&
+ Gbl_Fadt->XFacs && CurrentInstance == 0)
+ {
+ TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XFacs;
+ }
+ else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_FACS) &&
+ Gbl_Fadt->Facs != FirstTableAddress)
+ {
+ TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Facs;
+ }
}
}
else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_XSDT))
@@ -1097,16 +1104,32 @@ OslGetBiosTable (
{
return (AE_BAD_SIGNATURE);
}
- TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.XsdtPhysicalAddress;
+ if (CurrentInstance == 0)
+ {
+ TableAddress =
+ (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.XsdtPhysicalAddress;
+ }
}
else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_RSDT))
{
- TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.RsdtPhysicalAddress;
+ if (CurrentInstance == 0)
+ {
+ TableAddress =
+ (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.RsdtPhysicalAddress;
+ }
}
else
{
- TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_RsdpAddress;
- Signature = ACPI_SIG_RSDP;
+ if (CurrentInstance == 0)
+ {
+ TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_RsdpAddress;
+ Signature = ACPI_SIG_RSDP;
+ }
+ }
+
+ if (TableAddress == 0)
+ {
+ goto ExitFindTable;
}
/* Now we can get the requested special table */
@@ -1118,6 +1141,20 @@ OslGetBiosTable (
}
TableLength = ApGetTableLength (MappedTable);
+ if (FirstTableAddress == 0)
+ {
+ FirstTableAddress = TableAddress;
+ }
+
+ /* Match table instance */
+
+ if (CurrentInstance != Instance)
+ {
+ OslUnmapTable (MappedTable);
+ MappedTable = NULL;
+ CurrentInstance++;
+ goto FindNextInstance;
+ }
}
else /* Case for a normal ACPI table */
{
@@ -1155,7 +1192,7 @@ OslGetBiosTable (
/* Skip NULL entries in RSDT/XSDT */
- if (!TableAddress)
+ if (TableAddress == 0)
{
continue;
}
@@ -1190,6 +1227,8 @@ OslGetBiosTable (
}
}
+ExitFindTable:
+
if (!MappedTable)
{
return (AE_LIMIT);
diff --git a/source/tools/acpidump/apfiles.c b/source/tools/acpidump/apfiles.c
index 9f7c80c42040..70b73d206460 100644
--- a/source/tools/acpidump/apfiles.c
+++ b/source/tools/acpidump/apfiles.c
@@ -175,7 +175,7 @@ static int
ApIsExistingFile (
char *Pathname)
{
-#ifndef _GNU_EFI
+#if !defined(_GNU_EFI) && !defined(_EDK2_EFI)
struct stat StatInfo;
diff --git a/source/tools/acpidump/apmain.c b/source/tools/acpidump/apmain.c
index 60ee23dcde17..6491fe9e51a2 100644
--- a/source/tools/acpidump/apmain.c
+++ b/source/tools/acpidump/apmain.c
@@ -440,7 +440,7 @@ ApDoOptions (
*
******************************************************************************/
-#ifndef _GNU_EFI
+#if !defined(_GNU_EFI) && !defined(_EDK2_EFI)
int ACPI_SYSTEM_XFACE
main (
int argc,
diff --git a/source/tools/acpihelp/ahaslkey.c b/source/tools/acpihelp/ahaslkey.c
index 124583b7a969..3474b4011d53 100644
--- a/source/tools/acpihelp/ahaslkey.c
+++ b/source/tools/acpihelp/ahaslkey.c
@@ -295,6 +295,7 @@ const AH_DIRECTIVE_INFO Gbl_PreprocessorDirectives[] =
{"__PATH__", "Return the full pathname of the current ASL file"},
{"__LINE__", "Return the current line number within the current ASL file"},
{"__DATE__", "Return the current date"},
+ {"__METHOD__", "Return the declared name of the current control method"},
{"__IASL__", "Permanently defined for the iASL compiler"},
{NULL, NULL}
};
diff --git a/source/tools/efihello/efihello.c b/source/tools/efihello/efihello.c
index b4783b59f137..ed3dc7e79df3 100644
--- a/source/tools/efihello/efihello.c
+++ b/source/tools/efihello/efihello.c
@@ -169,7 +169,7 @@ static char LineBuffer[LINE_SIZE];
*
******************************************************************************/
-#ifndef _GNU_EFI
+#if !defined(_GNU_EFI) && !defined(_EDK2_EFI)
int ACPI_SYSTEM_XFACE
main (
int argc,
diff --git a/tests/misc/grammar.asl b/tests/misc/grammar.asl
index 8ace87f84f46..981c74e341a9 100644
--- a/tests/misc/grammar.asl
+++ b/tests/misc/grammar.asl
@@ -946,7 +946,7 @@ DefinitionBlock (
Notify (\_PR.CPU0, 0)
}
- Method (_ERR, 2)
+ Method (_ERR, 3)
{
Increment (ERRS)
Store ("Run-time exception:", Debug)