From 097035956ee55f899bf466ff0c1a52deec2ab29f Mon Sep 17 00:00:00 2001 From: Al Stone Date: May 29 2013 02:33:12 +0000 Subject: Imported Upstream version 20130517 --- diff --git a/changes.txt b/changes.txt index dd8b806..a16fc69 100755 --- a/changes.txt +++ b/changes.txt @@ -1,4 +1,191 @@ ---------------------------------------- +17 May 2013. Summary of changes for version 20130517: + +1) ACPICA kernel-resident subsystem: + +Fixed a regression introduced in version 20130328 for _INI methods. This +change fixes a problem introduced in 20130328 where _INI methods are no +longer executed properly because of a memory block that was not +initialized correctly. ACPICA BZ 1016. Tomasz Nowicki +. + +Fixed a possible problem with the new extended sleep registers in the ACPI +5.0 FADT. Do not use these registers (even if populated) unless the HW- +reduced bit is set in the FADT (as per the ACPI specification). ACPICA BZ +1020. Lv Zheng. + +Implemented return value repair code for _CST predefined objects: Sort the +list and detect/remove invalid entries. ACPICA BZ 890. Lv Zheng. + +Implemented a debug-only option to disable loading of SSDTs from the +RSDT/XSDT during ACPICA initialization. This can be useful for debugging +ACPI problems on some machines. Set AcpiGbl_DisableSsdtTableLoad in +acglobal.h - ACPICA BZ 1005. Lv Zheng. + +Fixed some issues in the ACPICA initialization and termination code: +Tomasz Nowicki +1) Clear events initialized flag upon event component termination. ACPICA +BZ 1013. +2) Fixed a possible memory leak in GPE init error path. ACPICA BZ 1018. +3) Delete global lock pending lock during termination. ACPICA BZ 1012. +4) Clear debug buffer global on termination to prevent possible multiple +delete. ACPICA BZ 1010. + +Standardized all switch() blocks across the entire source base. After many +years, different formatting for switch() had crept in. This change makes +the formatting of every switch block identical. ACPICA BZ 997. Chao Guan. + +Split some files to enhance ACPICA modularity and configurability: +1) Split buffer dump routines into utilities/utbuffer.c +2) Split internal error message routines into utilities/uterror.c +3) Split table print utilities into tables/tbprint.c +4) Split iASL command-line option processing into asloptions.c + +Makefile enhancements: +1) Support for all new files above. +2) Abort make on errors from any subcomponent. Chao Guan. +3) Add build support for Apple Mac OS X. Liang Qi. + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 9.0 32-bit compiler. The +debug version of the code includes the debug output trace mechanism and +has a much larger code and data size. + + Current Release: + Non-Debug Version: 96.0K Code, 27.0K Data, 123.0K Total + Debug Version: 184.1K Code, 76.8K Data, 260.9K Total + Previous Release: + Non-Debug Version: 95.6K Code, 26.8K Data, 122.4K Total + Debug Version: 183.5K Code, 76.6K Data, 260.1K Total + + +2) iASL Compiler/Disassembler and Tools: + +New utility: Implemented an easily portable version of the acpidump +utility to extract ACPI tables from the system (or a file) in an ASCII hex +dump format. The top-level code implements the various command line +options, file I/O, and table dump routines. To port to a new host, only +three functions need to be implemented to get tables -- since this +functionality is OS-dependent. See the tools/acpidump/apmain.c module and +the ACPICA reference for porting instructions. ACPICA BZ 859. Notes: +1) The Windows version obtains the ACPI tables from the Registry. +2) The Linux version is under development. +3) Other hosts - If an OS-dependent module is submitted, it will be +distributed with ACPICA. + +iASL: Fixed a regression for -D preprocessor option (define symbol). A +restructuring/change to the initialization sequence caused this option to +no longer work properly. + +iASL: Implemented a mechanism to disable specific warnings and remarks. +Adds a new command line option, "-vw as well as "#pragma +disable ". ACPICA BZ 989. Chao Guan, Bob Moore. + +iASL: Fix for too-strict package object validation. The package object +validation for return values from the predefined names is a bit too +strict, it does not allow names references within the package (which will +be resolved at runtime.) These types of references cannot be validated at +compile time. This change ignores named references within package objects +for names that return or define static packages. + +Debugger: Fixed the 80-character command line limitation for the History +command. Now allows lines of arbitrary length. ACPICA BZ 1000. Chao Guan. + +iASL: Added control method and package support for the -so option +(generates AML offset table for BIOS support.) + +iASL: issue a remark if a non-serialized method creates named objects. If +a thread blocks within the method for any reason, and another thread +enters the method, the method will fail because an attempt will be made to +create the same (named) object twice. In this case, issue a remark that +the method should be marked serialized. NOTE: may become a warning later. +ACPICA BZ 909. + +---------------------------------------- +18 April 2013. Summary of changes for version 20130418: + +1) ACPICA kernel-resident subsystem: + +Fixed a possible buffer overrun during some rare but specific field unit +read operations. This overrun can only happen if the DSDT version is 1 -- +meaning that all AML integers are 32 bits -- and the field length is +between 33 and 55 bits long. During the read, an internal buffer object is +created for the field unit because the field is larger than an integer (32 +bits). However, in this case, the buffer will be incorrectly written +beyond the end because the buffer length is less than the internal minimum +of 64 bits (8 bytes) long. The buffer will be either 5, 6, or 7 bytes +long, but a full 8 bytes will be written. + +Updated the Embedded Controller "orphan" _REG method support. This refers +to _REG methods under the EC device that have no corresponding operation +region. This is allowed by the ACPI specification. This update removes a +dependency on the existence an ECDT table. It will execute an orphan _REG +method as long as the operation region handler for the EC is installed at +the EC device node and not the namespace root. Rui Zhang (original +update), Bob Moore (update/integrate). + +Implemented run-time argument typechecking for all predefined ACPI names +(_STA, _BIF, etc.) This change performs object typechecking on all +incoming arguments for all predefined names executed via +AcpiEvaluateObject. This ensures that ACPI-related device drivers are +passing correct object types as well as the correct number of arguments +(therefore identifying any issues immediately). Also, the ASL/namespace +definition of the predefined name is checked against the ACPI +specification for the proper argument count. Adds one new file, +nsarguments.c + +Changed an exception code for the ASL UnLoad() operator. Changed the +exception code for the case where the input DdbHandle is invalid, from +AE_BAD_PARAMETER to the more appropriate AE_AML_OPERAND_TYPE. + +Unix/Linux makefiles: Removed the use of the -O2 optimization flag in the +global makefile. The use of this flag causes compiler errors on earlier +versions of GCC, so it has been removed for compatibility. + +Miscellaneous cleanup: +1) Removed some unused/obsolete macros +2) Fixed a possible memory leak in the _OSI support +3) Removed an unused variable in the predefined name support +4) Windows OSL: remove obsolete reference to a memory list field + +Example Code and Data Size: These are the sizes for the OS-independent +acpica.lib produced by the Microsoft Visual C++ 9.0 32-bit compiler. The +debug version of the code includes the debug output trace mechanism and +has a much larger code and data size. + + Current Release: + Non-Debug Version: 95.2K Code, 26.4K Data, 121.6K Total + Debug Version: 183.0K Code, 76.0K Data, 259.0K Total + Previous Release: + Non-Debug Version: 95.6K Code, 26.8K Data, 122.4K Total + Debug Version: 183.5K Code, 76.6K Data, 260.1K Total + + +2) iASL Compiler/Disassembler and Tools: + +AcpiExec: Added installation of a handler for the SystemCMOS address +space. This prevents control method abort if a method accesses this space. + +AcpiExec: Added support for multiple EC devices, and now install EC +operation region handler(s) at the actual EC device instead of the +namespace root. This reflects the typical behavior of host operating +systems. + +AcpiExec: Updated to ensure that all operation region handlers are +installed before the _REG methods are executed. This prevents a _REG +method from aborting if it accesses an address space has no handler. +AcpiExec installs a handler for every possible address space. + +Debugger: Enhanced the "handlers" command to display non-root handlers. +This change enhances the handlers command to display handlers associated +with individual devices throughout the namespace, in addition to the +currently supported display of handlers associated with the root namespace +node. + +ASL Test Suite: Several test suite errors have been identified and +resolved, reducing the total error count during execution. Chao Guan. + +---------------------------------------- 28 March 2013. Summary of changes for version 20130328: 1) ACPICA kernel-resident subsystem: diff --git a/generate/release/build.sh b/generate/release/build.sh index dccad34..5b8cd75 100755 --- a/generate/release/build.sh +++ b/generate/release/build.sh @@ -213,6 +213,7 @@ generate_source_package () mkdir $TEMP_DIR/generate/release mkdir $TEMP_DIR/generate/unix mkdir $TEMP_DIR/generate/unix/acpibin + mkdir $TEMP_DIR/generate/unix/acpidump mkdir $TEMP_DIR/generate/unix/acpiexec mkdir $TEMP_DIR/generate/unix/acpihelp mkdir $TEMP_DIR/generate/unix/acpinames @@ -258,6 +259,7 @@ generate_source_package () cp generate/unix/readme.txt $TEMP_DIR/generate/unix/readme.txt cp generate/unix/Makefile* $TEMP_DIR/generate/unix cp generate/unix/acpibin/Makefile $TEMP_DIR/generate/unix/acpibin + cp generate/unix/acpidump/Makefile $TEMP_DIR/generate/unix/acpidump cp generate/unix/acpiexec/Makefile $TEMP_DIR/generate/unix/acpiexec cp generate/unix/acpihelp/Makefile $TEMP_DIR/generate/unix/acpihelp cp generate/unix/acpinames/Makefile $TEMP_DIR/generate/unix/acpinames @@ -405,6 +407,7 @@ generate_binary_package() cp -r documents/changes.txt $TEMP_DIR/changes.txt cp documents/aslcompiler.pdf $TEMP_DIR cp libraries/acpibin.exe $TEMP_DIR + cp libraries/acpidump.exe $TEMP_DIR cp libraries/acpiexec.exe $TEMP_DIR cp libraries/acpihelp.exe $TEMP_DIR cp libraries/acpinames.exe $TEMP_DIR diff --git a/generate/unix/Makefile.common b/generate/unix/Makefile.common index 69e9806..a0e26ba 100644 --- a/generate/unix/Makefile.common +++ b/generate/unix/Makefile.common @@ -7,7 +7,6 @@ # string will be treated as a 64-bit OS. Otherwise, the default is 32-bit. # HARDWARE_NAME := $(shell uname -m) -BITS=0 # # Main rule will only generate versions that are appropriate for the running @@ -16,73 +15,54 @@ BITS=0 all: ${PROGS} ${PROGS}: FORCE @cd $(BUILD_DIRECTORY_PATH)/$@; \ - if [ $(BITS) -eq 32 ]; then \ - echo "Forced 32-bit generation of $@"; \ - mkdir -p obj32; \ - make BITS=32; \ - echo "32-bit version of $@:"; \ - ls -al ../bin32/$@; \ - elif [ $(findstring 64,$(HARDWARE_NAME)) ]; then \ - mkdir -p obj64; \ - make BITS=64; \ + mkdir -p obj; \ + make || exit "$$?"; \ + if [ $(findstring 64,$(HARDWARE_NAME)) ]; then \ echo "64-bit version of $@:"; \ - ls -al ../bin64/$@; \ else \ - mkdir -p obj32; \ - make BITS=32; \ echo "32-bit version of $@:"; \ - ls -al ../bin32/$@; \ - fi; - -# -# Make 32-bit and 64-bit versions of all the tools -# -both: 32 64 + fi; \ + ls -al ../bin/$@; \ + echo ""; # -# Make only 32-bit versions of all the tools +# Simple clean removes all .obj files, but leaves the executables +# in the local bin directory # -32: FORCE +clean: FORCE @for toolname in ${PROGS}; do \ (cd $(BUILD_DIRECTORY_PATH)/$$toolname; \ - pwd; \ - mkdir -p obj32; \ - make BITS=32; \ - echo "32-bit version of $$toolname:"; \ - ls -al obj32/$$toolname \ + if [ -d "obj" ] ; then \ + echo "Removing $$toolname:"; \ + pwd; \ + make clean; \ + rmdir obj; \ + echo ""; \ + fi; \ ); \ done; # -# Make only 64-bit versions of all the tools +# Very clean removes all executables and the local bin directory # -64: FORCE +veryclean: FORCE @for toolname in ${PROGS}; do \ (cd $(BUILD_DIRECTORY_PATH)/$$toolname; \ - pwd; \ - mkdir -p obj64; \ - make BITS=64; \ - echo "64-bit version of $$toolname:"; \ - ls -al obj64/$$toolname \ - ); \ - done; - -clean: FORCE - @for toolname in ${PROGS}; do \ - (cd $(BUILD_DIRECTORY_PATH)/$$toolname; \ - echo "Removing $$toolname"; \ - pwd; \ - if [ -d "obj32" ] ; then \ - make BITS=32 clean; \ - rmdir obj32; \ + if [ -d "obj" ] ; then \ + echo "Removing $$toolname:"; \ + pwd; \ + make clean; \ + rmdir obj; \ + echo ""; \ fi; \ - if [ -d "obj64" ] ; then \ - make BITS=64 clean; \ - rmdir obj64; \ - fi; \ - echo ""; \ ); \ - done; + if [ -e "$(BUILD_DIRECTORY_PATH)/bin/$$toolname" ] ; then \ + rm $(BUILD_DIRECTORY_PATH)/bin/$$toolname; \ + fi; \ + done; \ + if [ -d "bin" ] ; then \ + rmdir bin; \ + fi; # # Install all tools, either 32-bit or 64-bit as appropriate for the host OS @@ -91,11 +71,10 @@ install: FORCE @for toolname in ${PROGS}; do \ (cd $(BUILD_DIRECTORY_PATH)/$$toolname; \ pwd; \ + make PROG=$$toolname install; \ if [ $(findstring 64,$(HARDWARE_NAME)) ]; then \ - make BITS=64 PROG=$$toolname install; \ echo "Installed 64-bit version of $$toolname"; \ else \ - make BITS=32 PROG=$$toolname install; \ echo "Installed 32-bit version of $$toolname"; \ fi; \ echo ""; \ diff --git a/generate/unix/Makefile.config b/generate/unix/Makefile.config index 65242e0..390a464 100644 --- a/generate/unix/Makefile.config +++ b/generate/unix/Makefile.config @@ -24,28 +24,36 @@ # adding OPT_CFLAGS="..." to the invocation. # # Notes: -# $(BITS) must be set to either 32 or 64 # gcc should be version 4 or greater, otherwise some of the options -# used will not be recognized. -# Global optimization flags (such as -O2, -Os) may cause issues on -# some compilers. -# The _GNU_SOURCE symbol is required for many hosts. +# used will not be recognized. +# Optional: Change HOST to an appropriate value (_LINUX, __FreeBSD__, etc.) +# See include/platform/acenv.h for supported values. +# Note: HOST is not nearly as important for applications as it +# is for the kernel-resident version of ACPICA, and it may +# not be necessary to change it. # .SUFFIXES : -PROGS = acpibin acpiexec acpihelp acpinames acpisrc acpixtract iasl -HOST = _CYGWIN +PROGS = acpibin acpidump acpiexec acpihelp acpinames acpisrc acpixtract iasl +HOST ?= _CYGWIN CC = gcc # # Common defines # -OBJDIR = obj$(BITS) -BINDIR = bin$(BITS) -BITSFLAG = -m$(BITS) +OBJDIR = obj +BINDIR = bin COMPILEOBJ = $(CC) -c $(CFLAGS) $(OPT_CFLAGS) -o $@ $< LINKPROG = $(CC) $(OBJECTS) -o $(PROG) $(LDFLAGS) -INSTALLDIR = /usr/bin -INSTALLPROG = install -D ../$(BINDIR)/$(PROG) $(DESTDIR)$(INSTALLDIR)/$(PROG) +PREFIX ?= /usr +INSTALLDIR = $(PREFIX)/bin + +ifneq ($(HOST), _APPLE) + INSTALLPROG = install -D ../$(BINDIR)/$(PROG) $(DESTDIR)$(INSTALLDIR)/$(PROG) +else + INSTALLPROG = \ + test -d $(DESTDIR)$(INSTALLDIR) || mkdir -p $(DESTDIR)$(INSTALLDIR); \ + cp -f ../$(BINDIR)/$(PROG) $(DESTDIR)$(INSTALLDIR)/$(PROG) +endif # # Rename a .exe file if necessary @@ -57,11 +65,11 @@ RENAMEPROG = \ fi; # -# Copy the final file to the local bin[32|64] directory +# Copy the final executable to the local bin directory # COPYPROG = \ @mkdir -p ../$(BINDIR); \ - cp --remove-destination $(PROG) ../$(BINDIR); \ + cp -f $(PROG) ../$(BINDIR); \ echo "Copied $(PROG) to $(FINAL_PROG)"; # @@ -89,6 +97,7 @@ ACPICA_UTILITIES = $(ACPICA_CORE)/utilities # ACPICA tool and utility source directories # ACPIBIN = $(ACPICA_TOOLS)/acpibin +ACPIDUMP = $(ACPICA_TOOLS)/acpidump ACPIEXEC = $(ACPICA_TOOLS)/acpiexec ACPIHELP = $(ACPICA_TOOLS)/acpihelp ACPINAMES = $(ACPICA_TOOLS)/acpinames @@ -106,19 +115,20 @@ ACPICA_HEADERS = \ # # Common compiler flags # +# Flags/option notes: +# Global optimization flags (such as -O2, -Os) are not used, +# since they cause issues on some compilers (such as gcc 4.4) +# The _GNU_SOURCE symbol is required for many hosts. +# OPT_CFLAGS ?= \ -D_FORTIFY_SOURCE=2\ - -O2\ $(CWARNINGFLAGS) CFLAGS += \ - $(BITSFLAG)\ -D$(HOST)\ -D_GNU_SOURCE\ -I$(ACPICA_INCLUDE) -LDFLAGS += $(BITSFLAG) - # # Common compiler warning flags. The warning flags in addition # to -Wall are not automatically included in -Wall. @@ -139,22 +149,29 @@ CWARNINGFLAGS = \ -Wundef # -# Additional gcc 4+ warning flags +# Common gcc 4+ warning flags # CWARNINGFLAGS += \ -Waddress\ -Waggregate-return\ -Wchar-subscripts\ -Wempty-body\ - -Wlogical-op\ -Wmissing-declarations\ -Wmissing-field-initializers\ - -Wmissing-parameter-type\ -Wnested-externs\ - -Wold-style-declaration\ -Wold-style-definition\ - -Wredundant-decls\ + -Wredundant-decls + +# +# Additional gcc 4+ flags +# +ifneq ($(HOST), _APPLE) +CWARNINGFLAGS += \ + -Wlogical-op\ + -Wmissing-parameter-type\ + -Wold-style-declaration\ -Wtype-limits +endif # # Extra warning flags (for possible future use) diff --git a/generate/unix/Makefile.rules b/generate/unix/Makefile.rules index 2ec8b8b..788b56a 100644 --- a/generate/unix/Makefile.rules +++ b/generate/unix/Makefile.rules @@ -1,7 +1,7 @@ # # Common rules for generation of ACPICA utilities # -# FINAL_PROG - Copies the utility to the local binXX directory (32/64) +# FINAL_PROG - Copies the utility to the local bin directory # PROG - Builds the utility (links the object files) # # Note: $(INTERMEDIATES) and $(MISC) are used for iASL compiler only. diff --git a/generate/unix/acpibin/Makefile b/generate/unix/acpibin/Makefile index 1f6eb80..2a5aff6 100644 --- a/generate/unix/acpibin/Makefile +++ b/generate/unix/acpibin/Makefile @@ -30,8 +30,8 @@ OBJECTS = \ $(OBJDIR)/abcompare.o\ $(OBJDIR)/abmain.o\ $(OBJDIR)/utalloc.o\ + $(OBJDIR)/utbuffer.o\ $(OBJDIR)/utcache.o\ - $(OBJDIR)/utdebug.o\ $(OBJDIR)/utdecode.o\ $(OBJDIR)/utexcep.o\ $(OBJDIR)/utglobal.o\ diff --git a/generate/unix/acpidump/Makefile b/generate/unix/acpidump/Makefile new file mode 100644 index 0000000..637ef33 --- /dev/null +++ b/generate/unix/acpidump/Makefile @@ -0,0 +1,53 @@ +# +# acpidump - ACPI table dump utility (binary to ascii hex) +# + +# +# Note: This makefile is intended to be used from within the native +# ACPICA directory structure, from under generate/unix. It specifically +# places all object files in a generate/unix subdirectory, not within +# the various ACPICA source directories. This prevents collisions +# between different compilations of the same source file with different +# compile options, and prevents pollution of the source code. +# +include ../Makefile.config +FINAL_PROG = ../$(BINDIR)/acpidump +PROG = $(OBJDIR)/acpidump + +# +# Search paths for source files +# +vpath %.c \ + $(ACPIDUMP)\ + $(ACPICA_TABLES)\ + $(ACPICA_UTILITIES)\ + $(ACPICA_COMMON)\ + $(ACPICA_OSL) + +HEADERS = \ + $(wildcard $(ACPIDUMP)/*.h) + +OBJECTS = \ + $(OBJDIR)/apdump.o\ + $(OBJDIR)/apfiles.o\ + $(OBJDIR)/apmain.o\ + $(OBJDIR)/tbprint.o\ + $(OBJDIR)/utbuffer.o\ + $(OBJDIR)/utexcep.o\ + $(OBJDIR)/utmath.o\ + $(OBJDIR)/utstring.o\ + $(OBJDIR)/utxferror.o\ + $(OBJDIR)/oslinuxtbl.o\ + $(OBJDIR)/getopt.o + +# +# Flags specific to acpidump +# +CFLAGS += \ + -DACPI_DUMP_APP\ + -I$(ACPIDUMP) + +# +# Common Rules +# +include ../Makefile.rules diff --git a/generate/unix/acpiexec/Makefile b/generate/unix/acpiexec/Makefile index c6bd910..706ec41 100644 --- a/generate/unix/acpiexec/Makefile +++ b/generate/unix/acpiexec/Makefile @@ -131,6 +131,7 @@ OBJECTS = \ $(OBJDIR)/hwxfsleep.o\ $(OBJDIR)/nsaccess.o\ $(OBJDIR)/nsalloc.o\ + $(OBJDIR)/nsarguments.o\ $(OBJDIR)/nsconvert.o\ $(OBJDIR)/nsdump.o\ $(OBJDIR)/nsdumpdv.o\ @@ -179,17 +180,20 @@ OBJECTS = \ $(OBJDIR)/tbfadt.o\ $(OBJDIR)/tbfind.o\ $(OBJDIR)/tbinstal.o\ + $(OBJDIR)/tbprint.o\ $(OBJDIR)/tbutils.o\ $(OBJDIR)/tbxface.o\ $(OBJDIR)/tbxfload.o\ $(OBJDIR)/tbxfroot.o\ $(OBJDIR)/utaddress.o\ $(OBJDIR)/utalloc.o\ + $(OBJDIR)/utbuffer.o\ $(OBJDIR)/utcache.o\ $(OBJDIR)/utcopy.o\ $(OBJDIR)/utdebug.o\ $(OBJDIR)/utdecode.o\ $(OBJDIR)/utdelete.o\ + $(OBJDIR)/uterror.o\ $(OBJDIR)/uteval.o\ $(OBJDIR)/utexcep.o\ $(OBJDIR)/utglobal.o\ @@ -219,7 +223,11 @@ CFLAGS += \ -DACPI_EXEC_APP\ -I$(ACPIEXEC) -LDFLAGS += -lpthread -lrt +LDFLAGS += -lpthread + +ifneq ($(HOST),_APPLE) +LDFLAGS += -lrt +endif # # Common Rules diff --git a/generate/unix/acpinames/Makefile b/generate/unix/acpinames/Makefile index 98d9586..1438200 100644 --- a/generate/unix/acpinames/Makefile +++ b/generate/unix/acpinames/Makefile @@ -82,6 +82,7 @@ OBJECTS = \ $(OBJDIR)/tbfadt.o\ $(OBJDIR)/tbfind.o\ $(OBJDIR)/tbinstal.o\ + $(OBJDIR)/tbprint.o\ $(OBJDIR)/tbutils.o\ $(OBJDIR)/tbxface.o\ $(OBJDIR)/tbxfload.o\ @@ -92,6 +93,7 @@ OBJECTS = \ $(OBJDIR)/utdebug.o\ $(OBJDIR)/utdecode.o\ $(OBJDIR)/utdelete.o\ + $(OBJDIR)/uterror.o\ $(OBJDIR)/utexcep.o\ $(OBJDIR)/utglobal.o\ $(OBJDIR)/utlock.o\ diff --git a/generate/unix/iasl/Makefile b/generate/unix/iasl/Makefile index e7761c2..931620a 100644 --- a/generate/unix/iasl/Makefile +++ b/generate/unix/iasl/Makefile @@ -69,6 +69,7 @@ OBJECTS = \ $(OBJDIR)/aslopcodes.o\ $(OBJDIR)/asloperands.o\ $(OBJDIR)/aslopt.o\ + $(OBJDIR)/asloptions.o\ $(OBJDIR)/aslpredef.o\ $(OBJDIR)/aslprepkg.o\ $(OBJDIR)/aslresource.o\ @@ -172,15 +173,18 @@ OBJECTS = \ $(OBJDIR)/pswalk.o\ $(OBJDIR)/tbfadt.o\ $(OBJDIR)/tbinstal.o\ + $(OBJDIR)/tbprint.o\ $(OBJDIR)/tbutils.o\ $(OBJDIR)/tbxface.o\ $(OBJDIR)/utaddress.o\ $(OBJDIR)/utalloc.o\ + $(OBJDIR)/utbuffer.o\ $(OBJDIR)/utcache.o\ $(OBJDIR)/utcopy.o\ $(OBJDIR)/utdebug.o\ $(OBJDIR)/utdecode.o\ $(OBJDIR)/utdelete.o\ + $(OBJDIR)/uterror.o\ $(OBJDIR)/utexcep.o\ $(OBJDIR)/utglobal.o\ $(OBJDIR)/utinit.o\ diff --git a/source/common/adisasm.c b/source/common/adisasm.c index 511366f..fd20a22 100644 --- a/source/common/adisasm.c +++ b/source/common/adisasm.c @@ -628,10 +628,12 @@ AdCreateTableHeader ( switch (Table->Revision) { case 0: + AcpiOsPrintf (" **** Invalid Revision"); break; case 1: + /* Revision of DSDT controls the ACPI integer width */ if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT)) @@ -641,6 +643,7 @@ AdCreateTableHeader ( break; default: + break; } AcpiOsPrintf ("\n"); diff --git a/source/common/adwalk.c b/source/common/adwalk.c index 0a3a848..5ba7922 100644 --- a/source/common/adwalk.c +++ b/source/common/adwalk.c @@ -375,14 +375,17 @@ AcpiDmDumpDescending ( case AML_BYTE_OP: case AML_WORD_OP: case AML_DWORD_OP: + AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer); break; case AML_QWORD_OP: + AcpiOsPrintf ("%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); break; case AML_INT_NAMEPATH_OP: + if (Op->Common.Value.String) { AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String, @@ -400,10 +403,12 @@ AcpiDmDumpDescending ( case AML_METHOD_OP: case AML_DEVICE_OP: case AML_INT_NAMEDFIELD_OP: + AcpiOsPrintf ("%4.4s", ACPI_CAST_PTR (char, &Op->Named.Name)); break; default: + break; } @@ -450,6 +455,7 @@ AcpiDmFindOrphanDescending ( { #ifdef ACPI_UNDER_DEVELOPMENT case AML_ADD_OP: + ChildOp = Op->Common.Value.Arg; if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) && !ChildOp->Common.Node) @@ -556,6 +562,7 @@ AcpiDmFindOrphanDescending ( break; default: + break; } diff --git a/source/common/dmextern.c b/source/common/dmextern.c index 7825ab1..5baa462 100644 --- a/source/common/dmextern.c +++ b/source/common/dmextern.c @@ -594,6 +594,7 @@ AcpiDmAddExternalsToNamespace ( break; default: + break; } diff --git a/source/common/dmrestag.c b/source/common/dmrestag.c index 1c7de99..d72ecad 100644 --- a/source/common/dmrestag.c +++ b/source/common/dmrestag.c @@ -798,7 +798,6 @@ AcpiDmGetResourceTag ( case ACPI_RESOURCE_NAME_ADDRESS32: case ACPI_RESOURCE_NAME_ADDRESS64: case ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64: - /* * Subtype differentiation is the flags. * Kindof brute force, but just blindly search for an index match @@ -846,6 +845,7 @@ AcpiDmGetResourceTag ( break; default: + break; } diff --git a/source/common/dmtable.c b/source/common/dmtable.c index 0c1c39b..46d7b67 100644 --- a/source/common/dmtable.c +++ b/source/common/dmtable.c @@ -697,48 +697,71 @@ AcpiDmDumpTable ( case ACPI_DMT_EINJINST: case ACPI_DMT_ERSTACT: case ACPI_DMT_ERSTINST: + ByteLength = 1; break; + case ACPI_DMT_UINT16: case ACPI_DMT_DMAR: case ACPI_DMT_HEST: + ByteLength = 2; break; + case ACPI_DMT_UINT24: + ByteLength = 3; break; + case ACPI_DMT_UINT32: case ACPI_DMT_NAME4: case ACPI_DMT_SIG: case ACPI_DMT_SLIC: + ByteLength = 4; break; + case ACPI_DMT_UINT40: + ByteLength = 5; break; + case ACPI_DMT_UINT48: case ACPI_DMT_NAME6: + ByteLength = 6; break; + case ACPI_DMT_UINT56: case ACPI_DMT_BUF7: + ByteLength = 7; break; + case ACPI_DMT_UINT64: case ACPI_DMT_NAME8: + ByteLength = 8; break; + case ACPI_DMT_BUF16: case ACPI_DMT_UUID: + ByteLength = 16; break; + case ACPI_DMT_BUF128: + ByteLength = 128; break; + case ACPI_DMT_STRING: + ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1; break; + case ACPI_DMT_GAS: + if (!LastOutputBlankLine) { AcpiOsPrintf ("\n"); @@ -746,7 +769,9 @@ AcpiDmDumpTable ( } ByteLength = sizeof (ACPI_GENERIC_ADDRESS); break; + case ACPI_DMT_HESTNTFY: + if (!LastOutputBlankLine) { AcpiOsPrintf ("\n"); @@ -754,7 +779,9 @@ AcpiDmDumpTable ( } ByteLength = sizeof (ACPI_HEST_NOTIFY); break; + default: + ByteLength = 0; break; } @@ -837,7 +864,6 @@ AcpiDmDumpTable ( case ACPI_DMT_BUF7: case ACPI_DMT_BUF16: case ACPI_DMT_BUF128: - /* * Buffer: Size depends on the opcode and was set above. * Each hex byte is separated with a space. @@ -1146,16 +1172,19 @@ AcpiDmDumpTable ( switch (Temp8) { case ACPI_IVRS_TYPE_HARDWARE: + Name = AcpiDmIvrsSubnames[0]; break; case ACPI_IVRS_TYPE_MEMORY1: case ACPI_IVRS_TYPE_MEMORY2: case ACPI_IVRS_TYPE_MEMORY3: + Name = AcpiDmIvrsSubnames[1]; break; default: + Name = AcpiDmIvrsSubnames[2]; break; } @@ -1164,9 +1193,11 @@ AcpiDmDumpTable ( break; case ACPI_DMT_EXIT: + return (AE_OK); default: + ACPI_ERROR ((AE_INFO, "**** Invalid table opcode [0x%X] ****\n", Info->Opcode)); return (AE_SUPPORT); diff --git a/source/common/dmtbdump.c b/source/common/dmtbdump.c index b5e052e..57c160d 100644 --- a/source/common/dmtbdump.c +++ b/source/common/dmtbdump.c @@ -349,27 +349,33 @@ AcpiDmValidateFadtLength ( switch (Revision) { case 0: + AcpiOsPrintf ("// ACPI Warning: Invalid FADT revision: 0\n"); return; case 1: + ExpectedLength = ACPI_FADT_V1_SIZE; break; case 2: + ExpectedLength = ACPI_FADT_V2_SIZE; break; case 3: case 4: + ExpectedLength = ACPI_FADT_V3_SIZE; break; case 5: + ExpectedLength = ACPI_FADT_V5_SIZE; break; default: + return; } @@ -434,10 +440,12 @@ AcpiDmDumpAsf ( switch (Type) { case ACPI_ASF_TYPE_INFO: + InfoTable = AcpiDmTableInfoAsf0; break; case ACPI_ASF_TYPE_ALERT: + InfoTable = AcpiDmTableInfoAsf1; DataInfoTable = AcpiDmTableInfoAsf1a; DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT)); @@ -447,6 +455,7 @@ AcpiDmDumpAsf ( break; case ACPI_ASF_TYPE_CONTROL: + InfoTable = AcpiDmTableInfoAsf2; DataInfoTable = AcpiDmTableInfoAsf2a; DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE)); @@ -456,10 +465,12 @@ AcpiDmDumpAsf ( break; case ACPI_ASF_TYPE_BOOT: + InfoTable = AcpiDmTableInfoAsf3; break; case ACPI_ASF_TYPE_ADDRESS: + InfoTable = AcpiDmTableInfoAsf4; DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS)); DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices; @@ -467,6 +478,7 @@ AcpiDmDumpAsf ( break; default: + AcpiOsPrintf ("\n**** Unknown ASF sub-table type 0x%X\n", SubTable->Header.Type); return; } @@ -523,6 +535,7 @@ AcpiDmDumpAsf ( break; default: + break; } @@ -863,22 +876,31 @@ AcpiDmDumpDmar ( switch (SubTable->Type) { case ACPI_DMAR_TYPE_HARDWARE_UNIT: + InfoTable = AcpiDmTableInfoDmar0; ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT); break; + case ACPI_DMAR_TYPE_RESERVED_MEMORY: + InfoTable = AcpiDmTableInfoDmar1; ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY); break; + case ACPI_DMAR_TYPE_ATSR: + InfoTable = AcpiDmTableInfoDmar2; ScopeOffset = sizeof (ACPI_DMAR_ATSR); break; + case ACPI_DMAR_HARDWARE_AFFINITY: + InfoTable = AcpiDmTableInfoDmar3; ScopeOffset = sizeof (ACPI_DMAR_RHSA); break; + default: + AcpiOsPrintf ("\n**** Unknown DMAR sub-table type 0x%X\n\n", SubTable->Type); return; } @@ -1086,12 +1108,17 @@ AcpiDmDumpFpdt ( switch (SubTable->Type) { case ACPI_FPDT_TYPE_BOOT: + InfoTable = AcpiDmTableInfoFpdt0; break; + case ACPI_FPDT_TYPE_S3PERF: + InfoTable = AcpiDmTableInfoFpdt1; break; + default: + AcpiOsPrintf ("\n**** Unknown FPDT sub-table type 0x%X\n\n", SubTable->Type); /* Attempt to continue */ @@ -1164,6 +1191,7 @@ AcpiDmDumpHest ( switch (SubTable->Type) { case ACPI_HEST_TYPE_IA32_CHECK: + InfoTable = AcpiDmTableInfoHest0; SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, @@ -1171,6 +1199,7 @@ AcpiDmDumpHest ( break; case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: + InfoTable = AcpiDmTableInfoHest1; SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED); BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, @@ -1178,31 +1207,37 @@ AcpiDmDumpHest ( break; case ACPI_HEST_TYPE_IA32_NMI: + InfoTable = AcpiDmTableInfoHest2; SubTableLength = sizeof (ACPI_HEST_IA_NMI); break; case ACPI_HEST_TYPE_AER_ROOT_PORT: + InfoTable = AcpiDmTableInfoHest6; SubTableLength = sizeof (ACPI_HEST_AER_ROOT); break; case ACPI_HEST_TYPE_AER_ENDPOINT: + InfoTable = AcpiDmTableInfoHest7; SubTableLength = sizeof (ACPI_HEST_AER); break; case ACPI_HEST_TYPE_AER_BRIDGE: + InfoTable = AcpiDmTableInfoHest8; SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE); break; case ACPI_HEST_TYPE_GENERIC_ERROR: + InfoTable = AcpiDmTableInfoHest9; SubTableLength = sizeof (ACPI_HEST_GENERIC); break; default: + /* Cannot continue on unknown type - no length */ AcpiOsPrintf ("\n**** Unknown HEST sub-table type 0x%X\n", SubTable->Type); @@ -1304,14 +1339,19 @@ AcpiDmDumpIvrs ( switch (SubTable->Type) { case ACPI_IVRS_TYPE_HARDWARE: + InfoTable = AcpiDmTableInfoIvrs0; break; + case ACPI_IVRS_TYPE_MEMORY1: case ACPI_IVRS_TYPE_MEMORY2: case ACPI_IVRS_TYPE_MEMORY3: + InfoTable = AcpiDmTableInfoIvrs1; break; + default: + AcpiOsPrintf ("\n**** Unknown IVRS sub-table type 0x%X\n", SubTable->Type); @@ -1473,45 +1513,72 @@ AcpiDmDumpMadt ( switch (SubTable->Type) { case ACPI_MADT_TYPE_LOCAL_APIC: + InfoTable = AcpiDmTableInfoMadt0; break; + case ACPI_MADT_TYPE_IO_APIC: + InfoTable = AcpiDmTableInfoMadt1; break; + case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: + InfoTable = AcpiDmTableInfoMadt2; break; + case ACPI_MADT_TYPE_NMI_SOURCE: + InfoTable = AcpiDmTableInfoMadt3; break; + case ACPI_MADT_TYPE_LOCAL_APIC_NMI: + InfoTable = AcpiDmTableInfoMadt4; break; + case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: + InfoTable = AcpiDmTableInfoMadt5; break; + case ACPI_MADT_TYPE_IO_SAPIC: + InfoTable = AcpiDmTableInfoMadt6; break; + case ACPI_MADT_TYPE_LOCAL_SAPIC: + InfoTable = AcpiDmTableInfoMadt7; break; + case ACPI_MADT_TYPE_INTERRUPT_SOURCE: + InfoTable = AcpiDmTableInfoMadt8; break; + case ACPI_MADT_TYPE_LOCAL_X2APIC: + InfoTable = AcpiDmTableInfoMadt9; break; + case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: + InfoTable = AcpiDmTableInfoMadt10; break; + case ACPI_MADT_TYPE_GENERIC_INTERRUPT: + InfoTable = AcpiDmTableInfoMadt11; break; + case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: + InfoTable = AcpiDmTableInfoMadt12; break; + default: + AcpiOsPrintf ("\n**** Unknown MADT sub-table type 0x%X\n\n", SubTable->Type); /* Attempt to continue */ @@ -2152,12 +2219,17 @@ AcpiDmDumpS3pt ( switch (SubTable->Type) { case ACPI_S3PT_TYPE_RESUME: + InfoTable = AcpiDmTableInfoS3pt0; break; + case ACPI_S3PT_TYPE_SUSPEND: + InfoTable = AcpiDmTableInfoS3pt1; break; + default: + AcpiOsPrintf ("\n**** Unknown S3PT sub-table type 0x%X\n", SubTable->Type); /* Attempt to continue */ @@ -2229,12 +2301,17 @@ AcpiDmDumpSlic ( switch (SubTable->Type) { case ACPI_SLIC_TYPE_PUBLIC_KEY: + InfoTable = AcpiDmTableInfoSlic0; break; + case ACPI_SLIC_TYPE_WINDOWS_MARKER: + InfoTable = AcpiDmTableInfoSlic1; break; + default: + AcpiOsPrintf ("\n**** Unknown SLIC sub-table type 0x%X\n", SubTable->Type); /* Attempt to continue */ @@ -2390,14 +2467,20 @@ AcpiDmDumpSrat ( switch (SubTable->Type) { case ACPI_SRAT_TYPE_CPU_AFFINITY: + InfoTable = AcpiDmTableInfoSrat0; break; + case ACPI_SRAT_TYPE_MEMORY_AFFINITY: + InfoTable = AcpiDmTableInfoSrat1; break; + case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: + InfoTable = AcpiDmTableInfoSrat2; break; + default: AcpiOsPrintf ("\n**** Unknown SRAT sub-table type 0x%X\n", SubTable->Type); diff --git a/source/common/getopt.c b/source/common/getopt.c index 5a69da0..f1921ee 100644 --- a/source/common/getopt.c +++ b/source/common/getopt.c @@ -41,6 +41,15 @@ * POSSIBILITY OF SUCH DAMAGES. */ +/* + * ACPICA getopt() implementation + * + * Option strings: + * "f" - Option has no arguments + * "f:" - Option requires an argument + * "f^" - Option has optional single-char sub-options + * "f|" - Option has required single-char sub-options + */ #include #include @@ -52,9 +61,59 @@ if (AcpiGbl_Opterr) {fprintf (stderr, "%s%c\n", msg, badchar);} -int AcpiGbl_Opterr = 1; -int AcpiGbl_Optind = 1; -char *AcpiGbl_Optarg; +int AcpiGbl_Opterr = 1; +int AcpiGbl_Optind = 1; +int AcpiGbl_SubOptChar = 0; +char *AcpiGbl_Optarg; + +static int CurrentCharPtr = 1; + + +/******************************************************************************* + * + * FUNCTION: AcpiGetoptArgument + * + * PARAMETERS: argc, argv - from main + * + * RETURN: 0 if an argument was found, -1 otherwise. Sets AcpiGbl_Optarg + * to point to the next argument. + * + * DESCRIPTION: Get the next argument. Used to obtain arguments for the + * two-character options after the original call to AcpiGetopt. + * Note: Either the argument starts at the next character after + * the option, or it is pointed to by the next argv entry. + * (After call to AcpiGetopt, we need to backup to the previous + * argv entry). + * + ******************************************************************************/ + +int +AcpiGetoptArgument ( + int argc, + char **argv) +{ + AcpiGbl_Optind--; + CurrentCharPtr++; + + if (argv[AcpiGbl_Optind][(int) (CurrentCharPtr+1)] != '\0') + { + AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][(int) (CurrentCharPtr+1)]; + } + else if (++AcpiGbl_Optind >= argc) + { + ACPI_OPTION_ERROR ("Option requires an argument: -", 'v'); + + CurrentCharPtr = 1; + return (-1); + } + else + { + AcpiGbl_Optarg = argv[AcpiGbl_Optind++]; + } + + CurrentCharPtr = 1; + return (0); +} /******************************************************************************* @@ -76,7 +135,6 @@ AcpiGetopt( char **argv, char *opts) { - static int CurrentCharPtr = 1; int CurrentChar; char *OptsPtr; @@ -152,6 +210,7 @@ AcpiGetopt( AcpiGbl_Optarg = "^"; } + AcpiGbl_SubOptChar = AcpiGbl_Optarg[0]; AcpiGbl_Optind++; CurrentCharPtr = 1; } @@ -172,6 +231,7 @@ AcpiGetopt( return ('?'); } + AcpiGbl_SubOptChar = AcpiGbl_Optarg[0]; AcpiGbl_Optind++; CurrentCharPtr = 1; } diff --git a/source/compiler/aslanalyze.c b/source/compiler/aslanalyze.c index f0ec1af..a80c90d 100644 --- a/source/compiler/aslanalyze.c +++ b/source/compiler/aslanalyze.c @@ -381,6 +381,7 @@ AnIsResultUsed ( return (TRUE); default: + break; } @@ -411,6 +412,7 @@ AnIsResultUsed ( return (FALSE); default: + /* Any other type of parent means that the result is used */ return (TRUE); diff --git a/source/compiler/aslbtypes.c b/source/compiler/aslbtypes.c index b2f7512..f9dc107 100644 --- a/source/compiler/aslbtypes.c +++ b/source/compiler/aslbtypes.c @@ -83,15 +83,19 @@ AnMapArgTypeToBtype ( /* Simple types */ case ARGI_ANYTYPE: + return (ACPI_BTYPE_OBJECTS_AND_REFS); case ARGI_PACKAGE: + return (ACPI_BTYPE_PACKAGE); case ARGI_EVENT: + return (ACPI_BTYPE_EVENT); case ARGI_MUTEX: + return (ACPI_BTYPE_MUTEX); case ARGI_DDBHANDLE: @@ -111,31 +115,36 @@ AnMapArgTypeToBtype ( case ARGI_BUFFER: case ARGI_BUFFER_OR_STRING: case ARGI_COMPUTEDATA: + return (ACPI_BTYPE_COMPUTE_DATA); /* References */ case ARGI_INTEGER_REF: + return (ACPI_BTYPE_INTEGER); case ARGI_OBJECT_REF: + return (ACPI_BTYPE_ALL_OBJECTS); case ARGI_DEVICE_REF: + return (ACPI_BTYPE_DEVICE_OBJECTS); case ARGI_REFERENCE: + return (ACPI_BTYPE_REFERENCE); case ARGI_TARGETREF: case ARGI_FIXED_TARGET: case ARGI_SIMPLE_TARGET: + return (ACPI_BTYPE_OBJECTS_AND_REFS); /* Complex types */ case ARGI_DATAOBJECT: - /* * Buffer, string, package or reference to a Op - * Used only by SizeOf operator @@ -150,6 +159,7 @@ AnMapArgTypeToBtype ( return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | ACPI_BTYPE_PACKAGE); case ARGI_REF_OR_STRING: + return (ACPI_BTYPE_STRING | ACPI_BTYPE_REFERENCE); case ARGI_REGION_OR_BUFFER: @@ -159,10 +169,12 @@ AnMapArgTypeToBtype ( return (ACPI_BTYPE_REGION | ACPI_BTYPE_BUFFER | ACPI_BTYPE_FIELD_UNIT); case ARGI_DATAREFOBJ: + return (ACPI_BTYPE_INTEGER |ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE); default: + break; } @@ -207,22 +219,28 @@ AnMapEtypeToBtype ( switch (Etype) { case ACPI_TYPE_INTEGER: + return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_DDB_HANDLE); case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: + return (ACPI_BTYPE_COMPUTE_DATA); case ACPI_TYPE_PACKAGE: + return (ACPI_BTYPE_PACKAGE); case ACPI_TYPE_FIELD_UNIT: + return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT); case ACPI_TYPE_BUFFER_FIELD: + return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_BUFFER_FIELD); case ACPI_TYPE_DDB_HANDLE: + return (ACPI_BTYPE_INTEGER | ACPI_BTYPE_DDB_HANDLE); case ACPI_BTYPE_DEBUG_OBJECT: @@ -232,6 +250,7 @@ AnMapEtypeToBtype ( return (0); default: + return (1 << (Etype - 1)); } } @@ -259,6 +278,7 @@ AnMapEtypeToBtype ( return (ACPI_BTYPE_REFERENCE); default: + printf ("Unhandled encoded type: %X\n", Etype); return (0); } @@ -438,51 +458,67 @@ AnMapObjTypeToBtype ( switch (Op->Asl.ParseOpcode) { case PARSEOP_OBJECTTYPE_BFF: /* "BuffFieldObj" */ + return (ACPI_BTYPE_BUFFER_FIELD); case PARSEOP_OBJECTTYPE_BUF: /* "BuffObj" */ + return (ACPI_BTYPE_BUFFER); case PARSEOP_OBJECTTYPE_DDB: /* "DDBHandleObj" */ + return (ACPI_BTYPE_DDB_HANDLE); case PARSEOP_OBJECTTYPE_DEV: /* "DeviceObj" */ + return (ACPI_BTYPE_DEVICE); case PARSEOP_OBJECTTYPE_EVT: /* "EventObj" */ + return (ACPI_BTYPE_EVENT); case PARSEOP_OBJECTTYPE_FLD: /* "FieldUnitObj" */ + return (ACPI_BTYPE_FIELD_UNIT); case PARSEOP_OBJECTTYPE_INT: /* "IntObj" */ + return (ACPI_BTYPE_INTEGER); case PARSEOP_OBJECTTYPE_MTH: /* "MethodObj" */ + return (ACPI_BTYPE_METHOD); case PARSEOP_OBJECTTYPE_MTX: /* "MutexObj" */ + return (ACPI_BTYPE_MUTEX); case PARSEOP_OBJECTTYPE_OPR: /* "OpRegionObj" */ + return (ACPI_BTYPE_REGION); case PARSEOP_OBJECTTYPE_PKG: /* "PkgObj" */ + return (ACPI_BTYPE_PACKAGE); case PARSEOP_OBJECTTYPE_POW: /* "PowerResObj" */ + return (ACPI_BTYPE_POWER); case PARSEOP_OBJECTTYPE_STR: /* "StrObj" */ + return (ACPI_BTYPE_STRING); case PARSEOP_OBJECTTYPE_THZ: /* "ThermalZoneObj" */ + return (ACPI_BTYPE_THERMAL); case PARSEOP_OBJECTTYPE_UNK: /* "UnknownObj" */ + return (ACPI_BTYPE_OBJECTS_AND_REFS); default: + return (0); } } diff --git a/source/compiler/aslcodegen.c b/source/compiler/aslcodegen.c index 1171d34..1230f59 100644 --- a/source/compiler/aslcodegen.c +++ b/source/compiler/aslcodegen.c @@ -284,6 +284,7 @@ CgWriteAmlOpcode ( break; default: + Aml.Opcode = Op->Asl.AmlOpcode; break; } @@ -382,7 +383,9 @@ CgWriteAmlOpcode ( break; default: + /* All data opcodes must appear above */ + break; } } @@ -560,7 +563,9 @@ CgWriteNode ( return; default: + /* Internal data opcodes must all appear above */ + break; } diff --git a/source/compiler/aslcompile.c b/source/compiler/aslcompile.c index 73b6732..bbd8ab9 100644 --- a/source/compiler/aslcompile.c +++ b/source/compiler/aslcompile.c @@ -133,7 +133,9 @@ AslCompilerSignon ( break; default: + /* No other output types supported */ + break; } @@ -207,7 +209,9 @@ AslCompilerFileHeader ( break; default: + /* No other output types supported */ + break; } @@ -226,11 +230,14 @@ AslCompilerFileHeader ( case ASL_FILE_C_SOURCE_OUTPUT: case ASL_FILE_C_OFFSET_OUTPUT: case ASL_FILE_C_INCLUDE_OUTPUT: + FlPrintFile (FileId, " */\n"); break; default: + /* Nothing to do for other output types */ + break; } } diff --git a/source/compiler/aslcompiler.h b/source/compiler/aslcompiler.h index cfe3ecf..1ffbf92 100644 --- a/source/compiler/aslcompiler.h +++ b/source/compiler/aslcompiler.h @@ -291,6 +291,15 @@ AslError ( ACPI_PARSE_OBJECT *Op, char *ExtraMessage); +ACPI_STATUS +AslDisableException ( + char *MessageIdString); + +BOOLEAN +AslIsExceptionDisabled ( + UINT8 Level, + UINT8 MessageId); + void AslCoreSubsystemError ( ACPI_PARSE_OBJECT *Op, @@ -791,6 +800,17 @@ void LkFindUnreferencedObjects ( void); +/* + * aslmain - startup + */ +void +Usage ( + void); + +void +AslFilenameHelp ( + void); + /* * aslnamesp - namespace output file generation @@ -803,6 +823,13 @@ void NsSetupNamespaceListing ( void *Handle); +/* + * asloptions - command line processing + */ +int +AslCommandLine ( + int argc, + char **argv); /* * aslxref - namespace cross reference diff --git a/source/compiler/aslerror.c b/source/compiler/aslerror.c index 5b3b483..0616040 100644 --- a/source/compiler/aslerror.c +++ b/source/compiler/aslerror.c @@ -201,6 +201,7 @@ AePrintException ( switch (Enode->Level) { case ASL_REMARK: + if (!Gbl_DisplayRemarks) { return; @@ -208,6 +209,7 @@ AePrintException ( break; case ASL_OPTIMIZATION: + if (!Gbl_DisplayOptimizations) { return; @@ -215,6 +217,7 @@ AePrintException ( break; default: + break; } } @@ -676,6 +679,113 @@ AslCommonError ( /******************************************************************************* * + * FUNCTION: AslDisableException + * + * PARAMETERS: MessageIdString - ID to be disabled + * + * RETURN: Status + * + * DESCRIPTION: Enter a message ID into the global disabled messages table + * + ******************************************************************************/ + +ACPI_STATUS +AslDisableException ( + char *MessageIdString) +{ + UINT32 MessageId; + + + /* Convert argument to an integer and validate it */ + + MessageId = (UINT32) strtoul (MessageIdString, NULL, 0); + + if ((MessageId < 2000) || (MessageId > 5999)) + { + printf ("\"%s\" is not a valid warning/remark ID\n", + MessageIdString); + return (AE_BAD_PARAMETER); + } + + /* Insert value into the global disabled message array */ + + if (Gbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES) + { + printf ("Too many messages have been disabled (max %u)\n", + ASL_MAX_DISABLED_MESSAGES); + return (AE_LIMIT); + } + + Gbl_DisabledMessages[Gbl_DisabledMessagesIndex] = MessageId; + Gbl_DisabledMessagesIndex++; + return (AE_OK); +} + + +/******************************************************************************* + * + * 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 + * + ******************************************************************************/ + +BOOLEAN +AslIsExceptionDisabled ( + UINT8 Level, + UINT8 MessageId) +{ + UINT32 EncodedMessageId; + UINT32 i; + + + switch (Level) + { + case ASL_WARNING2: + case ASL_WARNING3: + + /* Check for global disable via -w1/-w2/-w3 options */ + + if (Level > Gbl_WarningLevel) + { + return (TRUE); + } + /* Fall through */ + + case ASL_WARNING: + case ASL_REMARK: + /* + * Ignore this warning/remark if it has been disabled by + * the user (-vw option) + */ + EncodedMessageId = MessageId + ((Level + 1) * 1000); + for (i = 0; i < Gbl_DisabledMessagesIndex; i++) + { + /* Simple implementation via fixed array */ + + if (EncodedMessageId == Gbl_DisabledMessages[i]) + { + return (TRUE); + } + } + break; + + default: + break; + } + + return (FALSE); +} + + +/******************************************************************************* + * * FUNCTION: AslError * * PARAMETERS: Level - Seriousness (Warning/error, etc.) @@ -698,32 +808,25 @@ AslError ( char *ExtraMessage) { - switch (Level) - { - case ASL_WARNING2: - case ASL_WARNING3: - if (Gbl_WarningLevel < Level) - { - return; - } - break; + /* Check if user wants to ignore this exception */ - default: - break; + if (AslIsExceptionDisabled (Level, MessageId)) + { + return; } if (Op) { AslCommonError (Level, MessageId, Op->Asl.LineNumber, - Op->Asl.LogicalLineNumber, - Op->Asl.LogicalByteOffset, - Op->Asl.Column, - Op->Asl.Filename, ExtraMessage); + Op->Asl.LogicalLineNumber, + Op->Asl.LogicalByteOffset, + Op->Asl.Column, + Op->Asl.Filename, ExtraMessage); } else { AslCommonError (Level, MessageId, 0, - 0, 0, 0, NULL, ExtraMessage); + 0, 0, 0, NULL, ExtraMessage); } } diff --git a/source/compiler/aslfold.c b/source/compiler/aslfold.c index d25c7ff..9a041a5 100644 --- a/source/compiler/aslfold.c +++ b/source/compiler/aslfold.c @@ -441,7 +441,6 @@ OpcAmlConstantWalk ( ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); break; - case ACPI_TYPE_STRING: Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL; @@ -455,7 +454,6 @@ OpcAmlConstantWalk ( break; - case ACPI_TYPE_BUFFER: Op->Asl.ParseOpcode = PARSEOP_BUFFER; @@ -493,8 +491,8 @@ OpcAmlConstantWalk ( ObjDesc->Buffer.Length); break; - default: + printf ("Unsupported return type: %s\n", AcpiUtGetObjectTypeName (ObjDesc)); break; @@ -536,27 +534,32 @@ OpcUpdateIntegerNode ( switch (Op->Asl.AmlLength) { case 1: + TrUpdateNode (PARSEOP_BYTECONST, Op); Op->Asl.AmlOpcode = AML_RAW_DATA_BYTE; break; case 2: + TrUpdateNode (PARSEOP_WORDCONST, Op); Op->Asl.AmlOpcode = AML_RAW_DATA_WORD; break; case 4: + TrUpdateNode (PARSEOP_DWORDCONST, Op); Op->Asl.AmlOpcode = AML_RAW_DATA_DWORD; break; case 8: + TrUpdateNode (PARSEOP_QWORDCONST, Op); Op->Asl.AmlOpcode = AML_RAW_DATA_QWORD; break; case 0: default: + OpcSetOptimalIntegerSize (Op); TrUpdateNode (PARSEOP_INTEGER, Op); break; diff --git a/source/compiler/aslglobal.h b/source/compiler/aslglobal.h index c15c669..e1be4ae 100644 --- a/source/compiler/aslglobal.h +++ b/source/compiler/aslglobal.h @@ -110,6 +110,7 @@ extern char *AslCompilertext; #define ASL_DEFAULT_LINE_BUFFER_SIZE (1024 * 32) /* 32K */ #define ASL_MSG_BUFFER_SIZE 4096 +#define ASL_MAX_DISABLED_MESSAGES 32 #define HEX_TABLE_LINE_SIZE 8 #define HEX_LISTING_LINE_SIZE 8 @@ -224,6 +225,7 @@ ASL_EXTERN char *Gbl_TemplateSignature; 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 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); @@ -250,6 +252,7 @@ ASL_EXTERN UINT8 Gbl_AmlBuffer[HEX_LISTING_LINE_SIZE]; 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]; #endif /* __ASLGLOBAL_H */ diff --git a/source/compiler/aslhex.c b/source/compiler/aslhex.c index 863c0a3..cc2ba6f 100644 --- a/source/compiler/aslhex.c +++ b/source/compiler/aslhex.c @@ -107,7 +107,9 @@ HxDoHexOutput ( break; default: + /* No other output types supported */ + break; } } diff --git a/source/compiler/asllength.c b/source/compiler/asllength.c index fae6768..69d4d22 100644 --- a/source/compiler/asllength.c +++ b/source/compiler/asllength.c @@ -258,6 +258,7 @@ CgGenerateAmlOpcodeLength ( break; default: + /* All data opcodes must be above */ break; } @@ -326,6 +327,7 @@ CgGenerateAmlLengths ( return; default: + break; } diff --git a/source/compiler/asllisting.c b/source/compiler/asllisting.c index 04c5179..c8e2a6e 100644 --- a/source/compiler/asllisting.c +++ b/source/compiler/asllisting.c @@ -157,6 +157,8 @@ LsGenerateListing ( if (FileId == ASL_FILE_C_OFFSET_OUTPUT) { + Gbl_CurrentAmlOffset = 0; + /* Offset table file has a special header and footer */ LsDoOffsetTableHeader (FileId); @@ -265,9 +267,10 @@ LsTreeWriteWalk ( DbgPrint (ASL_TREE_OUTPUT, "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level); + UtPrintFormattedName (Op->Asl.ParseOpcode, Level); - DbgPrint (ASL_TREE_OUTPUT, "\n"); + DbgPrint (ASL_TREE_OUTPUT, " (%.4X)\n", Op->Asl.ParseOpcode); return (AE_OK); } @@ -319,16 +322,20 @@ LsWriteNodeToListing ( break; default: + switch (OpClass) { case AML_CLASS_NAMED_OBJECT: + switch (Op->Asl.AmlOpcode) { case AML_SCOPE_OP: case AML_ALIAS_OP: + break; default: + if (Op->Asl.ExternalName) { LsFlushListingBuffer (FileId); @@ -339,7 +346,9 @@ LsWriteNodeToListing ( break; default: + /* Don't care about other objects */ + break; } break; @@ -427,7 +436,9 @@ LsWriteNodeToListing ( default: + /* All other opcodes have an AML opcode */ + break; } @@ -443,7 +454,6 @@ LsWriteNodeToListing ( break; - case AML_CLASS_NAMED_OBJECT: switch (Op->Asl.AmlOpcode) @@ -451,7 +461,6 @@ LsWriteNodeToListing ( case AML_FIELD_OP: case AML_INDEX_FIELD_OP: case AML_BANK_FIELD_OP: - /* * For fields, we want to dump all the AML after the * entire definition @@ -479,6 +488,7 @@ LsWriteNodeToListing ( break; default: + LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber, FileId); break; @@ -503,7 +513,6 @@ LsWriteNodeToListing ( case ASL_FILE_C_SOURCE_OUTPUT: case ASL_FILE_ASM_INCLUDE_OUTPUT: case ASL_FILE_C_INCLUDE_OUTPUT: - /* * For named objects, we will create a valid symbol so that the * AML code can be referenced from C or ASM @@ -558,7 +567,9 @@ LsWriteNodeToListing ( break; default: + /* Nothing to do for listing file */ + break; } } @@ -579,6 +590,7 @@ LsWriteNodeToListing ( break; case AML_CLASS_UNKNOWN: + break; } } diff --git a/source/compiler/asllistsup.c b/source/compiler/asllistsup.c index 4156dcc..d3bf39f 100644 --- a/source/compiler/asllistsup.c +++ b/source/compiler/asllistsup.c @@ -251,7 +251,9 @@ LsWriteListingHexBytes ( break; default: + /* No other types supported */ + return; } } @@ -617,7 +619,9 @@ LsFlushListingBuffer ( break; default: + /* No other types supported */ + return; } diff --git a/source/compiler/aslload.c b/source/compiler/aslload.c index e581df2..7f3ce1d 100644 --- a/source/compiler/aslload.c +++ b/source/compiler/aslload.c @@ -177,7 +177,9 @@ LdLoadFieldElements ( break; default: + /* No other opcodes should arrive here */ + return (AE_BAD_PARAMETER); } @@ -374,6 +376,7 @@ LdNamespace1Begin ( default: /* All other opcodes go below */ + break; } @@ -422,7 +425,6 @@ LdNamespace1Begin ( case PARSEOP_EXTERNAL: - /* * "External" simply enters a name and type into the namespace. * We must be careful to not open a new scope, however, no matter @@ -466,7 +468,6 @@ LdNamespace1Begin ( case PARSEOP_SCOPE: - /* * The name referenced by Scope(Name) must already exist at this point. * In other words, forward references for Scope() are not supported. @@ -521,7 +522,6 @@ LdNamespace1Begin ( case ACPI_TYPE_INTEGER: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - /* * These types we will allow, but we will change the type. * This enables some existing code of the form: diff --git a/source/compiler/asllookup.c b/source/compiler/asllookup.c index 7db805f..e965f18 100644 --- a/source/compiler/asllookup.c +++ b/source/compiler/asllookup.c @@ -144,9 +144,11 @@ LkIsObjectUsed ( case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_POWER: case ACPI_TYPE_LOCAL_RESOURCE: + return (AE_OK); default: + break; } diff --git a/source/compiler/aslmain.c b/source/compiler/aslmain.c index 4cc63fa..a75a6fd 100644 --- a/source/compiler/aslmain.c +++ b/source/compiler/aslmain.c @@ -41,7 +41,6 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #define _DECLARE_GLOBALS #include "aslcompiler.h" @@ -49,26 +48,11 @@ #include "acdisasm.h" #include -#ifdef _DEBUG -#include -#endif - #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("aslmain") -/* Local prototypes */ - -static void -Options ( - void); - -static void -FilenameHelp ( - void); -static void -Usage ( - void); +/* Local prototypes */ static void ACPI_SYSTEM_XFACE AslSignalHandler ( @@ -78,34 +62,10 @@ static void AslInitialize ( void); -static int -AslCommandLine ( - int argc, - char **argv); - -static int -AslDoOptions ( - int argc, - char **argv, - BOOLEAN IsResponseFile); - -static void -AslMergeOptionTokens ( - char *InBuffer, - char *OutBuffer); - -static int -AslDoResponseFile ( - char *Filename); - - -#define ASL_TOKEN_SEPARATORS " \t\n" -#define ASL_SUPPORTED_OPTIONS "@:b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T:G^v^w|x:z" - /******************************************************************************* * - * FUNCTION: Options + * FUNCTION: Usage * * PARAMETERS: None * @@ -116,10 +76,12 @@ AslDoResponseFile ( * ******************************************************************************/ -static void -Options ( +void +Usage ( void) { + printf ("%s\n\n", ASL_COMPLIANCE); + ACPI_USAGE_HEADER ("iasl [Options] [Files]"); printf ("\nGlobal:\n"); ACPI_OPTION ("-@ ", "Specify command file"); @@ -140,6 +102,7 @@ Options ( ACPI_OPTION ("-vo", "Enable optimization comments"); ACPI_OPTION ("-vr", "Disable remarks"); ACPI_OPTION ("-vs", "Disable signon"); + ACPI_OPTION ("-vw ", "Disable specific warning or remark"); ACPI_OPTION ("-w1 -w2 -w3", "Set warning reporting level"); ACPI_OPTION ("-we", "Report warnings as errors"); @@ -209,8 +172,8 @@ Options ( * ******************************************************************************/ -static void -FilenameHelp ( +void +AslFilenameHelp ( void) { @@ -225,29 +188,6 @@ FilenameHelp ( } -/******************************************************************************* - * - * FUNCTION: Usage - * - * PARAMETERS: None - * - * RETURN: None - * - * DESCRIPTION: Display usage and option message - * - ******************************************************************************/ - -static void -Usage ( - void) -{ - - printf ("%s\n\n", ASL_COMPLIANCE); - ACPI_USAGE_HEADER ("iasl [Options] [Files]"); - Options (); -} - - /****************************************************************************** * * FUNCTION: AslSignalHandler @@ -310,11 +250,6 @@ AslInitialize ( UINT32 i; -#ifdef _DEBUG - _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0)); -#endif - - for (i = 0; i < ASL_NUM_FILES; i++) { Gbl_Files[i].Handle = NULL; @@ -326,675 +261,6 @@ AslInitialize ( Gbl_Files[ASL_FILE_STDERR].Handle = stderr; Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; - - /* Allocate the line buffer(s) */ - - Gbl_LineBufferSize /= 2; - UtExpandLineBuffers (); -} - - -/******************************************************************************* - * - * FUNCTION: AslMergeOptionTokens - * - * PARAMETERS: InBuffer - Input containing an option string - * OutBuffer - Merged output buffer - * - * RETURN: None - * - * DESCRIPTION: Remove all whitespace from an option string. - * - ******************************************************************************/ - -static void -AslMergeOptionTokens ( - char *InBuffer, - char *OutBuffer) -{ - char *Token; - - - *OutBuffer = 0; - - Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS); - while (Token) - { - strcat (OutBuffer, Token); - Token = strtok (NULL, ASL_TOKEN_SEPARATORS); - } -} - - -/******************************************************************************* - * - * FUNCTION: AslDoResponseFile - * - * PARAMETERS: Filename - Name of the response file - * - * RETURN: Status - * - * DESCRIPTION: Open a response file and process all options within. - * - ******************************************************************************/ - -static int -AslDoResponseFile ( - char *Filename) -{ - char *argv = StringBuffer2; - FILE *ResponseFile; - int OptStatus = 0; - int Opterr; - int Optind; - - - ResponseFile = fopen (Filename, "r"); - if (!ResponseFile) - { - printf ("Could not open command file %s, %s\n", - Filename, strerror (errno)); - return (-1); - } - - /* Must save the current GetOpt globals */ - - Opterr = AcpiGbl_Opterr; - Optind = AcpiGbl_Optind; - - /* - * Process all lines in the response file. There must be one complete - * option per line - */ - while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile)) - { - /* Compress all tokens, allowing us to use a single argv entry */ - - AslMergeOptionTokens (StringBuffer, StringBuffer2); - - /* Process the option */ - - AcpiGbl_Opterr = 0; - AcpiGbl_Optind = 0; - - OptStatus = AslDoOptions (1, &argv, TRUE); - if (OptStatus) - { - printf ("Invalid option in command file %s: %s\n", - Filename, StringBuffer); - break; - } - } - - /* Restore the GetOpt globals */ - - AcpiGbl_Opterr = Opterr; - AcpiGbl_Optind = Optind; - - fclose (ResponseFile); - return (OptStatus); -} - - -/******************************************************************************* - * - * FUNCTION: AslDoOptions - * - * PARAMETERS: argc/argv - Standard argc/argv - * IsResponseFile - TRUE if executing a response file. - * - * RETURN: Status - * - * DESCRIPTION: Command line option processing - * - ******************************************************************************/ - -static int -AslDoOptions ( - int argc, - char **argv, - BOOLEAN IsResponseFile) -{ - int j; - ACPI_STATUS Status; - - - /* Get the command line options */ - - while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j) - { - case '@': /* Begin a response file */ - - if (IsResponseFile) - { - printf ("Nested command files are not supported\n"); - return (-1); - } - - if (AslDoResponseFile (AcpiGbl_Optarg)) - { - return (-1); - } - break; - - - case 'b': /* Debug output options */ - switch (AcpiGbl_Optarg[0]) - { - case 'f': - AslCompilerdebug = 1; /* same as yydebug */ - DtParserdebug = 1; - PrParserdebug = 1; - break; - - case 't': - break; - - default: - printf ("Unknown option: -b%s\n", AcpiGbl_Optarg); - return (-1); - } - - /* Produce debug output file */ - - Gbl_DebugFlag = TRUE; - break; - - - case 'c': - switch (AcpiGbl_Optarg[0]) - { - case 'r': - Gbl_NoResourceChecking = TRUE; - break; - - default: - printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'd': /* Disassembler */ - switch (AcpiGbl_Optarg[0]) - { - case '^': - Gbl_DoCompile = FALSE; - break; - - case 'a': - Gbl_DoCompile = FALSE; - Gbl_DisassembleAll = TRUE; - break; - - case 'b': /* Do not convert buffers to resource descriptors */ - AcpiGbl_NoResourceDisassembly = TRUE; - break; - - case 'c': - break; - - default: - printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); - return (-1); - } - - Gbl_DisasmFlag = TRUE; - break; - - - case 'D': /* Define a symbol */ - PrAddDefine (AcpiGbl_Optarg, NULL, TRUE); - break; - - - case 'e': /* External files for disassembler */ - Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg); - if (ACPI_FAILURE (Status)) - { - printf ("Could not add %s to external list\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'f': /* Ignore errors and force creation of aml file */ - Gbl_IgnoreErrors = TRUE; - break; - - - case 'G': - Gbl_CompileGeneric = TRUE; - break; - - - case 'g': /* Get all ACPI tables */ - - Gbl_GetAllTables = TRUE; - Gbl_DoCompile = FALSE; - break; - - - case 'h': - switch (AcpiGbl_Optarg[0]) - { - case '^': - Usage (); - exit (0); - - case 'c': - UtDisplayConstantOpcodes (); - exit (0); - - case 'f': - FilenameHelp (); - exit (0); - - case 'r': - /* reserved names */ - - ApDisplayReservedNames (); - exit (0); - - case 't': - UtDisplaySupportedTables (); - exit (0); - - default: - printf ("Unknown option: -h%s\n", AcpiGbl_Optarg); - return (-1); - } - - - case 'I': /* Add an include file search directory */ - FlAddIncludeDirectory (AcpiGbl_Optarg); - break; - - - case 'i': /* Output AML as an include file */ - switch (AcpiGbl_Optarg[0]) - { - case 'a': - - /* Produce assembly code include file */ - - Gbl_AsmIncludeOutputFlag = TRUE; - break; - - case 'c': - - /* Produce C include file */ - - Gbl_C_IncludeOutputFlag = TRUE; - break; - - case 'n': - - /* Compiler/Disassembler: Ignore the NOOP operator */ - - AcpiGbl_IgnoreNoopOperator = TRUE; - break; - - default: - printf ("Unknown option: -i%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'l': /* Listing files */ - switch (AcpiGbl_Optarg[0]) - { - case '^': - /* Produce listing file (Mixed source/aml) */ - - Gbl_ListingFlag = TRUE; - break; - - case 'i': - /* Produce preprocessor output file */ - - Gbl_PreprocessorOutputFlag = TRUE; - break; - - case 'n': - /* Produce namespace file */ - - Gbl_NsOutputFlag = TRUE; - break; - - case 's': - /* Produce combined source file */ - - Gbl_SourceOutputFlag = TRUE; - break; - - default: - printf ("Unknown option: -l%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'm': /* Set line buffer size */ - Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024; - if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE) - { - Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE; - } - printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize); - break; - - - case 'n': /* Parse only */ - Gbl_ParseOnlyFlag = TRUE; - break; - - - case 'o': /* Control compiler AML optimizations */ - switch (AcpiGbl_Optarg[0]) - { - case 'a': - - /* Disable all optimizations */ - - Gbl_FoldConstants = FALSE; - Gbl_IntegerOptimizationFlag = FALSE; - Gbl_ReferenceOptimizationFlag = FALSE; - break; - - case 'f': - - /* Disable folding on "normal" expressions */ - - Gbl_FoldConstants = FALSE; - break; - - case 'i': - - /* Disable integer optimization to constants */ - - Gbl_IntegerOptimizationFlag = FALSE; - break; - - case 'n': - - /* Disable named reference optimization */ - - Gbl_ReferenceOptimizationFlag = FALSE; - break; - - case 't': - - /* Display compile time(s) */ - - Gbl_CompileTimesFlag = TRUE; - break; - - default: - printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'P': /* Preprocessor options */ - switch (AcpiGbl_Optarg[0]) - { - case '^': /* Proprocess only, emit (.i) file */ - Gbl_PreprocessOnly = TRUE; - Gbl_PreprocessorOutputFlag = TRUE; - break; - - case 'n': /* Disable preprocessor */ - Gbl_PreprocessFlag = FALSE; - break; - - default: - printf ("Unknown option: -P%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'p': /* Override default AML output filename */ - Gbl_OutputFilenamePrefix = AcpiGbl_Optarg; - Gbl_UseDefaultAmlFilename = FALSE; - break; - - - case 'r': /* Override revision found in table header */ - Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); - break; - - - case 's': /* Create AML in a source code file */ - switch (AcpiGbl_Optarg[0]) - { - case 'a': - - /* Produce assembly code output file */ - - Gbl_AsmOutputFlag = TRUE; - break; - - case 'c': - - /* Produce C hex output file */ - - Gbl_C_OutputFlag = TRUE; - break; - - case 'o': - - /* Produce AML offset table in C */ - - Gbl_C_OffsetTableFlag = TRUE; - break; - - default: - printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 't': /* Produce hex table output file */ - switch (AcpiGbl_Optarg[0]) - { - case 'a': - Gbl_HexOutputFlag = HEX_OUTPUT_ASM; - break; - - case 'c': - Gbl_HexOutputFlag = HEX_OUTPUT_C; - break; - - case 's': - Gbl_HexOutputFlag = HEX_OUTPUT_ASL; - break; - - default: - printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'T': /* Create a ACPI table template file */ - Gbl_DoTemplates = TRUE; - Gbl_TemplateSignature = AcpiGbl_Optarg; - break; - - - case 'v': /* Version and verbosity settings */ - switch (AcpiGbl_Optarg[0]) - { - case '^': - printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); - exit (0); - - case 'a': - /* Disable All error/warning messages */ - - Gbl_NoErrors = TRUE; - break; - - case 'i': - /* - * Support for integrated development environment(s). - * - * 1) No compiler signon - * 2) Send stderr messages to stdout - * 3) Less verbose error messages (single line only for each) - * 4) Error/warning messages are formatted appropriately to - * be recognized by MS Visual Studio - */ - Gbl_VerboseErrors = FALSE; - Gbl_DoSignon = FALSE; - Gbl_Files[ASL_FILE_STDERR].Handle = stdout; - break; - - case 'o': - Gbl_DisplayOptimizations = TRUE; - break; - - case 'r': - Gbl_DisplayRemarks = FALSE; - break; - - case 's': - Gbl_DoSignon = FALSE; - break; - - case 't': - Gbl_VerboseTemplates = TRUE; - break; - - default: - printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'w': /* Set warning levels */ - switch (AcpiGbl_Optarg[0]) - { - case '1': - Gbl_WarningLevel = ASL_WARNING; - break; - - case '2': - Gbl_WarningLevel = ASL_WARNING2; - break; - - case '3': - Gbl_WarningLevel = ASL_WARNING3; - break; - - case 'e': - Gbl_WarningsAsErrors = TRUE; - break; - - default: - printf ("Unknown option: -w%s\n", AcpiGbl_Optarg); - return (-1); - } - break; - - - case 'x': /* Set debug print output level */ - AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16); - break; - - - case 'z': - Gbl_UseOriginalCompilerId = TRUE; - break; - - - default: - return (-1); - } - - return (0); -} - - -/******************************************************************************* - * - * FUNCTION: AslCommandLine - * - * PARAMETERS: argc/argv - * - * RETURN: Last argv index - * - * DESCRIPTION: Command line processing - * - ******************************************************************************/ - -static int -AslCommandLine ( - int argc, - char **argv) -{ - int BadCommandLine = 0; - ACPI_STATUS Status; - - - /* Minimum command line contains at least the command and an input file */ - - if (argc < 2) - { - printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); - Usage (); - exit (1); - } - - /* Process all command line options */ - - BadCommandLine = AslDoOptions (argc, argv, FALSE); - - if (Gbl_DoTemplates) - { - Status = DtCreateTemplates (Gbl_TemplateSignature); - if (ACPI_FAILURE (Status)) - { - exit (-1); - } - exit (1); - } - - /* Next parameter must be the input filename */ - - if (!argv[AcpiGbl_Optind] && - !Gbl_DisasmFlag && - !Gbl_GetAllTables) - { - printf ("Missing input filename\n"); - BadCommandLine = TRUE; - } - - if (Gbl_DoSignon) - { - printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); - if (Gbl_IgnoreErrors) - { - printf ("Ignoring all errors, forcing AML file generation\n\n"); - } - } - - /* Abort if anything went wrong on the command line */ - - if (BadCommandLine) - { - printf ("\n"); - Usage (); - exit (1); - } - - return (AcpiGbl_Optind); } @@ -1021,24 +287,24 @@ main ( int Index2; - signal (SIGINT, AslSignalHandler); + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ + /* Initialize preprocessor and compiler before command line processing */ + + signal (SIGINT, AslSignalHandler); AcpiGbl_ExternalFileList = NULL; AcpiDbgLevel = 0; - -#ifdef _DEBUG - _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF | - _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)); -#endif - - /* Init and command line */ + PrInitializePreprocessor (); + AslInitialize (); Index1 = Index2 = AslCommandLine (argc, argv); - AslInitialize (); - PrInitializePreprocessor (); + /* Allocate the line buffer(s), must be after command line */ + + Gbl_LineBufferSize /= 2; + UtExpandLineBuffers (); - /* Options that have no additional parameters or pathnames */ + /* Perform global actions first/only */ if (Gbl_GetAllTables) { diff --git a/source/compiler/aslmessages.h b/source/compiler/aslmessages.h index 102148d..a104a44 100644 --- a/source/compiler/aslmessages.h +++ b/source/compiler/aslmessages.h @@ -46,17 +46,52 @@ #define __ASLMESSAGES_H -#define ASL_WARNING 0 -#define ASL_WARNING2 1 -#define ASL_WARNING3 2 -#define ASL_ERROR 3 -#define ASL_REMARK 4 -#define ASL_OPTIMIZATION 5 -#define ASL_NUM_REPORT_LEVELS 6 +typedef enum +{ + ASL_OPTIMIZATION = 0, + ASL_REMARK, + ASL_WARNING, + ASL_WARNING2, + ASL_WARNING3, + ASL_ERROR, + ASL_NUM_REPORT_LEVELS + +} ASL_MESSAGE_TYPES; + +#ifdef ASL_EXCEPTIONS + +/* Strings for message reporting levels, must match values above */ +const char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = { + "Optimize", + "Remark ", + "Warning ", + "Warning ", + "Warning ", + "Error " +}; -/* Values for all compiler messages */ +/* All lowercase versions for IDEs */ +const char *AslErrorLevelIde [ASL_NUM_REPORT_LEVELS] = { + "optimize", + "remark ", + "warning ", + "warning ", + "warning ", + "error " +}; + +#define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings above */ +#endif + +/* + * Values for all compiler messages. + * + * NOTE: With the introduction of the -vw option to disable specific messages, + * new messages should only be added to the end of this list, so that values + * for existing messages are not disturbed. + */ typedef enum { ASL_MSG_RESERVED = 0, @@ -180,6 +215,7 @@ typedef enum ASL_MSG_SCOPE_TYPE, ASL_MSG_SEEK, ASL_MSG_SERIALIZED, + ASL_MSG_SERIALIZED_REQUIRED, ASL_MSG_SINGLE_NAME_OPTIMIZATION, ASL_MSG_SOME_NO_RETVAL, ASL_MSG_STRING_LENGTH, @@ -235,9 +271,15 @@ typedef enum #ifdef ASL_EXCEPTIONS -/* Actual message strings for each compiler message */ - -char *AslMessages [] = { +/* + * Actual message strings for each compiler message. + * + * NOTE: With the introduction of the -vw option to disable specific messages, + * new messages should only be added to the end of this list, so that values + * for existing messages are not disturbed. + */ +char *AslMessages [] = +{ /* The zeroth message is reserved */ "", /* ASL_MSG_ALIGNMENT */ "Must be a multiple of alignment/granularity value", /* ASL_MSG_ALPHANUMERIC_STRING */ "String must be entirely alphanumeric", @@ -358,6 +400,7 @@ char *AslMessages [] = { /* ASL_MSG_SCOPE_TYPE */ "Existing object has invalid type for Scope operator", /* ASL_MSG_SEEK */ "Could not seek file", /* ASL_MSG_SERIALIZED */ "Control Method marked Serialized", +/* ASL_MSG_SERIALIZED_REQUIRED */ "Control Method should be made Serialized", /* ASL_MSG_SINGLE_NAME_OPTIMIZATION */ "NamePath optimized to NameSeg (uses run-time search path)", /* ASL_MSG_SOME_NO_RETVAL */ "Called method may not always return a value", /* ASL_MSG_STRING_LENGTH */ "String literal too long", @@ -408,27 +451,6 @@ char *AslMessages [] = { /* ASL_MSG_ZERO_VALUE */ "Value must be non-zero" }; - -const char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = { - "Warning ", - "Warning ", - "Warning ", - "Error ", - "Remark ", - "Optimize" -}; - -const char *AslErrorLevelIde [ASL_NUM_REPORT_LEVELS] = { - "warning ", - "warning ", - "warning ", - "error ", - "remark ", - "optimize" -}; - -#define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings above */ - #endif /* ASL_EXCEPTIONS */ #endif /* __ASLMESSAGES_H */ diff --git a/source/compiler/aslmethod.c b/source/compiler/aslmethod.c index f191991..94e73d3 100644 --- a/source/compiler/aslmethod.c +++ b/source/compiler/aslmethod.c @@ -44,12 +44,22 @@ #include "aslcompiler.h" #include "aslcompiler.y.h" +#include "acparser.h" +#include "amlcode.h" #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("aslmethod") +/* Local prototypes */ + +void +MtCheckNamedObjectInMethod ( + ACPI_PARSE_OBJECT *Op, + ASL_METHOD_INFO *MethodInfo); + + /******************************************************************************* * * FUNCTION: MtMethodAnalysisWalkBegin @@ -111,6 +121,8 @@ MtMethodAnalysisWalkBegin ( /* Get the SerializeRule and SyncLevel nodes, ignored here */ Next = Next->Asl.Next; + MethodInfo->ShouldBeSerialized = (UINT8) Next->Asl.Value.Integer; + Next = Next->Asl.Next; ArgNode = Next; @@ -181,7 +193,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_METHODCALL: if (MethodInfo && @@ -191,7 +202,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_LOCAL0: case PARSEOP_LOCAL1: case PARSEOP_LOCAL2: @@ -236,7 +246,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_ARG0: case PARSEOP_ARG1: case PARSEOP_ARG2: @@ -287,7 +296,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_RETURN: if (!MethodInfo) @@ -320,7 +328,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_BREAK: case PARSEOP_CONTINUE: @@ -340,7 +347,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_STALL: /* We can range check if the argument is an integer */ @@ -352,7 +358,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_DEVICE: case PARSEOP_EVENT: case PARSEOP_MUTEX: @@ -372,7 +377,6 @@ MtMethodAnalysisWalkBegin ( } break; - case PARSEOP_NAME: /* Typecheck any predefined names statically defined with Name() */ @@ -410,17 +414,76 @@ MtMethodAnalysisWalkBegin ( } break; - default: + break; } + /* Check for named object creation within a non-serialized method */ + + MtCheckNamedObjectInMethod (Op, MethodInfo); return (AE_OK); } /******************************************************************************* * + * FUNCTION: MtCheckNamedObjectInMethod + * + * PARAMETERS: Op - Current parser op + * MethodInfo - Info for method being parsed + * + * RETURN: None + * + * DESCRIPTION: Detect if a non-serialized method is creating a named object, + * which could possibly cause problems if two threads execute + * the method concurrently. Emit a remark in this case. + * + ******************************************************************************/ + +void +MtCheckNamedObjectInMethod ( + ACPI_PARSE_OBJECT *Op, + ASL_METHOD_INFO *MethodInfo) +{ + const ACPI_OPCODE_INFO *OpInfo; + + + /* We don't care about actual method declarations */ + + if (Op->Asl.AmlOpcode == AML_METHOD_OP) + { + return; + } + + /* Determine if we are creating a named object */ + + OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); + if (OpInfo->Class == AML_CLASS_NAMED_OBJECT) + { + /* + * If we have a named object created within a non-serialized method, + * emit a remark that the method should be serialized. + * + * Reason: If a thread blocks within the method for any reason, and + * another thread enters the method, the method will fail because an + * attempt will be made to create the same object twice. + */ + if (MethodInfo && !MethodInfo->ShouldBeSerialized) + { + AslError (ASL_REMARK, ASL_MSG_SERIALIZED_REQUIRED, MethodInfo->Op, + "due to creation of named objects within"); + + /* Emit message only ONCE per method */ + + MethodInfo->ShouldBeSerialized = TRUE; + } + } +} + + +/******************************************************************************* + * * FUNCTION: MtMethodAnalysisWalkEnd * * PARAMETERS: ASL_WALK_CALLBACK @@ -446,6 +509,7 @@ MtMethodAnalysisWalkEnd ( { case PARSEOP_METHOD: case PARSEOP_RETURN: + if (!MethodInfo) { printf ("No method info for method! [%s]\n", Op->Asl.Namepath); @@ -458,6 +522,7 @@ MtMethodAnalysisWalkEnd ( break; default: + break; } @@ -534,7 +599,6 @@ MtMethodAnalysisWalkEnd ( ACPI_FREE (MethodInfo); break; - case PARSEOP_NAME: /* Special check for two names like _L01 and _E01 in same scope */ @@ -542,7 +606,6 @@ MtMethodAnalysisWalkEnd ( ApCheckForGpeNameConflict (Op); break; - case PARSEOP_RETURN: /* @@ -572,7 +635,6 @@ MtMethodAnalysisWalkEnd ( } break; - case PARSEOP_IF: if ((Op->Asl.CompileFlags & NODE_HAS_NO_EXIT) && @@ -588,7 +650,6 @@ MtMethodAnalysisWalkEnd ( } break; - case PARSEOP_ELSE: if ((Op->Asl.CompileFlags & NODE_HAS_NO_EXIT) && diff --git a/source/compiler/aslnamesp.c b/source/compiler/aslnamesp.c index 724f830..3fc5f39 100644 --- a/source/compiler/aslnamesp.c +++ b/source/compiler/aslnamesp.c @@ -194,7 +194,6 @@ NsDoOneNamespaceObject ( ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; - case ACPI_TYPE_STRING: FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, @@ -203,7 +202,9 @@ NsDoOneNamespaceObject ( break; default: + /* Nothing to do for other types */ + break; } @@ -228,7 +229,6 @@ NsDoOneNamespaceObject ( ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); break; - case ACPI_TYPE_STRING: if (Op->Asl.ParseOpcode == PARSEOP_NAME) @@ -245,7 +245,6 @@ NsDoOneNamespaceObject ( Op->Asl.Value.String); break; - case ACPI_TYPE_LOCAL_REGION_FIELD: if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) || @@ -258,42 +257,47 @@ NsDoOneNamespaceObject ( Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer); break; - case ACPI_TYPE_BUFFER_FIELD: switch (Op->Asl.ParseOpcode) { case PARSEOP_CREATEBYTEFIELD: + FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BYTE ( 8 bit)]"); break; case PARSEOP_CREATEDWORDFIELD: + FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [DWORD (32 bit)]"); break; case PARSEOP_CREATEQWORDFIELD: + FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [QWORD (64 bit)]"); break; case PARSEOP_CREATEWORDFIELD: + FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [WORD (16 bit)]"); break; case PARSEOP_CREATEBITFIELD: + FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BIT ( 1 bit)]"); break; case PARSEOP_CREATEFIELD: + FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [Arbitrary Bit Field]"); break; default: + break; } break; - case ACPI_TYPE_PACKAGE: if (Op->Asl.ParseOpcode == PARSEOP_NAME) @@ -316,7 +320,6 @@ NsDoOneNamespaceObject ( } break; - case ACPI_TYPE_BUFFER: if (Op->Asl.ParseOpcode == PARSEOP_NAME) @@ -338,7 +341,6 @@ NsDoOneNamespaceObject ( } break; - case ACPI_TYPE_METHOD: FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, @@ -346,14 +348,12 @@ NsDoOneNamespaceObject ( Op->Asl.AmlSubtreeLength); break; - case ACPI_TYPE_LOCAL_RESOURCE: FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [Desc Offset 0x%.4X Bytes]", Node->Value); break; - case ACPI_TYPE_LOCAL_RESOURCE_FIELD: FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, @@ -372,9 +372,10 @@ NsDoOneNamespaceObject ( } break; - default: + /* Nothing to do for other types */ + break; } } diff --git a/source/compiler/asloffset.c b/source/compiler/asloffset.c index 190b92a..25e5b0f 100644 --- a/source/compiler/asloffset.c +++ b/source/compiler/asloffset.c @@ -58,7 +58,6 @@ LsEmitOffsetTableEntry ( UINT32 FileId, ACPI_NAMESPACE_NODE *Node, UINT32 Offset, - UINT32 Length, char *OpName, UINT64 Value, UINT8 AmlOpcode); @@ -77,7 +76,9 @@ LsEmitOffsetTableEntry ( * Three types of objects are currently emitted to the offset table: * 1) Tagged (named) resource descriptors * 2) Named integer objects with constant integer values - * 3) Operation Regions that have constant Offset (address) parameters + * 3) Named package objects + * 4) Operation Regions that have constant Offset (address) parameters + * 5) Control methods * * The offset table allows the BIOS to dynamically update the values of these * objects at boot time. @@ -94,7 +95,7 @@ LsAmlOffsetWalk ( ACPI_NAMESPACE_NODE *Node; UINT32 Length; UINT32 OffsetOfOpcode; - ACPI_PARSE_OBJECT *AddressOp; + ACPI_PARSE_OBJECT *NextOp; /* Ignore actual data blocks for resource descriptors */ @@ -119,13 +120,17 @@ LsAmlOffsetWalk ( (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)) { LsEmitOffsetTableEntry (FileId, Node, Gbl_CurrentAmlOffset, - Op->Asl.FinalAmlLength, Op->Asl.ParseOpName, 0, Op->Asl.Extra); + Op->Asl.ParseOpName, 0, Op->Asl.Extra); + Gbl_CurrentAmlOffset += Op->Asl.FinalAmlLength; + return (AE_OK); } - /* Named object -- Name (NameString, DataRefObject) */ - - else if (Op->Asl.AmlOpcode == AML_NAME_OP) + switch (Op->Asl.AmlOpcode) { + case AML_NAME_OP: + + /* Named object -- Name (NameString, DataRefObject) */ + if (!Op->Asl.Child) { FlPrintFile (FileId, "%s NO CHILD!\n", MsgBuffer); @@ -154,39 +159,50 @@ LsAmlOffsetWalk ( case AML_DWORD_OP: case AML_QWORD_OP: - /* The +1/-1 is to handle the integer size prefix (opcode) */ + /* The +1 is to handle the integer size prefix (opcode) */ LsEmitOffsetTableEntry (FileId, Node, (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1), - (Op->Asl.FinalAmlLength - 1), Op->Asl.ParseOpName, - Op->Asl.Value.Integer, (UINT8) Op->Asl.AmlOpcode); + Op->Asl.ParseOpName, Op->Asl.Value.Integer, + (UINT8) Op->Asl.AmlOpcode); break; - default: + case AML_PACKAGE_OP: + case AML_VAR_PACKAGE_OP: + + NextOp = Op->Asl.Child; + + LsEmitOffsetTableEntry (FileId, Node, + (Gbl_CurrentAmlOffset + OffsetOfOpcode), + Op->Asl.ParseOpName, + NextOp->Asl.Value.Integer, + (UINT8) Op->Asl.AmlOpcode); break; + + default: + break; } Gbl_CurrentAmlOffset += Length; return (AE_OK); - } - /* OperationRegion (NameString, RegionSpace, RegionOffset, RegionLength) */ + case AML_REGION_OP: + + /* OperationRegion (NameString, RegionSpace, RegionOffset, RegionLength) */ - else if (Op->Asl.AmlOpcode == AML_REGION_OP) - { Length = Op->Asl.FinalAmlLength; /* Get the name/namepath node */ - AddressOp = Op->Asl.Child; - OffsetOfOpcode = Length + AddressOp->Asl.FinalAmlLength + 1; + NextOp = Op->Asl.Child; + OffsetOfOpcode = Length + NextOp->Asl.FinalAmlLength + 1; /* Get the SpaceId node, then the Offset (address) node */ - AddressOp = AddressOp->Asl.Next; - AddressOp = AddressOp->Asl.Next; + NextOp = NextOp->Asl.Next; + NextOp = NextOp->Asl.Next; - switch (AddressOp->Asl.AmlOpcode) + switch (NextOp->Asl.AmlOpcode) { /* * We are only interested in integer constants that can be changed @@ -198,12 +214,10 @@ LsAmlOffsetWalk ( case AML_DWORD_OP: case AML_QWORD_OP: - /* The +1/-1 is to handle the integer size prefix (opcode) */ - LsEmitOffsetTableEntry (FileId, Node, (Gbl_CurrentAmlOffset + OffsetOfOpcode + 1), - (AddressOp->Asl.FinalAmlLength - 1), Op->Asl.ParseOpName, - AddressOp->Asl.Value.Integer, (UINT8) AddressOp->Asl.AmlOpcode); + Op->Asl.ParseOpName, NextOp->Asl.Value.Integer, + (UINT8) NextOp->Asl.AmlOpcode); Gbl_CurrentAmlOffset += Length; return (AE_OK); @@ -211,6 +225,31 @@ LsAmlOffsetWalk ( default: break; } + break; + + case AML_METHOD_OP: + + /* Method (Namepath, ...) */ + + Length = Op->Asl.FinalAmlLength; + + /* Get the NameSeg/NamePath Op */ + + NextOp = Op->Asl.Child; + + /* Point to the *last* nameseg in the namepath */ + + OffsetOfOpcode = NextOp->Asl.FinalAmlLength - ACPI_NAME_SIZE; + + LsEmitOffsetTableEntry (FileId, Node, + (Gbl_CurrentAmlOffset + OffsetOfOpcode + Length), + Op->Asl.ParseOpName, + *((UINT32 *) &NextOp->Asl.Value.Buffer[OffsetOfOpcode]), + (UINT8) Op->Asl.AmlOpcode); + break; + + default: + break; } Gbl_CurrentAmlOffset += Op->Asl.FinalAmlLength; @@ -225,7 +264,6 @@ LsAmlOffsetWalk ( * PARAMETERS: FileId - ID of current listing file * Node - Namespace node associated with the name * Offset - Offset of the value within the AML table - * Length - Length in bytes of the value * OpName - Name of the AML opcode * Value - Current value of the AML field * AmlOpcode - Opcode associated with the field @@ -241,7 +279,6 @@ LsEmitOffsetTableEntry ( UINT32 FileId, ACPI_NAMESPACE_NODE *Node, UINT32 Offset, - UINT32 Length, char *OpName, UINT64 Value, UINT8 AmlOpcode) @@ -293,8 +330,6 @@ LsDoOffsetTableHeader ( UINT32 FileId) { - Gbl_CurrentAmlOffset = 0; - FlPrintFile (FileId, "#ifndef __AML_OFFSET_TABLE_H\n" "#define __AML_OFFSET_TABLE_H\n\n"); @@ -302,14 +337,41 @@ LsDoOffsetTableHeader ( FlPrintFile (FileId, "typedef struct {\n" " char *Pathname;\n" " unsigned long Offset;\n" - " unsigned char AmlOpcode;\n" - " unsigned long long AmlValue;\n" + " unsigned char Opcode;\n" + " unsigned long long Value;\n" "} AML_OFFSET_TABLE_ENTRY;\n\n"); FlPrintFile (FileId, "#endif /* __AML_OFFSET_TABLE_H */\n\n"); FlPrintFile (FileId, + "/*\n" + " * Information about supported object types:\n" + " *\n" + " * Integers:\n" + " * Offset points to the actual integer data\n" + " * Opcode is the integer prefix, indicates length of the data\n" + " * Value is the existing value in the AML\n" + " *\n" + " * Packages:\n" + " * Offset points to the package opcode\n" + " * Opcode is the package or var_package opcode\n" + " * Value is the package element cound\n" + " *\n" + " * Operation Regions:\n" + " * Offset points to the region address data\n" + " * Opcode is the address integer prefix, indicates length of the data\n" + " * Value is the existing address value in the AML\n" + " *\n" + " * Control Methods:\n" + " * Offset points to the first byte of the namepath\n" + " *\n" + " * Resource Descriptors:\n" + " * Offset points to the start of the descriptor\n" + " * Opcode is the descriptor type\n" + " */\n"); + + FlPrintFile (FileId, "AML_OFFSET_TABLE_ENTRY %s_%s_OffsetTable[] =\n{\n", Gbl_TableSignature, Gbl_TableId); } diff --git a/source/compiler/aslopcodes.c b/source/compiler/aslopcodes.c index d3a49f3..332def7 100644 --- a/source/compiler/aslopcodes.c +++ b/source/compiler/aslopcodes.c @@ -266,6 +266,7 @@ OpcSetOptimalIntegerSize ( break; default: + break; } } @@ -811,7 +812,9 @@ OpcGenerateAmlOpcode ( break; default: + /* Nothing to do for other opcodes */ + break; } diff --git a/source/compiler/asloperands.c b/source/compiler/asloperands.c index f281701..deb4bd4 100644 --- a/source/compiler/asloperands.c +++ b/source/compiler/asloperands.c @@ -298,7 +298,6 @@ OpnDoFieldCommon ( /* Nothing additional to do */ break; - case PARSEOP_OFFSET: /* New offset into the field */ @@ -342,7 +341,6 @@ OpnDoFieldCommon ( } break; - case PARSEOP_NAMESEG: case PARSEOP_RESERVED_BYTES: @@ -360,6 +358,7 @@ OpnDoFieldCommon ( case AML_FIELD_ACCESS_BYTE: case AML_FIELD_ACCESS_BUFFER: default: + MinimumLength = 8; break; @@ -380,7 +379,9 @@ OpnDoFieldCommon ( break; default: + /* All supported field opcodes must appear above */ + break; } @@ -610,7 +611,6 @@ OpnDoBuffer ( } break; - case PARSEOP_STRING_LITERAL: /* @@ -624,18 +624,16 @@ OpnDoBuffer ( InitializerOp->Asl.ParseOpcode = PARSEOP_RAW_DATA; break; - case PARSEOP_RAW_DATA: /* Buffer nodes are already initialized (e.g. Unicode operator) */ return; - case PARSEOP_DEFAULT_ARG: break; - default: + AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, InitializerOp, "Unknown buffer initializer opcode"); printf ("Unknown buffer initializer opcode [%s]\n", @@ -1092,6 +1090,7 @@ OpnAttachNameToNode ( return; default: + return; } @@ -1130,42 +1129,52 @@ OpnGenerateAmlOperands ( switch (Op->Asl.ParseOpcode) { case PARSEOP_DEFINITIONBLOCK: + OpnDoDefinitionBlock (Op); break; case PARSEOP_METHOD: + OpnDoMethod (Op); break; case PARSEOP_MUTEX: + OpnDoMutex (Op); break; case PARSEOP_FIELD: + OpnDoField (Op); break; case PARSEOP_INDEXFIELD: + OpnDoIndexField (Op); break; case PARSEOP_BANKFIELD: + OpnDoBankField (Op); break; case PARSEOP_BUFFER: + OpnDoBuffer (Op); break; case PARSEOP_LOADTABLE: + OpnDoLoadTable (Op); break; case PARSEOP_OPERATIONREGION: + OpnDoRegion (Op); break; case PARSEOP_RESOURCETEMPLATE: + RsDoResourceTemplate (Op); break; @@ -1173,9 +1182,11 @@ OpnGenerateAmlOperands ( case PARSEOP_NAMESTRING: case PARSEOP_METHODCALL: case PARSEOP_STRING_LITERAL: + break; default: + break; } diff --git a/source/compiler/asloptions.c b/source/compiler/asloptions.c new file mode 100644 index 0000000..bfb3d75 --- /dev/null +++ b/source/compiler/asloptions.c @@ -0,0 +1,791 @@ +/****************************************************************************** + * + * Module Name: asloptions - compiler command line processing + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#include "aslcompiler.h" +#include "acapps.h" +#include "acdisasm.h" + +#define _COMPONENT ACPI_COMPILER + ACPI_MODULE_NAME ("asloption") + + +/* Local prototypes */ + +static int +AslDoOptions ( + int argc, + char **argv, + BOOLEAN IsResponseFile); + +static void +AslMergeOptionTokens ( + char *InBuffer, + char *OutBuffer); + +static int +AslDoResponseFile ( + char *Filename); + + +#define ASL_TOKEN_SEPARATORS " \t\n" +#define ASL_SUPPORTED_OPTIONS "@:b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T:G^v^w|x:z" + + +/******************************************************************************* + * + * FUNCTION: AslCommandLine + * + * PARAMETERS: argc/argv + * + * RETURN: Last argv index + * + * DESCRIPTION: Command line processing + * + ******************************************************************************/ + +int +AslCommandLine ( + int argc, + char **argv) +{ + int BadCommandLine = 0; + ACPI_STATUS Status; + + + /* Minimum command line contains at least the command and an input file */ + + if (argc < 2) + { + printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); + Usage (); + exit (1); + } + + /* Process all command line options */ + + BadCommandLine = AslDoOptions (argc, argv, FALSE); + + if (Gbl_DoTemplates) + { + Status = DtCreateTemplates (Gbl_TemplateSignature); + if (ACPI_FAILURE (Status)) + { + exit (-1); + } + exit (1); + } + + /* Next parameter must be the input filename */ + + if (!argv[AcpiGbl_Optind] && + !Gbl_DisasmFlag && + !Gbl_GetAllTables) + { + printf ("Missing input filename\n"); + BadCommandLine = TRUE; + } + + if (Gbl_DoSignon) + { + printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); + if (Gbl_IgnoreErrors) + { + printf ("Ignoring all errors, forcing AML file generation\n\n"); + } + } + + if (BadCommandLine) + { + printf ("\n"); + Usage (); + exit (1); + } + + return (AcpiGbl_Optind); +} + + +/******************************************************************************* + * + * FUNCTION: AslDoOptions + * + * PARAMETERS: argc/argv - Standard argc/argv + * IsResponseFile - TRUE if executing a response file. + * + * RETURN: Status + * + * DESCRIPTION: Command line option processing + * + ******************************************************************************/ + +static int +AslDoOptions ( + int argc, + char **argv, + BOOLEAN IsResponseFile) +{ + ACPI_STATUS Status; + UINT32 j; + + + /* Get the command line options */ + + while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j) + { + case '@': /* Begin a response file */ + + if (IsResponseFile) + { + printf ("Nested command files are not supported\n"); + return (-1); + } + + if (AslDoResponseFile (AcpiGbl_Optarg)) + { + return (-1); + } + break; + + case 'b': /* Debug output options */ + + switch (AcpiGbl_Optarg[0]) + { + case 'f': + + AslCompilerdebug = 1; /* same as yydebug */ + DtParserdebug = 1; + PrParserdebug = 1; + break; + + case 't': + + break; + + default: + + printf ("Unknown option: -b%s\n", AcpiGbl_Optarg); + return (-1); + } + + /* Produce debug output file */ + + Gbl_DebugFlag = TRUE; + break; + + case 'c': + + switch (AcpiGbl_Optarg[0]) + { + case 'r': + + Gbl_NoResourceChecking = TRUE; + break; + + default: + + printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'd': /* Disassembler */ + + switch (AcpiGbl_Optarg[0]) + { + case '^': + + Gbl_DoCompile = FALSE; + break; + + case 'a': + + Gbl_DoCompile = FALSE; + Gbl_DisassembleAll = TRUE; + break; + + case 'b': /* Do not convert buffers to resource descriptors */ + + AcpiGbl_NoResourceDisassembly = TRUE; + break; + + case 'c': + + break; + + default: + + printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); + return (-1); + } + + Gbl_DisasmFlag = TRUE; + break; + + case 'D': /* Define a symbol */ + + PrAddDefine (AcpiGbl_Optarg, NULL, TRUE); + break; + + case 'e': /* External files for disassembler */ + + Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg); + if (ACPI_FAILURE (Status)) + { + printf ("Could not add %s to external list\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'f': /* Ignore errors and force creation of aml file */ + + Gbl_IgnoreErrors = TRUE; + break; + + case 'G': + + Gbl_CompileGeneric = TRUE; + break; + + case 'g': /* Get all ACPI tables */ + + Gbl_GetAllTables = TRUE; + Gbl_DoCompile = FALSE; + break; + + case 'h': + + switch (AcpiGbl_Optarg[0]) + { + case '^': + + Usage (); + exit (0); + + case 'c': + + UtDisplayConstantOpcodes (); + exit (0); + + case 'f': + + AslFilenameHelp (); + exit (0); + + case 'r': + + /* reserved names */ + + ApDisplayReservedNames (); + exit (0); + + case 't': + + UtDisplaySupportedTables (); + exit (0); + + default: + + printf ("Unknown option: -h%s\n", AcpiGbl_Optarg); + return (-1); + } + + case 'I': /* Add an include file search directory */ + + FlAddIncludeDirectory (AcpiGbl_Optarg); + break; + + case 'i': /* Output AML as an include file */ + + switch (AcpiGbl_Optarg[0]) + { + case 'a': + + /* Produce assembly code include file */ + + Gbl_AsmIncludeOutputFlag = TRUE; + break; + + case 'c': + + /* Produce C include file */ + + Gbl_C_IncludeOutputFlag = TRUE; + break; + + case 'n': + + /* Compiler/Disassembler: Ignore the NOOP operator */ + + AcpiGbl_IgnoreNoopOperator = TRUE; + break; + + default: + + printf ("Unknown option: -i%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'l': /* Listing files */ + + switch (AcpiGbl_Optarg[0]) + { + case '^': + + /* Produce listing file (Mixed source/aml) */ + + Gbl_ListingFlag = TRUE; + break; + + case 'i': + + /* Produce preprocessor output file */ + + Gbl_PreprocessorOutputFlag = TRUE; + break; + + case 'n': + + /* Produce namespace file */ + + Gbl_NsOutputFlag = TRUE; + break; + + case 's': + + /* Produce combined source file */ + + Gbl_SourceOutputFlag = TRUE; + break; + + default: + + printf ("Unknown option: -l%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'm': /* Set line buffer size */ + + Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024; + if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE) + { + Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE; + } + printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize); + break; + + case 'n': /* Parse only */ + + Gbl_ParseOnlyFlag = TRUE; + break; + + case 'o': /* Control compiler AML optimizations */ + + switch (AcpiGbl_Optarg[0]) + { + case 'a': + + /* Disable all optimizations */ + + Gbl_FoldConstants = FALSE; + Gbl_IntegerOptimizationFlag = FALSE; + Gbl_ReferenceOptimizationFlag = FALSE; + break; + + case 'f': + + /* Disable folding on "normal" expressions */ + + Gbl_FoldConstants = FALSE; + break; + + case 'i': + + /* Disable integer optimization to constants */ + + Gbl_IntegerOptimizationFlag = FALSE; + break; + + case 'n': + + /* Disable named reference optimization */ + + Gbl_ReferenceOptimizationFlag = FALSE; + break; + + case 't': + + /* Display compile time(s) */ + + Gbl_CompileTimesFlag = TRUE; + break; + + default: + + printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'P': /* Preprocessor options */ + + switch (AcpiGbl_Optarg[0]) + { + case '^': /* Proprocess only, emit (.i) file */ + + Gbl_PreprocessOnly = TRUE; + Gbl_PreprocessorOutputFlag = TRUE; + break; + + case 'n': /* Disable preprocessor */ + + Gbl_PreprocessFlag = FALSE; + break; + + default: + + printf ("Unknown option: -P%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'p': /* Override default AML output filename */ + + Gbl_OutputFilenamePrefix = AcpiGbl_Optarg; + Gbl_UseDefaultAmlFilename = FALSE; + break; + + case 'r': /* Override revision found in table header */ + + Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); + break; + + case 's': /* Create AML in a source code file */ + + switch (AcpiGbl_Optarg[0]) + { + case 'a': + + /* Produce assembly code output file */ + + Gbl_AsmOutputFlag = TRUE; + break; + + case 'c': + + /* Produce C hex output file */ + + Gbl_C_OutputFlag = TRUE; + break; + + case 'o': + + /* Produce AML offset table in C */ + + Gbl_C_OffsetTableFlag = TRUE; + break; + + default: + + printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 't': /* Produce hex table output file */ + + switch (AcpiGbl_Optarg[0]) + { + case 'a': + + Gbl_HexOutputFlag = HEX_OUTPUT_ASM; + break; + + case 'c': + + Gbl_HexOutputFlag = HEX_OUTPUT_C; + break; + + case 's': + + Gbl_HexOutputFlag = HEX_OUTPUT_ASL; + break; + + default: + + printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'T': /* Create a ACPI table template file */ + + Gbl_DoTemplates = TRUE; + Gbl_TemplateSignature = AcpiGbl_Optarg; + break; + + case 'v': /* Version and verbosity settings */ + + switch (AcpiGbl_Optarg[0]) + { + case '^': + + printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); + exit (0); + + case 'a': + + /* Disable All error/warning messages */ + + Gbl_NoErrors = TRUE; + break; + + case 'i': + /* + * Support for integrated development environment(s). + * + * 1) No compiler signon + * 2) Send stderr messages to stdout + * 3) Less verbose error messages (single line only for each) + * 4) Error/warning messages are formatted appropriately to + * be recognized by MS Visual Studio + */ + Gbl_VerboseErrors = FALSE; + Gbl_DoSignon = FALSE; + Gbl_Files[ASL_FILE_STDERR].Handle = stdout; + break; + + case 'o': + + Gbl_DisplayOptimizations = TRUE; + break; + + case 'r': + + Gbl_DisplayRemarks = FALSE; + break; + + case 's': + + Gbl_DoSignon = FALSE; + break; + + case 't': + + Gbl_VerboseTemplates = TRUE; + break; + + case 'w': + + /* Get the required argument */ + + if (AcpiGetoptArgument (argc, argv)) + { + return (-1); + } + + Status = AslDisableException (AcpiGbl_Optarg); + if (ACPI_FAILURE (Status)) + { + return (-1); + } + break; + + default: + + printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'w': /* Set warning levels */ + + switch (AcpiGbl_Optarg[0]) + { + case '1': + + Gbl_WarningLevel = ASL_WARNING; + break; + + case '2': + + Gbl_WarningLevel = ASL_WARNING2; + break; + + case '3': + + Gbl_WarningLevel = ASL_WARNING3; + break; + + case 'e': + + Gbl_WarningsAsErrors = TRUE; + break; + + default: + + printf ("Unknown option: -w%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + + case 'x': /* Set debug print output level */ + + AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16); + break; + + case 'z': + + Gbl_UseOriginalCompilerId = TRUE; + break; + + default: + + return (-1); + } + + return (0); +} + + +/******************************************************************************* + * + * FUNCTION: AslMergeOptionTokens + * + * PARAMETERS: InBuffer - Input containing an option string + * OutBuffer - Merged output buffer + * + * RETURN: None + * + * DESCRIPTION: Remove all whitespace from an option string. + * + ******************************************************************************/ + +static void +AslMergeOptionTokens ( + char *InBuffer, + char *OutBuffer) +{ + char *Token; + + + *OutBuffer = 0; + + Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS); + while (Token) + { + strcat (OutBuffer, Token); + Token = strtok (NULL, ASL_TOKEN_SEPARATORS); + } +} + + +/******************************************************************************* + * + * FUNCTION: AslDoResponseFile + * + * PARAMETERS: Filename - Name of the response file + * + * RETURN: Status + * + * DESCRIPTION: Open a response file and process all options within. + * + ******************************************************************************/ + +static int +AslDoResponseFile ( + char *Filename) +{ + char *argv = StringBuffer2; + FILE *ResponseFile; + int OptStatus = 0; + int Opterr; + int Optind; + + + ResponseFile = fopen (Filename, "r"); + if (!ResponseFile) + { + printf ("Could not open command file %s, %s\n", + Filename, strerror (errno)); + return (-1); + } + + /* Must save the current GetOpt globals */ + + Opterr = AcpiGbl_Opterr; + Optind = AcpiGbl_Optind; + + /* + * Process all lines in the response file. There must be one complete + * option per line + */ + while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile)) + { + /* Compress all tokens, allowing us to use a single argv entry */ + + AslMergeOptionTokens (StringBuffer, StringBuffer2); + + /* Process the option */ + + AcpiGbl_Opterr = 0; + AcpiGbl_Optind = 0; + + OptStatus = AslDoOptions (1, &argv, TRUE); + if (OptStatus) + { + printf ("Invalid option in command file %s: %s\n", + Filename, StringBuffer); + break; + } + } + + /* Restore the GetOpt globals */ + + AcpiGbl_Opterr = Opterr; + AcpiGbl_Optind = Optind; + + fclose (ResponseFile); + return (OptStatus); +} diff --git a/source/compiler/aslpredef.c b/source/compiler/aslpredef.c index 4330c19..60b5269 100644 --- a/source/compiler/aslpredef.c +++ b/source/compiler/aslpredef.c @@ -124,29 +124,30 @@ ApCheckForPredefinedMethod ( default: /* - * Matched a predefined method name + * Matched a predefined method name - validate the ASL-defined + * argument count against the ACPI specification. * - * Validate the ASL-defined argument count. Allow two different legal - * arg counts. + * Some methods are allowed to have a "minimum" number of args + * (_SCP) because their definition in ACPI has changed over time. */ Gbl_ReservedMethods++; ThisName = &AcpiGbl_PredefinedMethods[Index]; - RequiredArgCount = ThisName->Info.ArgumentList & METHOD_ARG_MASK; + RequiredArgCount = METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList); if (MethodInfo->NumArguments != RequiredArgCount) { sprintf (MsgBuffer, "%4.4s requires %u", ThisName->Info.Name, RequiredArgCount); - if ((MethodInfo->NumArguments > RequiredArgCount) && - !(ThisName->Info.ArgumentList & ARG_COUNT_IS_MINIMUM)) + if (MethodInfo->NumArguments < RequiredArgCount) { - AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op, + AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_LO, Op, MsgBuffer); } - else + else if ((MethodInfo->NumArguments > RequiredArgCount) && + !(ThisName->Info.ArgumentList & ARG_COUNT_IS_MINIMUM)) { - AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_LO, Op, + AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op, MsgBuffer); } } @@ -309,7 +310,6 @@ ApCheckPredefinedReturnValue ( break; default: - /* * All other ops are very difficult or impossible to typecheck at * compile time. These include all Localx, Argx, and method @@ -378,6 +378,7 @@ ApCheckForPredefinedObject ( return; default: + break; } @@ -388,7 +389,7 @@ ApCheckForPredefinedObject ( * it must be implemented as a control method */ ThisName = &AcpiGbl_PredefinedMethods[Index]; - if ((ThisName->Info.ArgumentList & METHOD_ARG_MASK) > 0) + if (METHOD_GET_ARG_COUNT (ThisName->Info.ArgumentList) > 0) { AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op, "with arguments"); @@ -623,33 +624,53 @@ ApCheckObjectType ( case PARSEOP_ONE: case PARSEOP_ONES: case PARSEOP_INTEGER: + ReturnBtype = ACPI_RTYPE_INTEGER; TypeName = "Integer"; break; case PARSEOP_STRING_LITERAL: + ReturnBtype = ACPI_RTYPE_STRING; TypeName = "String"; break; case PARSEOP_BUFFER: + ReturnBtype = ACPI_RTYPE_BUFFER; TypeName = "Buffer"; break; case PARSEOP_PACKAGE: case PARSEOP_VAR_PACKAGE: + ReturnBtype = ACPI_RTYPE_PACKAGE; TypeName = "Package"; break; case PARSEOP_NAMESEG: case PARSEOP_NAMESTRING: + /* + * Ignore any named references within a package object. + * + * For Package objects, references are allowed instead of any of the + * standard data types (Integer/String/Buffer/Package). These + * references are resolved at runtime. NAMESEG and NAMESTRING are + * impossible to typecheck at compile time because the type of + * any named object can be changed at runtime (for example, + * CopyObject will change the type of the target object). + */ + if (PackageIndex != ACPI_NOT_PACKAGE_ELEMENT) + { + return (AE_OK); + } + ReturnBtype = ACPI_RTYPE_REFERENCE; TypeName = "Reference"; break; default: + /* Not one of the supported object types */ TypeName = UtGetOpName (Op->Asl.ParseOpcode); diff --git a/source/compiler/aslprepkg.c b/source/compiler/aslprepkg.c index da34947..d32b1f2 100644 --- a/source/compiler/aslprepkg.c +++ b/source/compiler/aslprepkg.c @@ -54,12 +54,12 @@ static void ApCheckPackageElements ( - const char *PredefinedName, - ACPI_PARSE_OBJECT *Op, - UINT8 Type1, - UINT32 Count1, - UINT8 Type2, - UINT32 Count2); + const char *PredefinedName, + ACPI_PARSE_OBJECT *Op, + UINT8 Type1, + UINT32 Count1, + UINT8 Type2, + UINT32 Count2); static void ApCheckPackageList ( @@ -93,8 +93,9 @@ ApPackageTooLarge ( * * FUNCTION: ApCheckPackage * - * PARAMETERS: ParentOp - Parser op for the package - * Predefined - Pointer to package-specific info for method + * PARAMETERS: ParentOp - Parser op for the package + * Predefined - Pointer to package-specific info for + * the method * * RETURN: None * @@ -193,8 +194,8 @@ ApCheckPackage ( case ACPI_PTYPE1_VAR: /* - * The package count is variable, there are no sub-packages, and all - * elements must be of the same type + * The package count is variable, there are no sub-packages, + * and all elements must be of the same type */ for (i = 0; i < Count; i++) { @@ -206,9 +207,9 @@ ApCheckPackage ( case ACPI_PTYPE1_OPTION: /* - * The package count is variable, there are no sub-packages. There are - * a fixed number of required elements, and a variable number of - * optional elements. + * The package count is variable, there are no sub-packages. + * There are a fixed number of required elements, and a variable + * number of optional elements. * * Check if package is at least as large as the minimum required */ @@ -268,8 +269,8 @@ ApCheckPackage ( if (ACPI_SUCCESS (Status)) { /* - * Count cannot be larger than the parent package length, but allow it - * to be smaller. The >= accounts for the Integer above. + * Count cannot be larger than the parent package length, but + * allow it to be smaller. The >= accounts for the Integer above. */ ExpectedCount = (UINT32) Op->Asl.Value.Integer; if (ExpectedCount >= Count) @@ -320,12 +321,12 @@ PackageTooSmall: * * FUNCTION: ApCheckPackageElements * - * PARAMETERS: PredefinedName - Pointer to validation data structure - * Op - Parser op for the package - * Type1 - Object type for first group - * Count1 - Count for first group - * Type2 - Object type for second group - * Count2 - Count for second group + * PARAMETERS: PredefinedName - Name of the predefined object + * Op - Parser op for the package + * Type1 - Object type for first group + * Count1 - Count for first group + * Type2 - Object type for second group + * Count2 - Count for second group * * RETURN: None * diff --git a/source/compiler/aslresource.c b/source/compiler/aslresource.c index 272f9b0..d7f829f 100644 --- a/source/compiler/aslresource.c +++ b/source/compiler/aslresource.c @@ -319,6 +319,7 @@ RsLargeAddressCheck ( case ACPI_RESOURCE_FLAG_MIF: case ACPI_RESOURCE_FLAG_MAF: default: + AslError (ASL_ERROR, ASL_MSG_INVALID_ADDR_FLAGS, LengthOp, NULL); } } @@ -364,6 +365,7 @@ RsLargeAddressCheck ( case (ACPI_RESOURCE_FLAG_MIF | ACPI_RESOURCE_FLAG_MAF): default: + AslError (ASL_ERROR, ASL_MSG_INVALID_ADDR_FLAGS, LengthOp, NULL); } } @@ -655,45 +657,54 @@ RsDoOneResourceDescriptor ( switch (DescriptorTypeOp->Asl.ParseOpcode) { case PARSEOP_DMA: + Rnode = RsDoDmaDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_FIXEDDMA: + Rnode = RsDoFixedDmaDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_DWORDIO: + Rnode = RsDoDwordIoDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_DWORDMEMORY: + Rnode = RsDoDwordMemoryDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_DWORDSPACE: + Rnode = RsDoDwordSpaceDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_ENDDEPENDENTFN: + switch (*State) { case ACPI_RSTATE_NORMAL: + AslError (ASL_ERROR, ASL_MSG_MISSING_STARTDEPENDENT, DescriptorTypeOp, NULL); break; case ACPI_RSTATE_START_DEPENDENT: + AslError (ASL_ERROR, ASL_MSG_DEPENDENT_NESTING, DescriptorTypeOp, NULL); break; case ACPI_RSTATE_DEPENDENT_LIST: default: + break; } @@ -703,89 +714,107 @@ RsDoOneResourceDescriptor ( break; case PARSEOP_ENDTAG: + Rnode = RsDoEndTagDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_EXTENDEDIO: + Rnode = RsDoExtendedIoDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_EXTENDEDMEMORY: + Rnode = RsDoExtendedMemoryDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_EXTENDEDSPACE: + Rnode = RsDoExtendedSpaceDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_FIXEDIO: + Rnode = RsDoFixedIoDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_INTERRUPT: + Rnode = RsDoInterruptDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_IO: + Rnode = RsDoIoDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_IRQ: + Rnode = RsDoIrqDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_IRQNOFLAGS: + Rnode = RsDoIrqNoFlagsDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_MEMORY24: + Rnode = RsDoMemory24Descriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_MEMORY32: + Rnode = RsDoMemory32Descriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_MEMORY32FIXED: + Rnode = RsDoMemory32FixedDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_QWORDIO: + Rnode = RsDoQwordIoDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_QWORDMEMORY: + Rnode = RsDoQwordMemoryDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_QWORDSPACE: + Rnode = RsDoQwordSpaceDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_REGISTER: + Rnode = RsDoGeneralRegisterDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_STARTDEPENDENTFN: + switch (*State) { case ACPI_RSTATE_START_DEPENDENT: + AslError (ASL_ERROR, ASL_MSG_DEPENDENT_NESTING, DescriptorTypeOp, NULL); break; @@ -793,6 +822,7 @@ RsDoOneResourceDescriptor ( case ACPI_RSTATE_NORMAL: case ACPI_RSTATE_DEPENDENT_LIST: default: + break; } @@ -803,9 +833,11 @@ RsDoOneResourceDescriptor ( break; case PARSEOP_STARTDEPENDENTFN_NOPRI: + switch (*State) { case ACPI_RSTATE_START_DEPENDENT: + AslError (ASL_ERROR, ASL_MSG_DEPENDENT_NESTING, DescriptorTypeOp, NULL); break; @@ -813,6 +845,7 @@ RsDoOneResourceDescriptor ( case ACPI_RSTATE_NORMAL: case ACPI_RSTATE_DEPENDENT_LIST: default: + break; } @@ -823,60 +856,72 @@ RsDoOneResourceDescriptor ( break; case PARSEOP_VENDORLONG: + Rnode = RsDoVendorLargeDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_VENDORSHORT: + Rnode = RsDoVendorSmallDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_WORDBUSNUMBER: + Rnode = RsDoWordBusNumberDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_WORDIO: + Rnode = RsDoWordIoDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_WORDSPACE: + Rnode = RsDoWordSpaceDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_GPIO_INT: + Rnode = RsDoGpioIntDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_GPIO_IO: + Rnode = RsDoGpioIoDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_I2C_SERIALBUS: + Rnode = RsDoI2cSerialBusDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_SPI_SERIALBUS: + Rnode = RsDoSpiSerialBusDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_UART_SERIALBUS: + Rnode = RsDoUartSerialBusDescriptor (DescriptorTypeOp, CurrentByteOffset); break; case PARSEOP_DEFAULT_ARG: + /* Just ignore any of these, they are used as fillers/placeholders */ break; default: + printf ("Unknown resource descriptor type [%s]\n", DescriptorTypeOp->Asl.ParseOpName); break; diff --git a/source/compiler/aslrestype1i.c b/source/compiler/aslrestype1i.c index 01fe136..d8a6bd9 100644 --- a/source/compiler/aslrestype1i.c +++ b/source/compiler/aslrestype1i.c @@ -245,6 +245,7 @@ RsDoFixedDmaDescriptor ( break; default: /* Ignore any extra nodes */ + break; } diff --git a/source/compiler/aslrestype2s.c b/source/compiler/aslrestype2s.c index 4bdcef8..a7472b1 100644 --- a/source/compiler/aslrestype2s.c +++ b/source/compiler/aslrestype2s.c @@ -617,7 +617,6 @@ RsDoGpioIoDescriptor ( break; case 9: /* Vendor Data (Optional - Buffer of BYTEs) (_VEN) */ - /* * Always set the VendorOffset even if there is no Vendor Data. * This field is required in order to calculate the length @@ -812,6 +811,7 @@ RsDoI2cSerialBusDescriptor ( break; default: /* Ignore any extra nodes */ + break; } @@ -986,6 +986,7 @@ RsDoSpiSerialBusDescriptor ( break; default: /* Ignore any extra nodes */ + break; } @@ -1177,6 +1178,7 @@ RsDoUartSerialBusDescriptor ( break; default: /* Ignore any extra nodes */ + break; } diff --git a/source/compiler/aslstartup.c b/source/compiler/aslstartup.c index ad9a2bb..0168fd0 100644 --- a/source/compiler/aslstartup.c +++ b/source/compiler/aslstartup.c @@ -534,6 +534,7 @@ AslDoOneFile ( return (AE_ERROR); default: + printf ("Unknown file type %X\n", Gbl_FileType); return (AE_ERROR); } diff --git a/source/compiler/aslsupport.l b/source/compiler/aslsupport.l index 52389ee..e7d2b1f 100644 --- a/source/compiler/aslsupport.l +++ b/source/compiler/aslsupport.l @@ -395,16 +395,19 @@ count ( switch (Type) { case 2: + TotalKeywords++; TotalNamedObjects++; break; case 3: + TotalKeywords++; TotalExecutableOpcodes++; break; default: + break; } @@ -594,6 +597,7 @@ DoCharacter: goto CompletedString; default: + break; } break; @@ -605,34 +609,42 @@ DoCharacter: switch (StringChar) { case 'a': + StringChar = 0x07; /* BELL */ break; case 'b': + StringChar = 0x08; /* BACKSPACE */ break; case 'f': + StringChar = 0x0C; /* FORMFEED */ break; case 'n': + StringChar = 0x0A; /* LINEFEED */ break; case 'r': + StringChar = 0x0D; /* CARRIAGE RETURN*/ break; case 't': + StringChar = 0x09; /* HORIZONTAL TAB */ break; case 'v': + StringChar = 0x0B; /* VERTICAL TAB */ break; case 'x': + State = ASL_HEX_CONSTANT; i = 0; continue; @@ -640,6 +652,7 @@ DoCharacter: case '\'': /* Single Quote */ case '\"': /* Double Quote */ case '\\': /* Backslash */ + break; default: @@ -709,7 +722,6 @@ DoCharacter: i++; continue; - case ASL_HEX_CONSTANT: /* Up to two hex digits allowed */ @@ -755,6 +767,7 @@ DoCharacter: continue; default: + break; } diff --git a/source/compiler/asltransform.c b/source/compiler/asltransform.c index 4617713..c1a2526 100644 --- a/source/compiler/asltransform.c +++ b/source/compiler/asltransform.c @@ -299,15 +299,16 @@ TrTransformSubtree ( switch (Op->Asl.ParseOpcode) { case PARSEOP_DEFINITIONBLOCK: + TrDoDefinitionBlock (Op); break; case PARSEOP_SWITCH: + TrDoSwitch (Op); break; case PARSEOP_METHOD: - /* * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global, * however @@ -316,7 +317,9 @@ TrTransformSubtree ( break; default: + /* Nothing to do here for other opcodes */ + break; } } @@ -700,18 +703,21 @@ TrDoSwitch ( switch (Btype) { case ACPI_BTYPE_INTEGER: + NewOp2->Asl.Next = TrCreateValuedLeafNode (PARSEOP_ZERO, (UINT64) 0); TrAmlInitLineNumbers (NewOp2->Asl.Next, NewOp); break; case ACPI_BTYPE_STRING: + NewOp2->Asl.Next = TrCreateValuedLeafNode (PARSEOP_STRING_LITERAL, (UINT64) ACPI_TO_INTEGER ("")); TrAmlInitLineNumbers (NewOp2->Asl.Next, NewOp); break; case ACPI_BTYPE_BUFFER: + (void) TrLinkPeerNode (NewOp2, TrCreateValuedLeafNode (PARSEOP_BUFFER, (UINT64) 0)); Next = NewOp2->Asl.Next; @@ -728,6 +734,7 @@ TrDoSwitch ( break; default: + break; } diff --git a/source/compiler/asltree.c b/source/compiler/asltree.c index f275061..ca88071 100644 --- a/source/compiler/asltree.c +++ b/source/compiler/asltree.c @@ -185,20 +185,24 @@ TrUpdateNode ( switch (ParseOpcode) { case PARSEOP_BYTECONST: + Op->Asl.Value.Integer = ACPI_UINT8_MAX; break; case PARSEOP_WORDCONST: + Op->Asl.Value.Integer = ACPI_UINT16_MAX; break; case PARSEOP_DWORDCONST: + Op->Asl.Value.Integer = ACPI_UINT32_MAX; break; /* Don't need to do the QWORD case */ default: + /* Don't care about others */ break; } @@ -214,22 +218,27 @@ TrUpdateNode ( switch (ParseOpcode) { case PARSEOP_BYTECONST: + UtCheckIntegerRange (Op, 0x00, ACPI_UINT8_MAX); Op->Asl.Value.Integer &= ACPI_UINT8_MAX; break; case PARSEOP_WORDCONST: + UtCheckIntegerRange (Op, 0x00, ACPI_UINT16_MAX); Op->Asl.Value.Integer &= ACPI_UINT16_MAX; break; case PARSEOP_DWORDCONST: + UtCheckIntegerRange (Op, 0x00, ACPI_UINT32_MAX); Op->Asl.Value.Integer &= ACPI_UINT32_MAX; break; default: + /* Don't care about others, don't need to check QWORD */ + break; } @@ -257,54 +266,71 @@ TrGetNodeFlagName ( switch (Flags) { case NODE_VISITED: + return ("NODE_VISITED"); case NODE_AML_PACKAGE: + return ("NODE_AML_PACKAGE"); case NODE_IS_TARGET: + return ("NODE_IS_TARGET"); case NODE_IS_RESOURCE_DESC: + return ("NODE_IS_RESOURCE_DESC"); case NODE_IS_RESOURCE_FIELD: + return ("NODE_IS_RESOURCE_FIELD"); case NODE_HAS_NO_EXIT: + return ("NODE_HAS_NO_EXIT"); case NODE_IF_HAS_NO_EXIT: + return ("NODE_IF_HAS_NO_EXIT"); case NODE_NAME_INTERNALIZED: + return ("NODE_NAME_INTERNALIZED"); case NODE_METHOD_NO_RETVAL: + return ("NODE_METHOD_NO_RETVAL"); case NODE_METHOD_SOME_NO_RETVAL: + return ("NODE_METHOD_SOME_NO_RETVAL"); case NODE_RESULT_NOT_USED: + return ("NODE_RESULT_NOT_USED"); case NODE_METHOD_TYPED: + return ("NODE_METHOD_TYPED"); case NODE_COMPILE_TIME_CONST: + return ("NODE_COMPILE_TIME_CONST"); case NODE_IS_TERM_ARG: + return ("NODE_IS_TERM_ARG"); case NODE_WAS_ONES_OP: + return ("NODE_WAS_ONES_OP"); case NODE_IS_NAME_DECLARATION: + return ("NODE_IS_NAME_DECLARATION"); default: + return ("Multiple Flags (or unknown flag) set"); } } @@ -470,11 +496,13 @@ TrCreateConstantLeafNode ( switch (ParseOpcode) { case PARSEOP___LINE__: + Op = TrAllocateNode (PARSEOP_INTEGER); Op->Asl.Value.Integer = Op->Asl.LineNumber; break; case PARSEOP___PATH__: + Op = TrAllocateNode (PARSEOP_STRING_LITERAL); /* Op.Asl.Filename contains the full pathname to the file */ @@ -483,6 +511,7 @@ TrCreateConstantLeafNode ( break; case PARSEOP___FILE__: + Op = TrAllocateNode (PARSEOP_STRING_LITERAL); /* Get the simple filename from the full path */ @@ -493,6 +522,7 @@ TrCreateConstantLeafNode ( break; case PARSEOP___DATE__: + Op = TrAllocateNode (PARSEOP_STRING_LITERAL); /* Get a copy of the current time */ @@ -507,6 +537,7 @@ TrCreateConstantLeafNode ( break; default: /* This would be an internal error */ + return (NULL); } @@ -551,30 +582,37 @@ TrCreateValuedLeafNode ( switch (ParseOpcode) { case PARSEOP_STRING_LITERAL: + DbgPrint (ASL_PARSE_OUTPUT, "STRING->%s", Value); break; case PARSEOP_NAMESEG: + DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Value); break; case PARSEOP_NAMESTRING: + DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Value); break; case PARSEOP_EISAID: + DbgPrint (ASL_PARSE_OUTPUT, "EISAID->%s", Value); break; case PARSEOP_METHOD: + DbgPrint (ASL_PARSE_OUTPUT, "METHOD"); break; case PARSEOP_INTEGER: + DbgPrint (ASL_PARSE_OUTPUT, "INTEGER"); break; default: + break; } @@ -628,20 +666,25 @@ TrCreateNode ( switch (ParseOpcode) { case PARSEOP_DEFINITIONBLOCK: + RootNode = Op; DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->"); break; case PARSEOP_OPERATIONREGION: + DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->"); break; case PARSEOP_OR: + DbgPrint (ASL_PARSE_OUTPUT, "OR->"); break; default: + /* Nothing to do for other opcodes */ + break; } @@ -746,20 +789,25 @@ TrLinkChildren ( switch (Op->Asl.ParseOpcode) { case PARSEOP_DEFINITIONBLOCK: + RootNode = Op; DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->"); break; case PARSEOP_OPERATIONREGION: + DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->"); break; case PARSEOP_OR: + DbgPrint (ASL_PARSE_OUTPUT, "OR->"); break; default: + /* Nothing to do for other opcodes */ + break; } @@ -1106,7 +1154,6 @@ TrWalkParseTree ( } break; - case ASL_WALK_VISIT_UPWARD: while (Op) @@ -1161,7 +1208,6 @@ TrWalkParseTree ( } break; - case ASL_WALK_VISIT_TWICE: while (Op) diff --git a/source/compiler/asltypes.h b/source/compiler/asltypes.h index 6f2fb88..5ca17b3 100644 --- a/source/compiler/asltypes.h +++ b/source/compiler/asltypes.h @@ -81,16 +81,17 @@ typedef struct asl_method_info { - UINT8 NumArguments; - UINT8 LocalInitialized[ACPI_METHOD_NUM_LOCALS]; - UINT8 ArgInitialized[ACPI_METHOD_NUM_ARGS]; + ACPI_PARSE_OBJECT *Op; + struct asl_method_info *Next; UINT32 ValidArgTypes[ACPI_METHOD_NUM_ARGS]; UINT32 ValidReturnTypes; UINT32 NumReturnNoValue; UINT32 NumReturnWithValue; - ACPI_PARSE_OBJECT *Op; - struct asl_method_info *Next; + UINT8 NumArguments; + UINT8 LocalInitialized[ACPI_METHOD_NUM_LOCALS]; + UINT8 ArgInitialized[ACPI_METHOD_NUM_ARGS]; UINT8 HasBeenTyped; + UINT8 ShouldBeSerialized; } ASL_METHOD_INFO; diff --git a/source/compiler/aslutils.c b/source/compiler/aslutils.c index a3690b1..8174eeb 100644 --- a/source/compiler/aslutils.c +++ b/source/compiler/aslutils.c @@ -956,6 +956,7 @@ UtStrtoul64 ( case 8: case 10: case 16: + break; default: @@ -1090,19 +1091,24 @@ ErrorExit: switch (Base) { case 8: + Status = AE_BAD_OCTAL_CONSTANT; break; case 10: + Status = AE_BAD_DECIMAL_CONSTANT; break; case 16: + Status = AE_BAD_HEX_CONSTANT; break; default: + /* Base validated above */ + break; } diff --git a/source/compiler/aslwalks.c b/source/compiler/aslwalks.c index 20adf5e..5abda23 100644 --- a/source/compiler/aslwalks.c +++ b/source/compiler/aslwalks.c @@ -122,6 +122,7 @@ AnMethodTypingWalkEnd ( break; default: + break; } @@ -176,6 +177,7 @@ AnOperandTypecheckWalkEnd ( return (AE_OK); default: + break; } @@ -252,6 +254,7 @@ AnOperandTypecheckWalkEnd ( return (AE_OK); default: + break; } @@ -379,11 +382,13 @@ AnOperandTypecheckWalkEnd ( break; case PARSEOP_DEBUG: + break; case PARSEOP_REFOF: case PARSEOP_INDEX: default: + break; } @@ -391,6 +396,7 @@ AnOperandTypecheckWalkEnd ( case ARGI_INTEGER: default: + break; } @@ -434,6 +440,7 @@ AnOperandTypecheckWalkEnd ( break; default: + break; } @@ -520,9 +527,11 @@ AnOtherSemanticAnalysisWalkBegin ( case PARSEOP_ACQUIRE: case PARSEOP_WAIT: case PARSEOP_LOADTABLE: + break; default: + AslError (ASL_ERROR, ASL_MSG_RESULT_NOT_USED, Op, Op->Asl.ExternalName); break; @@ -661,6 +670,7 @@ AnOtherSemanticAnalysisWalkBegin ( break; default: + break; } diff --git a/source/compiler/aslxref.c b/source/compiler/aslxref.c index 5c98c2a..a04fefb 100644 --- a/source/compiler/aslxref.c +++ b/source/compiler/aslxref.c @@ -533,27 +533,33 @@ XfNamespaceLocateBegin ( break; case AML_CREATE_BIT_FIELD_OP: + FieldBitLength = 1; break; case AML_CREATE_BYTE_FIELD_OP: case AML_INDEX_OP: + FieldBitLength = 8; break; case AML_CREATE_WORD_FIELD_OP: + FieldBitLength = 16; break; case AML_CREATE_DWORD_FIELD_OP: + FieldBitLength = 32; break; case AML_CREATE_QWORD_FIELD_OP: + FieldBitLength = 64; break; default: + FieldBitLength = 0; break; } @@ -595,6 +601,7 @@ XfNamespaceLocateBegin ( break; default: + break; } @@ -728,18 +735,22 @@ XfNamespaceLocateBegin ( case AML_FIELD_ACCESS_BYTE: case AML_FIELD_ACCESS_BUFFER: default: + MinimumLength = 1; break; case AML_FIELD_ACCESS_WORD: + MinimumLength = 2; break; case AML_FIELD_ACCESS_DWORD: + MinimumLength = 4; break; case AML_FIELD_ACCESS_QWORD: + MinimumLength = 8; break; } @@ -784,6 +795,7 @@ XfNamespaceLocateBegin ( default: /* Nothing to do for other address spaces */ + break; } } diff --git a/source/compiler/dtexpress.c b/source/compiler/dtexpress.c index 1120d7b..a3f9c8c 100644 --- a/source/compiler/dtexpress.c +++ b/source/compiler/dtexpress.c @@ -127,18 +127,22 @@ DtDoOperator ( switch (Operator) { case EXPOP_ONES_COMPLIMENT: + Result = ~RightValue; break; case EXPOP_LOGICAL_NOT: + Result = !RightValue; break; case EXPOP_MULTIPLY: + Result = LeftValue * RightValue; break; case EXPOP_DIVIDE: + if (!RightValue) { DtError (ASL_ERROR, ASL_MSG_DIVIDE_BY_ZERO, @@ -149,6 +153,7 @@ DtDoOperator ( break; case EXPOP_MODULO: + if (!RightValue) { DtError (ASL_ERROR, ASL_MSG_DIVIDE_BY_ZERO, @@ -163,58 +168,72 @@ DtDoOperator ( break; case EXPOP_SUBTRACT: + Result = LeftValue - RightValue; break; case EXPOP_SHIFT_RIGHT: + Result = LeftValue >> RightValue; break; case EXPOP_SHIFT_LEFT: + Result = LeftValue << RightValue; break; case EXPOP_LESS: + Result = LeftValue < RightValue; break; case EXPOP_GREATER: + Result = LeftValue > RightValue; break; case EXPOP_LESS_EQUAL: + Result = LeftValue <= RightValue; break; case EXPOP_GREATER_EQUAL: + Result = LeftValue >= RightValue; break; case EXPOP_EQUAL: + Result = LeftValue == RightValue; break; case EXPOP_NOT_EQUAL: + Result = LeftValue != RightValue; break; case EXPOP_AND: + Result = LeftValue & RightValue; break; case EXPOP_XOR: + Result = LeftValue ^ RightValue; break; case EXPOP_OR: + Result = LeftValue | RightValue; break; case EXPOP_LOGICAL_AND: + Result = LeftValue && RightValue; break; case EXPOP_LOGICAL_OR: + Result = LeftValue || RightValue; break; diff --git a/source/compiler/dtfield.c b/source/compiler/dtfield.c index 275f22f..697b277 100644 --- a/source/compiler/dtfield.c +++ b/source/compiler/dtfield.c @@ -104,14 +104,17 @@ DtCompileOneField ( switch (Type) { case DT_FIELD_TYPE_INTEGER: + DtCompileInteger (Buffer, Field, ByteLength, Flags); break; case DT_FIELD_TYPE_STRING: + DtCompileString (Buffer, Field, ByteLength); break; case DT_FIELD_TYPE_UUID: + Status = DtCompileUuid (Buffer, Field, ByteLength); if (ACPI_SUCCESS (Status)) { @@ -121,17 +124,21 @@ DtCompileOneField ( /* Fall through. */ case DT_FIELD_TYPE_BUFFER: + DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); break; case DT_FIELD_TYPE_UNICODE: + DtCompileUnicode (Buffer, Field, ByteLength); break; case DT_FIELD_TYPE_DEVICE_PATH: + break; default: + DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); break; } @@ -382,10 +389,12 @@ DtNormalizeBuffer ( case ']': case ' ': case ',': + Separator = TRUE; break; default: + if (Separator) { /* Insert blank as the standard separator */ diff --git a/source/compiler/dtio.c b/source/compiler/dtio.c index 7876552..c26b2b8 100644 --- a/source/compiler/dtio.c +++ b/source/compiler/dtio.c @@ -426,7 +426,7 @@ DtGetNextLine ( UINT32 State = DT_NORMAL_TEXT; UINT32 CurrentLineOffset; UINT32 i; - char c; + int c; for (i = 0; ;) @@ -440,7 +440,7 @@ DtGetNextLine ( UtExpandLineBuffers (); } - c = (char) getc (Handle); + c = getc (Handle); if (c == EOF) { switch (State) @@ -452,6 +452,7 @@ DtGetNextLine ( break; default: + break; } @@ -479,14 +480,16 @@ DtGetNextLine ( /* Normal text, insert char into line buffer */ - Gbl_CurrentLineBuffer[i] = c; + Gbl_CurrentLineBuffer[i] = (char) c; switch (c) { case '/': + State = DT_START_COMMENT; break; case '"': + State = DT_START_QUOTED_STRING; LineNotAllBlanks = TRUE; i++; @@ -501,6 +504,7 @@ DtGetNextLine ( break; case '\n': + CurrentLineOffset = Gbl_NextLineOffset; Gbl_NextLineOffset = (UINT32) ftell (Handle); Gbl_CurrentLineNumber++; @@ -527,6 +531,7 @@ DtGetNextLine ( break; default: + if (c != ' ') { LineNotAllBlanks = TRUE; @@ -541,26 +546,30 @@ DtGetNextLine ( /* Insert raw chars until end of quoted string */ - Gbl_CurrentLineBuffer[i] = c; + Gbl_CurrentLineBuffer[i] = (char) c; i++; switch (c) { case '"': + State = DT_NORMAL_TEXT; break; case '\\': + State = DT_ESCAPE_SEQUENCE; break; case '\n': + AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n", Gbl_CurrentLineNumber++); State = DT_NORMAL_TEXT; break; default: /* Get next character */ + break; } break; @@ -569,7 +578,7 @@ DtGetNextLine ( /* Just copy the escaped character. TBD: sufficient for table compiler? */ - Gbl_CurrentLineBuffer[i] = c; + Gbl_CurrentLineBuffer[i] = (char) c; i++; State = DT_START_QUOTED_STRING; break; @@ -581,21 +590,24 @@ DtGetNextLine ( switch (c) { case '*': + State = DT_SLASH_ASTERISK_COMMENT; break; case '/': + State = DT_SLASH_SLASH_COMMENT; break; default: /* Not a comment */ + i++; /* Save the preceding slash */ if (i >= Gbl_LineBufferSize) { UtExpandLineBuffers (); } - Gbl_CurrentLineBuffer[i] = c; + Gbl_CurrentLineBuffer[i] = (char) c; i++; State = DT_NORMAL_TEXT; break; @@ -609,15 +621,18 @@ DtGetNextLine ( switch (c) { case '\n': + Gbl_NextLineOffset = (UINT32) ftell (Handle); Gbl_CurrentLineNumber++; break; case '*': + State = DT_END_COMMENT; break; default: + break; } break; @@ -642,20 +657,24 @@ DtGetNextLine ( switch (c) { case '/': + State = DT_NORMAL_TEXT; break; case '\n': + CurrentLineOffset = Gbl_NextLineOffset; Gbl_NextLineOffset = (UINT32) ftell (Handle); Gbl_CurrentLineNumber++; break; case '*': + /* Consume all adjacent asterisks */ break; default: + State = DT_SLASH_ASTERISK_COMMENT; break; } @@ -694,6 +713,7 @@ DtGetNextLine ( break; default: + DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state"); return (ASL_EOF); } diff --git a/source/compiler/dtsubtable.c b/source/compiler/dtsubtable.c index f49c205..275d67a 100644 --- a/source/compiler/dtsubtable.c +++ b/source/compiler/dtsubtable.c @@ -312,14 +312,17 @@ DtGetSubtableLength ( switch (Info->Opcode) { case ACPI_DMT_GAS: + Step = 5; break; case ACPI_DMT_HESTNTFY: + Step = 9; break; default: + Step = 1; break; } diff --git a/source/compiler/dttable.c b/source/compiler/dttable.c index b3ce5de..4236c6c 100644 --- a/source/compiler/dttable.c +++ b/source/compiler/dttable.c @@ -280,26 +280,32 @@ DtCompileAsf ( switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ { case ACPI_ASF_TYPE_INFO: + InfoTable = AcpiDmTableInfoAsf0; break; case ACPI_ASF_TYPE_ALERT: + InfoTable = AcpiDmTableInfoAsf1; break; case ACPI_ASF_TYPE_CONTROL: + InfoTable = AcpiDmTableInfoAsf2; break; case ACPI_ASF_TYPE_BOOT: + InfoTable = AcpiDmTableInfoAsf3; break; case ACPI_ASF_TYPE_ADDRESS: + InfoTable = AcpiDmTableInfoAsf4; break; default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); return (AE_ERROR); } @@ -316,10 +322,12 @@ DtCompileAsf ( switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */ { case ACPI_ASF_TYPE_INFO: + DataInfoTable = NULL; break; case ACPI_ASF_TYPE_ALERT: + DataInfoTable = AcpiDmTableInfoAsf1a; DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, ACPI_SUB_PTR (UINT8, Subtable->Buffer, @@ -327,6 +335,7 @@ DtCompileAsf ( break; case ACPI_ASF_TYPE_CONTROL: + DataInfoTable = AcpiDmTableInfoAsf2a; DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, ACPI_SUB_PTR (UINT8, Subtable->Buffer, @@ -334,10 +343,12 @@ DtCompileAsf ( break; case ACPI_ASF_TYPE_BOOT: + DataInfoTable = NULL; break; case ACPI_ASF_TYPE_ADDRESS: + DataInfoTable = TableInfoAsfAddress; DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, ACPI_SUB_PTR (UINT8, Subtable->Buffer, @@ -345,6 +356,7 @@ DtCompileAsf ( break; default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!"); return (AE_ERROR); } @@ -574,18 +586,27 @@ DtCompileDmar ( switch (DmarHeader->Type) { case ACPI_DMAR_TYPE_HARDWARE_UNIT: + InfoTable = AcpiDmTableInfoDmar0; break; + case ACPI_DMAR_TYPE_RESERVED_MEMORY: + InfoTable = AcpiDmTableInfoDmar1; break; + case ACPI_DMAR_TYPE_ATSR: + InfoTable = AcpiDmTableInfoDmar2; break; + case ACPI_DMAR_HARDWARE_AFFINITY: + InfoTable = AcpiDmTableInfoDmar3; break; + default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR"); return (AE_ERROR); } @@ -810,14 +831,17 @@ DtCompileFpdt ( switch (FpdtHeader->Type) { case ACPI_FPDT_TYPE_BOOT: + InfoTable = AcpiDmTableInfoFpdt0; break; case ACPI_FPDT_TYPE_S3PERF: + InfoTable = AcpiDmTableInfoFpdt1; break; default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT"); return (AE_ERROR); break; @@ -884,34 +908,42 @@ DtCompileHest ( switch (Type) { case ACPI_HEST_TYPE_IA32_CHECK: + InfoTable = AcpiDmTableInfoHest0; break; case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: + InfoTable = AcpiDmTableInfoHest1; break; case ACPI_HEST_TYPE_IA32_NMI: + InfoTable = AcpiDmTableInfoHest2; break; case ACPI_HEST_TYPE_AER_ROOT_PORT: + InfoTable = AcpiDmTableInfoHest6; break; case ACPI_HEST_TYPE_AER_ENDPOINT: + InfoTable = AcpiDmTableInfoHest7; break; case ACPI_HEST_TYPE_AER_BRIDGE: + InfoTable = AcpiDmTableInfoHest8; break; case ACPI_HEST_TYPE_GENERIC_ERROR: + InfoTable = AcpiDmTableInfoHest9; break; default: + /* Cannot continue on unknown type */ DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST"); @@ -933,16 +965,19 @@ DtCompileHest ( switch (Type) { case ACPI_HEST_TYPE_IA32_CHECK: + BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, Subtable->Buffer))->NumHardwareBanks; break; case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: + BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, Subtable->Buffer))->NumHardwareBanks; break; default: + break; } @@ -1019,16 +1054,19 @@ DtCompileIvrs ( switch (IvrsHeader->Type) { case ACPI_IVRS_TYPE_HARDWARE: + InfoTable = AcpiDmTableInfoIvrs0; break; case ACPI_IVRS_TYPE_MEMORY1: case ACPI_IVRS_TYPE_MEMORY2: case ACPI_IVRS_TYPE_MEMORY3: + InfoTable = AcpiDmTableInfoIvrs1; break; default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS"); return (AE_ERROR); } @@ -1088,6 +1126,7 @@ DtCompileIvrs ( break; default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS Device Entry"); return (AE_ERROR); @@ -1165,45 +1204,72 @@ DtCompileMadt ( switch (MadtHeader->Type) { case ACPI_MADT_TYPE_LOCAL_APIC: + InfoTable = AcpiDmTableInfoMadt0; break; + case ACPI_MADT_TYPE_IO_APIC: + InfoTable = AcpiDmTableInfoMadt1; break; + case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE: + InfoTable = AcpiDmTableInfoMadt2; break; + case ACPI_MADT_TYPE_NMI_SOURCE: + InfoTable = AcpiDmTableInfoMadt3; break; + case ACPI_MADT_TYPE_LOCAL_APIC_NMI: + InfoTable = AcpiDmTableInfoMadt4; break; + case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE: + InfoTable = AcpiDmTableInfoMadt5; break; + case ACPI_MADT_TYPE_IO_SAPIC: + InfoTable = AcpiDmTableInfoMadt6; break; + case ACPI_MADT_TYPE_LOCAL_SAPIC: + InfoTable = AcpiDmTableInfoMadt7; break; + case ACPI_MADT_TYPE_INTERRUPT_SOURCE: + InfoTable = AcpiDmTableInfoMadt8; break; + case ACPI_MADT_TYPE_LOCAL_X2APIC: + InfoTable = AcpiDmTableInfoMadt9; break; + case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI: + InfoTable = AcpiDmTableInfoMadt10; break; + case ACPI_MADT_TYPE_GENERIC_INTERRUPT: + InfoTable = AcpiDmTableInfoMadt11; break; + case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR: + InfoTable = AcpiDmTableInfoMadt12; break; + default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT"); return (AE_ERROR); } @@ -1665,14 +1731,17 @@ DtCompileS3pt ( switch (S3ptHeader->Type) { case ACPI_S3PT_TYPE_RESUME: + InfoTable = AcpiDmTableInfoS3pt0; break; case ACPI_S3PT_TYPE_SUSPEND: + InfoTable = AcpiDmTableInfoS3pt1; break; default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT"); return (AE_ERROR); } @@ -1736,12 +1805,17 @@ DtCompileSlic ( switch (SlicHeader->Type) { case ACPI_SLIC_TYPE_PUBLIC_KEY: + InfoTable = AcpiDmTableInfoSlic0; break; + case ACPI_SLIC_TYPE_WINDOWS_MARKER: + InfoTable = AcpiDmTableInfoSlic1; break; + default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC"); return (AE_ERROR); } @@ -1871,15 +1945,22 @@ DtCompileSrat ( switch (SratHeader->Type) { case ACPI_SRAT_TYPE_CPU_AFFINITY: + InfoTable = AcpiDmTableInfoSrat0; break; + case ACPI_SRAT_TYPE_MEMORY_AFFINITY: + InfoTable = AcpiDmTableInfoSrat1; break; + case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY: + InfoTable = AcpiDmTableInfoSrat2; break; + default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT"); return (AE_ERROR); } diff --git a/source/compiler/dtutils.c b/source/compiler/dtutils.c index 18ea93e..1f4207a 100644 --- a/source/compiler/dtutils.c +++ b/source/compiler/dtutils.c @@ -82,18 +82,11 @@ DtError ( char *ExtraMessage) { - switch (Level) - { - case ASL_WARNING2: - case ASL_WARNING3: - if (Gbl_WarningLevel < Level) - { - return; - } - break; + /* Check if user wants to ignore this exception */ - default: - break; + if (AslIsExceptionDisabled (Level, MessageId)) + { + return; } if (FieldObject) @@ -140,6 +133,7 @@ DtNameError ( { case ASL_WARNING2: case ASL_WARNING3: + if (Gbl_WarningLevel < Level) { return; @@ -147,6 +141,7 @@ DtNameError ( break; default: + break; } @@ -387,6 +382,7 @@ DtGetFieldType ( case ACPI_DMT_FLAGS1: case ACPI_DMT_FLAGS2: case ACPI_DMT_FLAGS4: + Type = DT_FIELD_TYPE_FLAG; break; @@ -395,6 +391,7 @@ DtGetFieldType ( case ACPI_DMT_NAME6: case ACPI_DMT_NAME8: case ACPI_DMT_STRING: + Type = DT_FIELD_TYPE_STRING; break; @@ -403,31 +400,38 @@ DtGetFieldType ( case ACPI_DMT_BUF16: case ACPI_DMT_BUF128: case ACPI_DMT_PCI_PATH: + Type = DT_FIELD_TYPE_BUFFER; break; case ACPI_DMT_GAS: case ACPI_DMT_HESTNTFY: + Type = DT_FIELD_TYPE_INLINE_SUBTABLE; break; case ACPI_DMT_UNICODE: + Type = DT_FIELD_TYPE_UNICODE; break; case ACPI_DMT_UUID: + Type = DT_FIELD_TYPE_UUID; break; case ACPI_DMT_DEVICE_PATH: + Type = DT_FIELD_TYPE_DEVICE_PATH; break; case ACPI_DMT_LABEL: + Type = DT_FIELD_TYPE_LABEL; break; default: + Type = DT_FIELD_TYPE_INTEGER; break; } @@ -517,6 +521,7 @@ DtGetFieldLength ( case ACPI_DMT_FLAGS4: case ACPI_DMT_LABEL: case ACPI_DMT_EXTRA_TEXT: + ByteLength = 0; break; @@ -535,6 +540,7 @@ DtGetFieldLength ( case ACPI_DMT_EINJINST: case ACPI_DMT_ERSTACT: case ACPI_DMT_ERSTINST: + ByteLength = 1; break; @@ -542,10 +548,12 @@ DtGetFieldLength ( case ACPI_DMT_DMAR: case ACPI_DMT_HEST: case ACPI_DMT_PCI_PATH: + ByteLength = 2; break; case ACPI_DMT_UINT24: + ByteLength = 3; break; @@ -553,29 +561,35 @@ DtGetFieldLength ( case ACPI_DMT_NAME4: case ACPI_DMT_SLIC: case ACPI_DMT_SIG: + ByteLength = 4; break; case ACPI_DMT_UINT40: + ByteLength = 5; break; case ACPI_DMT_UINT48: case ACPI_DMT_NAME6: + ByteLength = 6; break; case ACPI_DMT_UINT56: case ACPI_DMT_BUF7: + ByteLength = 7; break; case ACPI_DMT_UINT64: case ACPI_DMT_NAME8: + ByteLength = 8; break; case ACPI_DMT_STRING: + Value = DtGetFieldValue (Field); if (Value) { @@ -591,14 +605,17 @@ DtGetFieldLength ( break; case ACPI_DMT_GAS: + ByteLength = sizeof (ACPI_GENERIC_ADDRESS); break; case ACPI_DMT_HESTNTFY: + ByteLength = sizeof (ACPI_HEST_NOTIFY); break; case ACPI_DMT_BUFFER: + Value = DtGetFieldValue (Field); if (Value) { @@ -615,14 +632,17 @@ DtGetFieldLength ( case ACPI_DMT_BUF16: case ACPI_DMT_UUID: + ByteLength = 16; break; case ACPI_DMT_BUF128: + ByteLength = 128; break; case ACPI_DMT_UNICODE: + Value = DtGetFieldValue (Field); /* TBD: error if Value is NULL? (as below?) */ @@ -631,6 +651,7 @@ DtGetFieldLength ( break; default: + DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid table opcode"); return (0); } diff --git a/source/compiler/prscan.c b/source/compiler/prscan.c index f781deb..cc9b3ce 100644 --- a/source/compiler/prscan.c +++ b/source/compiler/prscan.c @@ -477,6 +477,7 @@ PrDoDirective ( switch (Directive) { case PR_DIRECTIVE_ELIF: + *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock); if (*IgnoringThisCodeBlock == TRUE) { @@ -493,10 +494,12 @@ PrDoDirective ( break; case PR_DIRECTIVE_ELSE: + *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock); return; case PR_DIRECTIVE_ENDIF: + *IgnoringThisCodeBlock = FALSE; Gbl_IfDepth--; if (Gbl_IfDepth < 0) @@ -508,6 +511,7 @@ PrDoDirective ( return; default: + break; } @@ -590,6 +594,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_ERROR: + /* TBD compiler should abort */ /* Note: No macro expansion */ @@ -598,6 +603,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_IF: + TokenOffset = Token - Gbl_MainTokenBuffer; /* Need to expand #define macros in the expression string first */ @@ -623,6 +629,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_IFDEF: + if (!PrMatchDefine (Token)) { *IgnoringThisCodeBlock = TRUE; @@ -635,6 +642,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_IFNDEF: + if (PrMatchDefine (Token)) { *IgnoringThisCodeBlock = TRUE; @@ -647,6 +655,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_INCLUDE: + Token = PrGetNextToken (NULL, " \"<>", Next); if (!Token) { @@ -661,6 +670,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_LINE: + TokenOffset = Token - Gbl_MainTokenBuffer; Status = PrResolveIntegerExpression ( @@ -686,26 +696,40 @@ PrDoDirective ( break; case PR_DIRECTIVE_PRAGMA: - /* Only "#pragma message" supported at this time */ - if (strcmp (Token, "message")) + if (!strcmp (Token, "disable")) { - PrError (ASL_ERROR, ASL_MSG_UNKNOWN_PRAGMA, - THIS_TOKEN_OFFSET (Token)); - return; + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next); + if (!Token) + { + goto SyntaxError; + } + + TokenOffset = Token - Gbl_MainTokenBuffer; + AslDisableException (&Gbl_CurrentLineBuffer[TokenOffset]); } + else if (!strcmp (Token, "message")) + { + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next); + if (!Token) + { + goto SyntaxError; + } - Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next); - if (!Token) + TokenOffset = Token - Gbl_MainTokenBuffer; + AcpiOsPrintf ("%s\n", &Gbl_CurrentLineBuffer[TokenOffset]); + } + else { - goto SyntaxError; + PrError (ASL_ERROR, ASL_MSG_UNKNOWN_PRAGMA, + THIS_TOKEN_OFFSET (Token)); + return; } - TokenOffset = Token - Gbl_MainTokenBuffer; - AcpiOsPrintf ("%s\n", &Gbl_CurrentLineBuffer[TokenOffset]); break; case PR_DIRECTIVE_UNDEF: + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "#undef: %s\n", Gbl_CurrentLineNumber, Token); @@ -713,11 +737,13 @@ PrDoDirective ( break; case PR_DIRECTIVE_WARNING: + PrError (ASL_WARNING, ASL_MSG_ERROR_DIRECTIVE, THIS_TOKEN_OFFSET (Token)); break; default: + /* Should never get here */ DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "Unrecognized directive: %u\n", diff --git a/source/components/debugger/dbcmds.c b/source/components/debugger/dbcmds.c index 3a1afa2..5700441 100644 --- a/source/components/debugger/dbcmds.c +++ b/source/components/debugger/dbcmds.c @@ -361,22 +361,27 @@ AcpiDbDisplayTableInfo ( switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) { case ACPI_TABLE_ORIGIN_UNKNOWN: + AcpiOsPrintf ("Unknown "); break; case ACPI_TABLE_ORIGIN_MAPPED: + AcpiOsPrintf ("Mapped "); break; case ACPI_TABLE_ORIGIN_ALLOCATED: + AcpiOsPrintf ("Allocated "); break; case ACPI_TABLE_ORIGIN_OVERRIDE: + AcpiOsPrintf ("Override "); break; default: + AcpiOsPrintf ("INVALID "); break; } diff --git a/source/components/debugger/dbconvert.c b/source/components/debugger/dbconvert.c index e30aba0..098a971 100644 --- a/source/components/debugger/dbconvert.c +++ b/source/components/debugger/dbconvert.c @@ -304,20 +304,24 @@ AcpiDbConvertToObject ( switch (Type) { case ACPI_TYPE_STRING: + Object->Type = ACPI_TYPE_STRING; Object->String.Pointer = String; Object->String.Length = (UINT32) ACPI_STRLEN (String); break; case ACPI_TYPE_BUFFER: + Status = AcpiDbConvertToBuffer (String, Object); break; case ACPI_TYPE_PACKAGE: + Status = AcpiDbConvertToPackage (String, Object); break; default: + Object->Type = ACPI_TYPE_INTEGER; Status = AcpiUtStrtoul64 (String, 16, &Object->Integer.Value); break; diff --git a/source/components/debugger/dbdisply.c b/source/components/debugger/dbdisply.c index d75d505..c453d57 100644 --- a/source/components/debugger/dbdisply.c +++ b/source/components/debugger/dbdisply.c @@ -68,6 +68,12 @@ static void * AcpiDbGetPointer ( void *Target); +static ACPI_STATUS +AcpiDbDisplayNonRootHandlers ( + ACPI_HANDLE ObjHandle, + UINT32 NestingLevel, + void *Context, + void **ReturnValue); /* * System handler information. @@ -76,6 +82,7 @@ AcpiDbGetPointer ( #define ACPI_PREDEFINED_PREFIX "%25s (%.2X) : " #define ACPI_HANDLER_NAME_STRING "%30s : " #define ACPI_HANDLER_PRESENT_STRING "%-9s (%p)\n" +#define ACPI_HANDLER_PRESENT_STRING2 "%-9s (%p)" #define ACPI_HANDLER_NOT_PRESENT_STRING "%-9s\n" /* All predefined Address Space IDs */ @@ -258,7 +265,6 @@ AcpiDbDecodeAndDisplayObject ( Node = ObjPtr; goto DumpNode; - case ACPI_DESC_TYPE_OPERAND: /* This is a ACPI OPERAND OBJECT */ @@ -275,7 +281,6 @@ AcpiDbDecodeAndDisplayObject ( AcpiExDumpObjectDescriptor (ObjPtr, 1); break; - case ACPI_DESC_TYPE_PARSER: /* This is a Parser Op object */ @@ -292,7 +297,6 @@ AcpiDbDecodeAndDisplayObject ( AcpiDbDumpParserDescriptor ((ACPI_PARSE_OBJECT *) ObjPtr); break; - default: /* Is not a recognizeable object */ @@ -439,6 +443,7 @@ AcpiDbDisplayMethodInfo ( switch (OpInfo->Class) { case AML_CLASS_ARGUMENT: + if (CountRemaining) { NumRemainingOperands++; @@ -448,11 +453,13 @@ AcpiDbDisplayMethodInfo ( break; case AML_CLASS_UNKNOWN: + /* Bad opcode or ASCII character */ continue; default: + if (CountRemaining) { NumRemainingOperators++; @@ -924,15 +931,21 @@ AcpiDbDisplayGpes ( switch (GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) { case ACPI_GPE_DISPATCH_NONE: + AcpiOsPrintf ("NotUsed"); break; + case ACPI_GPE_DISPATCH_METHOD: + AcpiOsPrintf ("Method"); break; case ACPI_GPE_DISPATCH_HANDLER: + AcpiOsPrintf ("Handler"); break; + case ACPI_GPE_DISPATCH_NOTIFY: + Count = 0; Notify = GpeEventInfo->Dispatch.NotifyList; while (Notify) @@ -942,7 +955,9 @@ AcpiDbDisplayGpes ( } AcpiOsPrintf ("Implicit Notify on %u devices", Count); break; + default: + AcpiOsPrintf ("UNKNOWN: %X", GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK); break; @@ -984,7 +999,7 @@ AcpiDbDisplayHandlers ( /* Operation region handlers */ - AcpiOsPrintf ("\nOperation Region Handlers:\n"); + AcpiOsPrintf ("\nOperation Region Handlers at the namespace root:\n"); ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode); if (ObjDesc) @@ -1076,6 +1091,77 @@ AcpiDbDisplayHandlers ( AcpiOsPrintf (ACPI_HANDLER_NOT_PRESENT_STRING, "None"); } } + + + /* Other handlers that are installed throughout the namespace */ + + AcpiOsPrintf ("\nOperation Region Handlers for specific devices:\n"); + + (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, AcpiDbDisplayNonRootHandlers, + NULL, NULL, NULL); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDbDisplayNonRootHandlers + * + * PARAMETERS: ACPI_WALK_CALLBACK + * + * RETURN: Status + * + * DESCRIPTION: Display information about all handlers installed for a + * device object. + * + ******************************************************************************/ + +static ACPI_STATUS +AcpiDbDisplayNonRootHandlers ( + ACPI_HANDLE ObjHandle, + UINT32 NestingLevel, + void *Context, + void **ReturnValue) +{ + ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_OPERAND_OBJECT *HandlerObj; + char *Pathname; + + + ObjDesc = AcpiNsGetAttachedObject (Node); + if (!ObjDesc) + { + return (AE_OK); + } + + Pathname = AcpiNsGetExternalPathname (Node); + if (!Pathname) + { + return (AE_OK); + } + + /* Display all handlers associated with this device */ + + HandlerObj = ObjDesc->Device.Handler; + while (HandlerObj) + { + AcpiOsPrintf (ACPI_PREDEFINED_PREFIX, + AcpiUtGetRegionName ((UINT8) HandlerObj->AddressSpace.SpaceId), + HandlerObj->AddressSpace.SpaceId); + + AcpiOsPrintf (ACPI_HANDLER_PRESENT_STRING2, + (HandlerObj->AddressSpace.HandlerFlags & + ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ? "Default" : "User", + HandlerObj->AddressSpace.Handler); + + AcpiOsPrintf (" Device Name: %s (%p)\n", Pathname, Node); + + HandlerObj = HandlerObj->AddressSpace.Next; + } + + ACPI_FREE (Pathname); + return (AE_OK); } #endif /* ACPI_DEBUGGER */ diff --git a/source/components/debugger/dbexec.c b/source/components/debugger/dbexec.c index e0edb5d..dff3c79 100644 --- a/source/components/debugger/dbexec.c +++ b/source/components/debugger/dbexec.c @@ -109,6 +109,7 @@ AcpiDbDeleteObjects ( switch (Objects[i].Type) { case ACPI_TYPE_BUFFER: + ACPI_FREE (Objects[i].Buffer.Pointer); break; @@ -125,6 +126,7 @@ AcpiDbDeleteObjects ( break; default: + break; } } @@ -151,8 +153,7 @@ AcpiDbExecuteMethod ( { ACPI_STATUS Status; ACPI_OBJECT_LIST ParamObjects; - ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS]; - ACPI_DEVICE_INFO *ObjInfo; + ACPI_OBJECT Params[ACPI_DEBUGGER_MAX_ARGS + 1]; UINT32 i; @@ -164,78 +165,30 @@ AcpiDbExecuteMethod ( AcpiOsPrintf ("Warning: debug output is not enabled!\n"); } - /* Get the object info for number of method parameters */ - - Status = AcpiGetObjectInfo (Info->Method, &ObjInfo); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } - + ParamObjects.Count = 0; ParamObjects.Pointer = NULL; - ParamObjects.Count = 0; - if (ObjInfo->Type == ACPI_TYPE_METHOD) - { - /* Are there arguments to the method? */ + /* Pass through any command-line arguments */ - i = 0; - if (Info->Args && Info->Args[0]) - { - /* Get arguments passed on the command line */ - - for (; Info->Args[i] && - (i < ACPI_METHOD_NUM_ARGS) && - (i < ObjInfo->ParamCount); - i++) - { - /* Convert input string (token) to an actual ACPI_OBJECT */ - - Status = AcpiDbConvertToObject (Info->Types[i], - Info->Args[i], &Params[i]); - if (ACPI_FAILURE (Status)) - { - ACPI_EXCEPTION ((AE_INFO, Status, - "While parsing method arguments")); - goto Cleanup; - } - } - } - - /* Create additional "default" parameters as needed */ + if (Info->Args && Info->Args[0]) + { + /* Get arguments passed on the command line */ - if (i < ObjInfo->ParamCount) + for (i = 0; (Info->Args[i] && *(Info->Args[i])); i++) { - AcpiOsPrintf ("Adding %u arguments containing default values\n", - ObjInfo->ParamCount - i); + /* Convert input string (token) to an actual ACPI_OBJECT */ - for (; i < ObjInfo->ParamCount; i++) + Status = AcpiDbConvertToObject (Info->Types[i], + Info->Args[i], &Params[i]); + if (ACPI_FAILURE (Status)) { - switch (i) - { - case 0: - - Params[0].Type = ACPI_TYPE_INTEGER; - Params[0].Integer.Value = 0x01020304; - break; - - case 1: - - Params[1].Type = ACPI_TYPE_STRING; - Params[1].String.Length = 12; - Params[1].String.Pointer = "AML Debugger"; - break; - - default: - - Params[i].Type = ACPI_TYPE_INTEGER; - Params[i].Integer.Value = i * (UINT64) 0x1000; - break; - } + ACPI_EXCEPTION ((AE_INFO, Status, + "While parsing method arguments")); + goto Cleanup; } } - ParamObjects.Count = ObjInfo->ParamCount; + ParamObjects.Count = i; ParamObjects.Pointer = Params; } @@ -247,8 +200,8 @@ AcpiDbExecuteMethod ( /* Do the actual method execution */ AcpiGbl_MethodExecuting = TRUE; - Status = AcpiEvaluateObject (NULL, - Info->Pathname, &ParamObjects, ReturnObj); + Status = AcpiEvaluateObject (NULL, Info->Pathname, + &ParamObjects, ReturnObj); AcpiGbl_CmSingleStep = FALSE; AcpiGbl_MethodExecuting = FALSE; @@ -267,9 +220,7 @@ AcpiDbExecuteMethod ( } Cleanup: - AcpiDbDeleteObjects (ObjInfo->ParamCount, Params); - ACPI_FREE (ObjInfo); - + AcpiDbDeleteObjects (ParamObjects.Count, Params); return_ACPI_STATUS (Status); } diff --git a/source/components/debugger/dbhistry.c b/source/components/debugger/dbhistry.c index c3933d3..ff11604 100644 --- a/source/components/debugger/dbhistry.c +++ b/source/components/debugger/dbhistry.c @@ -54,12 +54,12 @@ #define HI_NO_HISTORY 0 #define HI_RECORD_HISTORY 1 -#define HISTORY_SIZE 20 +#define HISTORY_SIZE 40 typedef struct HistoryInfo { - char Command[80]; + char *Command; UINT32 CmdNum; } HISTORY_INFO; @@ -88,13 +88,35 @@ void AcpiDbAddToHistory ( char *CommandLine) { + UINT16 CmdLen; + UINT16 BufferLen; /* Put command into the next available slot */ + CmdLen = (UINT16) ACPI_STRLEN (CommandLine); + if (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command != NULL) + { + BufferLen = (UINT16) ACPI_STRLEN ( + AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command); + if (CmdLen > BufferLen) + { + AcpiOsFree (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex]. + Command); + AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command = + AcpiOsAllocate (CmdLen + 1); + } + } + else + { + AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command = + AcpiOsAllocate (CmdLen + 1); + } + ACPI_STRCPY (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command, CommandLine); - AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].CmdNum = AcpiGbl_NextCmdNum; + AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].CmdNum = + AcpiGbl_NextCmdNum; /* Adjust indexes */ @@ -148,8 +170,12 @@ AcpiDbDisplayHistory ( for (i = 0; i < AcpiGbl_NumHistory; i++) { - AcpiOsPrintf ("%ld %s\n", AcpiGbl_HistoryBuffer[HistoryIndex].CmdNum, - AcpiGbl_HistoryBuffer[HistoryIndex].Command); + if (AcpiGbl_HistoryBuffer[HistoryIndex].Command) + { + AcpiOsPrintf ("%3ld %s\n", + AcpiGbl_HistoryBuffer[HistoryIndex].CmdNum, + AcpiGbl_HistoryBuffer[HistoryIndex].Command); + } HistoryIndex++; if (HistoryIndex >= HISTORY_SIZE) @@ -199,7 +225,7 @@ AcpiDbGetFromHistory ( { if (AcpiGbl_HistoryBuffer[HistoryIndex].CmdNum == CmdNum) { - /* Found the commnad, return it */ + /* Found the command, return it */ return (AcpiGbl_HistoryBuffer[HistoryIndex].Command); } diff --git a/source/components/debugger/dbinput.c b/source/components/debugger/dbinput.c index d891872..1e3ebff 100644 --- a/source/components/debugger/dbinput.c +++ b/source/components/debugger/dbinput.c @@ -753,6 +753,7 @@ AcpiDbCommandDispatch ( switch (CommandIndex) { case CMD_NULL: + if (Op) { return (AE_OK); @@ -768,41 +769,50 @@ AcpiDbCommandDispatch ( case CMD_ARGS: case CMD_ARGUMENTS: + AcpiDbDisplayArguments (); break; case CMD_BATCH: + AcpiDbBatchExecute (AcpiGbl_DbArgs[1]); break; case CMD_BREAKPOINT: + AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op); break; case CMD_BUSINFO: + AcpiDbGetBusInfo (); break; case CMD_CALL: + AcpiDbSetMethodCallBreakpoint (Op); Status = AE_OK; break; case CMD_CLOSE: + AcpiDbCloseDebugFile (); break; case CMD_DEBUG: + AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_SINGLE_STEP); break; case CMD_DISASSEMBLE: case CMD_DISASM: + (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]); break; case CMD_DUMP: + AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; @@ -819,45 +829,55 @@ AcpiDbCommandDispatch ( break; case CMD_EVENT: + AcpiOsPrintf ("Event command not implemented\n"); break; case CMD_EVALUATE: case CMD_EXECUTE: + AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], &AcpiGbl_DbArgTypes[2], EX_NO_SINGLE_STEP); break; case CMD_FIND: + Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]); break; case CMD_GO: + AcpiGbl_CmSingleStep = FALSE; return (AE_OK); case CMD_GPE: + AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_GPES: + AcpiDbDisplayGpes (); break; case CMD_HANDLERS: + AcpiDbDisplayHandlers (); break; case CMD_HELP: case CMD_HELP2: + AcpiDbDisplayHelp (AcpiGbl_DbArgs[1]); break; case CMD_HISTORY: + AcpiDbDisplayHistory (); break; - case CMD_HISTORY_EXE: + case CMD_HISTORY_EXE: /* ! command */ + CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]); if (!CommandLine) { @@ -867,7 +887,8 @@ AcpiDbCommandDispatch ( Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op); return (Status); - case CMD_HISTORY_LAST: + case CMD_HISTORY_LAST: /* !! command */ + CommandLine = AcpiDbGetFromHistory (NULL); if (!CommandLine) { @@ -878,14 +899,17 @@ AcpiDbCommandDispatch ( return (Status); case CMD_INFORMATION: + AcpiDbDisplayMethodInfo (Op); break; case CMD_INTEGRITY: + AcpiDbCheckIntegrity (); break; case CMD_INTO: + if (Op) { AcpiGbl_CmSingleStep = TRUE; @@ -894,6 +918,7 @@ AcpiDbCommandDispatch ( break; case CMD_LEVEL: + if (ParamCount == 0) { AcpiOsPrintf ("Current debug level for file output is: %8.8lX\n", @@ -921,96 +946,119 @@ AcpiDbCommandDispatch ( break; case CMD_LIST: + AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op); break; case CMD_LOAD: + Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL); break; case CMD_LOCKS: + AcpiDbDisplayLocks (); break; case CMD_LOCALS: + AcpiDbDisplayLocals (); break; case CMD_METHODS: + Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]); break; case CMD_NAMESPACE: + AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_NOTIFY: + Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0); AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp); break; case CMD_OBJECT: + AcpiUtStrupr (AcpiGbl_DbArgs[1]); Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_OPEN: + AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]); break; case CMD_OSI: + AcpiDbDisplayInterfaces (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_OWNER: + AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]); break; case CMD_PREDEFINED: + AcpiDbCheckPredefinedNames (); break; case CMD_PREFIX: + AcpiDbSetScope (AcpiGbl_DbArgs[1]); break; case CMD_REFERENCES: + AcpiDbFindReferences (AcpiGbl_DbArgs[1]); break; case CMD_RESOURCES: + AcpiDbDisplayResources (AcpiGbl_DbArgs[1]); break; case CMD_RESULTS: + AcpiDbDisplayResults (); break; case CMD_SET: + AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2], AcpiGbl_DbArgs[3]); break; case CMD_SLEEP: + Status = AcpiDbSleep (AcpiGbl_DbArgs[1]); break; case CMD_STATS: + Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]); break; case CMD_STOP: + return (AE_NOT_IMPLEMENTED); case CMD_TABLES: + AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]); break; case CMD_TEMPLATE: + AcpiDbDisplayTemplate (AcpiGbl_DbArgs[1]); break; case CMD_TERMINATE: + AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); AcpiUtSubsystemShutdown (); @@ -1023,28 +1071,34 @@ AcpiDbCommandDispatch ( break; case CMD_THREADS: + AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2], AcpiGbl_DbArgs[3]); break; case CMD_TRACE: + (void) AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1); break; case CMD_TREE: + AcpiDbDisplayCallingTree (); break; case CMD_TYPE: + AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]); break; case CMD_UNLOAD: + AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1]); break; case CMD_EXIT: case CMD_QUIT: + if (Op) { AcpiOsPrintf ("Method execution terminated\n"); @@ -1062,6 +1116,7 @@ AcpiDbCommandDispatch ( case CMD_NOT_FOUND: default: + AcpiOsPrintf ("Unknown Command\n"); return (AE_CTRL_TRUE); } diff --git a/source/components/debugger/dbmethod.c b/source/components/debugger/dbmethod.c index 90c0aad..fe1c3d5 100644 --- a/source/components/debugger/dbmethod.c +++ b/source/components/debugger/dbmethod.c @@ -49,6 +49,7 @@ #include "acdebug.h" #include "acdisasm.h" #include "acparser.h" +#include "acpredef.h" #ifdef ACPI_DEBUGGER @@ -270,6 +271,7 @@ AcpiDbSetMethodData ( break; default: + break; } @@ -433,17 +435,23 @@ AcpiDbWalkForExecute ( void *Context, void **ReturnValue) { - ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; - ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; - ACPI_BUFFER ReturnObj; - ACPI_STATUS Status; - char *Pathname; - UINT32 i; - ACPI_DEVICE_INFO *ObjInfo; - ACPI_OBJECT_LIST ParamObjects; - ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS]; - const ACPI_PREDEFINED_INFO *Predefined; - + ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; + ACPI_DB_EXECUTE_WALK *Info = (ACPI_DB_EXECUTE_WALK *) Context; + char *Pathname; + const ACPI_PREDEFINED_INFO *Predefined; + ACPI_DEVICE_INFO *ObjInfo; + ACPI_OBJECT_LIST ParamObjects; + ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS]; + ACPI_OBJECT *ThisParam; + ACPI_BUFFER ReturnObj; + ACPI_STATUS Status; + UINT16 ArgTypeList; + UINT8 ArgCount; + UINT8 ArgType; + UINT32 i; + + + /* The name must be a predefined ACPI name */ Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); if (!Predefined) @@ -470,21 +478,64 @@ AcpiDbWalkForExecute ( return (Status); } + ParamObjects.Count = 0; ParamObjects.Pointer = NULL; - ParamObjects.Count = 0; if (ObjInfo->Type == ACPI_TYPE_METHOD) { - /* Setup default parameters */ - - for (i = 0; i < ObjInfo->ParamCount; i++) + /* Setup default parameters (with proper types) */ + + ArgTypeList = Predefined->Info.ArgumentList; + ArgCount = METHOD_GET_ARG_COUNT (ArgTypeList); + + /* + * Setup the ACPI-required number of arguments, regardless of what + * the actual method defines. If there is a difference, then the + * method is wrong and a warning will be issued during execution. + */ + ThisParam = Params; + for (i = 0; i < ArgCount; i++) { - Params[i].Type = ACPI_TYPE_INTEGER; - Params[i].Integer.Value = 1; + ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList); + ThisParam->Type = ArgType; + + switch (ArgType) + { + case ACPI_TYPE_INTEGER: + + ThisParam->Integer.Value = 1; + break; + + case ACPI_TYPE_STRING: + + ThisParam->String.Pointer = "This is the default argument string"; + ThisParam->String.Length = ACPI_STRLEN (ThisParam->String.Pointer); + break; + + case ACPI_TYPE_BUFFER: + + ThisParam->Buffer.Pointer = (UINT8 *) Params; /* just a garbage buffer */ + ThisParam->Buffer.Length = 48; + break; + + case ACPI_TYPE_PACKAGE: + + ThisParam->Package.Elements = NULL; + ThisParam->Package.Count = 0; + break; + + default: + + AcpiOsPrintf ("%s: Unsupported argument type: %u\n", + Pathname, ArgType); + break; + } + + ThisParam++; } - ParamObjects.Pointer = Params; - ParamObjects.Count = ObjInfo->ParamCount; + ParamObjects.Count = ArgCount; + ParamObjects.Pointer = Params; } ACPI_FREE (ObjInfo); diff --git a/source/components/debugger/dbnames.c b/source/components/debugger/dbnames.c index 68a92d5..b414a40 100644 --- a/source/components/debugger/dbnames.c +++ b/source/components/debugger/dbnames.c @@ -435,6 +435,7 @@ AcpiDbWalkForPredefinedNames ( const ACPI_PREDEFINED_INFO *Predefined; const ACPI_PREDEFINED_INFO *Package = NULL; char *Pathname; + char StringBuffer[48]; Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); @@ -456,23 +457,28 @@ AcpiDbWalkForPredefinedNames ( Package = Predefined + 1; } - AcpiOsPrintf ("%-32s arg %X ret %2.2X", Pathname, - (Predefined->Info.ArgumentList & METHOD_ARG_MASK), + AcpiUtGetExpectedReturnTypes (StringBuffer, Predefined->Info.ExpectedBtypes); + AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname, + METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList), + StringBuffer); + if (Package) { - AcpiOsPrintf (" PkgType %2.2X ObjType %2.2X Count %2.2X", + AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)", Package->RetInfo.Type, Package->RetInfo.ObjectType1, Package->RetInfo.Count1); } AcpiOsPrintf("\n"); - AcpiNsCheckParameterCount (Pathname, Node, ACPI_UINT32_MAX, Predefined); + /* Check that the declared argument count matches the ACPI spec */ + + AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined); + ACPI_FREE (Pathname); (*Count)++; - return (AE_OK); } @@ -665,7 +671,7 @@ AcpiDbIntegrityWalk ( return (AE_OK); } - if (!AcpiUtValidAcpiName (Node->Name.Integer)) + if (!AcpiUtValidAcpiName (Node->Name.Ascii)) { AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node); return (AE_OK); diff --git a/source/components/debugger/dbstats.c b/source/components/debugger/dbstats.c index d9226f9..181efbf 100644 --- a/source/components/debugger/dbstats.c +++ b/source/components/debugger/dbstats.c @@ -267,6 +267,7 @@ AcpiDbEnumerateObject ( break; default: + break; } } @@ -479,7 +480,6 @@ AcpiDbDisplayStatistics ( } break; - case CMD_STAT_SIZES: AcpiOsPrintf ("\nInternal object sizes:\n\n"); @@ -530,7 +530,6 @@ AcpiDbDisplayStatistics ( AcpiOsPrintf ("Notify Info %3d\n", sizeof (ACPI_NOTIFY_INFO)); break; - case CMD_STAT_STACK: #if defined(ACPI_DEBUG_OUTPUT) @@ -545,6 +544,7 @@ AcpiDbDisplayStatistics ( break; default: + break; } diff --git a/source/components/debugger/dbutils.c b/source/components/debugger/dbutils.c index 83d60d5..268a496 100644 --- a/source/components/debugger/dbutils.c +++ b/source/components/debugger/dbutils.c @@ -179,14 +179,12 @@ AcpiDbDumpExternalObject ( AcpiOsPrintf ("[Null Object] (Type=0)\n"); break; - case ACPI_TYPE_INTEGER: AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; - case ACPI_TYPE_STRING: AcpiOsPrintf ("[String] Length %.2X = ", ObjDesc->String.Length); @@ -194,7 +192,6 @@ AcpiDbDumpExternalObject ( AcpiOsPrintf ("\n"); break; - case ACPI_TYPE_BUFFER: AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); @@ -213,7 +210,6 @@ AcpiDbDumpExternalObject ( } break; - case ACPI_TYPE_PACKAGE: AcpiOsPrintf ("[Package] Contains %u Elements:\n", @@ -225,26 +221,22 @@ AcpiDbDumpExternalObject ( } break; - case ACPI_TYPE_LOCAL_REFERENCE: AcpiOsPrintf ("[Object Reference] = "); AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL); break; - case ACPI_TYPE_PROCESSOR: AcpiOsPrintf ("[Processor]\n"); break; - case ACPI_TYPE_POWER: AcpiOsPrintf ("[Power Resource]\n"); break; - default: AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Type); diff --git a/source/components/debugger/dbxface.c b/source/components/debugger/dbxface.c index a6a5423..3c1df5b 100644 --- a/source/components/debugger/dbxface.c +++ b/source/components/debugger/dbxface.c @@ -232,9 +232,11 @@ AcpiDbSingleStep ( { case AML_CLASS_UNKNOWN: case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */ + return (AE_OK); default: + /* All other opcodes -- continue */ break; } @@ -408,6 +410,9 @@ AcpiDbInitialize ( ACPI_STATUS Status; + ACPI_FUNCTION_TRACE (DbInitialize); + + /* Init globals */ AcpiGbl_DbBuffer = NULL; @@ -427,7 +432,7 @@ AcpiDbInitialize ( AcpiGbl_DbBuffer = AcpiOsAllocate (ACPI_DEBUG_BUFFER_SIZE); if (!AcpiGbl_DbBuffer) { - return (AE_NO_MEMORY); + return_ACPI_STATUS (AE_NO_MEMORY); } ACPI_MEMSET (AcpiGbl_DbBuffer, 0, ACPI_DEBUG_BUFFER_SIZE); @@ -450,14 +455,14 @@ AcpiDbInitialize ( if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not get debugger mutex\n"); - return (Status); + return_ACPI_STATUS (Status); } Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY); if (ACPI_FAILURE (Status)) { AcpiOsPrintf ("Could not get debugger mutex\n"); - return (Status); + return_ACPI_STATUS (Status); } /* Create the debug execution thread to execute commands */ @@ -465,8 +470,8 @@ AcpiDbInitialize ( Status = AcpiOsExecute (OSL_DEBUGGER_THREAD, AcpiDbExecuteThread, NULL); if (ACPI_FAILURE (Status)) { - AcpiOsPrintf ("Could not start debugger thread\n"); - return (Status); + ACPI_EXCEPTION ((AE_INFO, Status, "Could not start debugger thread")); + return_ACPI_STATUS (Status); } } @@ -476,7 +481,7 @@ AcpiDbInitialize ( AcpiGbl_DbOpt_stats = FALSE; } - return (AE_OK); + return_ACPI_STATUS (AE_OK); } @@ -500,6 +505,7 @@ AcpiDbTerminate ( if (AcpiGbl_DbBuffer) { AcpiOsFree (AcpiGbl_DbBuffer); + AcpiGbl_DbBuffer = NULL; } } diff --git a/source/components/disassembler/dmbuffer.c b/source/components/disassembler/dmbuffer.c index 89102ab..d0f57ce 100644 --- a/source/components/disassembler/dmbuffer.c +++ b/source/components/disassembler/dmbuffer.c @@ -194,7 +194,6 @@ AcpiDmByteList ( case ACPI_DASM_BUFFER: default: - /* * Not a resource, string, or unicode string. * Just dump the buffer diff --git a/source/components/disassembler/dmdeferred.c b/source/components/disassembler/dmdeferred.c index 7102ea7..38e4134 100644 --- a/source/components/disassembler/dmdeferred.c +++ b/source/components/disassembler/dmdeferred.c @@ -128,6 +128,7 @@ AcpiDmParseDeferredOps ( break; default: + ACPI_ERROR ((AE_INFO, "Unhandled deferred AML opcode [0x%.4X]", Op->Common.AmlOpcode)); break; @@ -265,6 +266,7 @@ AcpiDmDeferredParse ( break; default: + break; } diff --git a/source/components/disassembler/dmnames.c b/source/components/disassembler/dmnames.c index 22f045c..0fc7751 100644 --- a/source/components/disassembler/dmnames.c +++ b/source/components/disassembler/dmnames.c @@ -237,20 +237,24 @@ AcpiDmNamestring ( switch (ACPI_GET8 (Name)) { case 0: + SegCount = 0; break; case AML_DUAL_NAME_PREFIX: + SegCount = 2; Name++; break; case AML_MULTI_NAME_PREFIX_OP: + SegCount = (UINT32) ACPI_GET8 (Name + 1); Name += 2; break; default: + SegCount = 1; break; } diff --git a/source/components/disassembler/dmobject.c b/source/components/disassembler/dmobject.c index f6c681d..ab1d744 100644 --- a/source/components/disassembler/dmobject.c +++ b/source/components/disassembler/dmobject.c @@ -214,7 +214,6 @@ AcpiDmDecodeInternalObject ( ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; - case ACPI_TYPE_STRING: AcpiOsPrintf ("(%u) \"%.24s", @@ -230,7 +229,6 @@ AcpiDmDecodeInternalObject ( } break; - case ACPI_TYPE_BUFFER: AcpiOsPrintf ("(%u)", ObjDesc->Buffer.Length); @@ -240,7 +238,6 @@ AcpiDmDecodeInternalObject ( } break; - default: AcpiOsPrintf (" %p", ObjDesc); @@ -283,14 +280,17 @@ AcpiDmDecodeNode ( /* These types have no attached object */ case ACPI_TYPE_DEVICE: + AcpiOsPrintf (" Device"); break; case ACPI_TYPE_THERMAL: + AcpiOsPrintf (" Thermal Zone"); break; default: + AcpiDmDecodeInternalObject (AcpiNsGetAttachedObject (Node)); break; } @@ -335,13 +335,11 @@ AcpiDmDisplayInternalObject ( AcpiOsPrintf (" "); break; - case ACPI_DESC_TYPE_NAMED: AcpiDmDecodeNode ((ACPI_NAMESPACE_NODE *) ObjDesc); break; - case ACPI_DESC_TYPE_OPERAND: Type = ObjDesc->Common.Type; @@ -375,7 +373,6 @@ AcpiDmDisplayInternalObject ( } break; - case ACPI_REFCLASS_ARG: AcpiOsPrintf ("%X ", ObjDesc->Reference.Value); @@ -388,7 +385,6 @@ AcpiDmDisplayInternalObject ( } break; - case ACPI_REFCLASS_INDEX: switch (ObjDesc->Reference.TargetType) @@ -420,7 +416,6 @@ AcpiDmDisplayInternalObject ( } break; - case ACPI_REFCLASS_REFOF: if (!ObjDesc->Reference.Object) @@ -446,20 +441,17 @@ AcpiDmDisplayInternalObject ( } break; - case ACPI_REFCLASS_NAME: AcpiDmDecodeNode (ObjDesc->Reference.Node); break; - case ACPI_REFCLASS_DEBUG: case ACPI_REFCLASS_TABLE: AcpiOsPrintf ("\n"); break; - default: /* Unknown reference class */ AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class); @@ -467,7 +459,6 @@ AcpiDmDisplayInternalObject ( } break; - default: AcpiOsPrintf (" "); @@ -476,7 +467,6 @@ AcpiDmDisplayInternalObject ( } break; - default: AcpiOsPrintf (" [%s]", diff --git a/source/components/disassembler/dmopcode.c b/source/components/disassembler/dmopcode.c index ad69531..490fa8c 100644 --- a/source/components/disassembler/dmopcode.c +++ b/source/components/disassembler/dmopcode.c @@ -121,6 +121,7 @@ AcpiDmPredefinedDescription ( switch (NameString[1]) { case 'A': + if ((NameString[2] == 'C') && (LastCharIsDigit)) { NameString = "_ACx"; @@ -132,6 +133,7 @@ AcpiDmPredefinedDescription ( break; case 'E': + if ((NameString[2] == 'J') && (LastCharIsDigit)) { NameString = "_EJx"; @@ -143,6 +145,7 @@ AcpiDmPredefinedDescription ( break; case 'L': + if (LastCharsAreHex) { NameString = "_Lxx"; @@ -150,6 +153,7 @@ AcpiDmPredefinedDescription ( break; case 'Q': + if (LastCharsAreHex) { NameString = "_Qxx"; @@ -157,6 +161,7 @@ AcpiDmPredefinedDescription ( break; case 'T': + if (NameString[2] == '_') { NameString = "_T_x"; @@ -164,6 +169,7 @@ AcpiDmPredefinedDescription ( break; case 'W': + if (LastCharsAreHex) { NameString = "_Wxx"; @@ -171,6 +177,7 @@ AcpiDmPredefinedDescription ( break; default: + break; } @@ -536,21 +543,26 @@ AcpiDmDisassembleOneOp ( return; case ACPI_DASM_LNOT_SUFFIX: + switch (Op->Common.AmlOpcode) { case AML_LEQUAL_OP: + AcpiOsPrintf ("LNotEqual"); break; case AML_LGREATER_OP: + AcpiOsPrintf ("LLessEqual"); break; case AML_LLESS_OP: + AcpiOsPrintf ("LGreaterEqual"); break; default: + break; } Op->Common.DisasmOpcode = 0; @@ -589,7 +601,6 @@ AcpiDmDisassembleOneOp ( AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer); break; - case AML_WORD_OP: if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) @@ -602,7 +613,6 @@ AcpiDmDisassembleOneOp ( } break; - case AML_DWORD_OP: if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID) @@ -615,22 +625,18 @@ AcpiDmDisassembleOneOp ( } break; - case AML_QWORD_OP: AcpiOsPrintf ("0x%8.8X%8.8X", ACPI_FORMAT_UINT64 (Op->Common.Value.Integer)); break; - case AML_STRING_OP: AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT8_MAX); break; - case AML_BUFFER_OP: - /* * Determine the type of buffer. We can have one of the following: * @@ -680,7 +686,6 @@ AcpiDmDisassembleOneOp ( } break; - case AML_INT_STATICSTRING_OP: if (Op->Common.Value.String) @@ -693,13 +698,11 @@ AcpiDmDisassembleOneOp ( } break; - case AML_INT_NAMEPATH_OP: AcpiDmNamestring (Op->Common.Value.Name); break; - case AML_INT_NAMEDFIELD_OP: Length = AcpiDmDumpName (Op->Named.Name); @@ -710,7 +713,6 @@ AcpiDmDisassembleOneOp ( Info->BitOffset += (UINT32) Op->Common.Value.Integer; break; - case AML_INT_RESERVEDFIELD_OP: /* Offset() -- Must account for previous offsets */ @@ -730,7 +732,6 @@ AcpiDmDisassembleOneOp ( AcpiDmCommaIfFieldMember (Op); break; - case AML_INT_ACCESSFIELD_OP: case AML_INT_EXTACCESSFIELD_OP: @@ -748,9 +749,7 @@ AcpiDmDisassembleOneOp ( AcpiDmCommaIfFieldMember (Op); break; - case AML_INT_CONNECTION_OP: - /* * Two types of Connection() - one with a buffer object, the * other with a namestring that points to a buffer object. @@ -790,7 +789,6 @@ AcpiDmDisassembleOneOp ( AcpiDmByteList (Info, Op); break; - case AML_INT_METHODCALL_OP: Op = AcpiPsGetDepthNext (NULL, Op); @@ -799,7 +797,6 @@ AcpiDmDisassembleOneOp ( AcpiDmNamestring (Op->Common.Value.Name); break; - default: /* Just get the opcode name and print it */ diff --git a/source/components/disassembler/dmresrc.c b/source/components/disassembler/dmresrc.c index 5041e88..44111e1 100644 --- a/source/components/disassembler/dmresrc.c +++ b/source/components/disassembler/dmresrc.c @@ -337,6 +337,7 @@ AcpiDmResourceTemplate ( return; default: + break; } diff --git a/source/components/disassembler/dmresrcl.c b/source/components/disassembler/dmresrcl.c index 1b7c50b..e35b1b4 100644 --- a/source/components/disassembler/dmresrcl.c +++ b/source/components/disassembler/dmresrcl.c @@ -153,16 +153,19 @@ AcpiDmMemoryFields ( switch (Type) { case 16: + AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i], AcpiDmMemoryNames[i]); break; case 32: + AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i], AcpiDmMemoryNames[i]); break; default: + return; } } @@ -201,21 +204,25 @@ AcpiDmAddressFields ( switch (Type) { case 16: + AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i], AcpiDmAddressNames[i]); break; case 32: + AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i], AcpiDmAddressNames[i]); break; case 64: + AcpiDmDumpInteger64 (ACPI_CAST_PTR (UINT64, Source)[i], AcpiDmAddressNames[i]); break; default: + return; } } @@ -242,22 +249,27 @@ AcpiDmAddressPrefix ( switch (Type) { case ACPI_RESOURCE_TYPE_ADDRESS16: + AcpiOsPrintf ("Word"); break; case ACPI_RESOURCE_TYPE_ADDRESS32: + AcpiOsPrintf ("DWord"); break; case ACPI_RESOURCE_TYPE_ADDRESS64: + AcpiOsPrintf ("QWord"); break; case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64: + AcpiOsPrintf ("Extended"); break; default: + return; } } diff --git a/source/components/disassembler/dmresrcl2.c b/source/components/disassembler/dmresrcl2.c index 5db2062..1e26f61 100644 --- a/source/components/disassembler/dmresrcl2.c +++ b/source/components/disassembler/dmresrcl2.c @@ -376,14 +376,17 @@ AcpiDmGpioDescriptor ( switch (ConnectionType) { case AML_RESOURCE_GPIO_TYPE_INT: + AcpiDmGpioIntDescriptor (Resource, Length, Level); break; case AML_RESOURCE_GPIO_TYPE_IO: + AcpiDmGpioIoDescriptor (Resource, Length, Level); break; default: + AcpiOsPrintf ("Unknown GPIO type\n"); break; } @@ -443,6 +446,7 @@ AcpiDmDumpSerialBusVendorData ( break; default: + return; } diff --git a/source/components/disassembler/dmwalk.c b/source/components/disassembler/dmwalk.c index 02c92a3..863471a 100644 --- a/source/components/disassembler/dmwalk.c +++ b/source/components/disassembler/dmwalk.c @@ -461,6 +461,7 @@ AcpiDmDescendingOp ( /* Fallthrough */ default: + AcpiDmIndent (Level); break; } @@ -699,7 +700,6 @@ AcpiDmDescendingOp ( AcpiDmFieldFlags (NextOp); break; - case AML_BUFFER_OP: /* The next op is the size parameter */ @@ -737,7 +737,6 @@ AcpiDmDescendingOp ( NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST; return (AE_OK); - case AML_VAR_PACKAGE_OP: case AML_IF_OP: case AML_WHILE_OP: @@ -751,7 +750,6 @@ AcpiDmDescendingOp ( } return (AE_OK); - case AML_PACKAGE_OP: /* The next op is the size parameter */ @@ -763,13 +761,11 @@ AcpiDmDescendingOp ( } return (AE_OK); - case AML_MATCH_OP: AcpiDmMatchOp (Op); break; - default: break; @@ -866,7 +862,6 @@ AcpiDmAscendingOp ( } break; - case BLOCK_BRACE: case (BLOCK_BRACE | BLOCK_PAREN): @@ -906,7 +901,6 @@ AcpiDmAscendingOp ( } break; - case BLOCK_NONE: default: diff --git a/source/components/dispatcher/dscontrol.c b/source/components/dispatcher/dscontrol.c index 39bb178..32efe10 100644 --- a/source/components/dispatcher/dscontrol.c +++ b/source/components/dispatcher/dscontrol.c @@ -86,7 +86,6 @@ AcpiDsExecBeginControlOp ( switch (Op->Common.AmlOpcode) { case AML_WHILE_OP: - /* * If this is an additional iteration of a while loop, continue. * There is no need to allocate a new control state. @@ -107,7 +106,6 @@ AcpiDsExecBeginControlOp ( /*lint -fallthrough */ case AML_IF_OP: - /* * IF/WHILE: Create a new control state to manage these * constructs. We need to manage these as a stack, in order @@ -150,6 +148,7 @@ AcpiDsExecBeginControlOp ( break; default: + break; } @@ -204,12 +203,10 @@ AcpiDsExecEndControlOp ( AcpiUtDeleteGenericState (ControlState); break; - case AML_ELSE_OP: break; - case AML_WHILE_OP: ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", Op)); @@ -252,7 +249,6 @@ AcpiDsExecEndControlOp ( AcpiUtDeleteGenericState (ControlState); break; - case AML_RETURN_OP: ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, @@ -348,12 +344,11 @@ AcpiDsExecEndControlOp ( Status = AE_CTRL_TERMINATE; break; - case AML_NOOP_OP: /* Just do nothing! */ - break; + break; case AML_BREAK_POINT_OP: @@ -373,11 +368,9 @@ AcpiDsExecEndControlOp ( "Executed AML Breakpoint opcode"); break; - case AML_BREAK_OP: case AML_CONTINUE_OP: /* ACPI 2.0 */ - /* Pop and delete control states until we find a while */ while (WalkState->ControlState && @@ -410,7 +403,6 @@ AcpiDsExecEndControlOp ( } break; - default: ACPI_ERROR ((AE_INFO, "Unknown control opcode=0x%X Op=%p", diff --git a/source/components/dispatcher/dsfield.c b/source/components/dispatcher/dsfield.c index ac2e847..2fb4f0e 100644 --- a/source/components/dispatcher/dsfield.c +++ b/source/components/dispatcher/dsfield.c @@ -599,21 +599,25 @@ AcpiDsInitFieldObjects ( switch (WalkState->Opcode) { case AML_FIELD_OP: + Arg = AcpiPsGetArg (Op, 2); Type = ACPI_TYPE_LOCAL_REGION_FIELD; break; case AML_BANK_FIELD_OP: + Arg = AcpiPsGetArg (Op, 4); Type = ACPI_TYPE_LOCAL_BANK_FIELD; break; case AML_INDEX_FIELD_OP: + Arg = AcpiPsGetArg (Op, 3); Type = ACPI_TYPE_LOCAL_INDEX_FIELD; break; default: + return_ACPI_STATUS (AE_BAD_PARAMETER); } diff --git a/source/components/dispatcher/dsinit.c b/source/components/dispatcher/dsinit.c index 65ff5cb..a00e1b4 100644 --- a/source/components/dispatcher/dsinit.c +++ b/source/components/dispatcher/dsinit.c @@ -128,20 +128,18 @@ AcpiDsInitOneObject ( Info->OpRegionCount++; break; - case ACPI_TYPE_METHOD: Info->MethodCount++; break; - case ACPI_TYPE_DEVICE: Info->DeviceCount++; break; - default: + break; } diff --git a/source/components/dispatcher/dsmthdat.c b/source/components/dispatcher/dsmthdat.c index ded1eb7..e5578f6 100644 --- a/source/components/dispatcher/dsmthdat.c +++ b/source/components/dispatcher/dsmthdat.c @@ -315,6 +315,7 @@ AcpiDsMethodDataGetNode ( break; default: + ACPI_ERROR ((AE_INFO, "Type %u is invalid", Type)); return_ACPI_STATUS (AE_TYPE); } @@ -472,7 +473,6 @@ AcpiDsMethodDataGetValue ( return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG); case ACPI_REFCLASS_LOCAL: - /* * No error message for this case, will be trapped again later to * detect and ignore cases of Store(LocalX,LocalX) diff --git a/source/components/dispatcher/dsobject.c b/source/components/dispatcher/dsobject.c index 870b9b1..77cc582 100644 --- a/source/components/dispatcher/dsobject.c +++ b/source/components/dispatcher/dsobject.c @@ -677,7 +677,6 @@ AcpiDsInitObjectFromOp ( switch (ObjDesc->Common.Type) { case ACPI_TYPE_BUFFER: - /* * Defer evaluation of Buffer TermArg operand */ @@ -687,9 +686,7 @@ AcpiDsInitObjectFromOp ( ObjDesc->Buffer.AmlLength = Op->Named.Length; break; - case ACPI_TYPE_PACKAGE: - /* * Defer evaluation of Package TermArg operand */ @@ -699,7 +696,6 @@ AcpiDsInitObjectFromOp ( ObjDesc->Package.AmlLength = Op->Named.Length; break; - case ACPI_TYPE_INTEGER: switch (OpInfo->Type) @@ -752,7 +748,6 @@ AcpiDsInitObjectFromOp ( } break; - case AML_TYPE_LITERAL: ObjDesc->Integer.Value = Op->Common.Value.Integer; @@ -770,8 +765,8 @@ AcpiDsInitObjectFromOp ( #endif break; - default: + ACPI_ERROR ((AE_INFO, "Unknown Integer type 0x%X", OpInfo->Type)); Status = AE_AML_OPERAND_TYPE; @@ -779,7 +774,6 @@ AcpiDsInitObjectFromOp ( } break; - case ACPI_TYPE_STRING: ObjDesc->String.Pointer = Op->Common.Value.String; @@ -792,11 +786,9 @@ AcpiDsInitObjectFromOp ( ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER; break; - case ACPI_TYPE_METHOD: break; - case ACPI_TYPE_LOCAL_REFERENCE: switch (OpInfo->Type) @@ -816,7 +808,6 @@ AcpiDsInitObjectFromOp ( #endif break; - case AML_TYPE_METHOD_ARGUMENT: /* Arg ID (0-6) is (AML opcode - base AML_ARG_OP) */ @@ -860,7 +851,6 @@ AcpiDsInitObjectFromOp ( } break; - default: ACPI_ERROR ((AE_INFO, "Unimplemented data type: 0x%X", diff --git a/source/components/dispatcher/dsopcode.c b/source/components/dispatcher/dsopcode.c index 8415bec..63c20a3 100644 --- a/source/components/dispatcher/dsopcode.c +++ b/source/components/dispatcher/dsopcode.c @@ -680,6 +680,7 @@ AcpiDsEvalDataObjectOperands ( break; default: + return_ACPI_STATUS (AE_AML_BAD_OPCODE); } diff --git a/source/components/dispatcher/dsutils.c b/source/components/dispatcher/dsutils.c index a7cc232..9fedbe6 100644 --- a/source/components/dispatcher/dsutils.c +++ b/source/components/dispatcher/dsutils.c @@ -264,7 +264,6 @@ AcpiDsIsResultUsed ( case AML_IF_OP: case AML_WHILE_OP: - /* * If we are executing the predicate AND this is the predicate op, * we will use the return value @@ -277,7 +276,9 @@ AcpiDsIsResultUsed ( break; default: + /* Ignore other control opcodes */ + break; } @@ -285,16 +286,13 @@ AcpiDsIsResultUsed ( goto ResultNotUsed; - case AML_CLASS_CREATE: - /* * These opcodes allow TermArg(s) as operands and therefore * the operands can be method calls. The result is used. */ goto ResultUsed; - case AML_CLASS_NAMED_OBJECT: if ((Op->Common.Parent->Common.AmlOpcode == AML_REGION_OP) || @@ -314,9 +312,7 @@ AcpiDsIsResultUsed ( goto ResultNotUsed; - default: - /* * In all other cases. the parent will actually use the return * object, so keep it. diff --git a/source/components/dispatcher/dswexec.c b/source/components/dispatcher/dswexec.c index 0336635..25de7f7 100644 --- a/source/components/dispatcher/dswexec.c +++ b/source/components/dispatcher/dswexec.c @@ -318,7 +318,6 @@ AcpiDsExecBeginOp ( Status = AcpiDsExecBeginControlOp (WalkState, Op); break; - case AML_CLASS_NAMED_OBJECT: if (WalkState->WalkType & ACPI_WALK_METHOD) @@ -350,14 +349,13 @@ AcpiDsExecBeginOp ( } break; - case AML_CLASS_EXECUTE: case AML_CLASS_CREATE: break; - default: + break; } @@ -441,7 +439,6 @@ AcpiDsExecEndOp ( } break; - case AML_CLASS_EXECUTE: /* Most operators with arguments */ /* Build resolved operand stack */ @@ -514,7 +511,6 @@ AcpiDsExecEndOp ( } break; - default: switch (OpType) @@ -527,9 +523,7 @@ AcpiDsExecEndOp ( break; - case AML_TYPE_METHOD_CALL: - /* * If the method is referenced from within a package * declaration, it is not a invocation of the method, just @@ -596,7 +590,6 @@ AcpiDsExecEndOp ( */ return_ACPI_STATUS (Status); - case AML_TYPE_CREATE_FIELD: ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, @@ -620,7 +613,6 @@ AcpiDsExecEndOp ( switch (Op->Common.Parent->Common.AmlOpcode) { case AML_NAME_OP: - /* * Put the Node on the object stack (Contains the ACPI Name * of this object) @@ -661,7 +653,6 @@ AcpiDsExecEndOp ( } break; - case AML_TYPE_NAMED_FIELD: case AML_TYPE_NAMED_COMPLEX: case AML_TYPE_NAMED_SIMPLE: @@ -708,14 +699,12 @@ AcpiDsExecEndOp ( } break; - case AML_TYPE_UNDEFINED: ACPI_ERROR ((AE_INFO, "Undefined opcode type Op=%p", Op)); return_ACPI_STATUS (AE_NOT_IMPLEMENTED); - case AML_TYPE_BOGUS: ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, @@ -723,7 +712,6 @@ AcpiDsExecEndOp ( WalkState->Opcode, Op)); break; - default: ACPI_ERROR ((AE_INFO, diff --git a/source/components/dispatcher/dswload.c b/source/components/dispatcher/dswload.c index 10ff07a..7050c87 100644 --- a/source/components/dispatcher/dswload.c +++ b/source/components/dispatcher/dswload.c @@ -81,6 +81,7 @@ AcpiDsInitCallbacks ( switch (PassNumber) { case 1: + WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; WalkState->DescendingCallback = AcpiDsLoad1BeginOp; @@ -88,6 +89,7 @@ AcpiDsInitCallbacks ( break; case 2: + WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; WalkState->DescendingCallback = AcpiDsLoad2BeginOp; @@ -95,6 +97,7 @@ AcpiDsInitCallbacks ( break; case 3: + #ifndef ACPI_NO_METHOD_EXECUTION WalkState->ParseFlags |= ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE; @@ -104,6 +107,7 @@ AcpiDsInitCallbacks ( break; default: + return (AE_BAD_PARAMETER); } @@ -174,7 +178,6 @@ AcpiDsLoad1BeginOp ( switch (WalkState->Opcode) { case AML_SCOPE_OP: - /* * The target name of the Scope() operator must exist at this point so * that we can actually open the scope to enter new names underneath it. @@ -221,7 +224,6 @@ AcpiDsLoad1BeginOp ( case ACPI_TYPE_INTEGER: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - /* * These types we will allow, but we will change the type. * This enables some existing code of the form: @@ -242,7 +244,6 @@ AcpiDsLoad1BeginOp ( break; case ACPI_TYPE_METHOD: - /* * Allow scope change to root during execution of module-level * code. Root is typed METHOD during this time. @@ -268,7 +269,6 @@ AcpiDsLoad1BeginOp ( } break; - default: /* * For all other named opcodes, we will enter the name into diff --git a/source/components/dispatcher/dswload2.c b/source/components/dispatcher/dswload2.c index a305564..07bd35e 100644 --- a/source/components/dispatcher/dswload2.c +++ b/source/components/dispatcher/dswload2.c @@ -496,7 +496,6 @@ AcpiDsLoad2EndOp ( Status = AcpiDsCreateBufferField (Op, WalkState); break; - case AML_TYPE_NAMED_FIELD: /* * If we are executing a method, initialize the field @@ -525,12 +524,12 @@ AcpiDsLoad2EndOp ( break; default: + /* All NAMED_FIELD opcodes must be handled above */ break; } break; - case AML_TYPE_NAMED_SIMPLE: Status = AcpiDsCreateOperands (WalkState, Arg); @@ -561,13 +560,13 @@ AcpiDsLoad2EndOp ( Status = AcpiExCreateEvent (WalkState); break; - case AML_ALIAS_OP: Status = AcpiExCreateAlias (WalkState); break; default: + /* Unknown opcode */ Status = AE_OK; @@ -652,13 +651,11 @@ AcpiDsLoad2EndOp ( } break; - case AML_NAME_OP: Status = AcpiDsCreateNode (WalkState, Node, Op); break; - case AML_METHOD_OP: /* * MethodOp PkgLength NameString MethodFlags TermList @@ -696,18 +693,17 @@ AcpiDsLoad2EndOp ( #endif /* ACPI_NO_METHOD_EXECUTION */ default: + /* All NAMED_COMPLEX opcodes must be handled above */ break; } break; - case AML_CLASS_INTERNAL: /* case AML_INT_NAMEPATH_OP: */ break; - case AML_CLASS_METHOD_CALL: ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, @@ -747,6 +743,7 @@ AcpiDsLoad2EndOp ( default: + break; } diff --git a/source/components/events/evglock.c b/source/components/events/evglock.c index 591bb7c..fffe8dd 100644 --- a/source/components/events/evglock.c +++ b/source/components/events/evglock.c @@ -144,6 +144,7 @@ AcpiEvRemoveGlobalLockHandler ( Status = AcpiRemoveFixedEventHandler (ACPI_EVENT_GLOBAL, AcpiEvGlobalLockHandler); + AcpiOsDeleteLock (AcpiGbl_GlobalLockPendingLock); return_ACPI_STATUS (Status); } diff --git a/source/components/events/evgpe.c b/source/components/events/evgpe.c index b6388a3..9b80f08 100644 --- a/source/components/events/evgpe.c +++ b/source/components/events/evgpe.c @@ -578,7 +578,6 @@ AcpiEvAsynchExecuteGpeMethod ( switch (LocalGpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) { case ACPI_GPE_DISPATCH_NOTIFY: - /* * Implicit notify. * Dispatch a DEVICE_WAKE notify to the appropriate handler. @@ -628,10 +627,10 @@ AcpiEvAsynchExecuteGpeMethod ( "while evaluating GPE method [%4.4s]", AcpiUtGetNodeName (LocalGpeEventInfo->Dispatch.MethodNode))); } - break; default: + return_VOID; /* Should never happen */ } @@ -818,7 +817,6 @@ AcpiEvGpeDispatch ( case ACPI_GPE_DISPATCH_METHOD: case ACPI_GPE_DISPATCH_NOTIFY: - /* * Execute the method associated with the GPE * NOTE: Level-triggered GPEs are cleared after the method completes. @@ -834,7 +832,6 @@ AcpiEvGpeDispatch ( break; default: - /* * No handler or method to run! * 03/2010: This case should no longer be possible. We will not allow diff --git a/source/components/events/evgpeblk.c b/source/components/events/evgpeblk.c index 64c8194..ccbe6a6 100644 --- a/source/components/events/evgpeblk.c +++ b/source/components/events/evgpeblk.c @@ -420,6 +420,8 @@ AcpiEvCreateGpeBlock ( Status = AcpiEvInstallGpeBlock (GpeBlock, InterruptNumber); if (ACPI_FAILURE (Status)) { + ACPI_FREE (GpeBlock->RegisterInfo); + ACPI_FREE (GpeBlock->EventInfo); ACPI_FREE (GpeBlock); return_ACPI_STATUS (Status); } diff --git a/source/components/events/evgpeinit.c b/source/components/events/evgpeinit.c index af1ec64..44a1378 100644 --- a/source/components/events/evgpeinit.c +++ b/source/components/events/evgpeinit.c @@ -382,14 +382,17 @@ AcpiEvMatchGpeMethod ( switch (Name[1]) { case 'L': + Type = ACPI_GPE_LEVEL_TRIGGERED; break; case 'E': + Type = ACPI_GPE_EDGE_TRIGGERED; break; default: + /* Unknown method type, just ignore it */ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, diff --git a/source/components/events/evhandler.c b/source/components/events/evhandler.c index 355a248..9444b06 100644 --- a/source/components/events/evhandler.c +++ b/source/components/events/evhandler.c @@ -393,36 +393,43 @@ AcpiEvInstallSpaceHandler ( switch (SpaceId) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: + Handler = AcpiExSystemMemorySpaceHandler; Setup = AcpiEvSystemMemoryRegionSetup; break; case ACPI_ADR_SPACE_SYSTEM_IO: + Handler = AcpiExSystemIoSpaceHandler; Setup = AcpiEvIoSpaceRegionSetup; break; case ACPI_ADR_SPACE_PCI_CONFIG: + Handler = AcpiExPciConfigSpaceHandler; Setup = AcpiEvPciConfigRegionSetup; break; case ACPI_ADR_SPACE_CMOS: + Handler = AcpiExCmosSpaceHandler; Setup = AcpiEvCmosRegionSetup; break; case ACPI_ADR_SPACE_PCI_BAR_TARGET: + Handler = AcpiExPciBarSpaceHandler; Setup = AcpiEvPciBarRegionSetup; break; case ACPI_ADR_SPACE_DATA_TABLE: + Handler = AcpiExDataTableSpaceHandler; Setup = NULL; break; default: + Status = AE_BAD_PARAMETER; goto UnlockAndExit; } diff --git a/source/components/events/evmisc.c b/source/components/events/evmisc.c index 1a971bf..1990a41 100644 --- a/source/components/events/evmisc.c +++ b/source/components/events/evmisc.c @@ -86,6 +86,7 @@ AcpiEvIsNotifyObject ( return (TRUE); default: + return (FALSE); } } @@ -306,6 +307,8 @@ AcpiEvTerminate ( ACPI_ERROR ((AE_INFO, "Could not remove Global Lock handler")); } + + AcpiGbl_EventsInitialized = FALSE; } /* Deallocate all handler objects installed within GPE info structs */ diff --git a/source/components/events/evregion.c b/source/components/events/evregion.c index f4e9059..8e11b29 100644 --- a/source/components/events/evregion.c +++ b/source/components/events/evregion.c @@ -60,7 +60,7 @@ extern UINT8 AcpiGbl_DefaultAddressSpaces[]; static void AcpiEvOrphanEcRegMethod ( - void); + ACPI_NAMESPACE_NODE *EcDeviceNode); static ACPI_STATUS AcpiEvRegRun ( @@ -564,7 +564,7 @@ AcpiEvExecuteRegMethod ( } Info->PrefixNode = RegionObj2->Extra.Method_REG; - Info->Pathname = NULL; + Info->RelativePathname = NULL; Info->Parameters = Args; Info->Flags = ACPI_IGNORE_RETURN_VALUE; @@ -650,7 +650,7 @@ AcpiEvExecuteRegMethods ( if (SpaceId == ACPI_ADR_SPACE_EC) { - AcpiEvOrphanEcRegMethod (); + AcpiEvOrphanEcRegMethod (Node); } return_ACPI_STATUS (Status); @@ -728,7 +728,7 @@ AcpiEvRegRun ( * * FUNCTION: AcpiEvOrphanEcRegMethod * - * PARAMETERS: None + * PARAMETERS: EcDeviceNode - Namespace node for an EC device * * RETURN: None * @@ -740,41 +740,30 @@ AcpiEvRegRun ( * detected by providing a _REG method object underneath the * Embedded Controller device." * - * To quickly access the EC device, we use the EC_ID that appears - * within the ECDT. Otherwise, we would need to perform a time- - * consuming namespace walk, executing _HID methods to find the - * EC device. + * To quickly access the EC device, we use the EcDeviceNode used + * during EC handler installation. Otherwise, we would need to + * perform a time consuming namespace walk, executing _HID + * methods to find the EC device. + * + * MUTEX: Assumes the namespace is locked * ******************************************************************************/ static void AcpiEvOrphanEcRegMethod ( - void) + ACPI_NAMESPACE_NODE *EcDeviceNode) { - ACPI_TABLE_ECDT *Table; + ACPI_HANDLE RegMethod; + ACPI_NAMESPACE_NODE *NextNode; ACPI_STATUS Status; ACPI_OBJECT_LIST Args; ACPI_OBJECT Objects[2]; - ACPI_NAMESPACE_NODE *EcDeviceNode; - ACPI_NAMESPACE_NODE *RegMethod; - ACPI_NAMESPACE_NODE *NextNode; ACPI_FUNCTION_TRACE (EvOrphanEcRegMethod); - /* Get the ECDT (if present in system) */ - - Status = AcpiGetTable (ACPI_SIG_ECDT, 0, - ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &Table)); - if (ACPI_FAILURE (Status)) - { - return_VOID; - } - - /* We need a valid EC_ID string */ - - if (!(*Table->Id)) + if (!EcDeviceNode) { return_VOID; } @@ -783,23 +772,12 @@ AcpiEvOrphanEcRegMethod ( (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); - /* Get a handle to the EC device referenced in the ECDT */ - - Status = AcpiGetHandle (NULL, - ACPI_CAST_PTR (char, Table->Id), - ACPI_CAST_PTR (ACPI_HANDLE, &EcDeviceNode)); - if (ACPI_FAILURE (Status)) - { - goto Exit; - } - /* Get a handle to a _REG method immediately under the EC device */ - Status = AcpiGetHandle (EcDeviceNode, - METHOD_NAME__REG, ACPI_CAST_PTR (ACPI_HANDLE, &RegMethod)); + Status = AcpiGetHandle (EcDeviceNode, METHOD_NAME__REG, &RegMethod); if (ACPI_FAILURE (Status)) { - goto Exit; + goto Exit; /* There is no _REG method present */ } /* @@ -807,7 +785,7 @@ AcpiEvOrphanEcRegMethod ( * this scope with the Embedded Controller space ID. Otherwise, it * will already have been executed. Note, this allows for Regions * with other space IDs to be present; but the code below will then - * execute the _REG method with the EC space ID argument. + * execute the _REG method with the EmbeddedControl SpaceID argument. */ NextNode = AcpiNsGetNextNode (EcDeviceNode, NULL); while (NextNode) @@ -816,12 +794,13 @@ AcpiEvOrphanEcRegMethod ( (NextNode->Object) && (NextNode->Object->Region.SpaceId == ACPI_ADR_SPACE_EC)) { - goto Exit; /* Do not execute _REG */ + goto Exit; /* Do not execute the _REG */ } + NextNode = AcpiNsGetNextNode (EcDeviceNode, NextNode); } - /* Evaluate the _REG(EC,Connect) method */ + /* Evaluate the _REG(EmbeddedControl,Connect) method */ Args.Count = 2; Args.Pointer = Objects; diff --git a/source/components/events/evrgnini.c b/source/components/events/evrgnini.c index 4bb7c9f..b8a632e 100644 --- a/source/components/events/evrgnini.c +++ b/source/components/events/evrgnini.c @@ -664,7 +664,9 @@ AcpiEvInitializeRegion ( break; default: + /* Ignore other objects */ + break; } diff --git a/source/components/events/evxfgpe.c b/source/components/events/evxfgpe.c index b8d7e37..1deff5b 100644 --- a/source/components/events/evxfgpe.c +++ b/source/components/events/evxfgpe.c @@ -250,14 +250,17 @@ AcpiSetGpe ( switch (Action) { case ACPI_GPE_ENABLE: + Status = AcpiEvEnableGpe (GpeEventInfo); break; case ACPI_GPE_DISABLE: + Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_DISABLE); break; default: + Status = AE_BAD_PARAMETER; break; } @@ -487,14 +490,17 @@ AcpiSetGpeWakeMask ( switch (Action) { case ACPI_GPE_ENABLE: + ACPI_SET_BIT (GpeRegisterInfo->EnableForWake, (UINT8) RegisterBit); break; case ACPI_GPE_DISABLE: + ACPI_CLEAR_BIT (GpeRegisterInfo->EnableForWake, (UINT8) RegisterBit); break; default: + ACPI_ERROR ((AE_INFO, "%u, Invalid action", Action)); Status = AE_BAD_PARAMETER; break; diff --git a/source/components/events/evxfregn.c b/source/components/events/evxfregn.c index 330de61..4b5b3d0 100644 --- a/source/components/events/evxfregn.c +++ b/source/components/events/evxfregn.c @@ -149,6 +149,7 @@ AcpiInstallAddressSpaceHandler ( break; default: + break; } diff --git a/source/components/executer/exconfig.c b/source/components/executer/exconfig.c index 4f1962b..3e9f12b 100644 --- a/source/components/executer/exconfig.c +++ b/source/components/executer/exconfig.c @@ -483,7 +483,6 @@ AcpiExLoadOp ( TableDesc.Address = ObjDesc->Region.Address; break; - case ACPI_TYPE_BUFFER: /* Buffer or resolved RegionField */ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, @@ -526,8 +525,8 @@ AcpiExLoadOp ( TableDesc.Address = ACPI_TO_INTEGER (TableDesc.Pointer); break; - default: + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } @@ -643,7 +642,7 @@ AcpiExUnloadTable ( (DdbHandle->Common.Type != ACPI_TYPE_LOCAL_REFERENCE) || (!(DdbHandle->Common.Flags & AOPOBJ_DATA_VALID))) { - return_ACPI_STATUS (AE_BAD_PARAMETER); + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Get the table index from the DdbHandle */ diff --git a/source/components/executer/exconvrt.c b/source/components/executer/exconvrt.c index 2ba2e3e..6f803c0 100644 --- a/source/components/executer/exconvrt.c +++ b/source/components/executer/exconvrt.c @@ -114,6 +114,7 @@ AcpiExConvertToInteger ( break; default: + return_ACPI_STATUS (AE_TYPE); } @@ -133,7 +134,6 @@ AcpiExConvertToInteger ( switch (ObjDesc->Common.Type) { case ACPI_TYPE_STRING: - /* * Convert string to an integer - for most cases, the string must be * hexadecimal as per the ACPI specification. The only exception (as @@ -147,7 +147,6 @@ AcpiExConvertToInteger ( } break; - case ACPI_TYPE_BUFFER: /* Check for zero-length buffer */ @@ -179,10 +178,10 @@ AcpiExConvertToInteger ( } break; - default: /* No other types can get here */ + break; } @@ -242,7 +241,6 @@ AcpiExConvertToBuffer ( case ACPI_TYPE_INTEGER: - /* * Create a new Buffer object. * Need enough space for one integer @@ -261,9 +259,7 @@ AcpiExConvertToBuffer ( AcpiGbl_IntegerByteWidth); break; - case ACPI_TYPE_STRING: - /* * Create a new Buffer object * Size will be the string length @@ -287,8 +283,8 @@ AcpiExConvertToBuffer ( ObjDesc->String.Length); break; - default: + return_ACPI_STATUS (AE_TYPE); } @@ -344,15 +340,18 @@ AcpiExConvertToAscii ( switch (DataWidth) { case 1: + DecimalLength = ACPI_MAX8_DECIMAL_DIGITS; break; case 4: + DecimalLength = ACPI_MAX32_DECIMAL_DIGITS; break; case 8: default: + DecimalLength = ACPI_MAX64_DECIMAL_DIGITS; break; } @@ -461,7 +460,6 @@ AcpiExConvertToString ( *ResultDesc = ObjDesc; return_ACPI_STATUS (AE_OK); - case ACPI_TYPE_INTEGER: switch (Type) @@ -505,7 +503,6 @@ AcpiExConvertToString ( NewBuf [StringLength] = 0; break; - case ACPI_TYPE_BUFFER: /* Setup string length, base, and separator */ @@ -604,6 +601,7 @@ AcpiExConvertToString ( break; default: + return_ACPI_STATUS (AE_TYPE); } @@ -663,6 +661,7 @@ AcpiExConvertToTargetType ( break; default: + /* No conversion allowed for these types */ if (DestinationType != SourceDesc->Common.Type) @@ -676,7 +675,6 @@ AcpiExConvertToTargetType ( } break; - case ARGI_TARGETREF: switch (DestinationType) @@ -693,7 +691,6 @@ AcpiExConvertToTargetType ( 16); break; - case ACPI_TYPE_STRING: /* * The operand must be a String. We can convert an @@ -703,7 +700,6 @@ AcpiExConvertToTargetType ( ACPI_IMPLICIT_CONVERT_HEX); break; - case ACPI_TYPE_BUFFER: /* * The operand must be a Buffer. We can convert an @@ -712,8 +708,8 @@ AcpiExConvertToTargetType ( Status = AcpiExConvertToBuffer (SourceDesc, ResultDesc); break; - default: + ACPI_ERROR ((AE_INFO, "Bad destination type during conversion: 0x%X", DestinationType)); Status = AE_AML_INTERNAL; @@ -721,15 +717,14 @@ AcpiExConvertToTargetType ( } break; - case ARGI_REFERENCE: /* * CreateXxxxField cases - we are storing the field object into the name */ break; - default: + ACPI_ERROR ((AE_INFO, "Unknown Target type ID 0x%X AmlOpcode 0x%X DestType %s", GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs), diff --git a/source/components/executer/excreate.c b/source/components/executer/excreate.c index 822f2a5..376e1fd 100644 --- a/source/components/executer/excreate.c +++ b/source/components/executer/excreate.c @@ -113,7 +113,6 @@ AcpiExCreateAlias ( 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. @@ -123,7 +122,6 @@ AcpiExCreateAlias ( 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. @@ -133,7 +131,6 @@ AcpiExCreateAlias ( break; case ACPI_TYPE_METHOD: - /* * Control method aliases need to be differentiated */ diff --git a/source/components/executer/exdebug.c b/source/components/executer/exdebug.c index 923d2ce..9db779f 100644 --- a/source/components/executer/exdebug.c +++ b/source/components/executer/exdebug.c @@ -208,6 +208,7 @@ AcpiExDoDebugObject ( return_VOID; default: + break; } @@ -241,6 +242,7 @@ AcpiExDoDebugObject ( break; default: + AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object, Level+4, 0); break; diff --git a/source/components/executer/exdump.c b/source/components/executer/exdump.c index 48ff6e3..333168e 100644 --- a/source/components/executer/exdump.c +++ b/source/components/executer/exdump.c @@ -380,6 +380,7 @@ AcpiExDumpObject ( switch (Info->Opcode) { case ACPI_EXD_INIT: + break; case ACPI_EXD_TYPE: @@ -541,19 +542,16 @@ AcpiExDumpOperand ( AcpiOsPrintf ("\n"); break; - case ACPI_REFCLASS_INDEX: AcpiOsPrintf ("%p\n", ObjDesc->Reference.Object); break; - case ACPI_REFCLASS_TABLE: AcpiOsPrintf ("Table Index %X\n", ObjDesc->Reference.Value); break; - case ACPI_REFCLASS_REFOF: AcpiOsPrintf ("%p [%s]\n", ObjDesc->Reference.Object, @@ -561,20 +559,17 @@ AcpiExDumpOperand ( ObjDesc->Reference.Object)->Common.Type)); break; - case ACPI_REFCLASS_NAME: AcpiOsPrintf ("- [%4.4s]\n", ObjDesc->Reference.Node->Name.Ascii); break; - case ACPI_REFCLASS_ARG: case ACPI_REFCLASS_LOCAL: AcpiOsPrintf ("%X\n", ObjDesc->Reference.Value); break; - default: /* Unknown reference class */ AcpiOsPrintf ("%2.2X\n", ObjDesc->Reference.Class); @@ -582,7 +577,6 @@ AcpiExDumpOperand ( } break; - case ACPI_TYPE_BUFFER: AcpiOsPrintf ("Buffer length %.2X @ %p\n", @@ -604,14 +598,12 @@ AcpiExDumpOperand ( } break; - case ACPI_TYPE_INTEGER: AcpiOsPrintf ("Integer %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; - case ACPI_TYPE_PACKAGE: AcpiOsPrintf ("Package [Len %X] ElementArray %p\n", @@ -632,7 +624,6 @@ AcpiExDumpOperand ( } break; - case ACPI_TYPE_REGION: AcpiOsPrintf ("Region %s (%X)", @@ -655,7 +646,6 @@ AcpiExDumpOperand ( } break; - case ACPI_TYPE_STRING: AcpiOsPrintf ("String length %X @ %p ", @@ -666,13 +656,11 @@ AcpiExDumpOperand ( AcpiOsPrintf ("\n"); break; - case ACPI_TYPE_LOCAL_BANK_FIELD: AcpiOsPrintf ("BankField\n"); break; - case ACPI_TYPE_LOCAL_REGION_FIELD: AcpiOsPrintf ("RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at " @@ -687,13 +675,11 @@ AcpiExDumpOperand ( AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1); break; - case ACPI_TYPE_LOCAL_INDEX_FIELD: AcpiOsPrintf ("IndexField\n"); break; - case ACPI_TYPE_BUFFER_FIELD: AcpiOsPrintf ("BufferField: %X bits at byte %X bit %X of\n", @@ -716,13 +702,11 @@ AcpiExDumpOperand ( } break; - case ACPI_TYPE_EVENT: AcpiOsPrintf ("Event\n"); break; - case ACPI_TYPE_METHOD: AcpiOsPrintf ("Method(%X) @ %p:%X\n", @@ -731,38 +715,33 @@ AcpiExDumpOperand ( ObjDesc->Method.AmlLength); break; - case ACPI_TYPE_MUTEX: AcpiOsPrintf ("Mutex\n"); break; - case ACPI_TYPE_DEVICE: AcpiOsPrintf ("Device\n"); break; - case ACPI_TYPE_POWER: AcpiOsPrintf ("Power\n"); break; - case ACPI_TYPE_PROCESSOR: AcpiOsPrintf ("Processor\n"); break; - case ACPI_TYPE_THERMAL: AcpiOsPrintf ("Thermal\n"); break; - default: + /* Unknown Type */ AcpiOsPrintf ("Unknown Type %X\n", ObjDesc->Common.Type); @@ -1005,7 +984,6 @@ AcpiExDumpPackageObj ( ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; - case ACPI_TYPE_STRING: AcpiOsPrintf ("[String] Value: "); @@ -1013,7 +991,6 @@ AcpiExDumpPackageObj ( AcpiOsPrintf ("\n"); break; - case ACPI_TYPE_BUFFER: AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length); @@ -1028,7 +1005,6 @@ AcpiExDumpPackageObj ( } break; - case ACPI_TYPE_PACKAGE: AcpiOsPrintf ("[Package] Contains %u Elements:\n", @@ -1040,7 +1016,6 @@ AcpiExDumpPackageObj ( } break; - case ACPI_TYPE_LOCAL_REFERENCE: AcpiOsPrintf ("[Object Reference] Type [%s] %2.2X", @@ -1049,7 +1024,6 @@ AcpiExDumpPackageObj ( AcpiExDumpReferenceObj (ObjDesc); break; - default: AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Common.Type); diff --git a/source/components/executer/exfield.c b/source/components/executer/exfield.c index 18021c5..2b4f5f7 100644 --- a/source/components/executer/exfield.c +++ b/source/components/executer/exfield.c @@ -360,21 +360,25 @@ AcpiExWriteDataToField ( switch (SourceDesc->Common.Type) { case ACPI_TYPE_INTEGER: + Buffer = &SourceDesc->Integer.Value; Length = sizeof (SourceDesc->Integer.Value); break; case ACPI_TYPE_BUFFER: + Buffer = SourceDesc->Buffer.Pointer; Length = SourceDesc->Buffer.Length; break; case ACPI_TYPE_STRING: + Buffer = SourceDesc->String.Pointer; Length = SourceDesc->String.Length; break; default: + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } diff --git a/source/components/executer/exfldio.c b/source/components/executer/exfldio.c index 24636ab..cd3c40f 100644 --- a/source/components/executer/exfldio.c +++ b/source/components/executer/exfldio.c @@ -480,9 +480,7 @@ AcpiExFieldDatumIo ( Status = AE_OK; break; - case ACPI_TYPE_LOCAL_BANK_FIELD: - /* * Ensure that the BankValue is not beyond the capacity of * the register @@ -512,7 +510,6 @@ AcpiExFieldDatumIo ( /*lint -fallthrough */ - case ACPI_TYPE_LOCAL_REGION_FIELD: /* * For simple RegionFields, we just directly access the owning @@ -522,10 +519,7 @@ AcpiExFieldDatumIo ( ReadWrite); break; - case ACPI_TYPE_LOCAL_INDEX_FIELD: - - /* * Ensure that the IndexValue is not beyond the capacity of * the register @@ -575,7 +569,6 @@ AcpiExFieldDatumIo ( } break; - default: ACPI_ERROR ((AE_INFO, "Wrong object type in field I/O %u", @@ -766,7 +759,18 @@ AcpiExExtractFromField ( if ((ObjDesc->CommonField.StartFieldBitOffset == 0) && (ObjDesc->CommonField.BitLength == AccessBitWidth)) { - Status = AcpiExFieldDatumIo (ObjDesc, 0, Buffer, ACPI_READ); + if (BufferLength >= sizeof (UINT64)) + { + Status = AcpiExFieldDatumIo (ObjDesc, 0, Buffer, ACPI_READ); + } + else + { + /* Use RawDatum (UINT64) to handle buffers < 64 bits */ + + Status = AcpiExFieldDatumIo (ObjDesc, 0, &RawDatum, ACPI_READ); + ACPI_MEMCPY (Buffer, &RawDatum, BufferLength); + } + return_ACPI_STATUS (Status); } diff --git a/source/components/executer/exmisc.c b/source/components/executer/exmisc.c index e527514..7520c9b 100644 --- a/source/components/executer/exmisc.c +++ b/source/components/executer/exmisc.c @@ -115,16 +115,13 @@ AcpiExGetObjectReference ( } break; - case ACPI_DESC_TYPE_NAMED: - /* * A named reference that has already been resolved to a Node */ ReferencedObj = ObjDesc; break; - default: ACPI_ERROR ((AE_INFO, "Invalid descriptor type 0x%X", @@ -286,19 +283,23 @@ AcpiExDoConcatenate ( switch (Operand0->Common.Type) { case ACPI_TYPE_INTEGER: + Status = AcpiExConvertToInteger (Operand1, &LocalOperand1, 16); break; case ACPI_TYPE_STRING: + Status = AcpiExConvertToString (Operand1, &LocalOperand1, ACPI_IMPLICIT_CONVERT_HEX); break; case ACPI_TYPE_BUFFER: + Status = AcpiExConvertToBuffer (Operand1, &LocalOperand1); break; default: + ACPI_ERROR ((AE_INFO, "Invalid object type: 0x%X", Operand0->Common.Type)); Status = AE_AML_INTERNAL; @@ -450,37 +451,30 @@ AcpiExDoMathOp ( return (Integer0 + Integer1); - case AML_BIT_AND_OP: /* And (Integer0, Integer1, Result) */ return (Integer0 & Integer1); - case AML_BIT_NAND_OP: /* NAnd (Integer0, Integer1, Result) */ return (~(Integer0 & Integer1)); - case AML_BIT_OR_OP: /* Or (Integer0, Integer1, Result) */ return (Integer0 | Integer1); - case AML_BIT_NOR_OP: /* NOr (Integer0, Integer1, Result) */ return (~(Integer0 | Integer1)); - case AML_BIT_XOR_OP: /* XOr (Integer0, Integer1, Result) */ return (Integer0 ^ Integer1); - case AML_MULTIPLY_OP: /* Multiply (Integer0, Integer1, Result) */ return (Integer0 * Integer1); - case AML_SHIFT_LEFT_OP: /* ShiftLeft (Operand, ShiftCount, Result)*/ /* @@ -493,7 +487,6 @@ AcpiExDoMathOp ( } return (Integer0 << Integer1); - case AML_SHIFT_RIGHT_OP: /* ShiftRight (Operand, ShiftCount, Result) */ /* @@ -506,7 +499,6 @@ AcpiExDoMathOp ( } return (Integer0 >> Integer1); - case AML_SUBTRACT_OP: /* Subtract (Integer0, Integer1, Result) */ return (Integer0 - Integer1); @@ -571,6 +563,7 @@ AcpiExDoLogicalNumericOp ( break; default: + Status = AE_AML_INTERNAL; break; } @@ -638,19 +631,23 @@ AcpiExDoLogicalOp ( switch (Operand0->Common.Type) { case ACPI_TYPE_INTEGER: + Status = AcpiExConvertToInteger (Operand1, &LocalOperand1, 16); break; case ACPI_TYPE_STRING: + Status = AcpiExConvertToString (Operand1, &LocalOperand1, ACPI_IMPLICIT_CONVERT_HEX); break; case ACPI_TYPE_BUFFER: + Status = AcpiExConvertToBuffer (Operand1, &LocalOperand1); break; default: + Status = AE_AML_INTERNAL; break; } @@ -699,6 +696,7 @@ AcpiExDoLogicalOp ( break; default: + Status = AE_AML_INTERNAL; break; } @@ -776,6 +774,7 @@ AcpiExDoLogicalOp ( break; default: + Status = AE_AML_INTERNAL; break; } diff --git a/source/components/executer/exnames.c b/source/components/executer/exnames.c index fee4e5c..ac12e1a 100644 --- a/source/components/executer/exnames.c +++ b/source/components/executer/exnames.c @@ -334,7 +334,6 @@ AcpiExGetNameString ( HasPrefix = TRUE; break; - case AML_PARENT_PREFIX: /* Increment past possibly multiple parent prefixes */ @@ -352,7 +351,6 @@ AcpiExGetNameString ( HasPrefix = TRUE; break; - default: /* Not a prefix character */ @@ -388,7 +386,6 @@ AcpiExGetNameString ( } break; - case AML_MULTI_NAME_PREFIX_OP: ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "MultiNamePrefix at %p\n", @@ -420,7 +417,6 @@ AcpiExGetNameString ( break; - case 0: /* NullName valid as of 8-12-98 ASL/AML Grammar Update */ @@ -443,7 +439,6 @@ AcpiExGetNameString ( break; - default: /* Name segment string */ diff --git a/source/components/executer/exoparg1.c b/source/components/executer/exoparg1.c index 73fc026..ff8dee2 100644 --- a/source/components/executer/exoparg1.c +++ b/source/components/executer/exoparg1.c @@ -180,37 +180,31 @@ AcpiExOpcode_1A_0T_0R ( Status = AcpiExReleaseMutex (Operand[0], WalkState); break; - case AML_RESET_OP: /* Reset (EventObject) */ Status = AcpiExSystemResetEvent (Operand[0]); break; - case AML_SIGNAL_OP: /* Signal (EventObject) */ Status = AcpiExSystemSignalEvent (Operand[0]); break; - case AML_SLEEP_OP: /* Sleep (MsecTime) */ Status = AcpiExSystemDoSleep (Operand[0]->Integer.Value); break; - case AML_STALL_OP: /* Stall (UsecTime) */ Status = AcpiExSystemDoStall ((UINT32) Operand[0]->Integer.Value); break; - case AML_UNLOAD_OP: /* Unload (Handle) */ Status = AcpiExUnloadTable (Operand[0]); break; - default: /* Unknown opcode */ ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", @@ -330,7 +324,6 @@ AcpiExOpcode_1A_1T_1R ( ReturnDesc->Integer.Value = ~Operand[0]->Integer.Value; break; - case AML_FIND_SET_LEFT_BIT_OP: /* FindSetLeftBit (Operand, Result) */ ReturnDesc->Integer.Value = Operand[0]->Integer.Value; @@ -348,7 +341,6 @@ AcpiExOpcode_1A_1T_1R ( ReturnDesc->Integer.Value = Temp32; break; - case AML_FIND_SET_RIGHT_BIT_OP: /* FindSetRightBit (Operand, Result) */ ReturnDesc->Integer.Value = Operand[0]->Integer.Value; @@ -369,9 +361,7 @@ AcpiExOpcode_1A_1T_1R ( Temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - Temp32; break; - case AML_FROM_BCD_OP: /* FromBcd (BCDValue, Result) */ - /* * The 64-bit ACPI integer can hold 16 4-bit BCD characters * (if table is 32-bit, integer can hold 8 BCD characters) @@ -416,7 +406,6 @@ AcpiExOpcode_1A_1T_1R ( } break; - case AML_TO_BCD_OP: /* ToBcd (Operand, Result) */ ReturnDesc->Integer.Value = 0; @@ -448,9 +437,7 @@ AcpiExOpcode_1A_1T_1R ( } break; - case AML_COND_REF_OF_OP: /* CondRefOf (SourceObject, Result) */ - /* * This op is a little strange because the internal return value is * different than the return value stored in the result descriptor @@ -485,14 +472,14 @@ AcpiExOpcode_1A_1T_1R ( default: + /* No other opcodes get here */ + break; } break; - case AML_STORE_OP: /* Store (Source, Target) */ - /* * A store operand is typically a number, string, buffer or lvalue * Be careful about deleting the source object, @@ -519,7 +506,6 @@ AcpiExOpcode_1A_1T_1R ( } return_ACPI_STATUS (Status); - /* * ACPI 2.0 Opcodes */ @@ -529,7 +515,6 @@ AcpiExOpcode_1A_1T_1R ( WalkState); break; - case AML_TO_DECSTRING_OP: /* ToDecimalString (Data, Result) */ Status = AcpiExConvertToString (Operand[0], &ReturnDesc, @@ -541,7 +526,6 @@ AcpiExOpcode_1A_1T_1R ( } break; - case AML_TO_HEXSTRING_OP: /* ToHexString (Data, Result) */ Status = AcpiExConvertToString (Operand[0], &ReturnDesc, @@ -553,7 +537,6 @@ AcpiExOpcode_1A_1T_1R ( } break; - case AML_TO_BUFFER_OP: /* ToBuffer (Data, Result) */ Status = AcpiExConvertToBuffer (Operand[0], &ReturnDesc); @@ -564,7 +547,6 @@ AcpiExOpcode_1A_1T_1R ( } break; - case AML_TO_INTEGER_OP: /* ToInteger (Data, Result) */ Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc, @@ -576,7 +558,6 @@ AcpiExOpcode_1A_1T_1R ( } break; - case AML_SHIFT_LEFT_BIT_OP: /* ShiftLeftBit (Source, BitNum) */ case AML_SHIFT_RIGHT_BIT_OP: /* ShiftRightBit (Source, BitNum) */ @@ -588,7 +569,6 @@ AcpiExOpcode_1A_1T_1R ( Status = AE_SUPPORT; goto Cleanup; - default: /* Unknown opcode */ ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", @@ -676,10 +656,8 @@ AcpiExOpcode_1A_0T_1R ( } break; - case AML_DECREMENT_OP: /* Decrement (Operand) */ case AML_INCREMENT_OP: /* Increment (Operand) */ - /* * Create a new integer. Can't just get the base integer and * increment it because it may be an Arg or Field. @@ -744,9 +722,7 @@ AcpiExOpcode_1A_0T_1R ( Status = AcpiExStore (ReturnDesc, Operand[0], WalkState); break; - case AML_TYPE_OP: /* ObjectType (SourceObject) */ - /* * Note: The operand is not resolved at this point because we want to * get the associated object, not its value. For example, we don't @@ -772,9 +748,7 @@ AcpiExOpcode_1A_0T_1R ( } break; - case AML_SIZE_OF_OP: /* SizeOf (SourceObject) */ - /* * Note: The operand is not resolved at this point because we want to * get the associated object, not its value. @@ -801,10 +775,12 @@ AcpiExOpcode_1A_0T_1R ( switch (Type) { case ACPI_TYPE_INTEGER: + Value = AcpiGbl_IntegerByteWidth; break; case ACPI_TYPE_STRING: + Value = TempDesc->String.Length; break; @@ -825,6 +801,7 @@ AcpiExOpcode_1A_0T_1R ( break; default: + ACPI_ERROR ((AE_INFO, "Operand must be Buffer/Integer/String/Package - found type %s", AcpiUtGetTypeName (Type))); @@ -932,9 +909,11 @@ AcpiExOpcode_1A_0T_1R ( break; case ACPI_TYPE_STRING: + break; default: + Status = AE_AML_OPERAND_TYPE; goto Cleanup; } @@ -993,7 +972,6 @@ AcpiExOpcode_1A_0T_1R ( switch (Operand[0]->Reference.Class) { case ACPI_REFCLASS_INDEX: - /* * The target type for the Index operator must be * either a Buffer or a Package @@ -1025,9 +1003,7 @@ AcpiExOpcode_1A_0T_1R ( } break; - case ACPI_TYPE_PACKAGE: - /* * Return the referenced element of the package. We must * add another reference to the referenced object, however. @@ -1039,7 +1015,6 @@ AcpiExOpcode_1A_0T_1R ( } break; - default: ACPI_ERROR ((AE_INFO, @@ -1050,7 +1025,6 @@ AcpiExOpcode_1A_0T_1R ( } break; - case ACPI_REFCLASS_REFOF: ReturnDesc = Operand[0]->Reference.Object; @@ -1067,8 +1041,8 @@ AcpiExOpcode_1A_0T_1R ( AcpiUtAddReference (ReturnDesc); break; - default: + ACPI_ERROR ((AE_INFO, "Unknown class in reference(%p) - 0x%2.2X", Operand[0], Operand[0]->Reference.Class)); @@ -1079,7 +1053,6 @@ AcpiExOpcode_1A_0T_1R ( } break; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", diff --git a/source/components/executer/exoparg2.c b/source/components/executer/exoparg2.c index 6151fa8..ff1d8bb 100644 --- a/source/components/executer/exoparg2.c +++ b/source/components/executer/exoparg2.c @@ -144,7 +144,6 @@ AcpiExOpcode_2A_0T_0R ( Status = AcpiEvQueueNotifyRequest (Node, Value); break; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", @@ -217,7 +216,6 @@ AcpiExOpcode_2A_2T_1R ( } break; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", @@ -331,16 +329,13 @@ AcpiExOpcode_2A_1T_1R ( &ReturnDesc->Integer.Value); break; - case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */ Status = AcpiExDoConcatenate (Operand[0], Operand[1], &ReturnDesc, WalkState); break; - case AML_TO_STRING_OP: /* ToString (Buffer, Length, Result) (ACPI 2.0) */ - /* * Input object is guaranteed to be a buffer at this point (it may have * been converted.) Copy the raw buffer data to a new object of @@ -380,7 +375,6 @@ AcpiExOpcode_2A_1T_1R ( Operand[0]->Buffer.Pointer, Length); break; - case AML_CONCAT_RES_OP: /* ConcatenateResTemplate (Buffer, Buffer, Result) (ACPI 2.0) */ @@ -389,7 +383,6 @@ AcpiExOpcode_2A_1T_1R ( &ReturnDesc, WalkState); break; - case AML_INDEX_OP: /* Index (Source Index Result) */ /* Create the internal return object */ @@ -479,7 +472,6 @@ AcpiExOpcode_2A_1T_1R ( WalkState->ResultObj = ReturnDesc; goto Cleanup; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", @@ -602,7 +594,6 @@ AcpiExOpcode_2A_0T_1R ( } break; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", diff --git a/source/components/executer/exoparg3.c b/source/components/executer/exoparg3.c index a7d4431..b850485 100644 --- a/source/components/executer/exoparg3.c +++ b/source/components/executer/exoparg3.c @@ -129,7 +129,6 @@ AcpiExOpcode_3A_0T_0R ( ACPI_FREE (Fatal); break; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", @@ -176,7 +175,6 @@ AcpiExOpcode_3A_1T_1R ( switch (WalkState->Opcode) { case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */ - /* * Create the return object. The Source operand is guaranteed to be * either a String or a Buffer, so just use its type. @@ -268,7 +266,6 @@ AcpiExOpcode_3A_1T_1R ( ReturnDesc->Buffer.Flags |= AOPOBJ_DATA_VALID; break; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", diff --git a/source/components/executer/exoparg6.c b/source/components/executer/exoparg6.c index 6b04784..974d4c8 100644 --- a/source/components/executer/exoparg6.c +++ b/source/components/executer/exoparg6.c @@ -130,7 +130,6 @@ AcpiExDoMatch ( break; case MATCH_MEQ: - /* * True if equal: (P[i] == M) * Change to: (M == P[i]) @@ -144,7 +143,6 @@ AcpiExDoMatch ( break; case MATCH_MLE: - /* * True if less than or equal: (P[i] <= M) (P[i] NotGreater than M) * Change to: (M >= P[i]) (M NotLess than P[i]) @@ -159,7 +157,6 @@ AcpiExDoMatch ( break; case MATCH_MLT: - /* * True if less than: (P[i] < M) * Change to: (M > P[i]) @@ -173,7 +170,6 @@ AcpiExDoMatch ( break; case MATCH_MGE: - /* * True if greater than or equal: (P[i] >= M) (P[i] NotLess than M) * Change to: (M <= P[i]) (M NotGreater than P[i]) @@ -188,7 +184,6 @@ AcpiExDoMatch ( break; case MATCH_MGT: - /* * True if greater than: (P[i] > M) * Change to: (M < P[i]) @@ -328,13 +323,11 @@ AcpiExOpcode_6A_0T_1R ( } break; - case AML_LOAD_TABLE_OP: Status = AcpiExLoadTableOp (WalkState, &ReturnDesc); break; - default: ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X", diff --git a/source/components/executer/exprep.c b/source/components/executer/exprep.c index 90687a5..c629224 100644 --- a/source/components/executer/exprep.c +++ b/source/components/executer/exprep.c @@ -267,26 +267,31 @@ AcpiExDecodeFieldAccess ( case AML_FIELD_ACCESS_BYTE: case AML_FIELD_ACCESS_BUFFER: /* ACPI 2.0 (SMBus Buffer) */ + ByteAlignment = 1; BitLength = 8; break; case AML_FIELD_ACCESS_WORD: + ByteAlignment = 2; BitLength = 16; break; case AML_FIELD_ACCESS_DWORD: + ByteAlignment = 4; BitLength = 32; break; case AML_FIELD_ACCESS_QWORD: /* ACPI 2.0 */ + ByteAlignment = 8; BitLength = 64; break; default: + /* Invalid field access type */ ACPI_ERROR ((AE_INFO, @@ -536,7 +541,6 @@ AcpiExPrepFieldValue ( ObjDesc->Field.AccessByteWidth, ObjDesc->Field.RegionObj)); break; - case ACPI_TYPE_LOCAL_BANK_FIELD: ObjDesc->BankField.Value = Info->BankValue; @@ -571,7 +575,6 @@ AcpiExPrepFieldValue ( break; - case ACPI_TYPE_LOCAL_INDEX_FIELD: /* Get the Index and Data registers */ @@ -625,7 +628,9 @@ AcpiExPrepFieldValue ( break; default: + /* No other types should get here */ + break; } diff --git a/source/components/executer/exregion.c b/source/components/executer/exregion.c index 1092a42..304cfe6 100644 --- a/source/components/executer/exregion.c +++ b/source/components/executer/exregion.c @@ -99,22 +99,27 @@ AcpiExSystemMemorySpaceHandler ( switch (BitWidth) { case 8: + Length = 1; break; case 16: + Length = 2; break; case 32: + Length = 4; break; case 64: + Length = 8; break; default: + ACPI_ERROR ((AE_INFO, "Invalid SystemMemory width %u", BitWidth)); return_ACPI_STATUS (AE_AML_OPERAND_VALUE); @@ -231,23 +236,29 @@ AcpiExSystemMemorySpaceHandler ( switch (BitWidth) { case 8: + *Value = (UINT64) ACPI_GET8 (LogicalAddrPtr); break; case 16: + *Value = (UINT64) ACPI_GET16 (LogicalAddrPtr); break; case 32: + *Value = (UINT64) ACPI_GET32 (LogicalAddrPtr); break; case 64: + *Value = (UINT64) ACPI_GET64 (LogicalAddrPtr); break; default: + /* BitWidth was already validated */ + break; } break; @@ -257,28 +268,35 @@ AcpiExSystemMemorySpaceHandler ( switch (BitWidth) { case 8: + ACPI_SET8 (LogicalAddrPtr, *Value); break; case 16: + ACPI_SET16 (LogicalAddrPtr, *Value); break; case 32: + ACPI_SET32 (LogicalAddrPtr, *Value); break; case 64: + ACPI_SET64 (LogicalAddrPtr, *Value); break; default: + /* BitWidth was already validated */ + break; } break; default: + Status = AE_BAD_PARAMETER; break; } @@ -343,6 +361,7 @@ AcpiExSystemIoSpaceHandler ( break; default: + Status = AE_BAD_PARAMETER; break; } diff --git a/source/components/executer/exresnte.c b/source/components/executer/exresnte.c index fae97db..c26cbb9 100644 --- a/source/components/executer/exresnte.c +++ b/source/components/executer/exresnte.c @@ -164,7 +164,6 @@ AcpiExResolveNodeToValue ( } break; - case ACPI_TYPE_BUFFER: if (SourceDesc->Common.Type != ACPI_TYPE_BUFFER) @@ -184,7 +183,6 @@ AcpiExResolveNodeToValue ( } break; - case ACPI_TYPE_STRING: if (SourceDesc->Common.Type != ACPI_TYPE_STRING) @@ -200,7 +198,6 @@ AcpiExResolveNodeToValue ( AcpiUtAddReference (ObjDesc); break; - case ACPI_TYPE_INTEGER: if (SourceDesc->Common.Type != ACPI_TYPE_INTEGER) @@ -216,7 +213,6 @@ AcpiExResolveNodeToValue ( AcpiUtAddReference (ObjDesc); break; - case ACPI_TYPE_BUFFER_FIELD: case ACPI_TYPE_LOCAL_REGION_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD: @@ -252,7 +248,6 @@ AcpiExResolveNodeToValue ( return_ACPI_STATUS (AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */ - case ACPI_TYPE_LOCAL_REFERENCE: switch (SourceDesc->Reference.Class) @@ -268,6 +263,7 @@ AcpiExResolveNodeToValue ( break; default: + /* No named references are allowed here */ ACPI_ERROR ((AE_INFO, @@ -278,7 +274,6 @@ AcpiExResolveNodeToValue ( } break; - default: /* Default case is for unknown types */ diff --git a/source/components/executer/exresolv.c b/source/components/executer/exresolv.c index e68ea05..e99d46c 100644 --- a/source/components/executer/exresolv.c +++ b/source/components/executer/exresolv.c @@ -176,7 +176,6 @@ AcpiExResolveObjectToValue ( { case ACPI_REFCLASS_LOCAL: case ACPI_REFCLASS_ARG: - /* * Get the local from the method's state info * Note: this increments the local's object reference count @@ -199,7 +198,6 @@ AcpiExResolveObjectToValue ( *StackPtr = ObjDesc; break; - case ACPI_REFCLASS_INDEX: switch (StackDesc->Reference.TargetType) @@ -209,7 +207,6 @@ AcpiExResolveObjectToValue ( /* Just return - do not dereference */ break; - case ACPI_TYPE_PACKAGE: /* If method call or CopyObject - do not dereference */ @@ -247,7 +244,6 @@ AcpiExResolveObjectToValue ( } break; - default: /* Invalid reference object */ @@ -260,7 +256,6 @@ AcpiExResolveObjectToValue ( } break; - case ACPI_REFCLASS_REFOF: case ACPI_REFCLASS_DEBUG: case ACPI_REFCLASS_TABLE: @@ -300,19 +295,16 @@ AcpiExResolveObjectToValue ( } break; - case ACPI_TYPE_BUFFER: Status = AcpiDsGetBufferArguments (StackDesc); break; - case ACPI_TYPE_PACKAGE: Status = AcpiDsGetPackageArguments (StackDesc); break; - case ACPI_TYPE_BUFFER_FIELD: case ACPI_TYPE_LOCAL_REGION_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD: @@ -330,6 +322,7 @@ AcpiExResolveObjectToValue ( break; default: + break; } @@ -374,10 +367,12 @@ AcpiExResolveMultiple ( switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc)) { case ACPI_DESC_TYPE_OPERAND: + Type = ObjDesc->Common.Type; break; case ACPI_DESC_TYPE_NAMED: + Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type; ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc); @@ -454,7 +449,6 @@ AcpiExResolveMultiple ( } break; - case ACPI_REFCLASS_INDEX: /* Get the type of this reference (index into another object) */ @@ -482,13 +476,11 @@ AcpiExResolveMultiple ( } break; - case ACPI_REFCLASS_TABLE: Type = ACPI_TYPE_DDB_HANDLE; goto Exit; - case ACPI_REFCLASS_LOCAL: case ACPI_REFCLASS_ARG: @@ -520,7 +512,6 @@ AcpiExResolveMultiple ( } break; - case ACPI_REFCLASS_DEBUG: /* The Debug Object is of type "DebugObject" */ @@ -528,7 +519,6 @@ AcpiExResolveMultiple ( Type = ACPI_TYPE_DEBUG_OBJECT; goto Exit; - default: ACPI_ERROR ((AE_INFO, @@ -564,7 +554,9 @@ Exit: break; default: + /* No change to Type required */ + break; } diff --git a/source/components/executer/exresop.c b/source/components/executer/exresop.c index 96410b2..59602ba 100644 --- a/source/components/executer/exresop.c +++ b/source/components/executer/exresop.c @@ -224,7 +224,6 @@ AcpiExResolveOperands ( } break; - case ACPI_DESC_TYPE_OPERAND: /* ACPI internal object */ @@ -277,7 +276,6 @@ AcpiExResolveOperands ( } break; - default: /* Invalid descriptor */ @@ -324,7 +322,6 @@ AcpiExResolveOperands ( case ARGI_TARGETREF: /* Allows implicit conversion rules before store */ case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */ case ARGI_SIMPLE_TARGET: /* Name, Local, or Arg - no implicit conversion */ - /* * Need an operand of type ACPI_TYPE_LOCAL_REFERENCE * A Namespace Node is OK as-is @@ -342,9 +339,7 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_DATAREFOBJ: /* Store operator only */ - /* * We don't want to resolve IndexOp reference objects during * a store because this would be an implicit DeRefOf operation. @@ -360,7 +355,9 @@ AcpiExResolveOperands ( break; default: + /* All cases covered above */ + break; } @@ -453,9 +450,7 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_BUFFER: - /* * Need an operand of type ACPI_TYPE_BUFFER, * But we can implicitly convert from a STRING or INTEGER @@ -482,9 +477,7 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_STRING: - /* * Need an operand of type ACPI_TYPE_STRING, * But we can implicitly convert from a BUFFER or INTEGER @@ -512,7 +505,6 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_COMPUTEDATA: /* Need an operand of type INTEGER, STRING or BUFFER */ @@ -535,7 +527,6 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_BUFFER_OR_STRING: /* Need an operand of type STRING or BUFFER */ @@ -573,7 +564,6 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_DATAOBJECT: /* * ARGI_DATAOBJECT is only used by the SizeOf operator. @@ -593,6 +583,7 @@ AcpiExResolveOperands ( break; default: + ACPI_ERROR ((AE_INFO, "Needed [Buffer/String/Package/Reference], found [%s] %p", AcpiUtGetObjectTypeName (ObjDesc), ObjDesc)); @@ -601,7 +592,6 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_COMPLEXOBJ: /* Need a buffer or package or (ACPI 2.0) String */ @@ -616,6 +606,7 @@ AcpiExResolveOperands ( break; default: + ACPI_ERROR ((AE_INFO, "Needed [Buffer/String/Package], found [%s] %p", AcpiUtGetObjectTypeName (ObjDesc), ObjDesc)); @@ -624,7 +615,6 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_REGION_OR_BUFFER: /* Used by Load() only */ /* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */ @@ -638,6 +628,7 @@ AcpiExResolveOperands ( break; default: + ACPI_ERROR ((AE_INFO, "Needed [Region/Buffer], found [%s] %p", AcpiUtGetObjectTypeName (ObjDesc), ObjDesc)); @@ -646,7 +637,6 @@ AcpiExResolveOperands ( } goto NextOperand; - case ARGI_DATAREFOBJ: /* Used by the Store() operator only */ @@ -694,7 +684,6 @@ AcpiExResolveOperands ( } goto NextOperand; - default: /* Unknown type */ diff --git a/source/components/executer/exstore.c b/source/components/executer/exstore.c index 98c3eca..2ec392e 100644 --- a/source/components/executer/exstore.c +++ b/source/components/executer/exstore.c @@ -124,6 +124,7 @@ AcpiExStore ( switch (DestDesc->Common.Type) { case ACPI_TYPE_LOCAL_REFERENCE: + break; case ACPI_TYPE_INTEGER: @@ -167,7 +168,6 @@ AcpiExStore ( WalkState, ACPI_IMPLICIT_CONVERSION); break; - case ACPI_REFCLASS_INDEX: /* Storing to an Index (pointer into a packager or buffer) */ @@ -175,7 +175,6 @@ AcpiExStore ( Status = AcpiExStoreObjectToIndex (SourceDesc, RefDesc, WalkState); break; - case ACPI_REFCLASS_LOCAL: case ACPI_REFCLASS_ARG: @@ -185,9 +184,7 @@ AcpiExStore ( RefDesc->Reference.Value, SourceDesc, WalkState); break; - case ACPI_REFCLASS_DEBUG: - /* * Storing to the Debug object causes the value stored to be * displayed and otherwise has no effect -- see ACPI Specification @@ -199,7 +196,6 @@ AcpiExStore ( ACPI_DEBUG_OBJECT (SourceDesc, 0, 0); break; - default: ACPI_ERROR ((AE_INFO, "Unknown Reference Class 0x%2.2X", @@ -308,9 +304,7 @@ AcpiExStoreObjectToIndex ( break; - case ACPI_TYPE_BUFFER_FIELD: - /* * Store into a Buffer or String (not actually a real BufferField) * at a location defined by an Index. @@ -368,7 +362,6 @@ AcpiExStoreObjectToIndex ( ObjDesc->Buffer.Pointer[IndexDesc->Reference.Value] = Value; break; - default: ACPI_ERROR ((AE_INFO, "Target is not a Package or BufferField")); @@ -473,11 +466,9 @@ AcpiExStoreObjectToNode ( &WalkState->ResultObj); break; - case ACPI_TYPE_INTEGER: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - /* * These target types are all of type Integer/String/Buffer, and * therefore support implicit conversion before the store. @@ -511,7 +502,6 @@ AcpiExStoreObjectToNode ( } break; - default: ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, diff --git a/source/components/executer/exstoren.c b/source/components/executer/exstoren.c index ae36296..a21d8b9 100644 --- a/source/components/executer/exstoren.c +++ b/source/components/executer/exstoren.c @@ -94,11 +94,9 @@ AcpiExResolveObject ( * These cases all require only Integers or values that * can be converted to Integers (Strings or Buffers) */ - case ACPI_TYPE_INTEGER: case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - /* * Stores into a Field/Region or into a Integer/Buffer/String * are all essentially the same. This case handles the @@ -140,10 +138,8 @@ AcpiExResolveObject ( } break; - case ACPI_TYPE_LOCAL_ALIAS: case ACPI_TYPE_LOCAL_METHOD_ALIAS: - /* * All aliases should have been resolved earlier, during the * operand resolution phase. @@ -152,10 +148,8 @@ AcpiExResolveObject ( Status = AE_AML_INTERNAL; break; - case ACPI_TYPE_PACKAGE: default: - /* * All other types than Alias and the various Fields come here, * including the untyped case - ACPI_TYPE_ANY. diff --git a/source/components/hardware/hwacpi.c b/source/components/hardware/hwacpi.c index d4d5b55..deb2dfb 100644 --- a/source/components/hardware/hwacpi.c +++ b/source/components/hardware/hwacpi.c @@ -120,7 +120,6 @@ AcpiHwSetMode ( break; case ACPI_SYS_MODE_LEGACY: - /* * BIOS should clear all fixed status bits and restore fixed event * enable bits to default @@ -132,6 +131,7 @@ AcpiHwSetMode ( break; default: + return_ACPI_STATUS (AE_BAD_PARAMETER); } diff --git a/source/components/hardware/hwgpe.c b/source/components/hardware/hwgpe.c index efeba2b..4f123bc 100644 --- a/source/components/hardware/hwgpe.c +++ b/source/components/hardware/hwgpe.c @@ -142,14 +142,17 @@ AcpiHwLowSetGpe ( /*lint -fallthrough */ case ACPI_GPE_ENABLE: + ACPI_SET_BIT (EnableMask, RegisterBit); break; case ACPI_GPE_DISABLE: + ACPI_CLEAR_BIT (EnableMask, RegisterBit); break; default: + ACPI_ERROR ((AE_INFO, "Invalid GPE Action, %u", Action)); return (AE_BAD_PARAMETER); } diff --git a/source/components/hardware/hwregs.c b/source/components/hardware/hwregs.c index ca2f48b..88f8b4e 100644 --- a/source/components/hardware/hwregs.c +++ b/source/components/hardware/hwregs.c @@ -430,7 +430,6 @@ AcpiHwRegisterRead ( &AcpiGbl_XPm1bStatus); break; - case ACPI_REGISTER_PM1_ENABLE: /* PM1 A/B: 16-bit access each */ Status = AcpiHwReadMultiple (&Value, @@ -438,7 +437,6 @@ AcpiHwRegisterRead ( &AcpiGbl_XPm1bEnable); break; - case ACPI_REGISTER_PM1_CONTROL: /* PM1 A/B: 16-bit access each */ Status = AcpiHwReadMultiple (&Value, @@ -453,26 +451,23 @@ AcpiHwRegisterRead ( Value &= ~ACPI_PM1_CONTROL_WRITEONLY_BITS; break; - case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPm2ControlBlock); break; - case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ Status = AcpiHwRead (&Value, &AcpiGbl_FADT.XPmTimerBlock); break; - case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ Status = AcpiHwReadPort (AcpiGbl_FADT.SmiCommand, &Value, 8); break; - default: + ACPI_ERROR ((AE_INFO, "Unknown Register ID: 0x%X", RegisterId)); Status = AE_BAD_PARAMETER; @@ -546,7 +541,6 @@ AcpiHwRegisterWrite ( &AcpiGbl_XPm1bStatus); break; - case ACPI_REGISTER_PM1_ENABLE: /* PM1 A/B: 16-bit access each */ Status = AcpiHwWriteMultiple (Value, @@ -554,9 +548,7 @@ AcpiHwRegisterWrite ( &AcpiGbl_XPm1bEnable); break; - case ACPI_REGISTER_PM1_CONTROL: /* PM1 A/B: 16-bit access each */ - /* * Perform a read first to preserve certain bits (per ACPI spec) * Note: This includes SCI_EN, we never want to change this bit @@ -580,9 +572,7 @@ AcpiHwRegisterWrite ( &AcpiGbl_FADT.XPm1bControlBlock); break; - case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ - /* * For control registers, all reserved bits must be preserved, * as per the ACPI spec. @@ -600,13 +590,11 @@ AcpiHwRegisterWrite ( Status = AcpiHwWrite (Value, &AcpiGbl_FADT.XPm2ControlBlock); break; - case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ Status = AcpiHwWrite (Value, &AcpiGbl_FADT.XPmTimerBlock); break; - case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ /* SMI_CMD is currently always in IO space */ @@ -614,8 +602,8 @@ AcpiHwRegisterWrite ( Status = AcpiHwWritePort (AcpiGbl_FADT.SmiCommand, Value, 8); break; - default: + ACPI_ERROR ((AE_INFO, "Unknown Register ID: 0x%X", RegisterId)); Status = AE_BAD_PARAMETER; diff --git a/source/components/hardware/hwxface.c b/source/components/hardware/hwxface.c index 9d02640..25ad60a 100644 --- a/source/components/hardware/hwxface.c +++ b/source/components/hardware/hwxface.c @@ -556,7 +556,8 @@ AcpiGetSleepTypeData ( * Evaluate the \_Sx namespace object containing the register values * for this state */ - Info->Pathname = ACPI_CAST_PTR (char, AcpiGbl_SleepStateNames[SleepState]); + Info->RelativePathname = ACPI_CAST_PTR ( + char, AcpiGbl_SleepStateNames[SleepState]); Status = AcpiNsEvaluate (Info); if (ACPI_FAILURE (Status)) { @@ -568,7 +569,7 @@ AcpiGetSleepTypeData ( if (!Info->ReturnObject) { ACPI_ERROR ((AE_INFO, "No Sleep State object returned from [%s]", - Info->Pathname)); + Info->RelativePathname)); Status = AE_AML_NO_RETURN_VALUE; goto Cleanup; } @@ -591,10 +592,12 @@ AcpiGetSleepTypeData ( switch (Info->ReturnObject->Package.Count) { case 0: + Status = AE_AML_PACKAGE_LIMIT; break; case 1: + if (Elements[0]->Common.Type != ACPI_TYPE_INTEGER) { Status = AE_AML_OPERAND_TYPE; @@ -609,6 +612,7 @@ AcpiGetSleepTypeData ( case 2: default: + if ((Elements[0]->Common.Type != ACPI_TYPE_INTEGER) || (Elements[1]->Common.Type != ACPI_TYPE_INTEGER)) { @@ -630,7 +634,7 @@ Cleanup: if (ACPI_FAILURE (Status)) { ACPI_EXCEPTION ((AE_INFO, Status, - "While evaluating Sleep State [%s]", Info->Pathname)); + "While evaluating Sleep State [%s]", Info->RelativePathname)); } ACPI_FREE (Info); diff --git a/source/components/hardware/hwxfsleep.c b/source/components/hardware/hwxfsleep.c index 42f0543..8259f01 100644 --- a/source/components/hardware/hwxfsleep.c +++ b/source/components/hardware/hwxfsleep.c @@ -267,13 +267,14 @@ AcpiHwSleepDispatch ( #if (!ACPI_REDUCED_HARDWARE) - /* * If the Hardware Reduced flag is set (from the FADT), we must - * use the extended sleep registers + * use the extended sleep registers (FADT). Note: As per the ACPI + * specification, these extended registers are to be used for HW-reduced + * platforms only. They are not general-purpose replacements for the + * legacy PM register sleep support. */ - if (AcpiGbl_ReducedHardware || - AcpiGbl_FADT.SleepControl.Address) + if (AcpiGbl_ReducedHardware) { Status = SleepFunctions->ExtendedFunction (SleepState); } @@ -351,20 +352,24 @@ AcpiEnterSleepStatePrep ( switch (SleepState) { case ACPI_STATE_S0: + SstValue = ACPI_SST_WORKING; break; case ACPI_STATE_S1: case ACPI_STATE_S2: case ACPI_STATE_S3: + SstValue = ACPI_SST_SLEEPING; break; case ACPI_STATE_S4: + SstValue = ACPI_SST_SLEEP_CONTEXT; break; default: + SstValue = ACPI_SST_INDICATOR_OFF; /* Default is off */ break; } diff --git a/source/components/namespace/nsaccess.c b/source/components/namespace/nsaccess.c index 609256b..ad94f6c 100644 --- a/source/components/namespace/nsaccess.c +++ b/source/components/namespace/nsaccess.c @@ -167,6 +167,7 @@ AcpiNsRootInitialize ( switch (InitVal->Type) { case ACPI_TYPE_METHOD: + ObjDesc->Method.ParamCount = (UINT8) ACPI_TO_INTEGER (Val); ObjDesc->Common.Flags |= AOPOBJ_DATA_VALID; @@ -188,7 +189,6 @@ AcpiNsRootInitialize ( ObjDesc->Integer.Value = ACPI_TO_INTEGER (Val); break; - case ACPI_TYPE_STRING: /* Build an object around the static string */ @@ -198,7 +198,6 @@ AcpiNsRootInitialize ( ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER; break; - case ACPI_TYPE_MUTEX: ObjDesc->Mutex.Node = NewNode; @@ -231,7 +230,6 @@ AcpiNsRootInitialize ( } break; - default: ACPI_ERROR ((AE_INFO, "Unsupported initial type value 0x%X", diff --git a/source/components/namespace/nsarguments.c b/source/components/namespace/nsarguments.c new file mode 100644 index 0000000..912813c --- /dev/null +++ b/source/components/namespace/nsarguments.c @@ -0,0 +1,303 @@ +/****************************************************************************** + * + * Module Name: nsarguments - Validation of args for ACPI predefined methods + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#include "acpi.h" +#include "accommon.h" +#include "acnamesp.h" +#include "acpredef.h" + + +#define _COMPONENT ACPI_NAMESPACE + ACPI_MODULE_NAME ("nsarguments") + + +/******************************************************************************* + * + * FUNCTION: AcpiNsCheckArgumentTypes + * + * PARAMETERS: Info - Method execution information block + * + * RETURN: None + * + * DESCRIPTION: Check the incoming argument count and all argument types + * against the argument type list for a predefined name. + * + ******************************************************************************/ + +void +AcpiNsCheckArgumentTypes ( + ACPI_EVALUATE_INFO *Info) +{ + UINT16 ArgTypeList; + UINT8 ArgCount; + UINT8 ArgType; + UINT8 UserArgType; + UINT32 i; + + + /* If not a predefined name, cannot typecheck args */ + + if (!Info->Predefined) + { + return; + } + + ArgTypeList = Info->Predefined->Info.ArgumentList; + ArgCount = METHOD_GET_ARG_COUNT (ArgTypeList); + + /* Typecheck all arguments */ + + for (i = 0; ((i < ArgCount) && (i < Info->ParamCount)); i++) + { + ArgType = METHOD_GET_NEXT_TYPE (ArgTypeList); + UserArgType = Info->Parameters[i]->Common.Type; + + if (UserArgType != ArgType) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_ALWAYS, + "Argument #%u type mismatch - " + "Found [%s], ACPI requires [%s]", (i + 1), + AcpiUtGetTypeName (UserArgType), + AcpiUtGetTypeName (ArgType))); + } + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsCheckAcpiCompliance + * + * PARAMETERS: Pathname - Full pathname to the node (for error msgs) + * Node - Namespace node for the method/object + * Predefined - Pointer to entry in predefined name table + * + * RETURN: None + * + * DESCRIPTION: Check that the declared parameter count (in ASL/AML) for a + * predefined name is what is expected (matches what is defined in + * the ACPI specification for this predefined name.) + * + ******************************************************************************/ + +void +AcpiNsCheckAcpiCompliance ( + char *Pathname, + ACPI_NAMESPACE_NODE *Node, + const ACPI_PREDEFINED_INFO *Predefined) +{ + UINT32 AmlParamCount; + UINT32 RequiredParamCount; + + + if (!Predefined) + { + return; + } + + /* Get the ACPI-required arg count from the predefined info table */ + + RequiredParamCount = METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList); + + /* + * If this object is not a control method, we can check if the ACPI + * spec requires that it be a method. + */ + if (Node->Type != ACPI_TYPE_METHOD) + { + if (RequiredParamCount > 0) + { + /* Object requires args, must be implemented as a method */ + + ACPI_BIOS_ERROR_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Object (%s) must be a control method with %u arguments", + AcpiUtGetTypeName (Node->Type), RequiredParamCount)); + } + else if (!RequiredParamCount && !Predefined->Info.ExpectedBtypes) + { + /* Object requires no args and no return value, must be a method */ + + ACPI_BIOS_ERROR_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Object (%s) must be a control method " + "with no arguments and no return value", + AcpiUtGetTypeName (Node->Type))); + } + + return; + } + + /* + * This is a control method. + * Check that the ASL/AML-defined parameter count for this method + * matches the ACPI-required parameter count + * + * Some methods are allowed to have a "minimum" number of args (_SCP) + * because their definition in ACPI has changed over time. + * + * Note: These are BIOS errors in the declaration of the object + */ + AmlParamCount = Node->Object->Method.ParamCount; + + if (AmlParamCount < RequiredParamCount) + { + ACPI_BIOS_ERROR_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Insufficient arguments - " + "ASL declared %u, ACPI requires %u", + AmlParamCount, RequiredParamCount)); + } + else if ((AmlParamCount > RequiredParamCount) && + !(Predefined->Info.ArgumentList & ARG_COUNT_IS_MINIMUM)) + { + ACPI_BIOS_ERROR_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Excess arguments - " + "ASL declared %u, ACPI requires %u", + AmlParamCount, RequiredParamCount)); + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiNsCheckArgumentCount + * + * PARAMETERS: Pathname - Full pathname to the node (for error msgs) + * Node - Namespace node for the method/object + * UserParamCount - Number of args passed in by the caller + * Predefined - Pointer to entry in predefined name table + * + * RETURN: None + * + * DESCRIPTION: Check that incoming argument count matches the declared + * parameter count (in the ASL/AML) for an object. + * + ******************************************************************************/ + +void +AcpiNsCheckArgumentCount ( + char *Pathname, + ACPI_NAMESPACE_NODE *Node, + UINT32 UserParamCount, + const ACPI_PREDEFINED_INFO *Predefined) +{ + UINT32 AmlParamCount; + UINT32 RequiredParamCount; + + + if (!Predefined) + { + /* + * Not a predefined name. Check the incoming user argument count + * against the count that is specified in the method/object. + */ + if (Node->Type != ACPI_TYPE_METHOD) + { + if (UserParamCount) + { + ACPI_INFO_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "%u arguments were passed to a non-method ACPI object (%s)", + UserParamCount, AcpiUtGetTypeName (Node->Type))); + } + + return; + } + + /* + * This is a control method. Check the parameter count. + * We can only check the incoming argument count against the + * argument count declared for the method in the ASL/AML. + * + * Emit a message if too few or too many arguments have been passed + * by the caller. + * + * Note: Too many arguments will not cause the method to + * fail. However, the method will fail if there are too few + * arguments and the method attempts to use one of the missing ones. + */ + AmlParamCount = Node->Object->Method.ParamCount; + + if (UserParamCount < AmlParamCount) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Insufficient arguments - " + "Caller passed %u, method requires %u", + UserParamCount, AmlParamCount)); + } + else if (UserParamCount > AmlParamCount) + { + ACPI_INFO_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Excess arguments - " + "Caller passed %u, method requires %u", + UserParamCount, AmlParamCount)); + } + + return; + } + + /* + * This is a predefined name. Validate the user-supplied parameter + * count against the ACPI specification. We don't validate against + * the method itself because what is important here is that the + * caller is in conformance with the spec. (The arg count for the + * method was checked against the ACPI spec earlier.) + * + * Some methods are allowed to have a "minimum" number of args (_SCP) + * because their definition in ACPI has changed over time. + */ + RequiredParamCount = METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList); + + if (UserParamCount < RequiredParamCount) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Insufficient arguments - " + "Caller passed %u, ACPI requires %u", + UserParamCount, RequiredParamCount)); + } + else if ((UserParamCount > RequiredParamCount) && + !(Predefined->Info.ArgumentList & ARG_COUNT_IS_MINIMUM)) + { + ACPI_INFO_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Excess arguments - " + "Caller passed %u, ACPI requires %u", + UserParamCount, RequiredParamCount)); + } +} diff --git a/source/components/namespace/nsconvert.c b/source/components/namespace/nsconvert.c index e3ff375..11aca36 100644 --- a/source/components/namespace/nsconvert.c +++ b/source/components/namespace/nsconvert.c @@ -111,6 +111,7 @@ AcpiNsConvertToInteger ( break; default: + return (AE_AML_OPERAND_TYPE); } @@ -208,6 +209,7 @@ AcpiNsConvertToString ( break; default: + return (AE_AML_OPERAND_TYPE); } @@ -317,6 +319,7 @@ AcpiNsConvertToBuffer ( break; default: + return (AE_AML_OPERAND_TYPE); } diff --git a/source/components/namespace/nsdump.c b/source/components/namespace/nsdump.c index ac7b679..be780f2 100644 --- a/source/components/namespace/nsdump.c +++ b/source/components/namespace/nsdump.c @@ -282,10 +282,12 @@ AcpiNsDumpOneObject ( case ACPI_TYPE_BUFFER: case ACPI_TYPE_STRING: case ACPI_TYPE_METHOD: + AcpiOsPrintf (""); break; default: + break; } @@ -302,13 +304,11 @@ AcpiNsDumpOneObject ( ACPI_CAST_PTR (void, ObjDesc->Processor.Address)); break; - case ACPI_TYPE_DEVICE: AcpiOsPrintf ("Notify Object: %p\n", ObjDesc); break; - case ACPI_TYPE_METHOD: AcpiOsPrintf ("Args %X Len %.4X Aml %p\n", @@ -316,14 +316,12 @@ AcpiNsDumpOneObject ( ObjDesc->Method.AmlLength, ObjDesc->Method.AmlStart); break; - case ACPI_TYPE_INTEGER: AcpiOsPrintf ("= %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value)); break; - case ACPI_TYPE_PACKAGE: if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) @@ -337,7 +335,6 @@ AcpiNsDumpOneObject ( } break; - case ACPI_TYPE_BUFFER: if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID) @@ -363,7 +360,6 @@ AcpiNsDumpOneObject ( } break; - case ACPI_TYPE_STRING: AcpiOsPrintf ("Len %.2X ", ObjDesc->String.Length); @@ -371,7 +367,6 @@ AcpiNsDumpOneObject ( AcpiOsPrintf ("\n"); break; - case ACPI_TYPE_REGION: AcpiOsPrintf ("[%s]", @@ -388,13 +383,11 @@ AcpiNsDumpOneObject ( } break; - case ACPI_TYPE_LOCAL_REFERENCE: AcpiOsPrintf ("[%s]\n", AcpiUtGetReferenceName (ObjDesc)); break; - case ACPI_TYPE_BUFFER_FIELD: if (ObjDesc->BufferField.BufferObj && @@ -406,7 +399,6 @@ AcpiNsDumpOneObject ( } break; - case ACPI_TYPE_LOCAL_REGION_FIELD: AcpiOsPrintf ("Rgn [%4.4s]", @@ -414,7 +406,6 @@ AcpiNsDumpOneObject ( ObjDesc->CommonField.RegionObj->Region.Node)); break; - case ACPI_TYPE_LOCAL_BANK_FIELD: AcpiOsPrintf ("Rgn [%4.4s] Bnk [%4.4s]", @@ -424,7 +415,6 @@ AcpiNsDumpOneObject ( ObjDesc->BankField.BankObj->CommonField.Node)); break; - case ACPI_TYPE_LOCAL_INDEX_FIELD: AcpiOsPrintf ("Idx [%4.4s] Dat [%4.4s]", @@ -434,7 +424,6 @@ AcpiNsDumpOneObject ( ObjDesc->IndexField.DataObj->CommonField.Node)); break; - case ACPI_TYPE_LOCAL_ALIAS: case ACPI_TYPE_LOCAL_METHOD_ALIAS: @@ -465,11 +454,11 @@ AcpiNsDumpOneObject ( break; default: + break; } break; - case ACPI_DISPLAY_OBJECTS: AcpiOsPrintf ("O:%p", ObjDesc); @@ -518,7 +507,6 @@ AcpiNsDumpOneObject ( } break; - default: AcpiOsPrintf ("\n"); break; @@ -605,30 +593,37 @@ AcpiNsDumpOneObject ( goto Cleanup; case ACPI_TYPE_BUFFER_FIELD: + ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->BufferField.BufferObj; break; case ACPI_TYPE_PACKAGE: + ObjDesc = (void *) ObjDesc->Package.Elements; break; case ACPI_TYPE_METHOD: + ObjDesc = (void *) ObjDesc->Method.AmlStart; break; case ACPI_TYPE_LOCAL_REGION_FIELD: + ObjDesc = (void *) ObjDesc->Field.RegionObj; break; case ACPI_TYPE_LOCAL_BANK_FIELD: + ObjDesc = (void *) ObjDesc->BankField.RegionObj; break; case ACPI_TYPE_LOCAL_INDEX_FIELD: + ObjDesc = (void *) ObjDesc->IndexField.IndexObj; break; default: + goto Cleanup; } diff --git a/source/components/namespace/nseval.c b/source/components/namespace/nseval.c index 1de341c..c92e6e7 100644 --- a/source/components/namespace/nseval.c +++ b/source/components/namespace/nseval.c @@ -67,7 +67,7 @@ AcpiNsExecModuleCode ( * * PARAMETERS: Info - Evaluation info block, contains: * PrefixNode - Prefix or Method/Object Node to execute - * Pathname - Name of method to execute, If NULL, the + * RelativePath - Name of method to execute, If NULL, the * Node is the object to execute * Parameters - List of parameters to pass to the method, * terminated by NULL. Params itself may be @@ -93,7 +93,6 @@ AcpiNsEvaluate ( ACPI_EVALUATE_INFO *Info) { ACPI_STATUS Status; - ACPI_NAMESPACE_NODE *Node; ACPI_FUNCTION_TRACE (NsEvaluate); @@ -104,23 +103,18 @@ AcpiNsEvaluate ( return_ACPI_STATUS (AE_BAD_PARAMETER); } - /* Initialize the return value to an invalid object */ - - Info->ReturnObject = NULL; - Info->ParamCount = 0; - - if (!Info->ResolvedNode) + if (!Info->Node) { /* - * Get the actual namespace node for the target object if we need to. - * Handles these cases: + * Get the actual namespace node for the target object if we + * need to. Handles these cases: * - * 1) Null node, Pathname (absolute path) - * 2) Node, Pathname (path relative to Node) - * 3) Node, Null Pathname + * 1) Null node, valid pathname from root (absolute path) + * 2) Node and valid pathname (path relative to Node) + * 3) Node, Null pathname */ - Status = AcpiNsGetNode (Info->PrefixNode, Info->Pathname, - ACPI_NS_NO_UPSEARCH, &Info->ResolvedNode); + Status = AcpiNsGetNode (Info->PrefixNode, Info->RelativePathname, + ACPI_NS_NO_UPSEARCH, &Info->Node); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -128,60 +122,122 @@ AcpiNsEvaluate ( } /* - * For a method alias, we must grab the actual method node so that proper - * scoping context will be established before execution. + * For a method alias, we must grab the actual method node so that + * proper scoping context will be established before execution. */ - if (AcpiNsGetType (Info->ResolvedNode) == ACPI_TYPE_LOCAL_METHOD_ALIAS) + if (AcpiNsGetType (Info->Node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) + { + Info->Node = ACPI_CAST_PTR ( + ACPI_NAMESPACE_NODE, Info->Node->Object); + } + + /* Complete the info block initialization */ + + Info->ReturnObject = NULL; + Info->NodeFlags = Info->Node->Flags; + Info->ObjDesc = AcpiNsGetAttachedObject (Info->Node); + + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n", + Info->RelativePathname, Info->Node, + AcpiNsGetAttachedObject (Info->Node))); + + /* Get info if we have a predefined name (_HID, etc.) */ + + Info->Predefined = AcpiUtMatchPredefinedMethod (Info->Node->Name.Ascii); + + /* Get the full pathname to the object, for use in warning messages */ + + Info->FullPathname = AcpiNsGetExternalPathname (Info->Node); + if (!Info->FullPathname) { - Info->ResolvedNode = - ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Info->ResolvedNode->Object); + return_ACPI_STATUS (AE_NO_MEMORY); } - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n", Info->Pathname, - Info->ResolvedNode, AcpiNsGetAttachedObject (Info->ResolvedNode))); + /* Count the number of arguments being passed in */ - Node = Info->ResolvedNode; + Info->ParamCount = 0; + if (Info->Parameters) + { + while (Info->Parameters[Info->ParamCount]) + { + Info->ParamCount++; + } + + /* Warn on impossible argument count */ + + if (Info->ParamCount > ACPI_METHOD_NUM_ARGS) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_ALWAYS, + "Excess arguments (%u) - using only %u", + Info->ParamCount, ACPI_METHOD_NUM_ARGS)); + + Info->ParamCount = ACPI_METHOD_NUM_ARGS; + } + } /* - * Two major cases here: + * For predefined names: Check that the declared argument count + * matches the ACPI spec -- otherwise this is a BIOS error. + */ + AcpiNsCheckAcpiCompliance (Info->FullPathname, Info->Node, + Info->Predefined); + + /* + * For all names: Check that the incoming argument count for + * this method/object matches the actual ASL/AML definition. + */ + AcpiNsCheckArgumentCount (Info->FullPathname, Info->Node, + Info->ParamCount, Info->Predefined); + + /* For predefined names: Typecheck all incoming arguments */ + + AcpiNsCheckArgumentTypes (Info); + + /* + * Three major evaluation cases: * - * 1) The object is a control method -- execute it - * 2) The object is not a method -- just return it's current value + * 1) Object types that cannot be evaluated by definition + * 2) The object is a control method -- execute it + * 3) The object is not a method -- just return it's current value */ - if (AcpiNsGetType (Info->ResolvedNode) == ACPI_TYPE_METHOD) + switch (AcpiNsGetType (Info->Node)) { + case ACPI_TYPE_DEVICE: + case ACPI_TYPE_EVENT: + case ACPI_TYPE_MUTEX: + case ACPI_TYPE_REGION: + case ACPI_TYPE_THERMAL: + case ACPI_TYPE_LOCAL_SCOPE: /* - * 1) Object is a control method - execute it + * 1) Disallow evaluation of certain object types. For these, + * object evaluation is undefined and not supported. */ + ACPI_ERROR ((AE_INFO, + "%s: Evaluation of object type [%s] is not supported", + Info->FullPathname, + AcpiUtGetTypeName (Info->Node->Type))); - /* Verify that there is a method object associated with this node */ + Status = AE_TYPE; + goto Cleanup; - Info->ObjDesc = AcpiNsGetAttachedObject (Info->ResolvedNode); - if (!Info->ObjDesc) - { - ACPI_ERROR ((AE_INFO, "Control method has no attached sub-object")); - return_ACPI_STATUS (AE_NULL_OBJECT); - } + case ACPI_TYPE_METHOD: + /* + * 2) Object is a control method - execute it + */ - /* Count the number of arguments being passed to the method */ + /* Verify that there is a method object associated with this node */ - if (Info->Parameters) + if (!Info->ObjDesc) { - while (Info->Parameters[Info->ParamCount]) - { - if (Info->ParamCount > ACPI_METHOD_MAX_ARG) - { - return_ACPI_STATUS (AE_LIMIT); - } - Info->ParamCount++; - } + ACPI_ERROR ((AE_INFO, "%s: Method has no attached sub-object", + Info->FullPathname)); + Status = AE_NULL_OBJECT; + goto Cleanup; } - ACPI_DUMP_PATHNAME (Info->ResolvedNode, "ACPI: Execute Method", - ACPI_LV_INFO, _COMPONENT); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Method at AML address %p Length %X\n", + "**** Execute method [%s] at AML address %p length %X\n", + Info->FullPathname, Info->ObjDesc->Method.AmlStart + 1, Info->ObjDesc->Method.AmlLength - 1)); @@ -196,80 +252,58 @@ AcpiNsEvaluate ( AcpiExEnterInterpreter (); Status = AcpiPsExecuteMethod (Info); AcpiExExitInterpreter (); - } - else - { + break; + + default: /* - * 2) Object is not a method, return its current value - * - * Disallow certain object types. For these, "evaluation" is undefined. + * 3) All other non-method objects -- get the current object value */ - switch (Info->ResolvedNode->Type) - { - case ACPI_TYPE_DEVICE: - case ACPI_TYPE_EVENT: - case ACPI_TYPE_MUTEX: - case ACPI_TYPE_REGION: - case ACPI_TYPE_THERMAL: - case ACPI_TYPE_LOCAL_SCOPE: - - ACPI_ERROR ((AE_INFO, - "[%4.4s] Evaluation of object type [%s] is not supported", - Info->ResolvedNode->Name.Ascii, - AcpiUtGetTypeName (Info->ResolvedNode->Type))); - - return_ACPI_STATUS (AE_TYPE); - - default: - break; - } /* - * Objects require additional resolution steps (e.g., the Node may be - * a field that must be read, etc.) -- we can't just grab the object - * out of the node. + * Some objects require additional resolution steps (e.g., the Node + * may be a field that must be read, etc.) -- we can't just grab + * the object out of the node. * * Use ResolveNodeToValue() to get the associated value. * * NOTE: we can get away with passing in NULL for a walk state because - * ResolvedNode is guaranteed to not be a reference to either a method + * the Node is guaranteed to not be a reference to either a method * local or a method argument (because this interface is never called * from a running method.) * * Even though we do not directly invoke the interpreter for object - * resolution, we must lock it because we could access an opregion. - * The opregion access code assumes that the interpreter is locked. + * resolution, we must lock it because we could access an OpRegion. + * The OpRegion access code assumes that the interpreter is locked. */ AcpiExEnterInterpreter (); - /* Function has a strange interface */ + /* TBD: ResolveNodeToValue has a strange interface, fix */ + + Info->ReturnObject = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Info->Node); - Status = AcpiExResolveNodeToValue (&Info->ResolvedNode, NULL); + Status = AcpiExResolveNodeToValue (ACPI_CAST_INDIRECT_PTR ( + ACPI_NAMESPACE_NODE, &Info->ReturnObject), NULL); AcpiExExitInterpreter (); - /* - * If AcpiExResolveNodeToValue() succeeded, the return value was placed - * in ResolvedNode. - */ - if (ACPI_SUCCESS (Status)) + if (ACPI_FAILURE (Status)) { - Status = AE_CTRL_RETURN_VALUE; - Info->ReturnObject = - ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Info->ResolvedNode); - - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Returning object %p [%s]\n", - Info->ReturnObject, - AcpiUtGetObjectTypeName (Info->ReturnObject))); + goto Cleanup; } + + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Returned object %p [%s]\n", + Info->ReturnObject, + AcpiUtGetObjectTypeName (Info->ReturnObject))); + + Status = AE_CTRL_RETURN_VALUE; /* Always has a "return value" */ + break; } /* - * Check input argument count against the ASL-defined count for a method. - * Also check predefined names: argument count and return value against - * the ACPI specification. Some incorrect return value types are repaired. + * For predefined names, check the return value against the ACPI + * specification. Some incorrect return value types are repaired. */ - (void) AcpiNsCheckPredefinedNames (Node, Info->ParamCount, - Status, &Info->ReturnObject); + (void) AcpiNsCheckReturnValue (Info->Node, Info, Info->ParamCount, + Status, &Info->ReturnObject); /* Check if there is a return value that must be dealt with */ @@ -289,12 +323,16 @@ AcpiNsEvaluate ( } ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "*** Completed evaluation of object %s ***\n", Info->Pathname)); + "*** Completed evaluation of object %s ***\n", + Info->RelativePathname)); +Cleanup: /* * Namespace was unlocked by the handling AcpiNs* function, so we - * just return + * just free the pathname and return */ + ACPI_FREE (Info->FullPathname); + Info->FullPathname = NULL; return_ACPI_STATUS (Status); } diff --git a/source/components/namespace/nsinit.c b/source/components/namespace/nsinit.c index 2fcee18..05d78c1 100644 --- a/source/components/namespace/nsinit.c +++ b/source/components/namespace/nsinit.c @@ -198,7 +198,7 @@ AcpiNsInitializeDevices ( * part of the ACPI specification. */ Info.EvaluateInfo->PrefixNode = AcpiGbl_RootNode; - Info.EvaluateInfo->Pathname = METHOD_NAME__INI; + Info.EvaluateInfo->RelativePathname = METHOD_NAME__INI; Info.EvaluateInfo->Parameters = NULL; Info.EvaluateInfo->Flags = ACPI_IGNORE_RETURN_VALUE; @@ -296,28 +296,34 @@ AcpiNsInitOneObject ( switch (Type) { case ACPI_TYPE_REGION: + Info->OpRegionCount++; break; case ACPI_TYPE_BUFFER_FIELD: + Info->FieldCount++; break; case ACPI_TYPE_LOCAL_BANK_FIELD: + Info->FieldCount++; break; case ACPI_TYPE_BUFFER: + Info->BufferCount++; break; case ACPI_TYPE_PACKAGE: + Info->PackageCount++; break; default: /* No init required, just exit now */ + return (AE_OK); } @@ -369,7 +375,9 @@ AcpiNsInitOneObject ( break; default: + /* No other types can get here */ + break; } @@ -456,6 +464,7 @@ AcpiNsFindIniMethods ( break; default: + break; } @@ -609,8 +618,9 @@ AcpiNsInitOneDevice ( ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname ( ACPI_TYPE_METHOD, DeviceNode, METHOD_NAME__INI)); + ACPI_MEMSET (Info, 0, sizeof (ACPI_EVALUATE_INFO)); Info->PrefixNode = DeviceNode; - Info->Pathname = METHOD_NAME__INI; + Info->RelativePathname = METHOD_NAME__INI; Info->Parameters = NULL; Info->Flags = ACPI_IGNORE_RETURN_VALUE; @@ -625,7 +635,7 @@ AcpiNsInitOneDevice ( { /* Ignore error and move on to next device */ - char *ScopeName = AcpiNsGetExternalPathname (Info->ResolvedNode); + char *ScopeName = AcpiNsGetExternalPathname (Info->Node); ACPI_EXCEPTION ((AE_INFO, Status, "during %s._INI execution", ScopeName)); diff --git a/source/components/namespace/nspredef.c b/source/components/namespace/nspredef.c index a9250e3..7122e7a 100644 --- a/source/components/namespace/nspredef.c +++ b/source/components/namespace/nspredef.c @@ -63,12 +63,12 @@ * There are several areas that are validated: * * 1) The number of input arguments as defined by the method/object in the - * ASL is validated against the ACPI specification. + * ASL is validated against the ACPI specification. * 2) The type of the return object (if any) is validated against the ACPI - * specification. + * specification. * 3) For returned package objects, the count of package elements is - * validated, as well as the type of each package element. Nested - * packages are supported. + * validated, as well as the type of each package element. Nested + * packages are supported. * * For any problems found, a warning message is issued. * @@ -79,7 +79,7 @@ static ACPI_STATUS AcpiNsCheckReference ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *ReturnObject); static UINT32 @@ -89,9 +89,10 @@ AcpiNsGetBitmappedType ( /******************************************************************************* * - * FUNCTION: AcpiNsCheckPredefinedNames + * FUNCTION: AcpiNsCheckReturnValue * * PARAMETERS: Node - Namespace node for the method/object + * Info - Method execution information block * UserParamCount - Number of parameters actually passed * ReturnStatus - Status from the object evaluation * ReturnObjectPtr - Pointer to the object returned from the @@ -99,56 +100,38 @@ AcpiNsGetBitmappedType ( * * RETURN: Status * - * DESCRIPTION: Check an ACPI name for a match in the predefined name list. + * DESCRIPTION: Check the value returned from a predefined name. * ******************************************************************************/ ACPI_STATUS -AcpiNsCheckPredefinedNames ( +AcpiNsCheckReturnValue ( ACPI_NAMESPACE_NODE *Node, + ACPI_EVALUATE_INFO *Info, UINT32 UserParamCount, ACPI_STATUS ReturnStatus, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { - ACPI_STATUS Status = AE_OK; + ACPI_STATUS Status; const ACPI_PREDEFINED_INFO *Predefined; - char *Pathname; - ACPI_PREDEFINED_DATA *Data; - - - /* Match the name for this method/object against the predefined list */ - Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); - - /* Get the full pathname to the object, for use in warning messages */ - - Pathname = AcpiNsGetExternalPathname (Node); - if (!Pathname) - { - return (AE_OK); /* Could not get pathname, ignore */ - } - - /* - * Check that the parameter count for this method matches the ASL - * definition. For predefined names, ensure that both the caller and - * the method itself are in accordance with the ACPI specification. - */ - AcpiNsCheckParameterCount (Pathname, Node, UserParamCount, Predefined); /* If not a predefined name, we cannot validate the return object */ + Predefined = Info->Predefined; if (!Predefined) { - goto Cleanup; + return (AE_OK); } /* * If the method failed or did not actually return an object, we cannot * validate the return object */ - if ((ReturnStatus != AE_OK) && (ReturnStatus != AE_CTRL_RETURN_VALUE)) + if ((ReturnStatus != AE_OK) && + (ReturnStatus != AE_CTRL_RETURN_VALUE)) { - goto Cleanup; + return (AE_OK); } /* @@ -168,27 +151,15 @@ AcpiNsCheckPredefinedNames ( (!Predefined->Info.ExpectedBtypes) || (Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL)) { - goto Cleanup; - } - - /* Create the parameter data block for object validation */ - - Data = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_PREDEFINED_DATA)); - if (!Data) - { - goto Cleanup; + return (AE_OK); } - Data->Predefined = Predefined; - Data->Node = Node; - Data->NodeFlags = Node->Flags; - Data->Pathname = Pathname; /* * Check that the type of the main return object is what is expected * for this predefined name */ - Status = AcpiNsCheckObjectType (Data, ReturnObjectPtr, - Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); + Status = AcpiNsCheckObjectType (Info, ReturnObjectPtr, + Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); if (ACPI_FAILURE (Status)) { goto Exit; @@ -200,11 +171,17 @@ AcpiNsCheckPredefinedNames ( */ if ((*ReturnObjectPtr)->Common.Type == ACPI_TYPE_PACKAGE) { - Data->ParentPackage = *ReturnObjectPtr; - Status = AcpiNsCheckPackage (Data, ReturnObjectPtr); + Info->ParentPackage = *ReturnObjectPtr; + Status = AcpiNsCheckPackage (Info, ReturnObjectPtr); if (ACPI_FAILURE (Status)) { - goto Exit; + /* We might be able to fix some errors */ + + if ((Status != AE_AML_OPERAND_TYPE) && + (Status != AE_AML_OPERAND_VALUE)) + { + goto Exit; + } } } @@ -216,7 +193,7 @@ AcpiNsCheckPredefinedNames ( * performed on a per-name basis, i.e., the code is specific to * particular predefined names. */ - Status = AcpiNsComplexRepairs (Data, Node, Status, ReturnObjectPtr); + Status = AcpiNsComplexRepairs (Info, Node, Status, ReturnObjectPtr); Exit: /* @@ -224,119 +201,21 @@ Exit: * or more objects, mark the parent node to suppress further warning * messages during the next evaluation of the same method/object. */ - if (ACPI_FAILURE (Status) || (Data->Flags & ACPI_OBJECT_REPAIRED)) + if (ACPI_FAILURE (Status) || + (Info->ReturnFlags & ACPI_OBJECT_REPAIRED)) { Node->Flags |= ANOBJ_EVALUATED; } - ACPI_FREE (Data); -Cleanup: - ACPI_FREE (Pathname); return (Status); } /******************************************************************************* * - * FUNCTION: AcpiNsCheckParameterCount - * - * PARAMETERS: Pathname - Full pathname to the node (for error msgs) - * Node - Namespace node for the method/object - * UserParamCount - Number of args passed in by the caller - * Predefined - Pointer to entry in predefined name table - * - * RETURN: None - * - * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a - * predefined name is what is expected (i.e., what is defined in - * the ACPI specification for this predefined name.) - * - ******************************************************************************/ - -void -AcpiNsCheckParameterCount ( - char *Pathname, - ACPI_NAMESPACE_NODE *Node, - UINT32 UserParamCount, - const ACPI_PREDEFINED_INFO *Predefined) -{ - UINT32 ParamCount; - UINT32 RequiredParamsCurrent; - UINT32 RequiredParamsOld; - - - /* Methods have 0-7 parameters. All other types have zero. */ - - ParamCount = 0; - if (Node->Type == ACPI_TYPE_METHOD) - { - ParamCount = Node->Object->Method.ParamCount; - } - - if (!Predefined) - { - /* - * Check the parameter count for non-predefined methods/objects. - * - * Warning if too few or too many arguments have been passed by the - * caller. An incorrect number of arguments may not cause the method - * to fail. However, the method will fail if there are too few - * arguments and the method attempts to use one of the missing ones. - */ - if (UserParamCount < ParamCount) - { - ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, - "Insufficient arguments - needs %u, found %u", - ParamCount, UserParamCount)); - } - else if (UserParamCount > ParamCount) - { - ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, - "Excess arguments - needs %u, found %u", - ParamCount, UserParamCount)); - } - return; - } - - /* - * Validate the user-supplied parameter count. - * Allow two different legal argument counts (_SCP, etc.) - */ - RequiredParamsCurrent = Predefined->Info.ArgumentList & METHOD_ARG_MASK; - RequiredParamsOld = Predefined->Info.ArgumentList >> METHOD_ARG_BIT_WIDTH; - - if (UserParamCount != ACPI_UINT32_MAX) - { - if ((UserParamCount != RequiredParamsCurrent) && - (UserParamCount != RequiredParamsOld)) - { - ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, - "Parameter count mismatch - " - "caller passed %u, ACPI requires %u", - UserParamCount, RequiredParamsCurrent)); - } - } - - /* - * Check that the ASL-defined parameter count is what is expected for - * this predefined name (parameter count as defined by the ACPI - * specification) - */ - if ((ParamCount != RequiredParamsCurrent) && - (ParamCount != RequiredParamsOld)) - { - ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, Node->Flags, - "Parameter count mismatch - ASL declared %u, ACPI requires %u", - ParamCount, RequiredParamsCurrent)); - } -} - - -/******************************************************************************* - * * FUNCTION: AcpiNsCheckObjectType * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * ExpectedBtypes - Bitmap of expected return type(s) @@ -353,7 +232,7 @@ AcpiNsCheckParameterCount ( ACPI_STATUS AcpiNsCheckObjectType ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr, UINT32 ExpectedBtypes, UINT32 PackageIndex) @@ -368,7 +247,7 @@ AcpiNsCheckObjectType ( if (ReturnObject && ACPI_GET_DESCRIPTOR_TYPE (ReturnObject) == ACPI_DESC_TYPE_NAMED) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Invalid return type - Found a Namespace node [%4.4s] type %s", ReturnObject->Node.Name.Ascii, AcpiUtGetTypeName (ReturnObject->Node.Type))); @@ -383,8 +262,8 @@ AcpiNsCheckObjectType ( * from all of the predefined names (including elements of returned * packages) */ - Data->ReturnBtype = AcpiNsGetBitmappedType (ReturnObject); - if (Data->ReturnBtype == ACPI_RTYPE_ANY) + Info->ReturnBtype = AcpiNsGetBitmappedType (ReturnObject); + if (Info->ReturnBtype == ACPI_RTYPE_ANY) { /* Not one of the supported objects, must be incorrect */ goto TypeErrorExit; @@ -392,17 +271,20 @@ AcpiNsCheckObjectType ( /* For reference objects, check that the reference type is correct */ - if ((Data->ReturnBtype & ExpectedBtypes) == ACPI_RTYPE_REFERENCE) + if ((Info->ReturnBtype & ExpectedBtypes) == ACPI_RTYPE_REFERENCE) { - Status = AcpiNsCheckReference (Data, ReturnObject); + Status = AcpiNsCheckReference (Info, ReturnObject); return (Status); } /* Attempt simple repair of the returned object if necessary */ - Status = AcpiNsSimpleRepair (Data, ExpectedBtypes, - PackageIndex, ReturnObjectPtr); - return (Status); + Status = AcpiNsSimpleRepair (Info, ExpectedBtypes, + PackageIndex, ReturnObjectPtr); + if (ACPI_SUCCESS (Status)) + { + return (AE_OK); /* Successful repair */ + } TypeErrorExit: @@ -413,13 +295,13 @@ TypeErrorExit: if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Return type mismatch - found %s, expected %s", AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer)); } else { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Return Package type mismatch at index %u - " "found %s, expected %s", PackageIndex, AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer)); @@ -433,7 +315,7 @@ TypeErrorExit: * * FUNCTION: AcpiNsCheckReference * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObject - Object returned from the evaluation of a * method or object * @@ -447,7 +329,7 @@ TypeErrorExit: static ACPI_STATUS AcpiNsCheckReference ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *ReturnObject) { @@ -461,7 +343,7 @@ AcpiNsCheckReference ( return (AE_OK); } - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Return type mismatch - unexpected reference object type [%s] %2.2X", AcpiUtGetReferenceName (ReturnObject), ReturnObject->Reference.Class)); @@ -501,26 +383,32 @@ AcpiNsGetBitmappedType ( switch (ReturnObject->Common.Type) { case ACPI_TYPE_INTEGER: + ReturnBtype = ACPI_RTYPE_INTEGER; break; case ACPI_TYPE_BUFFER: + ReturnBtype = ACPI_RTYPE_BUFFER; break; case ACPI_TYPE_STRING: + ReturnBtype = ACPI_RTYPE_STRING; break; case ACPI_TYPE_PACKAGE: + ReturnBtype = ACPI_RTYPE_PACKAGE; break; case ACPI_TYPE_LOCAL_REFERENCE: + ReturnBtype = ACPI_RTYPE_REFERENCE; break; default: + /* Not one of the supported objects, must be incorrect */ ReturnBtype = ACPI_RTYPE_ANY; diff --git a/source/components/namespace/nsprepkg.c b/source/components/namespace/nsprepkg.c index d18205c..6d74d57 100644 --- a/source/components/namespace/nsprepkg.c +++ b/source/components/namespace/nsprepkg.c @@ -55,14 +55,14 @@ static ACPI_STATUS AcpiNsCheckPackageList ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, const ACPI_PREDEFINED_INFO *Package, ACPI_OPERAND_OBJECT **Elements, UINT32 Count); static ACPI_STATUS AcpiNsCheckPackageElements ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **Elements, UINT8 Type1, UINT32 Count1, @@ -75,7 +75,7 @@ AcpiNsCheckPackageElements ( * * FUNCTION: AcpiNsCheckPackage * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * @@ -88,7 +88,7 @@ AcpiNsCheckPackageElements ( ACPI_STATUS AcpiNsCheckPackage ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; @@ -105,17 +105,18 @@ AcpiNsCheckPackage ( /* The package info for this name is in the next table entry */ - Package = Data->Predefined + 1; + Package = Info->Predefined + 1; ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s Validating return Package of Type %X, Count %X\n", - Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count)); + Info->FullPathname, Package->RetInfo.Type, + ReturnObject->Package.Count)); /* * For variable-length Packages, we can safely remove all embedded * and trailing NULL package elements */ - AcpiNsRemoveNullElements (Data, Package->RetInfo.Type, ReturnObject); + AcpiNsRemoveNullElements (Info, Package->RetInfo.Type, ReturnObject); /* Extract package count and elements array */ @@ -133,7 +134,7 @@ AcpiNsCheckPackage ( return (AE_OK); } - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Return Package has no elements (empty)")); return (AE_AML_OPERAND_VALUE); @@ -148,7 +149,6 @@ AcpiNsCheckPackage ( switch (Package->RetInfo.Type) { case ACPI_PTYPE1_FIXED: - /* * The package count is fixed and there are no sub-packages * @@ -165,26 +165,24 @@ AcpiNsCheckPackage ( ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Return Package is larger than needed - " "found %u, expected %u\n", - Data->Pathname, Count, ExpectedCount)); + Info->FullPathname, Count, ExpectedCount)); } /* Validate all elements of the returned package */ - Status = AcpiNsCheckPackageElements (Data, Elements, + Status = AcpiNsCheckPackageElements (Info, Elements, Package->RetInfo.ObjectType1, Package->RetInfo.Count1, Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0); break; - case ACPI_PTYPE1_VAR: - /* * The package count is variable, there are no sub-packages, and all * elements must be of the same type */ for (i = 0; i < Count; i++) { - Status = AcpiNsCheckObjectType (Data, Elements, + Status = AcpiNsCheckObjectType (Info, Elements, Package->RetInfo.ObjectType1, i); if (ACPI_FAILURE (Status)) { @@ -194,9 +192,7 @@ AcpiNsCheckPackage ( } break; - case ACPI_PTYPE1_OPTION: - /* * The package count is variable, there are no sub-packages. There are * a fixed number of required elements, and a variable number of @@ -218,7 +214,7 @@ AcpiNsCheckPackage ( { /* These are the required package elements (0, 1, or 2) */ - Status = AcpiNsCheckObjectType (Data, Elements, + Status = AcpiNsCheckObjectType (Info, Elements, Package->RetInfo3.ObjectType[i], i); if (ACPI_FAILURE (Status)) { @@ -229,7 +225,7 @@ AcpiNsCheckPackage ( { /* These are the optional package elements */ - Status = AcpiNsCheckObjectType (Data, Elements, + Status = AcpiNsCheckObjectType (Info, Elements, Package->RetInfo3.TailObjectType, i); if (ACPI_FAILURE (Status)) { @@ -240,12 +236,11 @@ AcpiNsCheckPackage ( } break; - case ACPI_PTYPE2_REV_FIXED: /* First element is the (Integer) revision */ - Status = AcpiNsCheckObjectType (Data, Elements, + Status = AcpiNsCheckObjectType (Info, Elements, ACPI_RTYPE_INTEGER, 0); if (ACPI_FAILURE (Status)) { @@ -257,15 +252,14 @@ AcpiNsCheckPackage ( /* Examine the sub-packages */ - Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); + Status = AcpiNsCheckPackageList (Info, Package, Elements, Count); break; - case ACPI_PTYPE2_PKG_COUNT: /* First element is the (Integer) count of sub-packages to follow */ - Status = AcpiNsCheckObjectType (Data, Elements, + Status = AcpiNsCheckObjectType (Info, Elements, ACPI_RTYPE_INTEGER, 0); if (ACPI_FAILURE (Status)) { @@ -287,16 +281,14 @@ AcpiNsCheckPackage ( /* Examine the sub-packages */ - Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); + Status = AcpiNsCheckPackageList (Info, Package, Elements, Count); break; - case ACPI_PTYPE2: case ACPI_PTYPE2_FIXED: case ACPI_PTYPE2_MIN: case ACPI_PTYPE2_COUNT: case ACPI_PTYPE2_FIX_VAR: - /* * These types all return a single Package that consists of a * variable number of sub-Packages. @@ -311,7 +303,7 @@ AcpiNsCheckPackage ( { /* Create the new outer package and populate it */ - Status = AcpiNsWrapWithPackage (Data, ReturnObject, ReturnObjectPtr); + Status = AcpiNsWrapWithPackage (Info, ReturnObject, ReturnObjectPtr); if (ACPI_FAILURE (Status)) { return (Status); @@ -326,15 +318,14 @@ AcpiNsCheckPackage ( /* Examine the sub-packages */ - Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); + Status = AcpiNsCheckPackageList (Info, Package, Elements, Count); break; - default: /* Should not get here if predefined info table is correct */ - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Invalid internal return type in table entry: %X", Package->RetInfo.Type)); @@ -348,7 +339,7 @@ PackageTooSmall: /* Error exit for the case with an incorrect package count */ - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Return Package is too small - found %u elements, expected %u", Count, ExpectedCount)); @@ -360,7 +351,7 @@ PackageTooSmall: * * FUNCTION: AcpiNsCheckPackageList * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * Package - Pointer to package-specific info for method * Elements - Element list of parent package. All elements * of this list should be of type Package. @@ -374,7 +365,7 @@ PackageTooSmall: static ACPI_STATUS AcpiNsCheckPackageList ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, const ACPI_PREDEFINED_INFO *Package, ACPI_OPERAND_OBJECT **Elements, UINT32 Count) @@ -398,11 +389,11 @@ AcpiNsCheckPackageList ( { SubPackage = *Elements; SubElements = SubPackage->Package.Elements; - Data->ParentPackage = SubPackage; + Info->ParentPackage = SubPackage; /* Each sub-object must be of type Package */ - Status = AcpiNsCheckObjectType (Data, &SubPackage, + Status = AcpiNsCheckObjectType (Info, &SubPackage, ACPI_RTYPE_PACKAGE, i); if (ACPI_FAILURE (Status)) { @@ -411,7 +402,7 @@ AcpiNsCheckPackageList ( /* Examine the different types of expected sub-packages */ - Data->ParentPackage = SubPackage; + Info->ParentPackage = SubPackage; switch (Package->RetInfo.Type) { case ACPI_PTYPE2: @@ -426,7 +417,7 @@ AcpiNsCheckPackageList ( goto PackageTooSmall; } - Status = AcpiNsCheckPackageElements (Data, SubElements, + Status = AcpiNsCheckPackageElements (Info, SubElements, Package->RetInfo.ObjectType1, Package->RetInfo.Count1, Package->RetInfo.ObjectType2, @@ -437,7 +428,6 @@ AcpiNsCheckPackageList ( } break; - case ACPI_PTYPE2_FIX_VAR: /* * Each subpackage has a fixed number of elements and an @@ -449,7 +439,7 @@ AcpiNsCheckPackageList ( goto PackageTooSmall; } - Status = AcpiNsCheckPackageElements (Data, SubElements, + Status = AcpiNsCheckPackageElements (Info, SubElements, Package->RetInfo.ObjectType1, Package->RetInfo.Count1, Package->RetInfo.ObjectType2, @@ -460,7 +450,6 @@ AcpiNsCheckPackageList ( } break; - case ACPI_PTYPE2_FIXED: /* Each sub-package has a fixed length */ @@ -475,7 +464,7 @@ AcpiNsCheckPackageList ( for (j = 0; j < ExpectedCount; j++) { - Status = AcpiNsCheckObjectType (Data, &SubElements[j], + Status = AcpiNsCheckObjectType (Info, &SubElements[j], Package->RetInfo2.ObjectType[j], j); if (ACPI_FAILURE (Status)) { @@ -484,7 +473,6 @@ AcpiNsCheckPackageList ( } break; - case ACPI_PTYPE2_MIN: /* Each sub-package has a variable but minimum length */ @@ -497,7 +485,7 @@ AcpiNsCheckPackageList ( /* Check the type of each sub-package element */ - Status = AcpiNsCheckPackageElements (Data, SubElements, + Status = AcpiNsCheckPackageElements (Info, SubElements, Package->RetInfo.ObjectType1, SubPackage->Package.Count, 0, 0, 0); if (ACPI_FAILURE (Status)) @@ -506,14 +494,12 @@ AcpiNsCheckPackageList ( } break; - case ACPI_PTYPE2_COUNT: - /* * First element is the (Integer) count of elements, including * the count field (the ACPI name is NumElements) */ - Status = AcpiNsCheckObjectType (Data, SubElements, + Status = AcpiNsCheckObjectType (Info, SubElements, ACPI_RTYPE_INTEGER, 0); if (ACPI_FAILURE (Status)) { @@ -548,7 +534,7 @@ AcpiNsCheckPackageList ( /* Check the type of each sub-package element */ - Status = AcpiNsCheckPackageElements (Data, (SubElements + 1), + Status = AcpiNsCheckPackageElements (Info, (SubElements + 1), Package->RetInfo.ObjectType1, (ExpectedCount - 1), 0, 0, 1); if (ACPI_FAILURE (Status)) @@ -557,7 +543,6 @@ AcpiNsCheckPackageList ( } break; - default: /* Should not get here, type was validated by caller */ return (AE_AML_INTERNAL); @@ -573,7 +558,7 @@ PackageTooSmall: /* The sub-package count was smaller than required */ - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Return Sub-Package[%u] is too small - found %u elements, expected %u", i, SubPackage->Package.Count, ExpectedCount)); @@ -585,7 +570,7 @@ PackageTooSmall: * * FUNCTION: AcpiNsCheckPackageElements * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * Elements - Pointer to the package elements array * Type1 - Object type for first group * Count1 - Count for first group @@ -602,7 +587,7 @@ PackageTooSmall: static ACPI_STATUS AcpiNsCheckPackageElements ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **Elements, UINT8 Type1, UINT32 Count1, @@ -622,7 +607,7 @@ AcpiNsCheckPackageElements ( */ for (i = 0; i < Count1; i++) { - Status = AcpiNsCheckObjectType (Data, ThisElement, + Status = AcpiNsCheckObjectType (Info, ThisElement, Type1, i + StartIndex); if (ACPI_FAILURE (Status)) { @@ -633,7 +618,7 @@ AcpiNsCheckPackageElements ( for (i = 0; i < Count2; i++) { - Status = AcpiNsCheckObjectType (Data, ThisElement, + Status = AcpiNsCheckObjectType (Info, ThisElement, Type2, (i + Count1 + StartIndex)); if (ACPI_FAILURE (Status)) { diff --git a/source/components/namespace/nsrepair.c b/source/components/namespace/nsrepair.c index e065028..45b4660 100644 --- a/source/components/namespace/nsrepair.c +++ b/source/components/namespace/nsrepair.c @@ -131,7 +131,7 @@ static const ACPI_SIMPLE_REPAIR_INFO AcpiObjectRepairInfo[] = * * FUNCTION: AcpiNsSimpleRepair * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ExpectedBtypes - Object types expected * PackageIndex - Index of object within parent package (if * applicable - ACPI_NOT_PACKAGE_ELEMENT @@ -148,7 +148,7 @@ static const ACPI_SIMPLE_REPAIR_INFO AcpiObjectRepairInfo[] = ACPI_STATUS AcpiNsSimpleRepair ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, UINT32 ExpectedBtypes, UINT32 PackageIndex, ACPI_OPERAND_OBJECT **ReturnObjectPtr) @@ -166,13 +166,13 @@ AcpiNsSimpleRepair ( * Special repairs for certain names that are in the repair table. * Check if this name is in the list of repairable names. */ - Predefined = AcpiNsMatchSimpleRepair (Data->Node, - Data->ReturnBtype, PackageIndex); + Predefined = AcpiNsMatchSimpleRepair (Info->Node, + Info->ReturnBtype, PackageIndex); if (Predefined) { if (!ReturnObject) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_ALWAYS, "Missing expected return value")); } @@ -195,7 +195,7 @@ AcpiNsSimpleRepair ( * Do not perform simple object repair unless the return type is not * expected. */ - if (Data->ReturnBtype & ExpectedBtypes) + if (Info->ReturnBtype & ExpectedBtypes) { return (AE_OK); } @@ -218,7 +218,7 @@ AcpiNsSimpleRepair ( { if (ExpectedBtypes && (!(ExpectedBtypes & ACPI_RTYPE_NONE))) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, ACPI_WARN_ALWAYS, "Missing expected return value")); return (AE_AML_NO_RETURN_VALUE); @@ -259,7 +259,7 @@ AcpiNsSimpleRepair ( * object. Note: after the wrapping, the package will be validated * for correct contents (expected object type or types). */ - Status = AcpiNsWrapWithPackage (Data, ReturnObject, &NewObject); + Status = AcpiNsWrapWithPackage (Info, ReturnObject, &NewObject); if (ACPI_SUCCESS (Status)) { /* @@ -267,7 +267,7 @@ AcpiNsSimpleRepair ( * incremented for being inserted into the new package. */ *ReturnObjectPtr = NewObject; /* New Package object */ - Data->Flags |= ACPI_OBJECT_REPAIRED; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; return (AE_OK); } } @@ -292,7 +292,7 @@ ObjectRepaired: * package object as part of the repair, we don't need to * change the reference count. */ - if (!(Data->Flags & ACPI_OBJECT_WRAPPED)) + if (!(Info->ReturnFlags & ACPI_OBJECT_WRAPPED)) { NewObject->Common.ReferenceCount = ReturnObject->Common.ReferenceCount; @@ -305,14 +305,14 @@ ObjectRepaired: ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Converted %s to expected %s at Package index %u\n", - Data->Pathname, AcpiUtGetObjectTypeName (ReturnObject), + Info->FullPathname, AcpiUtGetObjectTypeName (ReturnObject), AcpiUtGetObjectTypeName (NewObject), PackageIndex)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Converted %s to expected %s\n", - Data->Pathname, AcpiUtGetObjectTypeName (ReturnObject), + Info->FullPathname, AcpiUtGetObjectTypeName (ReturnObject), AcpiUtGetObjectTypeName (NewObject))); } @@ -320,7 +320,7 @@ ObjectRepaired: AcpiUtRemoveReference (ReturnObject); *ReturnObjectPtr = NewObject; - Data->Flags |= ACPI_OBJECT_REPAIRED; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; return (AE_OK); } @@ -378,7 +378,7 @@ AcpiNsMatchSimpleRepair ( * * FUNCTION: AcpiNsRepairNullElement * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ExpectedBtypes - Object types expected * PackageIndex - Index of object within parent package (if * applicable - ACPI_NOT_PACKAGE_ELEMENT @@ -394,7 +394,7 @@ AcpiNsMatchSimpleRepair ( ACPI_STATUS AcpiNsRepairNullElement ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, UINT32 ExpectedBtypes, UINT32 PackageIndex, ACPI_OPERAND_OBJECT **ReturnObjectPtr) @@ -451,14 +451,14 @@ AcpiNsRepairNullElement ( /* Set the reference count according to the parent Package object */ - NewObject->Common.ReferenceCount = Data->ParentPackage->Common.ReferenceCount; + NewObject->Common.ReferenceCount = Info->ParentPackage->Common.ReferenceCount; ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Converted NULL package element to expected %s at index %u\n", - Data->Pathname, AcpiUtGetObjectTypeName (NewObject), PackageIndex)); + Info->FullPathname, AcpiUtGetObjectTypeName (NewObject), PackageIndex)); *ReturnObjectPtr = NewObject; - Data->Flags |= ACPI_OBJECT_REPAIRED; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; return (AE_OK); } @@ -467,7 +467,7 @@ AcpiNsRepairNullElement ( * * FUNCTION: AcpiNsRemoveNullElements * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * PackageType - An AcpiReturnPackageTypes value * ObjDesc - A Package object * @@ -481,7 +481,7 @@ AcpiNsRepairNullElement ( void AcpiNsRemoveNullElements ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, UINT8 PackageType, ACPI_OPERAND_OBJECT *ObjDesc) { @@ -510,6 +510,7 @@ AcpiNsRemoveNullElements ( case ACPI_PTYPE2_MIN: case ACPI_PTYPE2_REV_FIXED: case ACPI_PTYPE2_FIX_VAR: + break; default: @@ -546,7 +547,7 @@ AcpiNsRemoveNullElements ( { ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Found and removed %u NULL elements\n", - Data->Pathname, (Count - NewCount))); + Info->FullPathname, (Count - NewCount))); /* NULL terminate list and update the package count */ @@ -560,7 +561,7 @@ AcpiNsRemoveNullElements ( * * FUNCTION: AcpiNsWrapWithPackage * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * OriginalObject - Pointer to the object to repair. * ObjDescPtr - The new package object is returned here * @@ -582,7 +583,7 @@ AcpiNsRemoveNullElements ( ACPI_STATUS AcpiNsWrapWithPackage ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *OriginalObject, ACPI_OPERAND_OBJECT **ObjDescPtr) { @@ -606,11 +607,11 @@ AcpiNsWrapWithPackage ( ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Wrapped %s with expected Package object\n", - Data->Pathname, AcpiUtGetObjectTypeName (OriginalObject))); + Info->FullPathname, AcpiUtGetObjectTypeName (OriginalObject))); /* Return the new object in the object pointer */ *ObjDescPtr = PkgObjDesc; - Data->Flags |= ACPI_OBJECT_REPAIRED | ACPI_OBJECT_WRAPPED; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED | ACPI_OBJECT_WRAPPED; return (AE_OK); } diff --git a/source/components/namespace/nsrepair2.c b/source/components/namespace/nsrepair2.c index b81c0dd..0dcfaad 100644 --- a/source/components/namespace/nsrepair2.c +++ b/source/components/namespace/nsrepair2.c @@ -58,7 +58,7 @@ */ typedef ACPI_STATUS (*ACPI_REPAIR_FUNCTION) ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); typedef struct acpi_repair_info @@ -77,43 +77,64 @@ AcpiNsMatchComplexRepair ( static ACPI_STATUS AcpiNsRepair_ALR ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_CID ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +static ACPI_STATUS +AcpiNsRepair_CST ( + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_FDE ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_HID ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, + ACPI_OPERAND_OBJECT **ReturnObjectPtr); + +static ACPI_STATUS +AcpiNsRepair_PRT ( + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_PSS ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsRepair_TSS ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); static ACPI_STATUS AcpiNsCheckSortedList ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *ReturnObject, + UINT32 StartIndex, UINT32 ExpectedCount, UINT32 SortIndex, UINT8 SortDirection, char *SortKeyName); +/* Values for SortDirection above */ + +#define ACPI_SORT_ASCENDING 0 +#define ACPI_SORT_DESCENDING 1 + +static void +AcpiNsRemoveElement ( + ACPI_OPERAND_OBJECT *ObjDesc, + UINT32 Index); + static void AcpiNsSortList ( ACPI_OPERAND_OBJECT **Elements, @@ -121,11 +142,6 @@ AcpiNsSortList ( UINT32 Index, UINT8 SortDirection); -/* Values for SortDirection above */ - -#define ACPI_SORT_ASCENDING 0 -#define ACPI_SORT_DESCENDING 1 - /* * This table contains the names of the predefined methods for which we can @@ -135,9 +151,11 @@ AcpiNsSortList ( * * _ALR: Sort the list ascending by AmbientIlluminance * _CID: Strings: uppercase all, remove any leading asterisk + * _CST: Sort the list ascending by C state type * _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs * _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs * _HID: Strings: uppercase all, remove any leading asterisk + * _PRT: Fix reversed SourceName and SourceIndex * _PSS: Sort the list descending by Power * _TSS: Sort the list descending by Power * @@ -152,9 +170,11 @@ static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] = { {"_ALR", AcpiNsRepair_ALR}, {"_CID", AcpiNsRepair_CID}, + {"_CST", AcpiNsRepair_CST}, {"_FDE", AcpiNsRepair_FDE}, {"_GTM", AcpiNsRepair_FDE}, /* _GTM has same repair as _FDE */ {"_HID", AcpiNsRepair_HID}, + {"_PRT", AcpiNsRepair_PRT}, {"_PSS", AcpiNsRepair_PSS}, {"_TSS", AcpiNsRepair_TSS}, {{0,0,0,0}, NULL} /* Table terminator */ @@ -170,7 +190,7 @@ static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] = * * FUNCTION: AcpiNsComplexRepairs * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * Node - Namespace node for the method/object * ValidateStatus - Original status of earlier validation * ReturnObjectPtr - Pointer to the object returned from the @@ -186,7 +206,7 @@ static const ACPI_REPAIR_INFO AcpiNsRepairableNames[] = ACPI_STATUS AcpiNsComplexRepairs ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_NAMESPACE_NODE *Node, ACPI_STATUS ValidateStatus, ACPI_OPERAND_OBJECT **ReturnObjectPtr) @@ -203,7 +223,7 @@ AcpiNsComplexRepairs ( return (ValidateStatus); } - Status = Predefined->RepairFunction (Data, ReturnObjectPtr); + Status = Predefined->RepairFunction (Info, ReturnObjectPtr); return (Status); } @@ -247,7 +267,7 @@ AcpiNsMatchComplexRepair ( * * FUNCTION: AcpiNsRepair_ALR * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * @@ -260,14 +280,14 @@ AcpiNsMatchComplexRepair ( static ACPI_STATUS AcpiNsRepair_ALR ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; ACPI_STATUS Status; - Status = AcpiNsCheckSortedList (Data, ReturnObject, 2, 1, + Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 2, 1, ACPI_SORT_ASCENDING, "AmbientIlluminance"); return (Status); @@ -278,7 +298,7 @@ AcpiNsRepair_ALR ( * * FUNCTION: AcpiNsRepair_FDE * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * @@ -293,7 +313,7 @@ AcpiNsRepair_ALR ( static ACPI_STATUS AcpiNsRepair_FDE ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; @@ -321,7 +341,7 @@ AcpiNsRepair_FDE ( if (ReturnObject->Buffer.Length != ACPI_FDE_BYTE_BUFFER_SIZE) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Incorrect return buffer length %u, expected %u", ReturnObject->Buffer.Length, ACPI_FDE_DWORD_BUFFER_SIZE)); @@ -350,10 +370,11 @@ AcpiNsRepair_FDE ( ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s Expanded Byte Buffer to expected DWord Buffer\n", - Data->Pathname)); + Info->FullPathname)); break; default: + return (AE_AML_OPERAND_TYPE); } @@ -362,7 +383,7 @@ AcpiNsRepair_FDE ( AcpiUtRemoveReference (ReturnObject); *ReturnObjectPtr = BufferObject; - Data->Flags |= ACPI_OBJECT_REPAIRED; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; return (AE_OK); } @@ -371,7 +392,7 @@ AcpiNsRepair_FDE ( * * FUNCTION: AcpiNsRepair_CID * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * @@ -385,7 +406,7 @@ AcpiNsRepair_FDE ( static ACPI_STATUS AcpiNsRepair_CID ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_STATUS Status; @@ -400,7 +421,7 @@ AcpiNsRepair_CID ( if (ReturnObject->Common.Type == ACPI_TYPE_STRING) { - Status = AcpiNsRepair_HID (Data, ReturnObjectPtr); + Status = AcpiNsRepair_HID (Info, ReturnObjectPtr); return (Status); } @@ -419,7 +440,7 @@ AcpiNsRepair_CID ( OriginalElement = *ElementPtr; OriginalRefCount = OriginalElement->Common.ReferenceCount; - Status = AcpiNsRepair_HID (Data, ElementPtr); + Status = AcpiNsRepair_HID (Info, ElementPtr); if (ACPI_FAILURE (Status)) { return (Status); @@ -446,9 +467,100 @@ AcpiNsRepair_CID ( /****************************************************************************** * + * FUNCTION: AcpiNsRepair_CST + * + * PARAMETERS: Info - Method execution information block + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if object is OK or was repaired successfully + * + * DESCRIPTION: Repair for the _CST object: + * 1. Sort the list ascending by C state type + * 2. Ensure type cannot be zero + * 3. A sub-package count of zero means _CST is meaningless + * 4. Count must match the number of C state sub-packages + * + *****************************************************************************/ + +static ACPI_STATUS +AcpiNsRepair_CST ( + ACPI_EVALUATE_INFO *Info, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; + ACPI_OPERAND_OBJECT **OuterElements; + UINT32 OuterElementCount; + ACPI_OPERAND_OBJECT *ObjDesc; + ACPI_STATUS Status; + BOOLEAN Removing; + UINT32 i; + + + ACPI_FUNCTION_NAME (NsRepair_CST); + + + /* + * Entries (subpackages) in the _CST Package must be sorted by the + * C-state type, in ascending order. + */ + Status = AcpiNsCheckSortedList (Info, ReturnObject, 1, 4, 1, + ACPI_SORT_ASCENDING, "C-State Type"); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* + * We now know the list is correctly sorted by C-state type. Check if + * the C-state type values are proportional. + */ + OuterElementCount = ReturnObject->Package.Count - 1; + i = 0; + while (i < OuterElementCount) + { + OuterElements = &ReturnObject->Package.Elements[i + 1]; + Removing = FALSE; + + if ((*OuterElements)->Package.Count == 0) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, + "SubPackage[%u] - removing entry due to zero count", i)); + Removing = TRUE; + } + + ObjDesc = (*OuterElements)->Package.Elements[1]; /* Index1 = Type */ + if ((UINT32) ObjDesc->Integer.Value == 0) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, + "SubPackage[%u] - removing entry due to invalid Type(0)", i)); + Removing = TRUE; + } + + if (Removing) + { + AcpiNsRemoveElement (ReturnObject, i + 1); + OuterElementCount--; + } + else + { + i++; + } + } + + /* Update top-level package count, Type "Integer" checked elsewhere */ + + ObjDesc = ReturnObject->Package.Elements[0]; + ObjDesc->Integer.Value = OuterElementCount; + return (AE_OK); +} + + +/****************************************************************************** + * * FUNCTION: AcpiNsRepair_HID * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * @@ -461,7 +573,7 @@ AcpiNsRepair_CID ( static ACPI_STATUS AcpiNsRepair_HID ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; @@ -482,12 +594,12 @@ AcpiNsRepair_HID ( if (ReturnObject->String.Length == 0) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "Invalid zero-length _HID or _CID string")); /* Return AE_OK anyway, let driver handle it */ - Data->Flags |= ACPI_OBJECT_REPAIRED; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; return (AE_OK); } @@ -512,7 +624,7 @@ AcpiNsRepair_HID ( NewString->String.Length--; ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, - "%s: Removed invalid leading asterisk\n", Data->Pathname)); + "%s: Removed invalid leading asterisk\n", Info->FullPathname)); } /* @@ -536,47 +648,65 @@ AcpiNsRepair_HID ( /****************************************************************************** * - * FUNCTION: AcpiNsRepair_TSS + * FUNCTION: AcpiNsRepair_PRT * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * * RETURN: Status. AE_OK if object is OK or was repaired successfully * - * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list - * descending by the power dissipation values. + * DESCRIPTION: Repair for the _PRT object. If necessary, fix reversed + * SourceName and SourceIndex field, a common BIOS bug. * *****************************************************************************/ static ACPI_STATUS -AcpiNsRepair_TSS ( - ACPI_PREDEFINED_DATA *Data, +AcpiNsRepair_PRT ( + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { - ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; - ACPI_STATUS Status; - ACPI_NAMESPACE_NODE *Node; + ACPI_OPERAND_OBJECT *PackageObject = *ReturnObjectPtr; + ACPI_OPERAND_OBJECT **TopObjectList; + ACPI_OPERAND_OBJECT **SubObjectList; + ACPI_OPERAND_OBJECT *ObjDesc; + UINT32 ElementCount; + UINT32 Index; - /* - * We can only sort the _TSS return package if there is no _PSS in the - * same scope. This is because if _PSS is present, the ACPI specification - * dictates that the _TSS Power Dissipation field is to be ignored, and - * therefore some BIOSs leave garbage values in the _TSS Power field(s). - * In this case, it is best to just return the _TSS package as-is. - * (May, 2011) - */ - Status = AcpiNsGetNode (Data->Node, "^_PSS", ACPI_NS_NO_UPSEARCH, &Node); - if (ACPI_SUCCESS (Status)) + /* Each element in the _PRT package is a subpackage */ + + TopObjectList = PackageObject->Package.Elements; + ElementCount = PackageObject->Package.Count; + + for (Index = 0; Index < ElementCount; Index++) { - return (AE_OK); - } + SubObjectList = (*TopObjectList)->Package.Elements; - Status = AcpiNsCheckSortedList (Data, ReturnObject, 5, 1, - ACPI_SORT_DESCENDING, "PowerDissipation"); + /* + * If the BIOS has erroneously reversed the _PRT SourceName (index 2) + * and the SourceIndex (index 3), fix it. _PRT is important enough to + * workaround this BIOS error. This also provides compatibility with + * other ACPI implementations. + */ + ObjDesc = SubObjectList[3]; + if (!ObjDesc || (ObjDesc->Common.Type != ACPI_TYPE_INTEGER)) + { + SubObjectList[3] = SubObjectList[2]; + SubObjectList[2] = ObjDesc; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; - return (Status); + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, + "PRT[%X]: Fixed reversed SourceName and SourceIndex", + Index)); + } + + /* Point to the next ACPI_OPERAND_OBJECT in the top level package */ + + TopObjectList++; + } + + return (AE_OK); } @@ -584,7 +714,7 @@ AcpiNsRepair_TSS ( * * FUNCTION: AcpiNsRepair_PSS * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObjectPtr - Pointer to the object returned from the * evaluation of a method or object * @@ -599,7 +729,7 @@ AcpiNsRepair_TSS ( static ACPI_STATUS AcpiNsRepair_PSS ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr) { ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; @@ -618,7 +748,7 @@ AcpiNsRepair_PSS ( * incorrectly sorted, sort it. We sort by CpuFrequency, since this * should be proportional to the power. */ - Status =AcpiNsCheckSortedList (Data, ReturnObject, 6, 0, + Status =AcpiNsCheckSortedList (Info, ReturnObject, 0, 6, 0, ACPI_SORT_DESCENDING, "CpuFrequency"); if (ACPI_FAILURE (Status)) { @@ -640,7 +770,7 @@ AcpiNsRepair_PSS ( if ((UINT32) ObjDesc->Integer.Value > PreviousValue) { - ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, + ACPI_WARN_PREDEFINED ((AE_INFO, Info->FullPathname, Info->NodeFlags, "SubPackage[%u,%u] - suspicious power dissipation values", i-1, i)); } @@ -655,10 +785,58 @@ AcpiNsRepair_PSS ( /****************************************************************************** * + * FUNCTION: AcpiNsRepair_TSS + * + * PARAMETERS: Info - Method execution information block + * ReturnObjectPtr - Pointer to the object returned from the + * evaluation of a method or object + * + * RETURN: Status. AE_OK if object is OK or was repaired successfully + * + * DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list + * descending by the power dissipation values. + * + *****************************************************************************/ + +static ACPI_STATUS +AcpiNsRepair_TSS ( + ACPI_EVALUATE_INFO *Info, + ACPI_OPERAND_OBJECT **ReturnObjectPtr) +{ + ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; + ACPI_STATUS Status; + ACPI_NAMESPACE_NODE *Node; + + + /* + * We can only sort the _TSS return package if there is no _PSS in the + * same scope. This is because if _PSS is present, the ACPI specification + * dictates that the _TSS Power Dissipation field is to be ignored, and + * therefore some BIOSs leave garbage values in the _TSS Power field(s). + * In this case, it is best to just return the _TSS package as-is. + * (May, 2011) + */ + Status = AcpiNsGetNode (Info->Node, "^_PSS", + ACPI_NS_NO_UPSEARCH, &Node); + if (ACPI_SUCCESS (Status)) + { + return (AE_OK); + } + + Status = AcpiNsCheckSortedList (Info, ReturnObject, 0, 5, 1, + ACPI_SORT_DESCENDING, "PowerDissipation"); + + return (Status); +} + + +/****************************************************************************** + * * FUNCTION: AcpiNsCheckSortedList * - * PARAMETERS: Data - Pointer to validation data structure + * PARAMETERS: Info - Method execution information block * ReturnObject - Pointer to the top-level returned object + * StartIndex - Index of the first sub-package * ExpectedCount - Minimum length of each sub-package * SortIndex - Sub-package entry to sort on * SortDirection - Ascending or descending @@ -674,8 +852,9 @@ AcpiNsRepair_PSS ( static ACPI_STATUS AcpiNsCheckSortedList ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *ReturnObject, + UINT32 StartIndex, UINT32 ExpectedCount, UINT32 SortIndex, UINT8 SortDirection, @@ -704,13 +883,15 @@ AcpiNsCheckSortedList ( * Any NULL elements should have been removed by earlier call * to AcpiNsRemoveNullElements. */ - OuterElements = ReturnObject->Package.Elements; OuterElementCount = ReturnObject->Package.Count; - if (!OuterElementCount) + if (!OuterElementCount || StartIndex >= OuterElementCount) { return (AE_AML_PACKAGE_LIMIT); } + OuterElements = &ReturnObject->Package.Elements[StartIndex]; + OuterElementCount -= StartIndex; + PreviousValue = 0; if (SortDirection == ACPI_SORT_DESCENDING) { @@ -752,14 +933,14 @@ AcpiNsCheckSortedList ( ((SortDirection == ACPI_SORT_DESCENDING) && (ObjDesc->Integer.Value > PreviousValue))) { - AcpiNsSortList (ReturnObject->Package.Elements, + AcpiNsSortList (&ReturnObject->Package.Elements[StartIndex], OuterElementCount, SortIndex, SortDirection); - Data->Flags |= ACPI_OBJECT_REPAIRED; + Info->ReturnFlags |= ACPI_OBJECT_REPAIRED; ACPI_DEBUG_PRINT ((ACPI_DB_REPAIR, "%s: Repaired unsorted list - now sorted by %s\n", - Data->Pathname, SortKeyName)); + Info->FullPathname, SortKeyName)); return (AE_OK); } @@ -825,3 +1006,61 @@ AcpiNsSortList ( } } } + + +/****************************************************************************** + * + * FUNCTION: AcpiNsRemoveElement + * + * PARAMETERS: ObjDesc - Package object element list + * Index - Index of element to remove + * + * RETURN: None + * + * DESCRIPTION: Remove the requested element of a package and delete it. + * + *****************************************************************************/ + +static void +AcpiNsRemoveElement ( + ACPI_OPERAND_OBJECT *ObjDesc, + UINT32 Index) +{ + ACPI_OPERAND_OBJECT **Source; + ACPI_OPERAND_OBJECT **Dest; + UINT32 Count; + UINT32 NewCount; + UINT32 i; + + + ACPI_FUNCTION_NAME (NsRemoveElement); + + + Count = ObjDesc->Package.Count; + NewCount = Count - 1; + + Source = ObjDesc->Package.Elements; + Dest = Source; + + /* Examine all elements of the package object, remove matched index */ + + for (i = 0; i < Count; i++) + { + if (i == Index) + { + AcpiUtRemoveReference (*Source); /* Remove one ref for being in pkg */ + AcpiUtRemoveReference (*Source); + } + else + { + *Dest = *Source; + Dest++; + } + Source++; + } + + /* NULL terminate list and update the package count */ + + *Dest = NULL; + ObjDesc->Package.Count = NewCount; +} diff --git a/source/components/namespace/nsutils.c b/source/components/namespace/nsutils.c index 16a6bdb..f2cf74f 100644 --- a/source/components/namespace/nsutils.c +++ b/source/components/namespace/nsutils.c @@ -497,10 +497,12 @@ AcpiNsExternalizeName ( switch (InternalName[0]) { case AML_ROOT_PREFIX: + PrefixLength = 1; break; case AML_PARENT_PREFIX: + for (i = 0; i < InternalNameLength; i++) { if (ACPI_IS_PARENT_PREFIX (InternalName[i])) @@ -521,6 +523,7 @@ AcpiNsExternalizeName ( break; default: + break; } diff --git a/source/components/namespace/nsxfeval.c b/source/components/namespace/nsxfeval.c index 6f13d66..6a2649a 100644 --- a/source/components/namespace/nsxfeval.c +++ b/source/components/namespace/nsxfeval.c @@ -205,8 +205,6 @@ AcpiEvaluateObject ( return_ACPI_STATUS (AE_NO_MEMORY); } - Info->Pathname = Pathname; - /* Convert and validate the device handle */ Info->PrefixNode = AcpiNsValidateHandle (Handle); @@ -217,17 +215,69 @@ AcpiEvaluateObject ( } /* - * If there are parameters to be passed to a control method, the external - * objects must all be converted to internal objects + * Get the actual namespace node for the target object. + * Handles these cases: + * + * 1) Null node, valid pathname from root (absolute path) + * 2) Node and valid pathname (path relative to Node) + * 3) Node, Null pathname + */ + if ((Pathname) && + (ACPI_IS_ROOT_PREFIX (Pathname[0]))) + { + /* The path is fully qualified, just evaluate by name */ + + Info->PrefixNode = NULL; + } + else if (!Handle) + { + /* + * A handle is optional iff a fully qualified pathname is specified. + * Since we've already handled fully qualified names above, this is + * an error. + */ + if (!Pathname) + { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Both Handle and Pathname are NULL")); + } + else + { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Null Handle with relative pathname [%s]", Pathname)); + } + + Status = AE_BAD_PARAMETER; + goto Cleanup; + } + + Info->RelativePathname = Pathname; + + /* + * Convert all external objects passed as arguments to the + * internal version(s). */ if (ExternalParams && ExternalParams->Count) { + Info->ParamCount = (UINT16) ExternalParams->Count; + + /* Warn on impossible argument count */ + + if (Info->ParamCount > ACPI_METHOD_NUM_ARGS) + { + ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, + "Excess arguments (%u) - using only %u", + Info->ParamCount, ACPI_METHOD_NUM_ARGS)); + + Info->ParamCount = ACPI_METHOD_NUM_ARGS; + } + /* * Allocate a new parameter block for the internal objects * Add 1 to count to allow for null terminated internal list */ Info->Parameters = ACPI_ALLOCATE_ZEROED ( - ((ACPI_SIZE) ExternalParams->Count + 1) * sizeof (void *)); + ((ACPI_SIZE) Info->ParamCount + 1) * sizeof (void *)); if (!Info->Parameters) { Status = AE_NO_MEMORY; @@ -236,58 +286,109 @@ AcpiEvaluateObject ( /* Convert each external object in the list to an internal object */ - for (i = 0; i < ExternalParams->Count; i++) + for (i = 0; i < Info->ParamCount; i++) { Status = AcpiUtCopyEobjectToIobject ( - &ExternalParams->Pointer[i], &Info->Parameters[i]); + &ExternalParams->Pointer[i], &Info->Parameters[i]); if (ACPI_FAILURE (Status)) { goto Cleanup; } } - Info->Parameters[ExternalParams->Count] = NULL; + + Info->Parameters[Info->ParamCount] = NULL; } + +#if 0 + /* - * Three major cases: - * 1) Fully qualified pathname - * 2) No handle, not fully qualified pathname (error) - * 3) Valid handle + * Begin incoming argument count analysis. Check for too few args + * and too many args. */ - if ((Pathname) && - (ACPI_IS_ROOT_PREFIX (Pathname[0]))) - { - /* The path is fully qualified, just evaluate by name */ - Info->PrefixNode = NULL; - Status = AcpiNsEvaluate (Info); - } - else if (!Handle) + switch (AcpiNsGetType (Info->Node)) { + case ACPI_TYPE_METHOD: + + /* Check incoming argument count against the method definition */ + + if (Info->ObjDesc->Method.ParamCount > Info->ParamCount) + { + ACPI_ERROR ((AE_INFO, + "Insufficient arguments (%u) - %u are required", + Info->ParamCount, + Info->ObjDesc->Method.ParamCount)); + + Status = AE_MISSING_ARGUMENTS; + goto Cleanup; + } + + else if (Info->ObjDesc->Method.ParamCount < Info->ParamCount) + { + ACPI_WARNING ((AE_INFO, + "Excess arguments (%u) - only %u are required", + Info->ParamCount, + Info->ObjDesc->Method.ParamCount)); + + /* Just pass the required number of arguments */ + + Info->ParamCount = Info->ObjDesc->Method.ParamCount; + } + /* - * A handle is optional iff a fully qualified pathname is specified. - * Since we've already handled fully qualified names above, this is - * an error + * Any incoming external objects to be passed as arguments to the + * method must be converted to internal objects */ - if (!Pathname) + if (Info->ParamCount) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "Both Handle and Pathname are NULL")); + /* + * Allocate a new parameter block for the internal objects + * Add 1 to count to allow for null terminated internal list + */ + Info->Parameters = ACPI_ALLOCATE_ZEROED ( + ((ACPI_SIZE) Info->ParamCount + 1) * sizeof (void *)); + if (!Info->Parameters) + { + Status = AE_NO_MEMORY; + goto Cleanup; + } + + /* Convert each external object in the list to an internal object */ + + for (i = 0; i < Info->ParamCount; i++) + { + Status = AcpiUtCopyEobjectToIobject ( + &ExternalParams->Pointer[i], &Info->Parameters[i]); + if (ACPI_FAILURE (Status)) + { + goto Cleanup; + } + } + + Info->Parameters[Info->ParamCount] = NULL; } - else + break; + + default: + + /* Warn if arguments passed to an object that is not a method */ + + if (Info->ParamCount) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "Null Handle with relative pathname [%s]", Pathname)); + ACPI_WARNING ((AE_INFO, + "%u arguments were passed to a non-method ACPI object", + Info->ParamCount)); } - - Status = AE_BAD_PARAMETER; + break; } - else - { - /* We have a namespace a node and a possible relative path */ - Status = AcpiNsEvaluate (Info); - } +#endif + + + /* Now we can evaluate the object */ + + Status = AcpiNsEvaluate (Info); /* * If we are expecting a return value, and all went well above, @@ -449,6 +550,7 @@ AcpiNsResolveReferences ( break; default: + return; } diff --git a/source/components/parser/psargs.c b/source/components/parser/psargs.c index 2bf7be7..42436fe 100644 --- a/source/components/parser/psargs.c +++ b/source/components/parser/psargs.c @@ -447,7 +447,6 @@ AcpiPsGetNextSimpleArg ( Length = 1; break; - case ARGP_WORDDATA: /* Get 2 bytes from the AML stream */ @@ -457,7 +456,6 @@ AcpiPsGetNextSimpleArg ( Length = 2; break; - case ARGP_DWORDDATA: /* Get 4 bytes from the AML stream */ @@ -467,7 +465,6 @@ AcpiPsGetNextSimpleArg ( Length = 4; break; - case ARGP_QWORDDATA: /* Get 8 bytes from the AML stream */ @@ -477,7 +474,6 @@ AcpiPsGetNextSimpleArg ( Length = 8; break; - case ARGP_CHARLIST: /* Get a pointer to the string, point past the string */ @@ -495,7 +491,6 @@ AcpiPsGetNextSimpleArg ( Length++; break; - case ARGP_NAME: case ARGP_NAMESTRING: @@ -503,7 +498,6 @@ AcpiPsGetNextSimpleArg ( Arg->Common.Value.Name = AcpiPsGetNextNamestring (ParserState); return_VOID; - default: ACPI_ERROR ((AE_INFO, "Invalid ArgType 0x%X", ArgType)); @@ -685,21 +679,25 @@ AcpiPsGetNextField ( switch (Opcode) { case AML_BYTE_OP: /* AML_BYTEDATA_ARG */ + BufferLength = ACPI_GET8 (ParserState->Aml); ParserState->Aml += 1; break; case AML_WORD_OP: /* AML_WORDDATA_ARG */ + BufferLength = ACPI_GET16 (ParserState->Aml); ParserState->Aml += 2; break; case AML_DWORD_OP: /* AML_DWORDATA_ARG */ + BufferLength = ACPI_GET32 (ParserState->Aml); ParserState->Aml += 4; break; default: + BufferLength = 0; break; } @@ -796,7 +794,6 @@ AcpiPsGetNextArg ( AcpiPsGetNextSimpleArg (ParserState, ArgType, Arg); break; - case ARGP_PKGLENGTH: /* Package length, nothing returned */ @@ -804,7 +801,6 @@ AcpiPsGetNextArg ( ParserState->PkgEnd = AcpiPsGetNextPackageEnd (ParserState); break; - case ARGP_FIELDLIST: if (ParserState->Aml < ParserState->PkgEnd) @@ -836,7 +832,6 @@ AcpiPsGetNextArg ( } break; - case ARGP_BYTELIST: if (ParserState->Aml < ParserState->PkgEnd) @@ -861,7 +856,6 @@ AcpiPsGetNextArg ( } break; - case ARGP_TARGET: case ARGP_SUPERNAME: case ARGP_SIMPLENAME: @@ -909,7 +903,6 @@ AcpiPsGetNextArg ( } break; - case ARGP_DATAOBJ: case ARGP_TERMARG: @@ -918,7 +911,6 @@ AcpiPsGetNextArg ( WalkState->ArgCount = 1; break; - case ARGP_DATAOBJLIST: case ARGP_TERMLIST: case ARGP_OBJLIST: @@ -931,7 +923,6 @@ AcpiPsGetNextArg ( } break; - default: ACPI_ERROR ((AE_INFO, "Invalid ArgType: 0x%X", ArgType)); diff --git a/source/components/parser/psloop.c b/source/components/parser/psloop.c index df7bd11..0afcb4c 100644 --- a/source/components/parser/psloop.c +++ b/source/components/parser/psloop.c @@ -174,7 +174,6 @@ AcpiPsGetArguments ( case AML_IF_OP: case AML_ELSE_OP: case AML_WHILE_OP: - /* * Currently supported module-level opcodes are: * IF/ELSE/WHILE. These appear to be the most common, @@ -280,6 +279,7 @@ AcpiPsGetArguments ( default: /* No action for all other opcodes */ + break; } diff --git a/source/components/parser/psobject.c b/source/components/parser/psobject.c index 78ee74c..f507e8e 100644 --- a/source/components/parser/psobject.c +++ b/source/components/parser/psobject.c @@ -436,8 +436,8 @@ AcpiPsCompleteOp ( switch (Status) { case AE_OK: - break; + break; case AE_CTRL_TRANSFER: @@ -447,7 +447,6 @@ AcpiPsCompleteOp ( WalkState->PrevArgTypes = WalkState->ArgTypes; return_ACPI_STATUS (Status); - case AE_CTRL_END: AcpiPsPopScope (&(WalkState->ParserState), Op, @@ -472,7 +471,6 @@ AcpiPsCompleteOp ( Status = AE_OK; break; - case AE_CTRL_BREAK: case AE_CTRL_CONTINUE: @@ -502,7 +500,6 @@ AcpiPsCompleteOp ( Status = AE_OK; break; - case AE_CTRL_TERMINATE: /* Clean up */ @@ -527,7 +524,6 @@ AcpiPsCompleteOp ( return_ACPI_STATUS (AE_OK); - default: /* All other non-AE_OK status */ do diff --git a/source/components/parser/psparse.c b/source/components/parser/psparse.c index a6a2ad9..925fa56 100644 --- a/source/components/parser/psparse.c +++ b/source/components/parser/psparse.c @@ -191,10 +191,10 @@ AcpiPsCompleteThisOp ( switch (ParentInfo->Class) { case AML_CLASS_CONTROL: + break; case AML_CLASS_CREATE: - /* * These opcodes contain TermArg operands. The current * op must be replaced by a placeholder return op @@ -207,7 +207,6 @@ AcpiPsCompleteThisOp ( break; case AML_CLASS_NAMED_OBJECT: - /* * These opcodes contain TermArg operands. The current * op must be replaced by a placeholder return op @@ -352,7 +351,6 @@ AcpiPsNextParseState ( Status = AE_CTRL_TERMINATE; break; - case AE_CTRL_BREAK: ParserState->Aml = WalkState->AmlLastWhile; @@ -360,14 +358,12 @@ AcpiPsNextParseState ( Status = AE_CTRL_BREAK; break; - case AE_CTRL_CONTINUE: ParserState->Aml = WalkState->AmlLastWhile; Status = AE_CTRL_CONTINUE; break; - case AE_CTRL_PENDING: ParserState->Aml = WalkState->AmlLastWhile; @@ -390,7 +386,6 @@ AcpiPsNextParseState ( Status = AE_CTRL_PENDING; break; - case AE_CTRL_FALSE: /* * Either an IF/WHILE Predicate was false or we encountered a BREAK @@ -407,7 +402,6 @@ AcpiPsNextParseState ( Status = AE_CTRL_END; break; - case AE_CTRL_TRANSFER: /* A method call (invocation) -- transfer control */ @@ -422,7 +416,6 @@ AcpiPsNextParseState ( WalkState->ReturnUsed = AcpiDsIsResultUsed (Op, WalkState); break; - default: Status = CallbackStatus; diff --git a/source/components/parser/pstree.c b/source/components/parser/pstree.c index 5a72b3b..6b67013 100644 --- a/source/components/parser/pstree.c +++ b/source/components/parser/pstree.c @@ -322,7 +322,6 @@ AcpiPsGetChild ( Child = AcpiPsGetArg (Op, 0); break; - case AML_BUFFER_OP: case AML_PACKAGE_OP: case AML_METHOD_OP: @@ -333,23 +332,22 @@ AcpiPsGetChild ( Child = AcpiPsGetArg (Op, 1); break; - case AML_POWER_RES_OP: case AML_INDEX_FIELD_OP: Child = AcpiPsGetArg (Op, 2); break; - case AML_PROCESSOR_OP: case AML_BANK_FIELD_OP: Child = AcpiPsGetArg (Op, 3); break; - default: + /* All others have no children */ + break; } diff --git a/source/components/parser/psxface.c b/source/components/parser/psxface.c index eb0fc7e..3f99157 100644 --- a/source/components/parser/psxface.c +++ b/source/components/parser/psxface.c @@ -150,7 +150,7 @@ AcpiPsStartTrace ( } if ((!AcpiGbl_TraceMethodName) || - (AcpiGbl_TraceMethodName != Info->ResolvedNode->Name.Integer)) + (AcpiGbl_TraceMethodName != Info->Node->Name.Integer)) { goto Exit; } @@ -205,7 +205,7 @@ AcpiPsStopTrace ( } if ((!AcpiGbl_TraceMethodName) || - (AcpiGbl_TraceMethodName != Info->ResolvedNode->Name.Integer)) + (AcpiGbl_TraceMethodName != Info->Node->Name.Integer)) { goto Exit; } @@ -268,14 +268,14 @@ AcpiPsExecuteMethod ( /* Validate the Info and method Node */ - if (!Info || !Info->ResolvedNode) + if (!Info || !Info->Node) { return_ACPI_STATUS (AE_NULL_ENTRY); } /* Init for new method, wait on concurrency semaphore */ - Status = AcpiDsBeginMethodExecution (Info->ResolvedNode, Info->ObjDesc, NULL); + Status = AcpiDsBeginMethodExecution (Info->Node, Info->ObjDesc, NULL); if (ACPI_FAILURE (Status)) { return_ACPI_STATUS (Status); @@ -295,7 +295,7 @@ AcpiPsExecuteMethod ( */ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Begin Method Parse/Execute [%4.4s] **** Node=%p Obj=%p\n", - Info->ResolvedNode->Name.Ascii, Info->ResolvedNode, Info->ObjDesc)); + Info->Node->Name.Ascii, Info->Node, Info->ObjDesc)); /* Create and init a Root Node */ @@ -317,7 +317,7 @@ AcpiPsExecuteMethod ( goto Cleanup; } - Status = AcpiDsInitAmlWalk (WalkState, Op, Info->ResolvedNode, + Status = AcpiDsInitAmlWalk (WalkState, Op, Info->Node, Info->ObjDesc->Method.AmlStart, Info->ObjDesc->Method.AmlLength, Info, Info->PassNumber); if (ACPI_FAILURE (Status)) diff --git a/source/components/resources/rscalc.c b/source/components/resources/rscalc.c index 5c373ec..a6e8b38 100644 --- a/source/components/resources/rscalc.c +++ b/source/components/resources/rscalc.c @@ -371,8 +371,8 @@ AcpiRsGetAmlLength ( break; - default: + break; } @@ -562,6 +562,7 @@ AcpiRsGetListLength ( break; default: + break; } @@ -676,7 +677,9 @@ AcpiRsGetPciRoutingTableLength ( NameFound = FALSE; - for (TableIndex = 0; TableIndex < 4 && !NameFound; TableIndex++) + for (TableIndex = 0; + TableIndex < PackageElement->Package.Count && !NameFound; + TableIndex++) { if (*SubObjectList && /* Null object allowed */ diff --git a/source/components/resources/rscreate.c b/source/components/resources/rscreate.c index 72202c6..209b503 100644 --- a/source/components/resources/rscreate.c +++ b/source/components/resources/rscreate.c @@ -297,16 +297,6 @@ AcpiRsCreatePciRoutingTable ( */ UserPrt->Length = (sizeof (ACPI_PCI_ROUTING_TABLE) - 4); - /* Each element of the top-level package must also be a package */ - - if ((*TopObjectList)->Common.Type != ACPI_TYPE_PACKAGE) - { - ACPI_ERROR ((AE_INFO, - "(PRT[%u]) Need sub-package, found %s", - Index, AcpiUtGetObjectTypeName (*TopObjectList))); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); - } - /* Each sub-package must be of length 4 */ if ((*TopObjectList)->Package.Count != 4) @@ -349,23 +339,6 @@ AcpiRsCreatePciRoutingTable ( UserPrt->Pin = (UINT32) ObjDesc->Integer.Value; /* - * If the BIOS has erroneously reversed the _PRT SourceName (index 2) - * and the SourceIndex (index 3), fix it. _PRT is important enough to - * workaround this BIOS error. This also provides compatibility with - * other ACPI implementations. - */ - ObjDesc = SubObjectList[3]; - if (!ObjDesc || (ObjDesc->Common.Type != ACPI_TYPE_INTEGER)) - { - SubObjectList[3] = SubObjectList[2]; - SubObjectList[2] = ObjDesc; - - ACPI_WARNING ((AE_INFO, - "(PRT[%X].Source) SourceName and SourceIndex are reversed, fixed", - Index)); - } - - /* * 3) Third subobject: Dereference the PRT.SourceName * The name may be unresolved (slack mode), so allow a null object */ @@ -400,7 +373,6 @@ AcpiRsCreatePciRoutingTable ( UserPrt->Length += (UINT32) ACPI_STRLEN (UserPrt->Source) + 1; break; - case ACPI_TYPE_STRING: ACPI_STRCPY (UserPrt->Source, ObjDesc->String.Pointer); @@ -412,7 +384,6 @@ AcpiRsCreatePciRoutingTable ( UserPrt->Length += ObjDesc->String.Length + 1; break; - case ACPI_TYPE_INTEGER: /* * If this is a number, then the Source Name is NULL, since the @@ -423,7 +394,6 @@ AcpiRsCreatePciRoutingTable ( UserPrt->Length += sizeof (UINT32); break; - default: ACPI_ERROR ((AE_INFO, diff --git a/source/components/resources/rsdump.c b/source/components/resources/rsdump.c index 063be02..4f72cdf 100644 --- a/source/components/resources/rsdump.c +++ b/source/components/resources/rsdump.c @@ -168,16 +168,19 @@ AcpiRsDumpDescriptor ( /* Strings */ case ACPI_RSD_LITERAL: + AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer)); break; case ACPI_RSD_STRING: + AcpiRsOutString (Name, ACPI_CAST_PTR (char, Target)); break; /* Data items, 8/16/32/64 bit */ case ACPI_RSD_UINT8: + if (Table->Pointer) { AcpiRsOutString (Name, ACPI_CAST_PTR (char, @@ -190,30 +193,36 @@ AcpiRsDumpDescriptor ( break; case ACPI_RSD_UINT16: + AcpiRsOutInteger16 (Name, ACPI_GET16 (Target)); break; case ACPI_RSD_UINT32: + AcpiRsOutInteger32 (Name, ACPI_GET32 (Target)); break; case ACPI_RSD_UINT64: + AcpiRsOutInteger64 (Name, ACPI_GET64 (Target)); break; /* Flags: 1-bit and 2-bit flags supported */ case ACPI_RSD_1BITFLAG: + AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer [*Target & 0x01])); break; case ACPI_RSD_2BITFLAG: + AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer [*Target & 0x03])); break; case ACPI_RSD_3BITFLAG: + AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer [*Target & 0x07])); break; @@ -293,6 +302,7 @@ AcpiRsDumpDescriptor ( break; default: + AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n", Table->Opcode); return; diff --git a/source/components/resources/rsmisc.c b/source/components/resources/rsmisc.c index c17d64b..f3e02a1 100644 --- a/source/components/resources/rsmisc.c +++ b/source/components/resources/rsmisc.c @@ -137,17 +137,14 @@ AcpiRsConvertAmlToResource ( Resource->Length = INIT_RESOURCE_LENGTH (Info); break; - case ACPI_RSC_INITSET: break; - case ACPI_RSC_FLAGINIT: FlagsMode = TRUE; break; - case ACPI_RSC_1BITFLAG: /* * Mask and shift the flag bit @@ -156,7 +153,6 @@ AcpiRsConvertAmlToResource ( ((ACPI_GET8 (Source) >> Info->Value) & 0x01)); break; - case ACPI_RSC_2BITFLAG: /* * Mask and shift the flag bits @@ -165,7 +161,6 @@ AcpiRsConvertAmlToResource ( ((ACPI_GET8 (Source) >> Info->Value) & 0x03)); break; - case ACPI_RSC_3BITFLAG: /* * Mask and shift the flag bits @@ -174,7 +169,6 @@ AcpiRsConvertAmlToResource ( ((ACPI_GET8 (Source) >> Info->Value) & 0x07)); break; - case ACPI_RSC_COUNT: ItemCount = ACPI_GET8 (Source); @@ -184,7 +178,6 @@ AcpiRsConvertAmlToResource ( (Info->Value * (ItemCount - 1)); break; - case ACPI_RSC_COUNT16: ItemCount = AmlResourceLength; @@ -194,7 +187,6 @@ AcpiRsConvertAmlToResource ( (Info->Value * (ItemCount - 1)); break; - case ACPI_RSC_COUNT_GPIO_PIN: Target = ACPI_ADD_PTR (void, Aml, Info->Value); @@ -205,7 +197,6 @@ AcpiRsConvertAmlToResource ( ACPI_SET16 (Destination, ItemCount); break; - case ACPI_RSC_COUNT_GPIO_VEN: ItemCount = ACPI_GET8 (Source); @@ -215,9 +206,7 @@ AcpiRsConvertAmlToResource ( (Info->Value * ItemCount); break; - case ACPI_RSC_COUNT_GPIO_RES: - /* * Vendor data is optional (length/offset may both be zero) * Examine vendor data length field first @@ -243,7 +232,6 @@ AcpiRsConvertAmlToResource ( ACPI_SET16 (Destination, ItemCount); break; - case ACPI_RSC_COUNT_SERIAL_VEN: ItemCount = ACPI_GET16 (Source) - Info->Value; @@ -252,7 +240,6 @@ AcpiRsConvertAmlToResource ( ACPI_SET16 (Destination, ItemCount); break; - case ACPI_RSC_COUNT_SERIAL_RES: ItemCount = (AmlResourceLength + @@ -263,13 +250,11 @@ AcpiRsConvertAmlToResource ( ACPI_SET16 (Destination, ItemCount); break; - case ACPI_RSC_LENGTH: Resource->Length = Resource->Length + Info->Value; break; - case ACPI_RSC_MOVE8: case ACPI_RSC_MOVE16: case ACPI_RSC_MOVE32: @@ -285,7 +270,6 @@ AcpiRsConvertAmlToResource ( AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_GPIO_PIN: /* Generate and set the PIN data pointer */ @@ -300,7 +284,6 @@ AcpiRsConvertAmlToResource ( AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_GPIO_RES: /* Generate and set the ResourceSource string pointer */ @@ -315,7 +298,6 @@ AcpiRsConvertAmlToResource ( AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_SERIAL_VEN: /* Generate and set the Vendor Data pointer */ @@ -330,7 +312,6 @@ AcpiRsConvertAmlToResource ( AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_SERIAL_RES: /* Generate and set the ResourceSource string pointer */ @@ -345,20 +326,17 @@ AcpiRsConvertAmlToResource ( AcpiRsMoveData (Target, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_SET8: ACPI_MEMSET (Destination, Info->AmlOffset, Info->Value); break; - case ACPI_RSC_DATA8: Target = ACPI_ADD_PTR (char, Resource, Info->Value); ACPI_MEMCPY (Destination, Source, ACPI_GET16 (Target)); break; - case ACPI_RSC_ADDRESS: /* * Common handler for address descriptor flags @@ -369,7 +347,6 @@ AcpiRsConvertAmlToResource ( } break; - case ACPI_RSC_SOURCE: /* * Optional ResourceSource (Index and String) @@ -379,7 +356,6 @@ AcpiRsConvertAmlToResource ( Destination, Aml, NULL); break; - case ACPI_RSC_SOURCEX: /* * Optional ResourceSource (Index and String). This is the more @@ -394,7 +370,6 @@ AcpiRsConvertAmlToResource ( Destination, Aml, Target); break; - case ACPI_RSC_BITMASK: /* * 8-bit encoded bitmask (DMA macro) @@ -409,7 +384,6 @@ AcpiRsConvertAmlToResource ( ACPI_SET8 (Target, ItemCount); break; - case ACPI_RSC_BITMASK16: /* * 16-bit encoded bitmask (IRQ macro) @@ -426,7 +400,6 @@ AcpiRsConvertAmlToResource ( ACPI_SET8 (Target, ItemCount); break; - case ACPI_RSC_EXIT_NE: /* * Control - Exit conversion if not equal @@ -434,6 +407,7 @@ AcpiRsConvertAmlToResource ( switch (Info->ResourceOffset) { case ACPI_RSC_COMPARE_AML_LENGTH: + if (AmlResourceLength != Info->Value) { goto Exit; @@ -441,6 +415,7 @@ AcpiRsConvertAmlToResource ( break; case ACPI_RSC_COMPARE_VALUE: + if (ACPI_GET8 (Source) != Info->Value) { goto Exit; @@ -454,7 +429,6 @@ AcpiRsConvertAmlToResource ( } break; - default: ACPI_ERROR ((AE_INFO, "Invalid conversion opcode")); @@ -538,11 +512,9 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceHeader (INIT_RESOURCE_TYPE (Info), AmlLength, Aml); break; - case ACPI_RSC_INITGET: break; - case ACPI_RSC_FLAGINIT: /* * Clear the flag byte @@ -550,7 +522,6 @@ AcpiRsConvertResourceToAml ( ACPI_SET8 (Destination, 0); break; - case ACPI_RSC_1BITFLAG: /* * Mask and shift the flag bit @@ -559,7 +530,6 @@ AcpiRsConvertResourceToAml ( ((ACPI_GET8 (Source) & 0x01) << Info->Value)); break; - case ACPI_RSC_2BITFLAG: /* * Mask and shift the flag bits @@ -568,7 +538,6 @@ AcpiRsConvertResourceToAml ( ((ACPI_GET8 (Source) & 0x03) << Info->Value)); break; - case ACPI_RSC_3BITFLAG: /* * Mask and shift the flag bits @@ -577,7 +546,6 @@ AcpiRsConvertResourceToAml ( ((ACPI_GET8 (Source) & 0x07) << Info->Value)); break; - case ACPI_RSC_COUNT: ItemCount = ACPI_GET8 (Source); @@ -586,7 +554,6 @@ AcpiRsConvertResourceToAml ( AmlLength = (UINT16) (AmlLength + (Info->Value * (ItemCount - 1))); break; - case ACPI_RSC_COUNT16: ItemCount = ACPI_GET16 (Source); @@ -594,7 +561,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_COUNT_GPIO_PIN: ItemCount = ACPI_GET16 (Source); @@ -606,7 +572,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_COUNT_GPIO_VEN: ItemCount = ACPI_GET16 (Source); @@ -616,7 +581,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_COUNT_GPIO_RES: /* Set resource source string length */ @@ -639,7 +603,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_COUNT_SERIAL_VEN: ItemCount = ACPI_GET16 (Source); @@ -648,7 +611,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_COUNT_SERIAL_RES: ItemCount = ACPI_GET16 (Source); @@ -656,13 +618,11 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_LENGTH: AcpiRsSetResourceLength (Info->Value, Aml); break; - case ACPI_RSC_MOVE8: case ACPI_RSC_MOVE16: case ACPI_RSC_MOVE32: @@ -675,7 +635,6 @@ AcpiRsConvertResourceToAml ( AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_GPIO_PIN: Destination = (char *) ACPI_ADD_PTR (void, Aml, @@ -684,7 +643,6 @@ AcpiRsConvertResourceToAml ( AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_GPIO_RES: /* Used for both ResourceSource string and VendorData */ @@ -695,7 +653,6 @@ AcpiRsConvertResourceToAml ( AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_SERIAL_VEN: Destination = (char *) ACPI_ADD_PTR (void, Aml, @@ -704,7 +661,6 @@ AcpiRsConvertResourceToAml ( AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_MOVE_SERIAL_RES: Destination = (char *) ACPI_ADD_PTR (void, Aml, @@ -713,7 +669,6 @@ AcpiRsConvertResourceToAml ( AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode); break; - case ACPI_RSC_ADDRESS: /* Set the Resource Type, General Flags, and Type-Specific Flags */ @@ -721,7 +676,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetAddressCommon (Aml, Resource); break; - case ACPI_RSC_SOURCEX: /* * Optional ResourceSource (Index and String) @@ -731,7 +685,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_SOURCE: /* * Optional ResourceSource (Index and String). This is the more @@ -741,7 +694,6 @@ AcpiRsConvertResourceToAml ( AcpiRsSetResourceLength (AmlLength, Aml); break; - case ACPI_RSC_BITMASK: /* * 8-bit encoded bitmask (DMA macro) @@ -751,7 +703,6 @@ AcpiRsConvertResourceToAml ( *ACPI_ADD_PTR (UINT8, Resource, Info->Value))); break; - case ACPI_RSC_BITMASK16: /* * 16-bit encoded bitmask (IRQ macro) @@ -761,7 +712,6 @@ AcpiRsConvertResourceToAml ( ACPI_MOVE_16_TO_16 (Destination, &Temp16); break; - case ACPI_RSC_EXIT_LE: /* * Control - Exit conversion if less than or equal @@ -772,7 +722,6 @@ AcpiRsConvertResourceToAml ( } break; - case ACPI_RSC_EXIT_NE: /* * Control - Exit conversion if not equal @@ -795,7 +744,6 @@ AcpiRsConvertResourceToAml ( } break; - case ACPI_RSC_EXIT_EQ: /* * Control - Exit conversion if equal @@ -807,7 +755,6 @@ AcpiRsConvertResourceToAml ( } break; - default: ACPI_ERROR ((AE_INFO, "Invalid conversion opcode")); diff --git a/source/components/resources/rsutils.c b/source/components/resources/rsutils.c index bba3a1f..a453efe 100644 --- a/source/components/resources/rsutils.c +++ b/source/components/resources/rsutils.c @@ -176,6 +176,7 @@ AcpiRsMoveData ( case ACPI_RSC_MOVE_GPIO_RES: case ACPI_RSC_MOVE_SERIAL_VEN: case ACPI_RSC_MOVE_SERIAL_RES: + ACPI_MEMCPY (Destination, Source, ItemCount); return; @@ -186,21 +187,25 @@ AcpiRsMoveData ( */ case ACPI_RSC_MOVE16: case ACPI_RSC_MOVE_GPIO_PIN: + ACPI_MOVE_16_TO_16 (&ACPI_CAST_PTR (UINT16, Destination)[i], &ACPI_CAST_PTR (UINT16, Source)[i]); break; case ACPI_RSC_MOVE32: + ACPI_MOVE_32_TO_32 (&ACPI_CAST_PTR (UINT32, Destination)[i], &ACPI_CAST_PTR (UINT32, Source)[i]); break; case ACPI_RSC_MOVE64: + ACPI_MOVE_64_TO_64 (&ACPI_CAST_PTR (UINT64, Destination)[i], &ACPI_CAST_PTR (UINT64, Source)[i]); break; default: + return; } } @@ -810,7 +815,7 @@ AcpiRsSetSrsMethodData ( } Info->PrefixNode = Node; - Info->Pathname = METHOD_NAME__SRS; + Info->RelativePathname = METHOD_NAME__SRS; Info->Parameters = Args; Info->Flags = ACPI_IGNORE_RETURN_VALUE; diff --git a/source/components/resources/rsxface.c b/source/components/resources/rsxface.c index 36edc81..0523f5b 100644 --- a/source/components/resources/rsxface.c +++ b/source/components/resources/rsxface.c @@ -452,6 +452,7 @@ AcpiResourceToAddress64 ( break; default: + return (AE_BAD_PARAMETER); } diff --git a/source/components/tables/tbinstal.c b/source/components/tables/tbinstal.c index e4a0610..e480749 100644 --- a/source/components/tables/tbinstal.c +++ b/source/components/tables/tbinstal.c @@ -160,7 +160,7 @@ AcpiTbAddTable ( ACPI_BIOS_ERROR ((AE_INFO, "Table has invalid signature [%4.4s] (0x%8.8X), " "must be SSDT or OEMx", - AcpiUtValidAcpiName (*(UINT32 *) TableDesc->Pointer->Signature) ? + AcpiUtValidAcpiName (TableDesc->Pointer->Signature) ? TableDesc->Pointer->Signature : "????", *(UINT32 *) TableDesc->Pointer->Signature)); @@ -514,16 +514,19 @@ AcpiTbDeleteTable ( switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) { case ACPI_TABLE_ORIGIN_MAPPED: + AcpiOsUnmapMemory (TableDesc->Pointer, TableDesc->Length); break; case ACPI_TABLE_ORIGIN_ALLOCATED: + ACPI_FREE (TableDesc->Pointer); break; /* Not mapped or allocated, there is nothing we can do */ default: + return; } diff --git a/source/components/tables/tbprint.c b/source/components/tables/tbprint.c new file mode 100644 index 0000000..7823ffc --- /dev/null +++ b/source/components/tables/tbprint.c @@ -0,0 +1,265 @@ +/****************************************************************************** + * + * Module Name: tbprint - Table output utilities + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#define __TBPRINT_C__ + +#include "acpi.h" +#include "accommon.h" +#include "actables.h" + +#define _COMPONENT ACPI_TABLES + ACPI_MODULE_NAME ("tbprint") + + +/* Local prototypes */ + +static void +AcpiTbFixString ( + char *String, + ACPI_SIZE Length); + +static void +AcpiTbCleanupTableHeader ( + ACPI_TABLE_HEADER *OutHeader, + ACPI_TABLE_HEADER *Header); + + +/******************************************************************************* + * + * FUNCTION: AcpiTbFixString + * + * PARAMETERS: String - String to be repaired + * Length - Maximum length + * + * RETURN: None + * + * DESCRIPTION: Replace every non-printable or non-ascii byte in the string + * with a question mark '?'. + * + ******************************************************************************/ + +static void +AcpiTbFixString ( + char *String, + ACPI_SIZE Length) +{ + + while (Length && *String) + { + if (!ACPI_IS_PRINT (*String)) + { + *String = '?'; + } + String++; + Length--; + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiTbCleanupTableHeader + * + * PARAMETERS: OutHeader - Where the cleaned header is returned + * Header - Input ACPI table header + * + * RETURN: Returns the cleaned header in OutHeader + * + * DESCRIPTION: Copy the table header and ensure that all "string" fields in + * the header consist of printable characters. + * + ******************************************************************************/ + +static void +AcpiTbCleanupTableHeader ( + ACPI_TABLE_HEADER *OutHeader, + ACPI_TABLE_HEADER *Header) +{ + + ACPI_MEMCPY (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); + + AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); + AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); + AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); + AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiTbPrintTableHeader + * + * PARAMETERS: Address - Table physical address + * Header - Table header + * + * RETURN: None + * + * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. + * + ******************************************************************************/ + +void +AcpiTbPrintTableHeader ( + ACPI_PHYSICAL_ADDRESS Address, + ACPI_TABLE_HEADER *Header) +{ + ACPI_TABLE_HEADER LocalHeader; + + + /* + * The reason that the Address is cast to a void pointer is so that we + * can use %p which will work properly on both 32-bit and 64-bit hosts. + */ + if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) + { + /* FACS only has signature and length fields */ + + ACPI_INFO ((AE_INFO, "%4.4s %p %05X", + Header->Signature, ACPI_CAST_PTR (void, Address), + Header->Length)); + } + else if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_RSDP)) + { + /* RSDP has no common fields */ + + ACPI_MEMCPY (LocalHeader.OemId, + ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE); + AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); + + ACPI_INFO ((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)", + ACPI_CAST_PTR (void, Address), + (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? + ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, + ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, + LocalHeader.OemId)); + } + else + { + /* Standard ACPI table with full common header */ + + AcpiTbCleanupTableHeader (&LocalHeader, Header); + + ACPI_INFO ((AE_INFO, + "%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)", + LocalHeader.Signature, ACPI_CAST_PTR (void, Address), + LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, + LocalHeader.OemTableId, LocalHeader.OemRevision, + LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiTbValidateChecksum + * + * PARAMETERS: Table - ACPI table to verify + * Length - Length of entire table + * + * RETURN: Status + * + * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns + * exception on bad checksum. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiTbVerifyChecksum ( + ACPI_TABLE_HEADER *Table, + UINT32 Length) +{ + UINT8 Checksum; + + + /* Compute the checksum on the table */ + + Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); + + /* Checksum ok? (should be zero) */ + + if (Checksum) + { + ACPI_BIOS_WARNING ((AE_INFO, + "Incorrect checksum in table [%4.4s] - 0x%2.2X, " + "should be 0x%2.2X", + Table->Signature, Table->Checksum, + (UINT8) (Table->Checksum - Checksum))); + +#if (ACPI_CHECKSUM_ABORT) + return (AE_BAD_CHECKSUM); +#endif + } + + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiTbChecksum + * + * PARAMETERS: Buffer - Pointer to memory region to be checked + * Length - Length of this memory region + * + * RETURN: Checksum (UINT8) + * + * DESCRIPTION: Calculates circular checksum of memory region. + * + ******************************************************************************/ + +UINT8 +AcpiTbChecksum ( + UINT8 *Buffer, + UINT32 Length) +{ + UINT8 Sum = 0; + UINT8 *End = Buffer + Length; + + + while (Buffer < End) + { + Sum = (UINT8) (Sum + *(Buffer++)); + } + + return (Sum); +} diff --git a/source/components/tables/tbutils.c b/source/components/tables/tbutils.c index 0ea5edd..7c84d5e 100644 --- a/source/components/tables/tbutils.c +++ b/source/components/tables/tbutils.c @@ -1,6 +1,6 @@ /****************************************************************************** * - * Module Name: tbutils - table utilities + * Module Name: tbutils - ACPI Table utilities * *****************************************************************************/ @@ -53,16 +53,6 @@ /* Local prototypes */ -static void -AcpiTbFixString ( - char *String, - ACPI_SIZE Length); - -static void -AcpiTbCleanupTableHeader ( - ACPI_TABLE_HEADER *OutHeader, - ACPI_TABLE_HEADER *Header); - static ACPI_PHYSICAL_ADDRESS AcpiTbGetRootTableEntry ( UINT8 *TableEntry, @@ -134,207 +124,6 @@ AcpiTbTablesLoaded ( /******************************************************************************* * - * FUNCTION: AcpiTbFixString - * - * PARAMETERS: String - String to be repaired - * Length - Maximum length - * - * RETURN: None - * - * DESCRIPTION: Replace every non-printable or non-ascii byte in the string - * with a question mark '?'. - * - ******************************************************************************/ - -static void -AcpiTbFixString ( - char *String, - ACPI_SIZE Length) -{ - - while (Length && *String) - { - if (!ACPI_IS_PRINT (*String)) - { - *String = '?'; - } - String++; - Length--; - } -} - - -/******************************************************************************* - * - * FUNCTION: AcpiTbCleanupTableHeader - * - * PARAMETERS: OutHeader - Where the cleaned header is returned - * Header - Input ACPI table header - * - * RETURN: Returns the cleaned header in OutHeader - * - * DESCRIPTION: Copy the table header and ensure that all "string" fields in - * the header consist of printable characters. - * - ******************************************************************************/ - -static void -AcpiTbCleanupTableHeader ( - ACPI_TABLE_HEADER *OutHeader, - ACPI_TABLE_HEADER *Header) -{ - - ACPI_MEMCPY (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); - - AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); - AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); - AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); - AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiTbPrintTableHeader - * - * PARAMETERS: Address - Table physical address - * Header - Table header - * - * RETURN: None - * - * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. - * - ******************************************************************************/ - -void -AcpiTbPrintTableHeader ( - ACPI_PHYSICAL_ADDRESS Address, - ACPI_TABLE_HEADER *Header) -{ - ACPI_TABLE_HEADER LocalHeader; - - - /* - * The reason that the Address is cast to a void pointer is so that we - * can use %p which will work properly on both 32-bit and 64-bit hosts. - */ - if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) - { - /* FACS only has signature and length fields */ - - ACPI_INFO ((AE_INFO, "%4.4s %p %05X", - Header->Signature, ACPI_CAST_PTR (void, Address), - Header->Length)); - } - else if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_RSDP)) - { - /* RSDP has no common fields */ - - ACPI_MEMCPY (LocalHeader.OemId, - ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE); - AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); - - ACPI_INFO ((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)", - ACPI_CAST_PTR (void, Address), - (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? - ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, - ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, - LocalHeader.OemId)); - } - else - { - /* Standard ACPI table with full common header */ - - AcpiTbCleanupTableHeader (&LocalHeader, Header); - - ACPI_INFO ((AE_INFO, - "%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)", - LocalHeader.Signature, ACPI_CAST_PTR (void, Address), - LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, - LocalHeader.OemTableId, LocalHeader.OemRevision, - LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); - } -} - - -/******************************************************************************* - * - * FUNCTION: AcpiTbValidateChecksum - * - * PARAMETERS: Table - ACPI table to verify - * Length - Length of entire table - * - * RETURN: Status - * - * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns - * exception on bad checksum. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiTbVerifyChecksum ( - ACPI_TABLE_HEADER *Table, - UINT32 Length) -{ - UINT8 Checksum; - - - /* Compute the checksum on the table */ - - Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); - - /* Checksum ok? (should be zero) */ - - if (Checksum) - { - ACPI_BIOS_WARNING ((AE_INFO, - "Incorrect checksum in table [%4.4s] - 0x%2.2X, " - "should be 0x%2.2X", - Table->Signature, Table->Checksum, - (UINT8) (Table->Checksum - Checksum))); - -#if (ACPI_CHECKSUM_ABORT) - return (AE_BAD_CHECKSUM); -#endif - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiTbChecksum - * - * PARAMETERS: Buffer - Pointer to memory region to be checked - * Length - Length of this memory region - * - * RETURN: Checksum (UINT8) - * - * DESCRIPTION: Calculates circular checksum of memory region. - * - ******************************************************************************/ - -UINT8 -AcpiTbChecksum ( - UINT8 *Buffer, - UINT32 Length) -{ - UINT8 Sum = 0; - UINT8 *End = Buffer + Length; - - - while (Buffer < End) - { - Sum = (UINT8) (Sum + *(Buffer++)); - } - - return (Sum); -} - - -/******************************************************************************* - * * FUNCTION: AcpiTbCheckDsdtHeader * * PARAMETERS: None diff --git a/source/components/tables/tbxfload.c b/source/components/tables/tbxfload.c index 3beafe9..2ebaab9 100644 --- a/source/components/tables/tbxfload.c +++ b/source/components/tables/tbxfload.c @@ -192,6 +192,18 @@ AcpiTbLoadNamespace ( continue; } + /* + * Optionally do not load any SSDTs from the RSDT/XSDT. This can + * be useful for debugging ACPI problems on some machines. + */ + if (AcpiGbl_DisableSsdtTableLoad) + { + ACPI_INFO ((AE_INFO, "Ignoring %4.4s at %p", + AcpiGbl_RootTableList.Tables[i].Signature.Ascii, + ACPI_CAST_PTR (void, AcpiGbl_RootTableList.Tables[i].Address))); + continue; + } + /* Ignore errors while loading tables, get as many as possible */ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); diff --git a/source/components/utilities/utbuffer.c b/source/components/utilities/utbuffer.c new file mode 100644 index 0000000..e1b56d5 --- /dev/null +++ b/source/components/utilities/utbuffer.c @@ -0,0 +1,220 @@ +/****************************************************************************** + * + * Module Name: utbuffer - Buffer dump routines + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#define __UTBUFFER_C__ + +#include "acpi.h" +#include "accommon.h" + +#define _COMPONENT ACPI_UTILITIES + ACPI_MODULE_NAME ("utbuffer") + + +/******************************************************************************* + * + * FUNCTION: AcpiUtDumpBuffer + * + * PARAMETERS: Buffer - Buffer to dump + * Count - Amount to dump, in bytes + * Display - BYTE, WORD, DWORD, or QWORD display: + * DB_BYTE_DISPLAY + * DB_WORD_DISPLAY + * DB_DWORD_DISPLAY + * DB_QWORD_DISPLAY + * BaseOffset - Beginning buffer offset (display only) + * + * RETURN: None + * + * DESCRIPTION: Generic dump buffer in both hex and ascii. + * + ******************************************************************************/ + +void +AcpiUtDumpBuffer ( + UINT8 *Buffer, + UINT32 Count, + UINT32 Display, + UINT32 BaseOffset) +{ + UINT32 i = 0; + UINT32 j; + UINT32 Temp32; + UINT8 BufChar; + + + if (!Buffer) + { + AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n"); + return; + } + + if ((Count < 4) || (Count & 0x01)) + { + Display = DB_BYTE_DISPLAY; + } + + /* Nasty little dump buffer routine! */ + + while (i < Count) + { + /* Print current offset */ + + AcpiOsPrintf ("%6.4X: ", (BaseOffset + i)); + + /* Print 16 hex chars */ + + for (j = 0; j < 16;) + { + if (i + j >= Count) + { + /* Dump fill spaces */ + + AcpiOsPrintf ("%*s", ((Display * 2) + 1), " "); + j += Display; + continue; + } + + switch (Display) + { + case DB_BYTE_DISPLAY: + default: /* Default is BYTE display */ + + AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]); + break; + + case DB_WORD_DISPLAY: + + ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); + AcpiOsPrintf ("%04X ", Temp32); + break; + + case DB_DWORD_DISPLAY: + + ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); + AcpiOsPrintf ("%08X ", Temp32); + break; + + case DB_QWORD_DISPLAY: + + ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); + AcpiOsPrintf ("%08X", Temp32); + + ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); + AcpiOsPrintf ("%08X ", Temp32); + break; + } + + j += Display; + } + + /* + * Print the ASCII equivalent characters but watch out for the bad + * unprintable ones (printable chars are 0x20 through 0x7E) + */ + AcpiOsPrintf (" "); + for (j = 0; j < 16; j++) + { + if (i + j >= Count) + { + AcpiOsPrintf ("\n"); + return; + } + + BufChar = Buffer[(ACPI_SIZE) i + j]; + if (ACPI_IS_PRINT (BufChar)) + { + AcpiOsPrintf ("%c", BufChar); + } + else + { + AcpiOsPrintf ("."); + } + } + + /* Done with that line. */ + + AcpiOsPrintf ("\n"); + i += 16; + } + + return; +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtDebugDumpBuffer + * + * PARAMETERS: Buffer - Buffer to dump + * Count - Amount to dump, in bytes + * Display - BYTE, WORD, DWORD, or QWORD display: + * DB_BYTE_DISPLAY + * DB_WORD_DISPLAY + * DB_DWORD_DISPLAY + * DB_QWORD_DISPLAY + * ComponentID - Caller's component ID + * + * RETURN: None + * + * DESCRIPTION: Generic dump buffer in both hex and ascii. + * + ******************************************************************************/ + +void +AcpiUtDebugDumpBuffer ( + UINT8 *Buffer, + UINT32 Count, + UINT32 Display, + UINT32 ComponentId) +{ + + /* Only dump the buffer if tracing is enabled */ + + if (!((ACPI_LV_TABLES & AcpiDbgLevel) && + (ComponentId & AcpiDbgLayer))) + { + return; + } + + AcpiUtDumpBuffer (Buffer, Count, Display, 0); +} diff --git a/source/components/utilities/utcopy.c b/source/components/utilities/utcopy.c index 13ffdb2..a251c06 100644 --- a/source/components/utilities/utcopy.c +++ b/source/components/utilities/utcopy.c @@ -172,7 +172,6 @@ AcpiUtCopyIsimpleToEsimple ( (ACPI_SIZE) InternalObject->String.Length + 1); break; - case ACPI_TYPE_BUFFER: ExternalObject->Buffer.Pointer = DataSpace; @@ -185,13 +184,11 @@ AcpiUtCopyIsimpleToEsimple ( InternalObject->Buffer.Length); break; - case ACPI_TYPE_INTEGER: ExternalObject->Integer.Value = InternalObject->Integer.Value; break; - case ACPI_TYPE_LOCAL_REFERENCE: /* This is an object reference. */ @@ -199,7 +196,6 @@ AcpiUtCopyIsimpleToEsimple ( switch (InternalObject->Reference.Class) { case ACPI_REFCLASS_NAME: - /* * For namepath, return the object handle ("reference") * We are referring to the namespace node @@ -218,7 +214,6 @@ AcpiUtCopyIsimpleToEsimple ( } break; - case ACPI_TYPE_PROCESSOR: ExternalObject->Processor.ProcId = @@ -229,7 +224,6 @@ AcpiUtCopyIsimpleToEsimple ( InternalObject->Processor.Length; break; - case ACPI_TYPE_POWER: ExternalObject->PowerResource.SystemLevel = @@ -239,7 +233,6 @@ AcpiUtCopyIsimpleToEsimple ( InternalObject->PowerResource.ResourceOrder; break; - default: /* * There is no corresponding external object type @@ -291,7 +284,6 @@ AcpiUtCopyIelementToEelement ( switch (ObjectType) { case ACPI_COPY_TYPE_SIMPLE: - /* * This is a simple or null object */ @@ -303,9 +295,7 @@ AcpiUtCopyIelementToEelement ( } break; - case ACPI_COPY_TYPE_PACKAGE: - /* * Build the package object */ @@ -328,8 +318,8 @@ AcpiUtCopyIelementToEelement ( sizeof (ACPI_OBJECT)); break; - default: + return (AE_BAD_PARAMETER); } @@ -514,6 +504,7 @@ AcpiUtCopyEsimpleToIsimple ( return_ACPI_STATUS (AE_OK); default: + /* All other types are not supported */ ACPI_ERROR ((AE_INFO, @@ -546,7 +537,6 @@ AcpiUtCopyEsimpleToIsimple ( InternalObject->String.Length = ExternalObject->String.Length; break; - case ACPI_TYPE_BUFFER: InternalObject->Buffer.Pointer = @@ -567,7 +557,6 @@ AcpiUtCopyEsimpleToIsimple ( InternalObject->Buffer.Flags |= AOPOBJ_DATA_VALID; break; - case ACPI_TYPE_INTEGER: InternalObject->Integer.Value = ExternalObject->Integer.Value; @@ -582,7 +571,9 @@ AcpiUtCopyEsimpleToIsimple ( break; default: + /* Other types can't get here */ + break; } @@ -855,7 +846,9 @@ AcpiUtCopySimpleObject ( break; default: + /* Nothing to do for other simple objects */ + break; } @@ -929,9 +922,7 @@ AcpiUtCopyIelementToIelement ( } break; - case ACPI_COPY_TYPE_PACKAGE: - /* * This object is a package - go down another nesting level * Create and build the package object @@ -953,8 +944,8 @@ AcpiUtCopyIelementToIelement ( *ThisTargetPtr = TargetObject; break; - default: + return (AE_BAD_PARAMETER); } diff --git a/source/components/utilities/utdebug.c b/source/components/utilities/utdebug.c index 9e749fb..e879967 100644 --- a/source/components/utilities/utdebug.c +++ b/source/components/utilities/utdebug.c @@ -1,6 +1,6 @@ /****************************************************************************** * - * Module Name: utdebug - Debug print routines + * Module Name: utdebug - Debug print/trace routines * *****************************************************************************/ @@ -613,168 +613,3 @@ AcpiUtPtrExit ( } #endif - - -/******************************************************************************* - * - * FUNCTION: AcpiUtDumpBuffer - * - * PARAMETERS: Buffer - Buffer to dump - * Count - Amount to dump, in bytes - * Display - BYTE, WORD, DWORD, or QWORD display - * Offset - Beginning buffer offset (display only) - * - * RETURN: None - * - * DESCRIPTION: Generic dump buffer in both hex and ascii. - * - ******************************************************************************/ - -void -AcpiUtDumpBuffer ( - UINT8 *Buffer, - UINT32 Count, - UINT32 Display, - UINT32 BaseOffset) -{ - UINT32 i = 0; - UINT32 j; - UINT32 Temp32; - UINT8 BufChar; - - - if (!Buffer) - { - AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n"); - return; - } - - if ((Count < 4) || (Count & 0x01)) - { - Display = DB_BYTE_DISPLAY; - } - - /* Nasty little dump buffer routine! */ - - while (i < Count) - { - /* Print current offset */ - - AcpiOsPrintf ("%6.4X: ", (BaseOffset + i)); - - /* Print 16 hex chars */ - - for (j = 0; j < 16;) - { - if (i + j >= Count) - { - /* Dump fill spaces */ - - AcpiOsPrintf ("%*s", ((Display * 2) + 1), " "); - j += Display; - continue; - } - - switch (Display) - { - case DB_BYTE_DISPLAY: - default: /* Default is BYTE display */ - - AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]); - break; - - - case DB_WORD_DISPLAY: - - ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); - AcpiOsPrintf ("%04X ", Temp32); - break; - - - case DB_DWORD_DISPLAY: - - ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); - AcpiOsPrintf ("%08X ", Temp32); - break; - - - case DB_QWORD_DISPLAY: - - ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]); - AcpiOsPrintf ("%08X", Temp32); - - ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]); - AcpiOsPrintf ("%08X ", Temp32); - break; - } - - j += Display; - } - - /* - * Print the ASCII equivalent characters but watch out for the bad - * unprintable ones (printable chars are 0x20 through 0x7E) - */ - AcpiOsPrintf (" "); - for (j = 0; j < 16; j++) - { - if (i + j >= Count) - { - AcpiOsPrintf ("\n"); - return; - } - - BufChar = Buffer[(ACPI_SIZE) i + j]; - if (ACPI_IS_PRINT (BufChar)) - { - AcpiOsPrintf ("%c", BufChar); - } - else - { - AcpiOsPrintf ("."); - } - } - - /* Done with that line. */ - - AcpiOsPrintf ("\n"); - i += 16; - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: AcpiUtDebugDumpBuffer - * - * PARAMETERS: Buffer - Buffer to dump - * Count - Amount to dump, in bytes - * Display - BYTE, WORD, DWORD, or QWORD display - * ComponentID - Caller's component ID - * - * RETURN: None - * - * DESCRIPTION: Generic dump buffer in both hex and ascii. - * - ******************************************************************************/ - -void -AcpiUtDebugDumpBuffer ( - UINT8 *Buffer, - UINT32 Count, - UINT32 Display, - UINT32 ComponentId) -{ - - /* Only dump the buffer if tracing is enabled */ - - if (!((ACPI_LV_TABLES & AcpiDbgLevel) && - (ComponentId & AcpiDbgLayer))) - { - return; - } - - AcpiUtDumpBuffer (Buffer, Count, Display, 0); -} diff --git a/source/components/utilities/utdelete.c b/source/components/utilities/utdelete.c index f18d556..5047bc1 100644 --- a/source/components/utilities/utdelete.c +++ b/source/components/utilities/utdelete.c @@ -118,7 +118,6 @@ AcpiUtDeleteInternalObj ( } break; - case ACPI_TYPE_BUFFER: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** Buffer %p, ptr %p\n", @@ -134,7 +133,6 @@ AcpiUtDeleteInternalObj ( } break; - case ACPI_TYPE_PACKAGE: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, " **** Package of count %X\n", @@ -150,7 +148,6 @@ AcpiUtDeleteInternalObj ( ObjPointer = Object->Package.Elements; break; - /* * These objects have a possible list of notify handlers. * Device object also may have a GPE block. @@ -178,7 +175,6 @@ AcpiUtDeleteInternalObj ( } break; - case ACPI_TYPE_MUTEX: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, @@ -202,7 +198,6 @@ AcpiUtDeleteInternalObj ( } break; - case ACPI_TYPE_EVENT: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, @@ -213,7 +208,6 @@ AcpiUtDeleteInternalObj ( Object->Event.OsSemaphore = NULL; break; - case ACPI_TYPE_METHOD: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, @@ -229,7 +223,6 @@ AcpiUtDeleteInternalObj ( } break; - case ACPI_TYPE_REGION: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, @@ -298,7 +291,6 @@ AcpiUtDeleteInternalObj ( } break; - case ACPI_TYPE_BUFFER_FIELD: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, @@ -311,7 +303,6 @@ AcpiUtDeleteInternalObj ( } break; - case ACPI_TYPE_LOCAL_BANK_FIELD: ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, @@ -324,8 +315,8 @@ AcpiUtDeleteInternalObj ( } break; - default: + break; } @@ -557,7 +548,6 @@ AcpiUtUpdateObjectReference ( case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_POWER: case ACPI_TYPE_THERMAL: - /* * Update the notify objects for these types (if present) * Two lists, system and device notify handlers. @@ -668,6 +658,7 @@ AcpiUtUpdateObjectReference ( case ACPI_TYPE_REGION: default: + break; /* No subobjects for all other types */ } diff --git a/source/components/utilities/uterror.c b/source/components/utilities/uterror.c new file mode 100644 index 0000000..73e2568 --- /dev/null +++ b/source/components/utilities/uterror.c @@ -0,0 +1,327 @@ +/******************************************************************************* + * + * Module Name: uterror - Various internal error/warning output functions + * + ******************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#define __UTERROR_C__ + +#include "acpi.h" +#include "accommon.h" +#include "acnamesp.h" + + +#define _COMPONENT ACPI_UTILITIES + ACPI_MODULE_NAME ("uterror") + + +/* + * This module contains internal error functions that may + * be configured out. + */ +#if !defined (ACPI_NO_ERROR_MESSAGES) + +/******************************************************************************* + * + * FUNCTION: AcpiUtPredefinedWarning + * + * PARAMETERS: ModuleName - Caller's module name (for error output) + * LineNumber - Caller's line number (for error output) + * Pathname - Full pathname to the node + * NodeFlags - From Namespace node for the method/object + * Format - Printf format string + additional args + * + * RETURN: None + * + * DESCRIPTION: Warnings for the predefined validation module. Messages are + * only emitted the first time a problem with a particular + * method/object is detected. This prevents a flood of error + * messages for methods that are repeatedly evaluated. + * + ******************************************************************************/ + +void ACPI_INTERNAL_VAR_XFACE +AcpiUtPredefinedWarning ( + const char *ModuleName, + UINT32 LineNumber, + char *Pathname, + UINT8 NodeFlags, + const char *Format, + ...) +{ + va_list ArgList; + + + /* + * Warning messages for this method/object will be disabled after the + * first time a validation fails or an object is successfully repaired. + */ + if (NodeFlags & ANOBJ_EVALUATED) + { + return; + } + + AcpiOsPrintf (ACPI_MSG_WARNING "%s: ", Pathname); + + va_start (ArgList, Format); + AcpiOsVprintf (Format, ArgList); + ACPI_MSG_SUFFIX; + va_end (ArgList); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtPredefinedInfo + * + * PARAMETERS: ModuleName - Caller's module name (for error output) + * LineNumber - Caller's line number (for error output) + * Pathname - Full pathname to the node + * NodeFlags - From Namespace node for the method/object + * Format - Printf format string + additional args + * + * RETURN: None + * + * DESCRIPTION: Info messages for the predefined validation module. Messages + * are only emitted the first time a problem with a particular + * method/object is detected. This prevents a flood of + * messages for methods that are repeatedly evaluated. + * + ******************************************************************************/ + +void ACPI_INTERNAL_VAR_XFACE +AcpiUtPredefinedInfo ( + const char *ModuleName, + UINT32 LineNumber, + char *Pathname, + UINT8 NodeFlags, + const char *Format, + ...) +{ + va_list ArgList; + + + /* + * Warning messages for this method/object will be disabled after the + * first time a validation fails or an object is successfully repaired. + */ + if (NodeFlags & ANOBJ_EVALUATED) + { + return; + } + + AcpiOsPrintf (ACPI_MSG_INFO "%s: ", Pathname); + + va_start (ArgList, Format); + AcpiOsVprintf (Format, ArgList); + ACPI_MSG_SUFFIX; + va_end (ArgList); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtPredefinedBiosError + * + * PARAMETERS: ModuleName - Caller's module name (for error output) + * LineNumber - Caller's line number (for error output) + * Pathname - Full pathname to the node + * NodeFlags - From Namespace node for the method/object + * Format - Printf format string + additional args + * + * RETURN: None + * + * DESCRIPTION: BIOS error message for predefined names. Messages + * are only emitted the first time a problem with a particular + * method/object is detected. This prevents a flood of + * messages for methods that are repeatedly evaluated. + * + ******************************************************************************/ + +void ACPI_INTERNAL_VAR_XFACE +AcpiUtPredefinedBiosError ( + const char *ModuleName, + UINT32 LineNumber, + char *Pathname, + UINT8 NodeFlags, + const char *Format, + ...) +{ + va_list ArgList; + + + /* + * Warning messages for this method/object will be disabled after the + * first time a validation fails or an object is successfully repaired. + */ + if (NodeFlags & ANOBJ_EVALUATED) + { + return; + } + + AcpiOsPrintf (ACPI_MSG_BIOS_ERROR "%s: ", Pathname); + + va_start (ArgList, Format); + AcpiOsVprintf (Format, ArgList); + ACPI_MSG_SUFFIX; + va_end (ArgList); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtNamespaceError + * + * PARAMETERS: ModuleName - Caller's module name (for error output) + * LineNumber - Caller's line number (for error output) + * InternalName - Name or path of the namespace node + * LookupStatus - Exception code from NS lookup + * + * RETURN: None + * + * DESCRIPTION: Print error message with the full pathname for the NS node. + * + ******************************************************************************/ + +void +AcpiUtNamespaceError ( + const char *ModuleName, + UINT32 LineNumber, + const char *InternalName, + ACPI_STATUS LookupStatus) +{ + ACPI_STATUS Status; + UINT32 BadName; + char *Name = NULL; + + + ACPI_MSG_REDIRECT_BEGIN; + AcpiOsPrintf (ACPI_MSG_ERROR); + + if (LookupStatus == AE_BAD_CHARACTER) + { + /* There is a non-ascii character in the name */ + + ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName)); + AcpiOsPrintf ("[0x%.8X] (NON-ASCII)", BadName); + } + else + { + /* Convert path to external format */ + + Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, + InternalName, NULL, &Name); + + /* Print target name */ + + if (ACPI_SUCCESS (Status)) + { + AcpiOsPrintf ("[%s]", Name); + } + else + { + AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]"); + } + + if (Name) + { + ACPI_FREE (Name); + } + } + + AcpiOsPrintf (" Namespace lookup failure, %s", + AcpiFormatException (LookupStatus)); + + ACPI_MSG_SUFFIX; + ACPI_MSG_REDIRECT_END; +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtMethodError + * + * PARAMETERS: ModuleName - Caller's module name (for error output) + * LineNumber - Caller's line number (for error output) + * Message - Error message to use on failure + * PrefixNode - Prefix relative to the path + * Path - Path to the node (optional) + * MethodStatus - Execution status + * + * RETURN: None + * + * DESCRIPTION: Print error message with the full pathname for the method. + * + ******************************************************************************/ + +void +AcpiUtMethodError ( + const char *ModuleName, + UINT32 LineNumber, + const char *Message, + ACPI_NAMESPACE_NODE *PrefixNode, + const char *Path, + ACPI_STATUS MethodStatus) +{ + ACPI_STATUS Status; + ACPI_NAMESPACE_NODE *Node = PrefixNode; + + + ACPI_MSG_REDIRECT_BEGIN; + AcpiOsPrintf (ACPI_MSG_ERROR); + + if (Path) + { + Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH, + &Node); + if (ACPI_FAILURE (Status)) + { + AcpiOsPrintf ("[Could not get node by pathname]"); + } + } + + AcpiNsPrintNodePathname (Node, Message); + AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus)); + + ACPI_MSG_SUFFIX; + ACPI_MSG_REDIRECT_END; +} + +#endif /* ACPI_NO_ERROR_MESSAGES */ diff --git a/source/components/utilities/uteval.c b/source/components/utilities/uteval.c index 7fb7ba6..e24f2a2 100644 --- a/source/components/utilities/uteval.c +++ b/source/components/utilities/uteval.c @@ -95,7 +95,7 @@ AcpiUtEvaluateObject ( } Info->PrefixNode = PrefixNode; - Info->Pathname = Path; + Info->RelativePathname = Path; /* Evaluate the object/method */ @@ -136,22 +136,27 @@ AcpiUtEvaluateObject ( switch ((Info->ReturnObject)->Common.Type) { case ACPI_TYPE_INTEGER: + ReturnBtype = ACPI_BTYPE_INTEGER; break; case ACPI_TYPE_BUFFER: + ReturnBtype = ACPI_BTYPE_BUFFER; break; case ACPI_TYPE_STRING: + ReturnBtype = ACPI_BTYPE_STRING; break; case ACPI_TYPE_PACKAGE: + ReturnBtype = ACPI_BTYPE_PACKAGE; break; default: + ReturnBtype = 0; break; } diff --git a/source/components/utilities/utexcep.c b/source/components/utilities/utexcep.c index 1aead78..75258d9 100644 --- a/source/components/utilities/utexcep.c +++ b/source/components/utilities/utexcep.c @@ -167,6 +167,7 @@ AcpiUtValidateException ( break; default: + break; } diff --git a/source/components/utilities/utids.c b/source/components/utilities/utids.c index 86c8a64..831875b 100644 --- a/source/components/utilities/utids.c +++ b/source/components/utilities/utids.c @@ -375,14 +375,17 @@ AcpiUtExecute_CID ( switch (CidObjects[i]->Common.Type) { case ACPI_TYPE_INTEGER: + StringAreaSize += ACPI_EISAID_STRING_SIZE; break; case ACPI_TYPE_STRING: + StringAreaSize += CidObjects[i]->String.Length + 1; break; default: + Status = AE_TYPE; goto Cleanup; } diff --git a/source/components/utilities/utmisc.c b/source/components/utilities/utmisc.c index 84fec46..6553d28 100644 --- a/source/components/utilities/utmisc.c +++ b/source/components/utilities/utmisc.c @@ -429,10 +429,12 @@ AcpiUtDisplayInitPathname ( switch (Type) { case ACPI_TYPE_METHOD: + AcpiOsPrintf ("Executing "); break; default: + AcpiOsPrintf ("Initializing "); break; } diff --git a/source/components/utilities/utobject.c b/source/components/utilities/utobject.c index a219798..32b31d3 100644 --- a/source/components/utilities/utobject.c +++ b/source/components/utilities/utobject.c @@ -140,6 +140,7 @@ AcpiUtCreateInternalObjectDbg ( break; default: + /* All others have no secondary object */ break; } @@ -397,6 +398,7 @@ AcpiUtValidInternalObject ( return (TRUE); default: + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p is not not an ACPI operand obj [%s]\n", Object, AcpiUtGetDescriptorName (Object))); @@ -556,13 +558,11 @@ AcpiUtGetSimpleObjectSize ( Length += (ACPI_SIZE) InternalObject->String.Length + 1; break; - case ACPI_TYPE_BUFFER: Length += (ACPI_SIZE) InternalObject->Buffer.Length; break; - case ACPI_TYPE_INTEGER: case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_POWER: @@ -571,13 +571,11 @@ AcpiUtGetSimpleObjectSize ( break; - case ACPI_TYPE_LOCAL_REFERENCE: switch (InternalObject->Reference.Class) { case ACPI_REFCLASS_NAME: - /* * Get the actual length of the full pathname to this object. * The reference will be converted to the pathname to the object @@ -592,7 +590,6 @@ AcpiUtGetSimpleObjectSize ( break; default: - /* * No other reference opcodes are supported. * Notably, Locals and Args are not supported, but this may be @@ -607,7 +604,6 @@ AcpiUtGetSimpleObjectSize ( } break; - default: ACPI_ERROR ((AE_INFO, "Cannot convert to external object - " @@ -656,7 +652,6 @@ AcpiUtGetElementLength ( switch (ObjectType) { case ACPI_COPY_TYPE_SIMPLE: - /* * Simple object - just get the size (Null object/entry is handled * here also) and sum it into the running package length @@ -670,7 +665,6 @@ AcpiUtGetElementLength ( Info->Length += ObjectSpace; break; - case ACPI_COPY_TYPE_PACKAGE: /* Package object - nothing much to do here, let the walk handle it */ @@ -679,7 +673,6 @@ AcpiUtGetElementLength ( State->Pkg.ThisTargetObj = NULL; break; - default: /* No other types allowed */ diff --git a/source/components/utilities/utosi.c b/source/components/utilities/utosi.c index 81d648b..21fe51b 100644 --- a/source/components/utilities/utosi.c +++ b/source/components/utilities/utosi.c @@ -392,7 +392,8 @@ AcpiUtOsiImplementation ( Status = AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); if (ACPI_FAILURE (Status)) { - return (Status); + AcpiUtRemoveReference (ReturnDesc); + return_ACPI_STATUS (Status); } /* Lookup the interface in the global _OSI list */ diff --git a/source/components/utilities/utpredef.c b/source/components/utilities/utpredef.c index 4d85497..114abdb 100644 --- a/source/components/utilities/utpredef.c +++ b/source/components/utilities/utpredef.c @@ -166,6 +166,12 @@ AcpiUtGetExpectedReturnTypes ( UINT32 j; + if (!ExpectedBtypes) + { + ACPI_STRCPY (Buffer, "NONE"); + return; + } + j = 1; Buffer[0] = 0; ThisRtype = ACPI_RTYPE_INTEGER; @@ -373,9 +379,7 @@ AcpiUtGetArgumentTypes ( /* First field in the types list is the count of args to follow */ - ArgCount = (ArgumentTypes & METHOD_ARG_MASK); - ArgumentTypes >>= METHOD_ARG_BIT_WIDTH; - + ArgCount = METHOD_GET_ARG_COUNT (ArgumentTypes); if (ArgCount > METHOD_PREDEF_ARGS_MAX) { printf ("**** Invalid argument count (%u) " @@ -387,7 +391,8 @@ AcpiUtGetArgumentTypes ( for (i = 0; i < ArgCount; i++) { - ThisArgumentType = (ArgumentTypes & METHOD_ARG_MASK); + ThisArgumentType = METHOD_GET_NEXT_TYPE (ArgumentTypes); + if (!ThisArgumentType || (ThisArgumentType > METHOD_MAX_ARG_TYPE)) { printf ("**** Invalid argument type (%u) " @@ -396,10 +401,6 @@ AcpiUtGetArgumentTypes ( } strcat (Buffer, UtExternalTypeNames[ThisArgumentType] + SubIndex); - - /* Shift to next argument type field */ - - ArgumentTypes >>= METHOD_ARG_BIT_WIDTH; SubIndex = 0; } diff --git a/source/components/utilities/utstring.c b/source/components/utilities/utstring.c index 4d35429..9e58908 100644 --- a/source/components/utilities/utstring.c +++ b/source/components/utilities/utstring.c @@ -220,10 +220,13 @@ AcpiUtStrtoul64 ( { case ACPI_ANY_BASE: case 16: + break; default: + /* Invalid Base */ + return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -423,36 +426,44 @@ AcpiUtPrintString ( switch (String[i]) { case 0x07: + AcpiOsPrintf ("\\a"); /* BELL */ break; case 0x08: + AcpiOsPrintf ("\\b"); /* BACKSPACE */ break; case 0x0C: + AcpiOsPrintf ("\\f"); /* FORMFEED */ break; case 0x0A: + AcpiOsPrintf ("\\n"); /* LINEFEED */ break; case 0x0D: + AcpiOsPrintf ("\\r"); /* CARRIAGE RETURN*/ break; case 0x09: + AcpiOsPrintf ("\\t"); /* HORIZONTAL TAB */ break; case 0x0B: + AcpiOsPrintf ("\\v"); /* VERTICAL TAB */ break; case '\'': /* Single Quote */ case '\"': /* Double Quote */ case '\\': /* Backslash */ + AcpiOsPrintf ("\\%c", (int) String[i]); break; @@ -530,7 +541,8 @@ AcpiUtValidAcpiChar ( * * FUNCTION: AcpiUtValidAcpiName * - * PARAMETERS: Name - The name to be examined + * PARAMETERS: Name - The name to be examined. Does not have to + * be NULL terminated string. * * RETURN: TRUE if the name is valid, FALSE otherwise * @@ -543,7 +555,7 @@ AcpiUtValidAcpiChar ( BOOLEAN AcpiUtValidAcpiName ( - UINT32 Name) + char *Name) { UINT32 i; @@ -553,7 +565,7 @@ AcpiUtValidAcpiName ( for (i = 0; i < ACPI_NAME_SIZE; i++) { - if (!AcpiUtValidAcpiChar ((ACPI_CAST_PTR (char, &Name))[i], i)) + if (!AcpiUtValidAcpiChar (Name[i], i)) { return (FALSE); } diff --git a/source/components/utilities/uttrack.c b/source/components/utilities/uttrack.c index c7484ec..6cf9bdf 100644 --- a/source/components/utilities/uttrack.c +++ b/source/components/utilities/uttrack.c @@ -675,6 +675,7 @@ AcpiUtDumpAllocations ( switch (ACPI_GET_DESCRIPTOR_TYPE (Descriptor)) { case ACPI_DESC_TYPE_OPERAND: + if (Element->Size == sizeof (ACPI_OPERAND_OBJECT)) { DescriptorType = ACPI_DESC_TYPE_OPERAND; @@ -682,6 +683,7 @@ AcpiUtDumpAllocations ( break; case ACPI_DESC_TYPE_PARSER: + if (Element->Size == sizeof (ACPI_PARSE_OBJECT)) { DescriptorType = ACPI_DESC_TYPE_PARSER; @@ -689,6 +691,7 @@ AcpiUtDumpAllocations ( break; case ACPI_DESC_TYPE_NAMED: + if (Element->Size == sizeof (ACPI_NAMESPACE_NODE)) { DescriptorType = ACPI_DESC_TYPE_NAMED; @@ -696,6 +699,7 @@ AcpiUtDumpAllocations ( break; default: + break; } @@ -704,22 +708,26 @@ AcpiUtDumpAllocations ( switch (DescriptorType) { case ACPI_DESC_TYPE_OPERAND: + AcpiOsPrintf ("%12.12s RefCount 0x%04X\n", AcpiUtGetTypeName (Descriptor->Object.Common.Type), Descriptor->Object.Common.ReferenceCount); break; case ACPI_DESC_TYPE_PARSER: + AcpiOsPrintf ("AmlOpcode 0x%04hX\n", Descriptor->Op.Asl.AmlOpcode); break; case ACPI_DESC_TYPE_NAMED: + AcpiOsPrintf ("%4.4s\n", AcpiUtGetNodeName (&Descriptor->Node)); break; default: + AcpiOsPrintf ( "\n"); break; } diff --git a/source/components/utilities/utxferror.c b/source/components/utilities/utxferror.c index 7a7afdb..a01b5b0 100644 --- a/source/components/utilities/utxferror.c +++ b/source/components/utilities/utxferror.c @@ -45,7 +45,6 @@ #include "acpi.h" #include "accommon.h" -#include "acnamesp.h" #define _COMPONENT ACPI_UTILITIES @@ -54,48 +53,7 @@ /* * This module is used for the in-kernel ACPICA as well as the ACPICA * tools/applications. - * - * For the iASL compiler case, the output is redirected to stderr so that - * any of the various ACPI errors and warnings do not appear in the output - * files, for either the compiler or disassembler portions of the tool. */ -#ifdef ACPI_ASL_COMPILER -#include - -extern FILE *AcpiGbl_OutputFile; - -#define ACPI_MSG_REDIRECT_BEGIN \ - FILE *OutputFile = AcpiGbl_OutputFile; \ - AcpiOsRedirectOutput (stderr); - -#define ACPI_MSG_REDIRECT_END \ - AcpiOsRedirectOutput (OutputFile); - -#else -/* - * non-iASL case - no redirection, nothing to do - */ -#define ACPI_MSG_REDIRECT_BEGIN -#define ACPI_MSG_REDIRECT_END -#endif - -/* - * Common message prefixes - */ -#define ACPI_MSG_ERROR "ACPI Error: " -#define ACPI_MSG_EXCEPTION "ACPI Exception: " -#define ACPI_MSG_WARNING "ACPI Warning: " -#define ACPI_MSG_INFO "ACPI: " - -#define ACPI_MSG_BIOS_ERROR "ACPI BIOS Bug: Error: " -#define ACPI_MSG_BIOS_WARNING "ACPI BIOS Bug: Warning: " - -/* - * Common message suffix - */ -#define ACPI_MSG_SUFFIX \ - AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber) - /******************************************************************************* * @@ -331,229 +289,3 @@ AcpiBiosWarning ( } ACPI_EXPORT_SYMBOL (AcpiBiosWarning) - - -/* - * The remainder of this module contains internal error functions that may - * be configured out. - */ -#if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP) - -/******************************************************************************* - * - * FUNCTION: AcpiUtPredefinedWarning - * - * PARAMETERS: ModuleName - Caller's module name (for error output) - * LineNumber - Caller's line number (for error output) - * Pathname - Full pathname to the node - * NodeFlags - From Namespace node for the method/object - * Format - Printf format string + additional args - * - * RETURN: None - * - * DESCRIPTION: Warnings for the predefined validation module. Messages are - * only emitted the first time a problem with a particular - * method/object is detected. This prevents a flood of error - * messages for methods that are repeatedly evaluated. - * - ******************************************************************************/ - -void ACPI_INTERNAL_VAR_XFACE -AcpiUtPredefinedWarning ( - const char *ModuleName, - UINT32 LineNumber, - char *Pathname, - UINT8 NodeFlags, - const char *Format, - ...) -{ - va_list ArgList; - - - /* - * Warning messages for this method/object will be disabled after the - * first time a validation fails or an object is successfully repaired. - */ - if (NodeFlags & ANOBJ_EVALUATED) - { - return; - } - - AcpiOsPrintf (ACPI_MSG_WARNING "For %s: ", Pathname); - - va_start (ArgList, Format); - AcpiOsVprintf (Format, ArgList); - ACPI_MSG_SUFFIX; - va_end (ArgList); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiUtPredefinedInfo - * - * PARAMETERS: ModuleName - Caller's module name (for error output) - * LineNumber - Caller's line number (for error output) - * Pathname - Full pathname to the node - * NodeFlags - From Namespace node for the method/object - * Format - Printf format string + additional args - * - * RETURN: None - * - * DESCRIPTION: Info messages for the predefined validation module. Messages - * are only emitted the first time a problem with a particular - * method/object is detected. This prevents a flood of - * messages for methods that are repeatedly evaluated. - * - ******************************************************************************/ - -void ACPI_INTERNAL_VAR_XFACE -AcpiUtPredefinedInfo ( - const char *ModuleName, - UINT32 LineNumber, - char *Pathname, - UINT8 NodeFlags, - const char *Format, - ...) -{ - va_list ArgList; - - - /* - * Warning messages for this method/object will be disabled after the - * first time a validation fails or an object is successfully repaired. - */ - if (NodeFlags & ANOBJ_EVALUATED) - { - return; - } - - AcpiOsPrintf (ACPI_MSG_INFO "For %s: ", Pathname); - - va_start (ArgList, Format); - AcpiOsVprintf (Format, ArgList); - ACPI_MSG_SUFFIX; - va_end (ArgList); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiUtNamespaceError - * - * PARAMETERS: ModuleName - Caller's module name (for error output) - * LineNumber - Caller's line number (for error output) - * InternalName - Name or path of the namespace node - * LookupStatus - Exception code from NS lookup - * - * RETURN: None - * - * DESCRIPTION: Print error message with the full pathname for the NS node. - * - ******************************************************************************/ - -void -AcpiUtNamespaceError ( - const char *ModuleName, - UINT32 LineNumber, - const char *InternalName, - ACPI_STATUS LookupStatus) -{ - ACPI_STATUS Status; - UINT32 BadName; - char *Name = NULL; - - - ACPI_MSG_REDIRECT_BEGIN; - AcpiOsPrintf (ACPI_MSG_ERROR); - - if (LookupStatus == AE_BAD_CHARACTER) - { - /* There is a non-ascii character in the name */ - - ACPI_MOVE_32_TO_32 (&BadName, ACPI_CAST_PTR (UINT32, InternalName)); - AcpiOsPrintf ("[0x%.8X] (NON-ASCII)", BadName); - } - else - { - /* Convert path to external format */ - - Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, - InternalName, NULL, &Name); - - /* Print target name */ - - if (ACPI_SUCCESS (Status)) - { - AcpiOsPrintf ("[%s]", Name); - } - else - { - AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]"); - } - - if (Name) - { - ACPI_FREE (Name); - } - } - - AcpiOsPrintf (" Namespace lookup failure, %s", - AcpiFormatException (LookupStatus)); - - ACPI_MSG_SUFFIX; - ACPI_MSG_REDIRECT_END; -} - - -/******************************************************************************* - * - * FUNCTION: AcpiUtMethodError - * - * PARAMETERS: ModuleName - Caller's module name (for error output) - * LineNumber - Caller's line number (for error output) - * Message - Error message to use on failure - * PrefixNode - Prefix relative to the path - * Path - Path to the node (optional) - * MethodStatus - Execution status - * - * RETURN: None - * - * DESCRIPTION: Print error message with the full pathname for the method. - * - ******************************************************************************/ - -void -AcpiUtMethodError ( - const char *ModuleName, - UINT32 LineNumber, - const char *Message, - ACPI_NAMESPACE_NODE *PrefixNode, - const char *Path, - ACPI_STATUS MethodStatus) -{ - ACPI_STATUS Status; - ACPI_NAMESPACE_NODE *Node = PrefixNode; - - - ACPI_MSG_REDIRECT_BEGIN; - AcpiOsPrintf (ACPI_MSG_ERROR); - - if (Path) - { - Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH, - &Node); - if (ACPI_FAILURE (Status)) - { - AcpiOsPrintf ("[Could not get node by pathname]"); - } - } - - AcpiNsPrintNodePathname (Node, Message); - AcpiOsPrintf (", %s", AcpiFormatException (MethodStatus)); - - ACPI_MSG_SUFFIX; - ACPI_MSG_REDIRECT_END; -} - -#endif /* ACPI_NO_ERROR_MESSAGES */ diff --git a/source/include/acapps.h b/source/include/acapps.h index 8266d49..0d6bf9f 100644 --- a/source/include/acapps.h +++ b/source/include/acapps.h @@ -103,11 +103,18 @@ AcpiGetopt( char **argv, char *opts); +int +AcpiGetoptArgument ( + int argc, + char **argv); + extern int AcpiGbl_Optind; extern int AcpiGbl_Opterr; +extern int AcpiGbl_SubOptChar; extern char *AcpiGbl_Optarg; +#ifndef ACPI_DUMP_APP /* * adisasm */ @@ -212,5 +219,6 @@ AdWriteTable ( UINT32 Length, char *TableName, char *OemTableId); +#endif #endif /* _ACAPPS */ diff --git a/source/include/acconfig.h b/source/include/acconfig.h index 452ab28..6a267fe 100644 --- a/source/include/acconfig.h +++ b/source/include/acconfig.h @@ -223,7 +223,7 @@ * *****************************************************************************/ -#define ACPI_DEBUGGER_MAX_ARGS ACPI_METHOD_NUM_ARGS + 2 /* Max command line arguments */ +#define ACPI_DEBUGGER_MAX_ARGS ACPI_METHOD_NUM_ARGS + 4 /* Max command line arguments */ #define ACPI_DB_LINE_BUFFER_SIZE 512 #define ACPI_DEBUGGER_COMMAND_PROMPT '-' diff --git a/source/include/acglobal.h b/source/include/acglobal.h index 91661d6..32ae55f 100644 --- a/source/include/acglobal.h +++ b/source/include/acglobal.h @@ -134,6 +134,12 @@ UINT8 ACPI_INIT_GLOBAL (AcpiGbl_TruncateIoAddresses, FALSE); */ UINT8 ACPI_INIT_GLOBAL (AcpiGbl_DisableAutoRepair, FALSE); +/* + * Optionally do not load any SSDTs from the RSDT/XSDT during initialization. + * This can be useful for debugging ACPI problems on some machines. + */ +UINT8 ACPI_INIT_GLOBAL (AcpiGbl_DisableSsdtTableLoad, FALSE); + /* AcpiGbl_FADT is a local copy of the FADT, converted to a common format. */ diff --git a/source/include/aclocal.h b/source/include/aclocal.h index f9fefb5..47e7437 100644 --- a/source/include/aclocal.h +++ b/source/include/aclocal.h @@ -414,26 +414,6 @@ typedef union acpi_predefined_info #pragma pack() -/* Data block used during object validation */ - -typedef struct acpi_predefined_data -{ - char *Pathname; - const ACPI_PREDEFINED_INFO *Predefined; - union acpi_operand_object *ParentPackage; - ACPI_NAMESPACE_NODE *Node; - UINT32 Flags; - UINT32 ReturnBtype; - UINT8 NodeFlags; - -} ACPI_PREDEFINED_DATA; - -/* Defines for Flags field above */ - -#define ACPI_OBJECT_REPAIRED 1 -#define ACPI_OBJECT_WRAPPED 2 - - /* Return object auto-repair info */ typedef ACPI_STATUS (*ACPI_OBJECT_CONVERTER) ( diff --git a/source/include/acmacros.h b/source/include/acmacros.h index a56dcd7..28bd2af 100644 --- a/source/include/acmacros.h +++ b/source/include/acmacros.h @@ -377,10 +377,11 @@ * the plist contains a set of parens to allow variable-length lists. * These macros are used for both the debug and non-debug versions of the code. */ -#define ACPI_ERROR_NAMESPACE(s, e) AcpiUtNamespaceError (AE_INFO, s, e); -#define ACPI_ERROR_METHOD(s, n, p, e) AcpiUtMethodError (AE_INFO, s, n, p, e); -#define ACPI_WARN_PREDEFINED(plist) AcpiUtPredefinedWarning plist -#define ACPI_INFO_PREDEFINED(plist) AcpiUtPredefinedInfo plist +#define ACPI_ERROR_NAMESPACE(s, e) AcpiUtNamespaceError (AE_INFO, s, e); +#define ACPI_ERROR_METHOD(s, n, p, e) AcpiUtMethodError (AE_INFO, s, n, p, e); +#define ACPI_WARN_PREDEFINED(plist) AcpiUtPredefinedWarning plist +#define ACPI_INFO_PREDEFINED(plist) AcpiUtPredefinedInfo plist +#define ACPI_BIOS_ERROR_PREDEFINED(plist) AcpiUtPredefinedBiosError plist #else @@ -390,6 +391,7 @@ #define ACPI_ERROR_METHOD(s, n, p, e) #define ACPI_WARN_PREDEFINED(plist) #define ACPI_INFO_PREDEFINED(plist) +#define ACPI_BIOS_ERROR_PREDEFINED(plist) #endif /* ACPI_NO_ERROR_MESSAGES */ diff --git a/source/include/acnamesp.h b/source/include/acnamesp.h index 07b0fe9..1118184 100644 --- a/source/include/acnamesp.h +++ b/source/include/acnamesp.h @@ -286,25 +286,40 @@ AcpiNsExecModuleCodeList ( /* - * nspredef - Support for predefined/reserved names + * nsarguments - Argument count/type checking for predefined/reserved names */ -ACPI_STATUS -AcpiNsCheckPredefinedNames ( - ACPI_NAMESPACE_NODE *Node, - UINT32 UserParamCount, - ACPI_STATUS ReturnStatus, - ACPI_OPERAND_OBJECT **ReturnObject); - void -AcpiNsCheckParameterCount ( +AcpiNsCheckArgumentCount ( char *Pathname, ACPI_NAMESPACE_NODE *Node, UINT32 UserParamCount, const ACPI_PREDEFINED_INFO *Info); +void +AcpiNsCheckAcpiCompliance ( + char *Pathname, + ACPI_NAMESPACE_NODE *Node, + const ACPI_PREDEFINED_INFO *Predefined); + +void +AcpiNsCheckArgumentTypes ( + ACPI_EVALUATE_INFO *Info); + + +/* + * nspredef - Return value checking for predefined/reserved names + */ +ACPI_STATUS +AcpiNsCheckReturnValue ( + ACPI_NAMESPACE_NODE *Node, + ACPI_EVALUATE_INFO *Info, + UINT32 UserParamCount, + ACPI_STATUS ReturnStatus, + ACPI_OPERAND_OBJECT **ReturnObject); + ACPI_STATUS AcpiNsCheckObjectType ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr, UINT32 ExpectedBtypes, UINT32 PackageIndex); @@ -315,7 +330,7 @@ AcpiNsCheckObjectType ( */ ACPI_STATUS AcpiNsCheckPackage ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT **ReturnObjectPtr); @@ -403,27 +418,27 @@ AcpiNsGetAttachedData ( */ ACPI_STATUS AcpiNsSimpleRepair ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, UINT32 ExpectedBtypes, UINT32 PackageIndex, ACPI_OPERAND_OBJECT **ReturnObjectPtr); ACPI_STATUS AcpiNsWrapWithPackage ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_OPERAND_OBJECT *OriginalObject, ACPI_OPERAND_OBJECT **ObjDescPtr); ACPI_STATUS AcpiNsRepairNullElement ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, UINT32 ExpectedBtypes, UINT32 PackageIndex, ACPI_OPERAND_OBJECT **ReturnObjectPtr); void AcpiNsRemoveNullElements ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, UINT8 PackageType, ACPI_OPERAND_OBJECT *ObjDesc); @@ -434,7 +449,7 @@ AcpiNsRemoveNullElements ( */ ACPI_STATUS AcpiNsComplexRepairs ( - ACPI_PREDEFINED_DATA *Data, + ACPI_EVALUATE_INFO *Info, ACPI_NAMESPACE_NODE *Node, ACPI_STATUS ValidateStatus, ACPI_OPERAND_OBJECT **ReturnObjectPtr); diff --git a/source/include/acoutput.h b/source/include/acoutput.h index 371ce7f..e7b1248 100644 --- a/source/include/acoutput.h +++ b/source/include/acoutput.h @@ -435,27 +435,21 @@ * This is the non-debug case -- make everything go away, * leaving no executable debug code! */ -#define ACPI_FUNCTION_NAME(a) #define ACPI_DEBUG_PRINT(pl) #define ACPI_DEBUG_PRINT_RAW(pl) #define ACPI_DEBUG_EXEC(a) #define ACPI_DEBUG_ONLY_MEMBERS(a) +#define ACPI_FUNCTION_NAME(a) #define ACPI_FUNCTION_TRACE(a) #define ACPI_FUNCTION_TRACE_PTR(a, b) #define ACPI_FUNCTION_TRACE_U32(a, b) #define ACPI_FUNCTION_TRACE_STR(a, b) -#define ACPI_FUNCTION_EXIT -#define ACPI_FUNCTION_STATUS_EXIT(s) -#define ACPI_FUNCTION_VALUE_EXIT(s) #define ACPI_FUNCTION_ENTRY() #define ACPI_DUMP_STACK_ENTRY(a) #define ACPI_DUMP_OPERANDS(a, b, c) #define ACPI_DUMP_ENTRY(a, b) -#define ACPI_DUMP_TABLES(a, b) #define ACPI_DUMP_PATHNAME(a, b, c, d) #define ACPI_DUMP_BUFFER(a, b) -#define ACPI_DEBUG_PRINT(pl) -#define ACPI_DEBUG_PRINT_RAW(pl) #define ACPI_IS_DEBUG_ENABLED(Level, Component) 0 /* Return macros must have a return statement at the minimum */ diff --git a/source/include/acpiosxf.h b/source/include/acpiosxf.h index a1acbd1..a1ac1d9 100644 --- a/source/include/acpiosxf.h +++ b/source/include/acpiosxf.h @@ -391,6 +391,28 @@ AcpiOsGetLine ( /* + * Obtain ACPI table(s) + */ +ACPI_STATUS +AcpiOsGetTableByName ( + char *Signature, + UINT32 Instance, + ACPI_TABLE_HEADER **Table, + ACPI_PHYSICAL_ADDRESS *Address); + +ACPI_STATUS +AcpiOsGetTableByIndex ( + UINT32 Index, + ACPI_TABLE_HEADER **Table, + ACPI_PHYSICAL_ADDRESS *Address); + +ACPI_STATUS +AcpiOsGetTableByAddress ( + ACPI_PHYSICAL_ADDRESS Address, + ACPI_TABLE_HEADER **Table); + + +/* * Directory manipulation */ void * diff --git a/source/include/acpixf.h b/source/include/acpixf.h index 405eb36..9f94e52 100644 --- a/source/include/acpixf.h +++ b/source/include/acpixf.h @@ -47,7 +47,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20130328 +#define ACPI_CA_VERSION 0x20130517 #include "acconfig.h" #include "actypes.h" @@ -79,6 +79,7 @@ extern UINT8 AcpiGbl_EnableAmlDebugObject; extern UINT8 AcpiGbl_CopyDsdtLocally; extern UINT8 AcpiGbl_TruncateIoAddresses; extern UINT8 AcpiGbl_DisableAutoRepair; +extern UINT8 AcpiGbl_DisableSsdtTableLoad; /* diff --git a/source/include/acpredef.h b/source/include/acpredef.h index 7a652b5..46f3d69 100644 --- a/source/include/acpredef.h +++ b/source/include/acpredef.h @@ -131,8 +131,8 @@ enum AcpiReturnPackageTypes #define ARG_COUNT_IS_MINIMUM 0x8000 #define METHOD_MAX_ARG_TYPE ACPI_TYPE_PACKAGE -#define METHOD_GET_COUNT(ArgList) (ArgList & METHOD_ARG_MASK) -#define METHOD_GET_NEXT_ARG(ArgList) (ArgList >> METHOD_ARG_BIT_WIDTH) +#define METHOD_GET_ARG_COUNT(ArgList) ((ArgList) & METHOD_ARG_MASK) +#define METHOD_GET_NEXT_TYPE(ArgList) (((ArgList) >>= METHOD_ARG_BIT_WIDTH) & METHOD_ARG_MASK) /* Macros used to build the predefined info table */ diff --git a/source/include/acstruct.h b/source/include/acstruct.h index 8923d81..a6ba5ea 100644 --- a/source/include/acstruct.h +++ b/source/include/acstruct.h @@ -195,27 +195,43 @@ typedef union acpi_aml_operands /* - * Structure used to pass object evaluation parameters. + * Structure used to pass object evaluation information and parameters. * Purpose is to reduce CPU stack use. */ typedef struct acpi_evaluate_info { - ACPI_NAMESPACE_NODE *PrefixNode; - char *Pathname; - ACPI_OPERAND_OBJECT *ObjDesc; - ACPI_OPERAND_OBJECT **Parameters; - ACPI_NAMESPACE_NODE *ResolvedNode; - ACPI_OPERAND_OBJECT *ReturnObject; - UINT8 ParamCount; - UINT8 PassNumber; - UINT8 ReturnObjectType; - UINT8 Flags; + /* The first 3 elements are passed by the caller to AcpiNsEvaluate */ + + ACPI_NAMESPACE_NODE *PrefixNode; /* Input: starting node */ + char *RelativePathname; /* Input: path relative to PrefixNode */ + ACPI_OPERAND_OBJECT **Parameters; /* Input: argument list */ + + ACPI_NAMESPACE_NODE *Node; /* Resolved node (PrefixNode:RelativePathname) */ + ACPI_OPERAND_OBJECT *ObjDesc; /* Object attached to the resolved node */ + char *FullPathname; /* Full pathname of the resolved node */ + + const ACPI_PREDEFINED_INFO *Predefined; /* Used if Node is a predefined name */ + ACPI_OPERAND_OBJECT *ReturnObject; /* Object returned from the evaluation */ + union acpi_operand_object *ParentPackage; /* Used if return object is a Package */ + + UINT32 ReturnFlags; /* Used for return value analysis */ + UINT32 ReturnBtype; /* Bitmapped type of the returned object */ + UINT16 ParamCount; /* Count of the input argument list */ + UINT8 PassNumber; /* Parser pass number */ + UINT8 ReturnObjectType; /* Object type of the returned object */ + UINT8 NodeFlags; /* Same as Node->Flags */ + UINT8 Flags; /* General flags */ } ACPI_EVALUATE_INFO; /* Values for Flags above */ -#define ACPI_IGNORE_RETURN_VALUE 1 +#define ACPI_IGNORE_RETURN_VALUE 1 + +/* Defines for ReturnFlags field above */ + +#define ACPI_OBJECT_REPAIRED 1 +#define ACPI_OBJECT_WRAPPED 2 /* Info used by AcpiNsInitializeDevices */ diff --git a/source/include/actypes.h b/source/include/actypes.h index 9c8ec7d..840c146 100644 --- a/source/include/actypes.h +++ b/source/include/actypes.h @@ -310,6 +310,14 @@ typedef UINT32 ACPI_PHYSICAL_ADDRESS; #define ACPI_EXPORT_SYMBOL(Symbol) #endif +/* + * Compiler/Clibrary-dependent debug initialization. Used for ACPICA + * utilities only. + */ +#ifndef ACPI_DEBUG_INITIALIZE +#define ACPI_DEBUG_INITIALIZE() +#endif + /****************************************************************************** * diff --git a/source/include/acutils.h b/source/include/acutils.h index 52fb049..c79240c 100644 --- a/source/include/acutils.h +++ b/source/include/acutils.h @@ -88,6 +88,49 @@ extern const char *AcpiGbl_FcDecode[]; extern const char *AcpiGbl_PtDecode[]; #endif +/* + * For the iASL compiler case, the output is redirected to stderr so that + * any of the various ACPI errors and warnings do not appear in the output + * files, for either the compiler or disassembler portions of the tool. + */ +#ifdef ACPI_ASL_COMPILER + +#include +extern FILE *AcpiGbl_OutputFile; + +#define ACPI_MSG_REDIRECT_BEGIN \ + FILE *OutputFile = AcpiGbl_OutputFile; \ + AcpiOsRedirectOutput (stderr); + +#define ACPI_MSG_REDIRECT_END \ + AcpiOsRedirectOutput (OutputFile); + +#else +/* + * non-iASL case - no redirection, nothing to do + */ +#define ACPI_MSG_REDIRECT_BEGIN +#define ACPI_MSG_REDIRECT_END +#endif + +/* + * Common error message prefixes + */ +#define ACPI_MSG_ERROR "ACPI Error: " +#define ACPI_MSG_EXCEPTION "ACPI Exception: " +#define ACPI_MSG_WARNING "ACPI Warning: " +#define ACPI_MSG_INFO "ACPI: " + +#define ACPI_MSG_BIOS_ERROR "ACPI BIOS Error (bug): " +#define ACPI_MSG_BIOS_WARNING "ACPI BIOS Warning (bug): " + +/* + * Common message suffix + */ +#define ACPI_MSG_SUFFIX \ + AcpiOsPrintf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, ModuleName, LineNumber) + + /* Types for Resource descriptor entries */ #define ACPI_INVALID_RESOURCE 0 @@ -868,7 +911,7 @@ UtConvertBackslashes ( BOOLEAN AcpiUtValidAcpiName ( - UINT32 Name); + char *Name); BOOLEAN AcpiUtValidAcpiChar ( @@ -1020,6 +1063,15 @@ AcpiUtPredefinedInfo ( const char *Format, ...); +void ACPI_INTERNAL_VAR_XFACE +AcpiUtPredefinedBiosError ( + const char *ModuleName, + UINT32 LineNumber, + char *Pathname, + UINT8 NodeFlags, + const char *Format, + ...); + void AcpiUtNamespaceError ( const char *ModuleName, diff --git a/source/include/platform/acenv.h b/source/include/platform/acenv.h index a9e78a8..8895ceb 100644 --- a/source/include/platform/acenv.h +++ b/source/include/platform/acenv.h @@ -97,10 +97,11 @@ #endif /* - * AcpiBin/AcpiHelp/AcpiSrc configuration. All single threaded, with - * no debug output. + * AcpiBin/AcpiDump/AcpiSrc/AcpiXtract configuration. All single + * threaded, with no debug output. */ #if (defined ACPI_BIN_APP) || \ + (defined ACPI_DUMP_APP) || \ (defined ACPI_SRC_APP) || \ (defined ACPI_XTRACT_APP) #define ACPI_APPLICATION @@ -147,6 +148,9 @@ #if defined(_LINUX) || defined(__linux__) #include "aclinux.h" +#elif defined(_APPLE) || defined(__APPLE__) +#include "acmacosx.h" + #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include "acfreebsd.h" diff --git a/source/include/platform/acmacosx.h b/source/include/platform/acmacosx.h new file mode 100644 index 0000000..91afeb6 --- /dev/null +++ b/source/include/platform/acmacosx.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Name: acmacosx.h - OS specific defines, etc. for Mac OS X + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#ifndef __ACMACOSX_H__ +#define __ACMACOSX_H__ + +#include "aclinux.h" + +#ifdef __APPLE__ +#define sem_destroy sem_close +#define ACPI_USE_ALTERNATE_TIMEOUT +#endif /* __APPLE__ */ + +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wformat-nonliteral" +#endif + +#endif /* __ACMACOSX_H__ */ diff --git a/source/include/platform/acmsvc.h b/source/include/platform/acmsvc.h index 799dfdb..d552f7d 100644 --- a/source/include/platform/acmsvc.h +++ b/source/include/platform/acmsvc.h @@ -146,4 +146,22 @@ #pragma warning( disable : 4295 ) /* needed for acpredef.h array */ #endif + +/* Debug support. Must be last in this file, do not move. */ + +#ifdef _DEBUG +#include + +/* + * Debugging memory corruption issues with windows: + * Add #include to accommon.h if necessary. + * Add _ASSERTE(_CrtCheckMemory()); where needed to test memory integrity. + * This can quickly localize the memory corruption. + */ +#define ACPI_DEBUG_INITIALIZE() \ + _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | \ + _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_CRT_DF | \ + _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) +#endif + #endif /* __ACMSVC_H__ */ diff --git a/source/os_specific/service_layers/oslinuxtbl.c b/source/os_specific/service_layers/oslinuxtbl.c new file mode 100644 index 0000000..2d1be3f --- /dev/null +++ b/source/os_specific/service_layers/oslinuxtbl.c @@ -0,0 +1,137 @@ +/****************************************************************************** + * + * Module Name: oslinuxtbl - Linux OSL for obtaining ACPI tables + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#include "acpi.h" + +#include +#include + +#define _COMPONENT ACPI_OS_SERVICES + ACPI_MODULE_NAME ("oslinuxtbl") + + +/****************************************************************************** + * + * FUNCTION: AcpiOsGetTableByAddress + * + * PARAMETERS: Address - Physical address of the ACPI table + * Table - Where a pointer to the table is returned + * + * RETURN: Status; Table buffer is returned if AE_OK. + * AE_NOT_FOUND: A valid table was not found at the address + * + * DESCRIPTION: Get an ACPI table via a physical memory address. + * + *****************************************************************************/ + +ACPI_STATUS +AcpiOsGetTableByAddress ( + ACPI_PHYSICAL_ADDRESS Address, + ACPI_TABLE_HEADER **Table) +{ + + fprintf (stderr, "Linux version not implemented yet\n"); + return (AE_SUPPORT); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiOsGetTableByIndex + * + * PARAMETERS: Index - Which table to get + * Table - Where a pointer to the table is returned + * Address - Where the table physical address is returned + * + * RETURN: Status; Table buffer and physical address returned if AE_OK. + * AE_LIMIT: Index is beyond valid limit + * + * DESCRIPTION: Get an ACPI table via an index value (0 through n). Returns + * AE_LIMIT when an invalid index is reached. Index is not + * necessarily an index into the RSDT/XSDT. + * + *****************************************************************************/ + +ACPI_STATUS +AcpiOsGetTableByIndex ( + UINT32 Index, + ACPI_TABLE_HEADER **Table, + ACPI_PHYSICAL_ADDRESS *Address) +{ + + fprintf (stderr, "Linux version not implemented yet\n"); + return (AE_SUPPORT); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiOsGetTableByName + * + * PARAMETERS: Signature - ACPI Signature for desired table. Must be + * a null terminated 4-character string. + * Instance - For SSDTs (0...n) + * Table - Where a pointer to the table is returned + * Address - Where the table physical address is returned + * + * RETURN: Status; Table buffer and physical address returned if AE_OK. + * + * RETURN: Status; Table buffer and physical address returned if AE_OK. + * AE_LIMIT: Instance is beyond valid limit + * AE_NOT_FOUND: A table with the signature was not found + * + * NOTE: Assumes the input signature is uppercase. + * + *****************************************************************************/ + +ACPI_STATUS +AcpiOsGetTableByName ( + char *Signature, + UINT32 Instance, + ACPI_TABLE_HEADER **Table, + ACPI_PHYSICAL_ADDRESS *Address) +{ + + fprintf (stderr, "Linux version not implemented yet\n"); + return (AE_SUPPORT); +} diff --git a/source/os_specific/service_layers/osunixxf.c b/source/os_specific/service_layers/osunixxf.c index 2afc54e..f77d70e 100644 --- a/source/os_specific/service_layers/osunixxf.c +++ b/source/os_specific/service_layers/osunixxf.c @@ -45,8 +45,6 @@ /* * These interfaces are required in order to compile the ASL compiler and the * various ACPICA tools under Linux or other Unix-like system. - * - * Note: Use #define __APPLE__ for OS X generation. */ #include "acpi.h" #include "accommon.h" @@ -88,12 +86,6 @@ typedef void* (*PTHREAD_CALLBACK) (void *); #define ACPI_VPRINTF_BUFFER_SIZE 512 -/* Apple-specific */ - -#ifdef __APPLE__ -#define sem_destroy sem_close -#endif - /****************************************************************************** * @@ -1086,18 +1078,22 @@ AcpiOsReadPort ( switch (Width) { case 8: + *Value = 0xFF; break; case 16: + *Value = 0xFFFF; break; case 32: + *Value = 0xFFFFFFFF; break; default: + return (AE_BAD_PARAMETER); } @@ -1158,10 +1154,12 @@ AcpiOsReadMemory ( case 16: case 32: case 64: + *Value = 0; break; default: + return (AE_BAD_PARAMETER); } return (AE_OK); @@ -1261,12 +1259,15 @@ AcpiOsSignal ( switch (Function) { case ACPI_SIGNAL_FATAL: + break; case ACPI_SIGNAL_BREAKPOINT: + break; default: + break; } diff --git a/source/os_specific/service_layers/oswindir.c b/source/os_specific/service_layers/oswindir.c index d7ead1c..dc8916a 100644 --- a/source/os_specific/service_layers/oswindir.c +++ b/source/os_specific/service_layers/oswindir.c @@ -214,6 +214,7 @@ AcpiOsGetNextFilename ( break; default: + return (NULL); } } diff --git a/source/os_specific/service_layers/oswintbl.c b/source/os_specific/service_layers/oswintbl.c index 6dcd554..347927f 100644 --- a/source/os_specific/service_layers/oswintbl.c +++ b/source/os_specific/service_layers/oswintbl.c @@ -41,8 +41,8 @@ * POSSIBILITY OF SUCH DAMAGES. */ - #include "acpi.h" +#include #ifdef WIN32 #pragma warning(disable:4115) /* warning C4115: (caused by rpcasync.h) */ @@ -55,21 +55,57 @@ #define _COMPONENT ACPI_OS_SERVICES ACPI_MODULE_NAME ("oswintbl") +/* Local prototypes */ + +static char * +WindowsFormatException ( + LONG WinStatus); + +/* Globals */ + +#define LOCAL_BUFFER_SIZE 64 + +static char KeyBuffer[LOCAL_BUFFER_SIZE]; +static char ErrorBuffer[LOCAL_BUFFER_SIZE]; + +/* + * Tables supported in the Windows registry. SSDTs are not placed into + * the registry, a limitation. + */ +static char *SupportedTables[] = +{ + "DSDT", + "RSDT", + "FACS", + "FACP" +}; + +/* Max index for table above */ -static char KeyBuffer[64]; -static char ErrorBuffer[64]; +#define ACPI_OS_MAX_TABLE_INDEX 3 -/* Little front-end to win FormatMessage */ +/****************************************************************************** + * + * FUNCTION: WindowsFormatException + * + * PARAMETERS: WinStatus - Status from a Windows system call + * + * RETURN: Formatted (ascii) exception code. Front-end to Windows + * FormatMessage interface. + * + * DESCRIPTION: Decode a windows exception + * + *****************************************************************************/ -char * -OsFormatException ( - LONG Status) +static char * +WindowsFormatException ( + LONG WinStatus) { ErrorBuffer[0] = 0; - FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, Status, 0, - ErrorBuffer, 64, NULL); + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, WinStatus, 0, + ErrorBuffer, LOCAL_BUFFER_SIZE, NULL); return (ErrorBuffer); } @@ -77,31 +113,121 @@ OsFormatException ( /****************************************************************************** * - * FUNCTION: OsGetTable + * FUNCTION: AcpiOsGetTableByAddress + * + * PARAMETERS: Address - Physical address of the ACPI table + * Table - Where a pointer to the table is returned * - * PARAMETERS: Signature - ACPI Signature for desired table. must be - * a null terminated string. + * RETURN: Status; Table buffer is returned if AE_OK. + * AE_NOT_FOUND: A valid table was not found at the address * - * RETURN: Pointer to the table. NULL if failure. + * DESCRIPTION: Get an ACPI table via a physical memory address. * - * DESCRIPTION: Get an ACPI table from the Windows registry. + * NOTE: Cannot be implemented without a Windows device driver. * *****************************************************************************/ -ACPI_TABLE_HEADER * -OsGetTable ( - char *Signature) +ACPI_STATUS +AcpiOsGetTableByAddress ( + ACPI_PHYSICAL_ADDRESS Address, + ACPI_TABLE_HEADER **Table) { - HKEY Handle = NULL; - ULONG i; - LONG Status; - ULONG Type; - ULONG NameSize; - ULONG DataSize; - HKEY SubKey; - ACPI_TABLE_HEADER *ReturnTable; + + fprintf (stderr, "Get table by address is not supported on Windows\n"); + return (AE_SUPPORT); +} +/****************************************************************************** + * + * FUNCTION: AcpiOsGetTableByIndex + * + * PARAMETERS: Index - Which table to get + * Table - Where a pointer to the table is returned + * Address - Where the table physical address is returned + * + * RETURN: Status; Table buffer and physical address returned if AE_OK. + * AE_LIMIT: Index is beyond valid limit + * + * DESCRIPTION: Get an ACPI table via an index value (0 through n). Returns + * AE_LIMIT when an invalid index is reached. Index is not + * necessarily an index into the RSDT/XSDT. + * Table is obtained from the Windows registry. + * + * NOTE: Cannot get the physical address from the windows registry; + * zero is returned instead. + * + *****************************************************************************/ + +ACPI_STATUS +AcpiOsGetTableByIndex ( + UINT32 Index, + ACPI_TABLE_HEADER **Table, + ACPI_PHYSICAL_ADDRESS *Address) +{ + ACPI_STATUS Status; + + + if (Index > ACPI_OS_MAX_TABLE_INDEX) + { + return (AE_LIMIT); + } + + Status = AcpiOsGetTableByName (SupportedTables[Index], 0, Table, Address); + return (Status); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiOsGetTableByName + * + * PARAMETERS: Signature - ACPI Signature for desired table. Must be + * a null terminated 4-character string. + * Instance - For SSDTs (0...n). Use 0 otherwise. + * Table - Where a pointer to the table is returned + * Address - Where the table physical address is returned + * + * RETURN: Status; Table buffer and physical address returned if AE_OK. + * AE_LIMIT: Instance is beyond valid limit + * AE_NOT_FOUND: A table with the signature was not found + * + * DESCRIPTION: Get an ACPI table via a table signature (4 ASCII characters). + * Returns AE_LIMIT when an invalid instance is reached. + * Table is obtained from the Windows registry. + * + * NOTE: Assumes the input signature is uppercase. + * Cannot get the physical address from the windows registry; + * zero is returned instead. + * + *****************************************************************************/ + +ACPI_STATUS +AcpiOsGetTableByName ( + char *Signature, + UINT32 Instance, + ACPI_TABLE_HEADER **Table, + ACPI_PHYSICAL_ADDRESS *Address) +{ + HKEY Handle = NULL; + LONG WinStatus; + ULONG Type; + ULONG NameSize; + ULONG DataSize; + HKEY SubKey; + ULONG i; + ACPI_TABLE_HEADER *ReturnTable; + + + /* + * Windows has no SSDTs in the registry, so multiple instances are + * not supported. + */ + if (Instance > 0) + { + return (AE_LIMIT); + } + /* Get a handle to the table key */ while (1) @@ -109,10 +235,10 @@ OsGetTable ( ACPI_STRCPY (KeyBuffer, "HARDWARE\\ACPI\\"); ACPI_STRCAT (KeyBuffer, Signature); - Status = RegOpenKeyEx (HKEY_LOCAL_MACHINE, KeyBuffer, - 0L, KEY_READ, &Handle); + WinStatus = RegOpenKeyEx (HKEY_LOCAL_MACHINE, KeyBuffer, + 0L, KEY_READ, &Handle); - if (Status != ERROR_SUCCESS) + if (WinStatus != ERROR_SUCCESS) { /* * Somewhere along the way, MS changed the registry entry for @@ -126,12 +252,16 @@ OsGetTable ( { Signature = "FADT"; } + else if (ACPI_COMPARE_NAME (Signature, "XSDT")) + { + Signature = "RSDT"; + } else { - AcpiOsPrintf ( - "Could not find %s in registry at %s: %s (Status=0x%X)\n", - Signature, KeyBuffer, OsFormatException (Status), Status); - return (NULL); + fprintf (stderr, + "Could not find %s in registry at %s: %s (WinStatus=0x%X)\n", + Signature, KeyBuffer, WindowsFormatException (WinStatus), WinStatus); + return (AE_NOT_FOUND); } } else @@ -140,23 +270,23 @@ OsGetTable ( } } - /* Actual data for table is down a couple levels */ + /* Actual data for the table is down a couple levels */ for (i = 0; ;) { - Status = RegEnumKey (Handle, i, KeyBuffer, sizeof (KeyBuffer)); - i += 1; - if (Status == ERROR_NO_MORE_ITEMS) + WinStatus = RegEnumKey (Handle, i, KeyBuffer, sizeof (KeyBuffer)); + i++; + if (WinStatus == ERROR_NO_MORE_ITEMS) { break; } - Status = RegOpenKey (Handle, KeyBuffer, &SubKey); - if (Status != ERROR_SUCCESS) + WinStatus = RegOpenKey (Handle, KeyBuffer, &SubKey); + if (WinStatus != ERROR_SUCCESS) { - AcpiOsPrintf ("Could not open %s entry: %s\n", - Signature, OsFormatException (Status)); - return (NULL); + fprintf (stderr, "Could not open %s entry: %s\n", + Signature, WindowsFormatException (WinStatus)); + return (AE_ERROR); } RegCloseKey (Handle); @@ -166,38 +296,38 @@ OsGetTable ( /* Find the (binary) table entry */ - for (i = 0; ;) + for (i = 0; ; i++) { NameSize = sizeof (KeyBuffer); - Status = RegEnumValue (Handle, i, KeyBuffer, &NameSize, - NULL, &Type, NULL, 0); - if (Status != ERROR_SUCCESS) + WinStatus = RegEnumValue (Handle, i, KeyBuffer, &NameSize, NULL, + &Type, NULL, 0); + if (WinStatus != ERROR_SUCCESS) { - AcpiOsPrintf ("Could not get %s registry entry: %s\n", - Signature, OsFormatException (Status)); - return (NULL); + fprintf (stderr, "Could not get %s registry entry: %s\n", + Signature, WindowsFormatException (WinStatus)); + return (AE_ERROR); } if (Type == REG_BINARY) { break; } - i += 1; } /* Get the size of the table */ - Status = RegQueryValueEx (Handle, KeyBuffer, NULL, NULL, NULL, &DataSize); - if (Status != ERROR_SUCCESS) + WinStatus = RegQueryValueEx (Handle, KeyBuffer, NULL, NULL, + NULL, &DataSize); + if (WinStatus != ERROR_SUCCESS) { - AcpiOsPrintf ("Could not read the %s table size: %s\n", - Signature, OsFormatException (Status)); - return (NULL); + fprintf (stderr, "Could not read the %s table size: %s\n", + Signature, WindowsFormatException (WinStatus)); + return (AE_ERROR); } /* Allocate a new buffer for the table */ - ReturnTable = AcpiOsAllocate (DataSize); + ReturnTable = malloc (DataSize); if (!ReturnTable) { goto Cleanup; @@ -205,17 +335,20 @@ OsGetTable ( /* Get the actual table from the registry */ - Status = RegQueryValueEx (Handle, KeyBuffer, NULL, NULL, - (UCHAR *) ReturnTable, &DataSize); - if (Status != ERROR_SUCCESS) + WinStatus = RegQueryValueEx (Handle, KeyBuffer, NULL, NULL, + (UCHAR *) ReturnTable, &DataSize); + if (WinStatus != ERROR_SUCCESS) { - AcpiOsPrintf ("Could not read %s data: %s\n", - Signature, OsFormatException (Status)); - AcpiOsFree (ReturnTable); - return (NULL); + fprintf (stderr, "Could not read %s data: %s\n", + Signature, WindowsFormatException (WinStatus)); + free (ReturnTable); + return (AE_ERROR); } Cleanup: RegCloseKey (Handle); - return (ReturnTable); + + *Table = ReturnTable; + *Address = 0; + return (AE_OK); } diff --git a/source/os_specific/service_layers/oswinxf.c b/source/os_specific/service_layers/oswinxf.c index b389fbe..f1c567c 100644 --- a/source/os_specific/service_layers/oswinxf.c +++ b/source/os_specific/service_layers/oswinxf.c @@ -74,7 +74,7 @@ char TableName[ACPI_NAME_SIZE + 1]; #define ACPI_OS_DEBUG_TIMEOUT 30000 /* 30 seconds */ -/* Upcalls to application */ +/* Upcalls to AcpiExec application */ ACPI_PHYSICAL_ADDRESS AeLocalGetRootPointer ( @@ -85,11 +85,6 @@ AeTableOverride ( ACPI_TABLE_HEADER *ExistingTable, ACPI_TABLE_HEADER **NewTable); -ACPI_TABLE_HEADER * -OsGetTable ( - char *Signature); - - /* * Real semaphores are only used for a multi-threaded application */ @@ -245,6 +240,10 @@ AcpiOsTableOverride ( ACPI_TABLE_HEADER *ExistingTable, ACPI_TABLE_HEADER **NewTable) { +#ifdef ACPI_ASL_COMPILER + ACPI_STATUS Status; + ACPI_PHYSICAL_ADDRESS Address; +#endif if (!ExistingTable || !NewTable) { @@ -271,15 +270,16 @@ AcpiOsTableOverride ( ACPI_MOVE_NAME (TableName, ExistingTable->Signature); TableName[ACPI_NAME_SIZE] = 0; - *NewTable = OsGetTable (TableName); - if (*NewTable) + Status = AcpiOsGetTableByName (TableName, 0, NewTable, &Address); + if (ACPI_SUCCESS (Status)) { AcpiOsPrintf ("Table [%s] obtained from registry, %u bytes\n", TableName, (*NewTable)->Length); } else { - AcpiOsPrintf ("Could not read table %s from registry\n", TableName); + AcpiOsPrintf ("Could not read table %s from registry (%s)\n", + TableName, AcpiFormatException (Status)); } #endif @@ -1224,18 +1224,22 @@ AcpiOsReadPort ( switch (Width) { case 8: + *Value = 0xFF; break; case 16: + *Value = 0xFFFF; break; case 32: + *Value = 0xFFFFFFFF; break; default: + ACPI_ERROR ((AE_INFO, "Bad width parameter: %X", Width)); return (AE_BAD_PARAMETER); } @@ -1305,10 +1309,12 @@ AcpiOsReadMemory ( case 16: case 32: case 64: + *Value = 0; break; default: + return (AE_BAD_PARAMETER); break; } @@ -1364,12 +1370,15 @@ AcpiOsSignal ( switch (Function) { case ACPI_SIGNAL_FATAL: + break; case ACPI_SIGNAL_BREAKPOINT: + break; default: + break; } @@ -1405,7 +1414,6 @@ AcpiOsCreateCache ( } memset (NewCache, 0, sizeof (ACPI_MEMORY_LIST)); - NewCache->LinkOffset = 8; NewCache->ListName = CacheName; NewCache->ObjectSize = ObjectSize; NewCache->MaxDepth = MaxDepth; diff --git a/source/tools/acpibin/abcompare.c b/source/tools/acpibin/abcompare.c index 59fc971..dc21a4e 100644 --- a/source/tools/acpibin/abcompare.c +++ b/source/tools/acpibin/abcompare.c @@ -69,6 +69,10 @@ AbGetFile ( char *Filename, UINT32 *FileSize); +static UINT32 +AbGetFileSize ( + FILE *File); + static void AbPrintHeaderInfo ( ACPI_TABLE_HEADER *Header); @@ -158,7 +162,7 @@ AbValidateHeader ( ACPI_TABLE_HEADER *Header) { - if (!AcpiUtValidAcpiName (* (UINT32 *) &Header->Signature)) + if (!AcpiUtValidAcpiName (Header->Signature)) { printf ("Header signature is invalid\n"); return (FALSE); @@ -528,6 +532,42 @@ AbCompareAmlFiles ( /****************************************************************************** * + * FUNCTION: AbGetFileSize + * + * DESCRIPTION: Get the size of an open file + * + ******************************************************************************/ + +static UINT32 +AbGetFileSize ( + FILE *File) +{ + UINT32 FileSize; + long Offset; + + + Offset = ftell (File); + + if (fseek (File, 0, SEEK_END)) + { + return (0); + } + + FileSize = (UINT32) ftell (File); + + /* Restore file pointer */ + + if (fseek (File, Offset, SEEK_SET)) + { + return (0); + } + + return (FileSize); +} + + +/****************************************************************************** + * * FUNCTION: AbGetFile * * DESCRIPTION: Open a file and read it entirely into a new buffer @@ -542,8 +582,6 @@ AbGetFile ( FILE *File; UINT32 Size; char *Buffer = NULL; - int Seek1; - int Seek2; size_t Actual; @@ -558,11 +596,8 @@ AbGetFile ( /* Need file size to allocate a buffer */ - Seek1 = fseek (File, 0L, SEEK_END); - Size = ftell (File); - Seek2 = fseek (File, 0L, SEEK_SET); - - if (Seek1 || Seek2 || (Size == -1)) + Size = AbGetFileSize (File); + if (!Size) { printf ("Could not get file size (seek) for %s\n", Filename); goto ErrorExit; @@ -610,14 +645,20 @@ AbDumpAmlFile ( char *File2Path) { char *FileBuffer; - UINT32 FileSize = 0; FILE *FileOutHandle; + UINT32 FileSize = 0; /* Get the entire AML file, validate header */ FileBuffer = AbGetFile (File1Path, &FileSize); - printf ("File %s contains 0x%X bytes\n\n", File1Path, FileSize); + if (!FileBuffer) + { + return (-1); + } + + printf ("Input file: %s contains %u (0x%X) bytes\n", + File1Path, FileSize, FileSize); FileOutHandle = fopen (File2Path, "wb"); if (!FileOutHandle) @@ -639,9 +680,13 @@ AbDumpAmlFile ( AcpiOsPrintf ("%4.4s @ 0x%8.8X\n", ((ACPI_TABLE_HEADER *) FileBuffer)->Signature, 0); - AcpiDbgLevel = ACPI_UINT32_MAX; - AcpiUtDebugDumpBuffer ((UINT8 *) FileBuffer, FileSize, - DB_BYTE_DISPLAY, ACPI_UINT32_MAX); + AcpiUtDumpBuffer ((UINT8 *) FileBuffer, FileSize, DB_BYTE_DISPLAY, 0); + + /* Summary for the output file */ + + FileSize = AbGetFileSize (FileOutHandle); + printf ("Output file: %s contains %u (0x%X) bytes\n\n", + File2Path, FileSize, FileSize); return (0); } diff --git a/source/tools/acpibin/abmain.c b/source/tools/acpibin/abmain.c index 6ce6040..67fbc24 100644 --- a/source/tools/acpibin/abmain.c +++ b/source/tools/acpibin/abmain.c @@ -99,8 +99,10 @@ main ( int Status = AE_OK; + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ + AcpiGbl_DebugFile = NULL; - AcpiGbl_DbOutputFlags = DB_CONSOLE_OUTPUT ; + AcpiGbl_DbOutputFlags = DB_CONSOLE_OUTPUT; AcpiOsInitialize (); printf (ACPI_COMMON_SIGNON ("ACPI Binary AML File Utility")); @@ -177,9 +179,10 @@ main ( break; default: + AbDisplayUsage (0); return (-1); } - return Status; + return (Status); } diff --git a/source/tools/acpidump/acpidump.h b/source/tools/acpidump/acpidump.h new file mode 100644 index 0000000..c76ec87 --- /dev/null +++ b/source/tools/acpidump/acpidump.h @@ -0,0 +1,139 @@ +/****************************************************************************** + * + * Module Name: acpidump.h - Include file for AcpiDump utility + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#include "acpi.h" +#include "accommon.h" +#include "actables.h" + +#include +#include +#include +#include + +/* + * Global variables. Defined in main.c only, externed in all other files + */ +#ifdef _DECLARE_GLOBALS +#define EXTERN +#define INIT_GLOBAL(a,b) a=b +#else +#define EXTERN extern +#define INIT_GLOBAL(a,b) a +#endif + + +/* Globals */ + +EXTERN BOOLEAN INIT_GLOBAL (Gbl_SummaryMode, FALSE); +EXTERN BOOLEAN INIT_GLOBAL (Gbl_VerboseMode, FALSE); +EXTERN BOOLEAN INIT_GLOBAL (Gbl_BinaryMode, FALSE); +EXTERN UINT32 INIT_GLOBAL (Gbl_SsdtCount, 0); +EXTERN FILE INIT_GLOBAL (*Gbl_OutputFile, NULL); +EXTERN char INIT_GLOBAL (*Gbl_OutputFilename, NULL); + +/* Globals required for use with ACPICA modules */ + +#ifdef _DECLARE_GLOBALS +UINT8 AcpiGbl_EnableInterpreterSlack = FALSE; +UINT8 AcpiGbl_IntegerByteWidth = 8; +UINT32 AcpiDbgLevel = 0; +UINT32 AcpiDbgLayer = 0; +#endif + +/* Action table used to defer requested options */ + +typedef struct ap_dump_action +{ + char *Argument; + UINT32 ToBeDone; + +} AP_DUMP_ACTION; + +#define AP_MAX_ACTIONS 32 + +#define AP_DUMP_ALL_TABLES 0 +#define AP_DUMP_TABLE_BY_ADDRESS 1 +#define AP_DUMP_TABLE_BY_NAME 2 +#define AP_DUMP_TABLE_BY_FILE 3 + +#define AP_MAX_ACPI_FILES 256 /* Prevent infinite loops */ + +/* + * apdump - Table get/dump routines + */ +int +ApDumpTableFromFile ( + char *Pathname); + +int +ApDumpTableByName ( + char *Signature); + +int +ApDumpTableByAddress ( + char *AsciiAddress); + +int +ApDumpAllTables ( + void); + + +/* + * apfiles - File I/O utilities + */ +UINT32 +ApGetFileSize ( + FILE *File); + +int +ApOpenOutputFile ( + char *Pathname); + +int +ApWriteToBinaryFile ( + ACPI_TABLE_HEADER *Table); + +ACPI_TABLE_HEADER * +ApGetTableFromFile ( + char *Pathname, + UINT32 *FileSize); diff --git a/source/tools/acpidump/apdump.c b/source/tools/acpidump/apdump.c new file mode 100644 index 0000000..c229ba5 --- /dev/null +++ b/source/tools/acpidump/apdump.c @@ -0,0 +1,423 @@ +/****************************************************************************** + * + * Module Name: apdump - Dump routines for ACPI tables (acpidump) + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#include "acpidump.h" + + +/* Local prototypes */ + +static BOOLEAN +ApIsValidHeader ( + ACPI_TABLE_HEADER *Table); + +static int +ApDumpTableBuffer ( + ACPI_TABLE_HEADER *Table, + ACPI_PHYSICAL_ADDRESS Address); + + +/****************************************************************************** + * + * FUNCTION: ApIsValidHeader + * + * PARAMETERS: Table - Pointer to table to be validated + * + * RETURN: TRUE if the header appears to be valid. FALSE otherwise + * + * DESCRIPTION: Check for a valid ACPI table header + * + ******************************************************************************/ + +static BOOLEAN +ApIsValidHeader ( + ACPI_TABLE_HEADER *Table) +{ + + /* Make sure signature is all ASCII and a valid ACPI name */ + + if (!AcpiUtValidAcpiName (Table->Signature)) + { + fprintf (stderr, "Table signature (0x%X) is invalid\n", + *(UINT32 *) Table->Signature); + return (FALSE); + } + + /* Check for minimum table length */ + + if (Table->Length <= sizeof (ACPI_TABLE_HEADER)) + { + fprintf (stderr, "Table length (0x%X) is invalid\n", + Table->Length); + return (FALSE); + } + + return (TRUE); +} + + +/****************************************************************************** + * + * FUNCTION: ApDumpTableBuffer + * + * PARAMETERS: Table - ACPI table to be dumped + * Address - Physical address of the table + * + * RETURN: None + * + * DESCRIPTION: Dump an ACPI table in standard ASCII hex format, with a + * header that is compatible with the AcpiXtract utility. + * + ******************************************************************************/ + +static int +ApDumpTableBuffer ( + ACPI_TABLE_HEADER *Table, + ACPI_PHYSICAL_ADDRESS Address) +{ + + /* Check if the table header appears to be valid */ + + if (!ApIsValidHeader (Table)) + { + return (-1); + } + + /* Validate the table checksum (except FACS - has no checksum) */ + + if (!ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) + { + (void) AcpiTbVerifyChecksum (Table, Table->Length); + } + + /* Print only the header if requested */ + + if (Gbl_SummaryMode) + { + AcpiTbPrintTableHeader (Address, Table); + return (0); + } + + /* Dump to binary file if requested */ + + if (Gbl_BinaryMode) + { + return (ApWriteToBinaryFile (Table)); + } + + /* + * Dump the table with header for use with acpixtract utility + * Note: simplest to just always emit a 64-bit address. AcpiXtract + * utility can handle this. + */ + printf ("%4.4s @ 0x%8.8X%8.8X\n", Table->Signature, + ACPI_FORMAT_UINT64 (Address)); + + AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), Table->Length, + DB_BYTE_DISPLAY, 0); + printf ("\n"); + return (0); +} + + +/****************************************************************************** + * + * FUNCTION: ApDumpAllTables + * + * PARAMETERS: None + * + * RETURN: Status + * + * DESCRIPTION: Get all tables from the RSDT/XSDT (or at least all of the + * tables that we can possibly get). + * + ******************************************************************************/ + +int +ApDumpAllTables ( + void) +{ + ACPI_TABLE_HEADER *Table; + ACPI_PHYSICAL_ADDRESS Address; + ACPI_STATUS Status; + UINT32 i; + + + /* Get and dump all available ACPI tables */ + + for (i = 0; i < AP_MAX_ACPI_FILES; i++) + { + Status = AcpiOsGetTableByIndex (i, &Table, &Address); + if (ACPI_FAILURE (Status)) + { + /* AE_LIMIT means that no more tables are available */ + + if (Status == AE_LIMIT) + { + return (0); + } + else if (i == 0) + { + fprintf (stderr, "Could not get ACPI tables, %s\n", + AcpiFormatException (Status)); + return (-1); + } + else + { + fprintf (stderr, "Could not get ACPI table at index %u, %s\n", + i, AcpiFormatException (Status)); + continue; + } + } + + if (ApDumpTableBuffer (Table, Address)) + { + return (-1); + } + free (Table); + } + + /* Something seriously bad happened if the loop terminates here */ + + return (-1); +} + + +/****************************************************************************** + * + * FUNCTION: ApDumpTableByAddress + * + * PARAMETERS: AsciiAddress - Address for requested ACPI table + * + * RETURN: Status + * + * DESCRIPTION: Get an ACPI table via a physical address and dump it. + * + ******************************************************************************/ + +int +ApDumpTableByAddress ( + char *AsciiAddress) +{ + ACPI_PHYSICAL_ADDRESS Address; + ACPI_TABLE_HEADER *Table; + ACPI_STATUS Status; + int TableStatus; + UINT64 LongAddress; + + + /* Convert argument to an integer physical address */ + + Status = AcpiUtStrtoul64 (AsciiAddress, 0, &LongAddress); + if (ACPI_FAILURE (Status)) + { + fprintf (stderr, "%s: Could not convert to a physical address\n", + AsciiAddress); + return (-1); + } + + Address = (ACPI_PHYSICAL_ADDRESS) LongAddress; + Status = AcpiOsGetTableByAddress (Address, &Table); + if (ACPI_FAILURE (Status)) + { + fprintf (stderr, "Could not get table at 0x%8.8X%8.8X, %s\n", + ACPI_FORMAT_UINT64 (Address), + AcpiFormatException (Status)); + return (-1); + } + + TableStatus = ApDumpTableBuffer (Table, Address); + free (Table); + return (TableStatus); +} + + +/****************************************************************************** + * + * FUNCTION: ApDumpTableByName + * + * PARAMETERS: Signature - Requested ACPI table signature + * + * RETURN: Status + * + * DESCRIPTION: Get an ACPI table via a signature and dump it. Handles + * multiple tables with the same signature (SSDTs). + * + ******************************************************************************/ + +int +ApDumpTableByName ( + char *Signature) +{ + char LocalSignature [ACPI_NAME_SIZE + 1]; + UINT32 Instance; + ACPI_TABLE_HEADER *Table; + ACPI_PHYSICAL_ADDRESS Address; + ACPI_STATUS Status; + + + if (strlen (Signature) > ACPI_NAME_SIZE) + { + fprintf (stderr, + "Invalid table signature [%s]: too long (4 chars max)\n", + Signature); + return (-1); + } + + /* Table signatures are expected to be uppercase */ + + strcpy (LocalSignature, Signature); + AcpiUtStrupr (LocalSignature); + + /* Dump all instances of this signature (to handle multiple SSDTs) */ + + for (Instance = 0; Instance < AP_MAX_ACPI_FILES; Instance++) + { + Status = AcpiOsGetTableByName (LocalSignature, Instance, + &Table, &Address); + if (ACPI_FAILURE (Status)) + { + /* AE_LIMIT means that no more tables are available */ + + if (Status == AE_LIMIT) + { + return (0); + } + + fprintf (stderr, + "Could not get ACPI table with signature [%s], %s\n", + LocalSignature, AcpiFormatException (Status)); + return (-1); + } + + if (ApDumpTableBuffer (Table, Address)) + { + return (-1); + } + free (Table); + } + + /* Something seriously bad happened if the loop terminates here */ + + return (-1); +} + + +/****************************************************************************** + * + * FUNCTION: ApDumpTableFromFile + * + * PARAMETERS: Pathname - File containing the binary ACPI table + * + * RETURN: Status + * + * DESCRIPTION: Dump an ACPI table from a binary file + * + ******************************************************************************/ + +int +ApDumpTableFromFile ( + char *Pathname) +{ + ACPI_TABLE_HEADER *Table; + UINT32 FileSize = 0; + int TableStatus; + + + /* Get the entire ACPI table from the file */ + + Table = ApGetTableFromFile (Pathname, &FileSize); + if (!Table) + { + return (-1); + } + + /* File must be at least as long as the table length */ + + if (Table->Length > FileSize) + { + fprintf (stderr, + "Table length (0x%X) is too large for input file (0x%X) %s\n", + Table->Length, FileSize, Pathname); + return (-1); + } + + if (Gbl_VerboseMode) + { + fprintf (stderr, + "Input file: %s contains table [%4.4s], 0x%X (%u) bytes\n", + Pathname, Table->Signature, FileSize, FileSize); + } + + TableStatus = ApDumpTableBuffer (Table, 0); + free (Table); + return (TableStatus); +} + + +/****************************************************************************** + * + * FUNCTION: AcpiOs* print functions + * + * DESCRIPTION: Used for linkage with ACPICA modules + * + ******************************************************************************/ + +void ACPI_INTERNAL_VAR_XFACE +AcpiOsPrintf ( + const char *Fmt, + ...) +{ + va_list Args; + + va_start (Args, Fmt); + vfprintf (stdout, Fmt, Args); + va_end (Args); +} + +void +AcpiOsVprintf ( + const char *Fmt, + va_list Args) +{ + vfprintf (stdout, Fmt, Args); +} diff --git a/source/tools/acpidump/apfiles.c b/source/tools/acpidump/apfiles.c new file mode 100644 index 0000000..fd17423 --- /dev/null +++ b/source/tools/acpidump/apfiles.c @@ -0,0 +1,277 @@ +/****************************************************************************** + * + * Module Name: apfiles - File-related functions for acpidump utility + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#include "acpidump.h" +#include "acapps.h" + + +/****************************************************************************** + * + * FUNCTION: ApOpenOutputFile + * + * PARAMETERS: Pathname - Output filename + * + * RETURN: Open file handle + * + * DESCRIPTION: Open a text output file for acpidump. Checks if file already + * exists. + * + ******************************************************************************/ + +int +ApOpenOutputFile ( + char *Pathname) +{ + struct stat StatInfo; + FILE *File; + + + /* If file exists, prompt for overwrite */ + + if (!stat (Pathname, &StatInfo)) + { + fprintf (stderr, "Target path already exists, overwrite? [y|n] "); + + if (getchar () != 'y') + { + return (-1); + } + } + + /* Point stdout to the file */ + + File = freopen (Pathname, "w", stdout); + if (!File) + { + perror ("Could not open output file"); + return (-1); + } + + /* Save the file and path */ + + Gbl_OutputFile = File; + Gbl_OutputFilename = Pathname; + return (0); +} + + +/****************************************************************************** + * + * FUNCTION: ApWriteToBinaryFile + * + * PARAMETERS: Table - ACPI table to be written + * + * RETURN: Status + * + * DESCRIPTION: Write an ACPI table to a binary file. Builds the output + * filename from the table signature. + * + ******************************************************************************/ + +int +ApWriteToBinaryFile ( + ACPI_TABLE_HEADER *Table) +{ + char Filename[ACPI_NAME_SIZE + 16]; + char SsdtInstance [16]; + FILE *File; + size_t Actual; + + + /* Construct lower-case filename from the table signature */ + + Filename[0] = (char) ACPI_TOLOWER (Table->Signature[0]); + Filename[1] = (char) ACPI_TOLOWER (Table->Signature[1]); + Filename[2] = (char) ACPI_TOLOWER (Table->Signature[2]); + Filename[3] = (char) ACPI_TOLOWER (Table->Signature[3]); + Filename[ACPI_NAME_SIZE] = 0; + + /* Handle multiple SSDTs - create different filenames for each */ + + if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT)) + { + sprintf (SsdtInstance, "%u", Gbl_SsdtCount); + strcat (Filename, SsdtInstance); + Gbl_SsdtCount++; + } + + strcat (Filename, ACPI_TABLE_FILE_SUFFIX); + + if (Gbl_VerboseMode) + { + fprintf (stderr, + "Writing [%4.4s] to binary file: %s 0x%X (%u) bytes\n", + Table->Signature, Filename, Table->Length, Table->Length); + } + + /* Open the file and dump the entire table in binary mode */ + + File = fopen (Filename, "wb"); + if (!File) + { + perror ("Could not open output file"); + return (-1); + } + + Actual = fwrite (Table, 1, Table->Length, File); + if (Actual != Table->Length) + { + perror ("Error writing binary output file"); + fclose (File); + return (-1); + } + + fclose (File); + return (0); +} + + +/****************************************************************************** + * + * FUNCTION: ApGetTableFromFile + * + * PARAMETERS: Pathname - File containing the binary ACPI table + * OutFileSize - Where the file size is returned + * + * RETURN: Buffer containing the ACPI table. NULL on error. + * + * DESCRIPTION: Open a file and read it entirely into a new buffer + * + ******************************************************************************/ + +ACPI_TABLE_HEADER * +ApGetTableFromFile ( + char *Pathname, + UINT32 *OutFileSize) +{ + ACPI_TABLE_HEADER *Buffer = NULL; + FILE *File; + UINT32 FileSize; + size_t Actual; + + + /* Must use binary mode */ + + File = fopen (Pathname, "rb"); + if (!File) + { + perror ("Could not open input file"); + return (NULL); + } + + /* Need file size to allocate a buffer */ + + FileSize = ApGetFileSize (File); + if (!FileSize) + { + fprintf (stderr, + "Could not get input file size: %s\n", Pathname); + goto Cleanup; + } + + /* Allocate a buffer for the entire file */ + + Buffer = calloc (1, FileSize); + if (!Buffer) + { + fprintf (stderr, + "Could not allocate file buffer of size: %u\n", FileSize); + goto Cleanup; + } + + /* Read the entire file */ + + Actual = fread (Buffer, 1, FileSize, File); + if (Actual != FileSize) + { + fprintf (stderr, + "Could not read input file: %s\n", Pathname); + free (Buffer); + Buffer = NULL; + goto Cleanup; + } + + *OutFileSize = FileSize; + +Cleanup: + fclose (File); + return (Buffer); +} + + +/****************************************************************************** + * + * FUNCTION: ApGetFileSize + * + * PARAMETERS: File - Open file descriptor + * + * RETURN: File size in bytes + * + * DESCRIPTION: Get the size of an open file + * + ******************************************************************************/ + +UINT32 +ApGetFileSize ( + FILE *File) +{ + UINT32 FileSize; + long Offset; + + + Offset = ftell (File); + if (fseek (File, 0, SEEK_END)) + { + return (0); + } + + /* Get size and restore file pointer */ + + FileSize = (UINT32) ftell (File); + if (fseek (File, Offset, SEEK_SET)) + { + return (0); + } + + return (FileSize); +} diff --git a/source/tools/acpidump/apmain.c b/source/tools/acpidump/apmain.c new file mode 100644 index 0000000..9ee4f46 --- /dev/null +++ b/source/tools/acpidump/apmain.c @@ -0,0 +1,351 @@ +/****************************************************************************** + * + * Module Name: apmain - Main module for the acpidump utility + * + *****************************************************************************/ + +/* + * Copyright (C) 2000 - 2013, Intel Corp. + * All rights reserved. + * + * 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. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + * NO WARRANTY + * 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 MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + */ + +#define _DECLARE_GLOBALS +#include "acpidump.h" +#include "acapps.h" + + +/* + * acpidump - A portable utility for obtaining system ACPI tables and dumping + * them in an ASCII hex format suitable for binary extraction via acpixtract. + * + * Obtaining the system ACPI tables is an OS-specific operation. + * + * This utility can be ported to any host operating system by providing a + * module containing system-specific versions of these interfaces: + * + * AcpiOsGetTableByAddress + * AcpiOsGetTableByIndex + * AcpiOsGetTableByName + * + * See the ACPICA Reference Guide for the exact definitions of these + * interfaces. Also, see these ACPICA source code modules for example + * implementations: + * + * source/os_specific/service_layers/oswintbl.c + * source/os_specific/service_layers/oslinuxtbl.c + */ + + +/* Local prototypes */ + +static void +ApDisplayUsage ( + void); + +static int +ApDoOptions ( + int argc, + char **argv); + +static void +ApInsertAction ( + char *Argument, + UINT32 ToBeDone); + + +/* Table for deferred actions from command line options */ + +AP_DUMP_ACTION ActionTable [AP_MAX_ACTIONS]; +UINT32 CurrentAction = 0; + + +#define AP_UTILITY_NAME "ACPI Binary Table Dump Utility" +#define AP_SUPPORTED_OPTIONS "?a:bf:hn:o:rsv" + + +/****************************************************************************** + * + * FUNCTION: ApDisplayUsage + * + * DESCRIPTION: Usage message for the AcpiDump utility + * + ******************************************************************************/ + +static void +ApDisplayUsage ( + void) +{ + + ACPI_USAGE_HEADER ("acpidump [options]"); + + ACPI_OPTION ("-b", "Dump tables to binary files"); + ACPI_OPTION ("-h -?", "This help message"); + ACPI_OPTION ("-o ", "Redirect output to file"); + ACPI_OPTION ("-r", "Revision (version)"); + ACPI_OPTION ("-s", "Print table summaries only"); + ACPI_OPTION ("-v", "Verbose mode"); + + printf ("\nTable Options:\n"); + + ACPI_OPTION ("-a
", "Get table via physical address"); + ACPI_OPTION ("-f ", "Get table via binary file"); + ACPI_OPTION ("-n ", "Get table via name/signature"); + + printf ( + "\n" + "Invocation without parameters dumps all available tables\n" + "Multiple mixed instances of -a, -f, and -n are supported\n\n"); +} + + +/****************************************************************************** + * + * FUNCTION: ApInsertAction + * + * PARAMETERS: Argument - Pointer to the argument for this action + * ToBeDone - What to do to process this action + * + * RETURN: None. Exits program if action table becomes full. + * + * DESCRIPTION: Add an action item to the action table + * + ******************************************************************************/ + +static void +ApInsertAction ( + char *Argument, + UINT32 ToBeDone) +{ + + /* Insert action and check for table overflow */ + + ActionTable [CurrentAction].Argument = Argument; + ActionTable [CurrentAction].ToBeDone = ToBeDone; + + CurrentAction++; + if (CurrentAction > AP_MAX_ACTIONS) + { + fprintf (stderr, "Too many table options (max %u)\n", AP_MAX_ACTIONS); + exit (-1); + } +} + + +/****************************************************************************** + * + * FUNCTION: ApDoOptions + * + * PARAMETERS: argc/argv - Standard argc/argv + * + * RETURN: Status + * + * DESCRIPTION: Command line option processing. The main actions for getting + * and dumping tables are deferred via the action table. + * + *****************************************************************************/ + +static int +ApDoOptions ( + int argc, + char **argv) +{ + int j; + + + /* Command line options */ + + while ((j = AcpiGetopt (argc, argv, AP_SUPPORTED_OPTIONS)) != EOF) switch (j) + { + /* + * Global options + */ + case 'b': /* Dump all input tables to binary files */ + + Gbl_BinaryMode = TRUE; + continue; + + case 'h': + case '?': + + ApDisplayUsage (); + exit (0); + + case 'o': /* Redirect output to a single file */ + + if (ApOpenOutputFile (AcpiGbl_Optarg)) + { + exit (-1); + } + continue; + + case 'r': /* Revision/version */ + + printf (ACPI_COMMON_SIGNON (AP_UTILITY_NAME)); + exit (0); + + case 's': /* Print table summaries only */ + + Gbl_SummaryMode = TRUE; + continue; + + case 'v': /* Verbose mode */ + + Gbl_VerboseMode = TRUE; + fprintf (stderr, ACPI_COMMON_SIGNON (AP_UTILITY_NAME)); + continue; + + /* + * Table options + */ + case 'a': /* Get table by physical address */ + + ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_ADDRESS); + break; + + case 'f': /* Get table from a file */ + + ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_FILE); + break; + + case 'n': /* Get table by input name (signature) */ + + ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_NAME); + break; + + default: + + ApDisplayUsage (); + exit (-1); + } + + /* If there are no actions, this means "get/dump all tables" */ + + if (CurrentAction == 0) + { + ApInsertAction (NULL, AP_DUMP_ALL_TABLES); + } + + return (0); +} + + +/****************************************************************************** + * + * FUNCTION: main + * + * PARAMETERS: argc/argv - Standard argc/argv + * + * RETURN: Status + * + * DESCRIPTION: C main function for acpidump utility + * + ******************************************************************************/ + +int ACPI_SYSTEM_XFACE +main ( + int argc, + char *argv[]) +{ + int Status = 0; + AP_DUMP_ACTION *Action; + UINT32 FileSize; + UINT32 i; + + + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ + + /* Process command line options */ + + if (ApDoOptions (argc, argv)) + { + return (-1); + } + + /* Get/dump ACPI table(s) as requested */ + + for (i = 0; i < CurrentAction; i++) + { + Action = &ActionTable[i]; + switch (Action->ToBeDone) + { + case AP_DUMP_ALL_TABLES: + + Status = ApDumpAllTables (); + break; + + case AP_DUMP_TABLE_BY_ADDRESS: + + Status = ApDumpTableByAddress (Action->Argument); + break; + + case AP_DUMP_TABLE_BY_NAME: + + Status = ApDumpTableByName (Action->Argument); + break; + + case AP_DUMP_TABLE_BY_FILE: + + Status = ApDumpTableFromFile (Action->Argument); + break; + + default: + + fprintf (stderr, "Internal error, invalid action: 0x%X\n", + Action->ToBeDone); + return (-1); + } + + if (Status) + { + return (Status); + } + } + + if (Gbl_OutputFile) + { + if (Gbl_VerboseMode) + { + /* Summary for the output file */ + + FileSize = ApGetFileSize (Gbl_OutputFile); + fprintf (stderr, "Output file %s contains 0x%X (%u) bytes\n\n", + Gbl_OutputFilename, FileSize, FileSize); + } + + fclose (Gbl_OutputFile); + } + + return (Status); +} diff --git a/source/tools/acpiexec/aehandlers.c b/source/tools/acpiexec/aehandlers.c index 166bd7f..7f704ef 100644 --- a/source/tools/acpiexec/aehandlers.c +++ b/source/tools/acpiexec/aehandlers.c @@ -103,6 +103,24 @@ AeInterfaceHandler ( ACPI_STRING InterfaceName, UINT32 Supported); +static ACPI_STATUS +AeInstallEcHandler ( + ACPI_HANDLE ObjHandle, + UINT32 Level, + void *Context, + void **ReturnValue); + +static ACPI_STATUS +AeInstallPciHandler ( + ACPI_HANDLE ObjHandle, + UINT32 Level, + void *Context, + void **ReturnValue); + +static ACPI_STATUS +AeInstallDeviceHandlers ( + void); + #if (!ACPI_REDUCED_HARDWARE) static UINT32 AeEventHandler ( @@ -116,17 +134,17 @@ static char *TableEvents[] = }; #endif /* !ACPI_REDUCED_HARDWARE */ + static UINT32 SigintCount = 0; static AE_DEBUG_REGIONS AeRegions; BOOLEAN AcpiGbl_DisplayRegionAccess = FALSE; - /* * We will override some of the default region handlers, especially the * SystemMemory handler, which must be implemented locally. Do not override * the PCI_Config handler since we would like to exercise the default handler * code. These handlers are installed "early" - before any _REG methods - * are executed - since they are special in the sense that tha ACPI spec + * are executed - since they are special in the sense that the ACPI spec * declares that they must "always be available". Cannot override the * DataTable region handler either -- needed for test execution. */ @@ -138,27 +156,27 @@ static ACPI_ADR_SPACE_TYPE DefaultSpaceIdList[] = /* * We will install handlers for some of the various address space IDs. - * Test one user-defined address space (used by aslts.) + * Test one user-defined address space (used by aslts). */ #define ACPI_ADR_SPACE_USER_DEFINED1 0x80 #define ACPI_ADR_SPACE_USER_DEFINED2 0xE4 static ACPI_ADR_SPACE_TYPE SpaceIdList[] = { - ACPI_ADR_SPACE_EC, ACPI_ADR_SPACE_SMBUS, - ACPI_ADR_SPACE_GSBUS, - ACPI_ADR_SPACE_GPIO, + ACPI_ADR_SPACE_CMOS, ACPI_ADR_SPACE_PCI_BAR_TARGET, ACPI_ADR_SPACE_IPMI, + ACPI_ADR_SPACE_GPIO, + ACPI_ADR_SPACE_GSBUS, ACPI_ADR_SPACE_FIXED_HARDWARE, ACPI_ADR_SPACE_USER_DEFINED1, ACPI_ADR_SPACE_USER_DEFINED2 }; - static ACPI_CONNECTION_INFO AeMyContext; + /****************************************************************************** * * FUNCTION: AeCtrlCHandler @@ -248,6 +266,7 @@ AeCommonNotifyHandler ( { #if 0 case 0: + printf ("[AcpiExec] Method Error 0x%X: Results not equal\n", Value); if (AcpiGbl_DebugFile) { @@ -255,8 +274,8 @@ AeCommonNotifyHandler ( } break; - case 1: + printf ("[AcpiExec] Method Error: Incorrect numeric result\n"); if (AcpiGbl_DebugFile) { @@ -264,8 +283,8 @@ AeCommonNotifyHandler ( } break; - case 2: + printf ("[AcpiExec] Method Error: An operand was overwritten\n"); if (AcpiGbl_DebugFile) { @@ -276,6 +295,7 @@ AeCommonNotifyHandler ( #endif default: + printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n", HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value, AcpiUtGetNotifyName (Value)); @@ -543,14 +563,17 @@ AeGlobalEventHandler ( switch (Type) { case ACPI_EVENT_TYPE_GPE: + TypeName = "GPE"; break; case ACPI_EVENT_TYPE_FIXED: + TypeName = "FixedEvent"; break; default: + TypeName = "UNKNOWN"; break; } @@ -652,6 +675,93 @@ AeRegionInit ( } +/******************************************************************************* + * + * FUNCTION: AeInstallDeviceHandlers, AeInstallEcHandler, + * AeInstallPciHandler + * + * PARAMETERS: ACPI_WALK_NAMESPACE callback + * + * RETURN: Status + * + * DESCRIPTION: Walk entire namespace, install a handler for every EC + * device found. + * + ******************************************************************************/ + +static ACPI_STATUS +AeInstallEcHandler ( + ACPI_HANDLE ObjHandle, + UINT32 Level, + void *Context, + void **ReturnValue) +{ + ACPI_STATUS Status; + + + /* Install the handler for this EC device */ + + Status = AcpiInstallAddressSpaceHandler (ObjHandle, ACPI_ADR_SPACE_EC, + AeRegionHandler, AeRegionInit, &AeMyContext); + if (ACPI_FAILURE (Status)) + { + ACPI_EXCEPTION ((AE_INFO, Status, + "Could not install an OpRegion handler for EC device (%p)", + ObjHandle)); + } + + return (Status); +} + +static ACPI_STATUS +AeInstallPciHandler ( + ACPI_HANDLE ObjHandle, + UINT32 Level, + void *Context, + void **ReturnValue) +{ + ACPI_STATUS Status; + + + /* Install memory and I/O handlers for the PCI device */ + + Status = AcpiInstallAddressSpaceHandler (ObjHandle, ACPI_ADR_SPACE_SYSTEM_IO, + AeRegionHandler, AeRegionInit, &AeMyContext); + if (ACPI_FAILURE (Status)) + { + ACPI_EXCEPTION ((AE_INFO, Status, + "Could not install an OpRegion handler for PCI device (%p)", + ObjHandle)); + } + + Status = AcpiInstallAddressSpaceHandler (ObjHandle, ACPI_ADR_SPACE_SYSTEM_MEMORY, + AeRegionHandler, AeRegionInit, &AeMyContext); + if (ACPI_FAILURE (Status)) + { + ACPI_EXCEPTION ((AE_INFO, Status, + "Could not install an OpRegion handler for PCI device (%p)", + ObjHandle)); + } + + return (AE_CTRL_TERMINATE); +} + +static ACPI_STATUS +AeInstallDeviceHandlers ( + void) +{ + + /* Find all Embedded Controller devices */ + + AcpiGetDevices ("PNP0C09", AeInstallEcHandler, NULL, NULL); + + /* Install a PCI handler */ + + AcpiGetDevices ("PNP0A08", AeInstallPciHandler, NULL, NULL); + return (AE_OK); +} + + /****************************************************************************** * * FUNCTION: AeInstallLateHandlers @@ -689,8 +799,16 @@ AeInstallLateHandlers ( AeMyContext.AccessLength = 0xA5; /* + * We will install a handler for each EC device, directly under the EC + * device definition. This is unlike the other handlers which we install + * at the root node. Also install memory and I/O handlers at any PCI + * devices. + */ + AeInstallDeviceHandlers (); + + /* * Install handlers for some of the "device driver" address spaces - * such as EC, SMBus, etc. + * such as SMBus, etc. */ for (i = 0; i < ACPI_ARRAY_LENGTH (SpaceIdList); i++) { @@ -1043,6 +1161,7 @@ AeRegionHandler ( break; default: + Status = AE_BAD_PARAMETER; break; } @@ -1067,25 +1186,28 @@ AeRegionHandler ( switch (Function & ACPI_IO_MASK) { case ACPI_READ: + switch (Function >> 16) { case AML_FIELD_ATTRIB_QUICK: case AML_FIELD_ATTRIB_SEND_RCV: case AML_FIELD_ATTRIB_BYTE: + Length = 1; break; case AML_FIELD_ATTRIB_WORD: case AML_FIELD_ATTRIB_WORD_CALL: + Length = 2; break; case AML_FIELD_ATTRIB_BLOCK: case AML_FIELD_ATTRIB_BLOCK_CALL: + Length = 32; break; - case AML_FIELD_ATTRIB_MULTIBYTE: case AML_FIELD_ATTRIB_RAW_BYTES: case AML_FIELD_ATTRIB_RAW_PROCESS: @@ -1095,11 +1217,13 @@ AeRegionHandler ( break; default: + break; } break; case ACPI_WRITE: + switch (Function >> 16) { case AML_FIELD_ATTRIB_QUICK: @@ -1107,6 +1231,7 @@ AeRegionHandler ( case AML_FIELD_ATTRIB_BYTE: case AML_FIELD_ATTRIB_WORD: case AML_FIELD_ATTRIB_BLOCK: + Length = 0; break; @@ -1127,11 +1252,13 @@ AeRegionHandler ( break; default: + break; } break; default: + break; } @@ -1330,6 +1457,7 @@ DoFunction: break; default: + return (AE_BAD_PARAMETER); } @@ -1360,6 +1488,7 @@ DoFunction: break; default: + break; } } diff --git a/source/tools/acpiexec/aemain.c b/source/tools/acpiexec/aemain.c index 92b4ea6..2764b58 100644 --- a/source/tools/acpiexec/aemain.c +++ b/source/tools/acpiexec/aemain.c @@ -43,13 +43,10 @@ #include "aecommon.h" -#ifdef _DEBUG -#include -#endif - #define _COMPONENT ACPI_TOOLS ACPI_MODULE_NAME ("aemain") + /* Local prototypes */ static int @@ -94,7 +91,7 @@ static char BatchBuffer[AE_BUFFER_SIZE]; /* Batch command buf static char *FileList[ASL_MAX_FILES]; static AE_TABLE_DESC *AeTableListHead = NULL; -#define AE_SUPPORTED_OPTIONS "?b:d:e:f:gm^orv:x:" +#define AE_SUPPORTED_OPTIONS "?b:d:e:f:ghm^orv:x:" /****************************************************************************** @@ -116,8 +113,8 @@ usage ( ACPI_USAGE_HEADER ("acpiexec [options] AMLfile1 AMLfile2 ..."); - ACPI_OPTION ("-?", "Display this message"); ACPI_OPTION ("-b \"CommandLine\"", "Batch mode command line execution (cmd1;cmd2;...)"); + ACPI_OPTION ("-h -?", "Display this help message"); ACPI_OPTION ("-m [Method]", "Batch mode method execution. Default=MAIN"); printf ("\n"); @@ -166,6 +163,7 @@ AeDoOptions ( while ((j = AcpiGetopt (argc, argv, AE_SUPPORTED_OPTIONS)) != EOF) switch (j) { case 'b': + if (strlen (AcpiGbl_Optarg) > (AE_BUFFER_SIZE -1)) { printf ("**** The length of command line (%u) exceeded maximum (%u)\n", @@ -177,128 +175,159 @@ AeDoOptions ( break; case 'd': + switch (AcpiGbl_Optarg[0]) { case 'a': + AcpiGbl_IgnoreErrors = TRUE; break; case 'i': + AcpiGbl_DbOpt_ini_methods = FALSE; break; case 'o': + AcpiGbl_DbOpt_NoRegionSupport = TRUE; break; case 'r': + AcpiGbl_DisableAutoRepair = TRUE; break; case 't': + #ifdef ACPI_DBG_TRACK_ALLOCATIONS AcpiGbl_DisableMemTracking = TRUE; #endif break; default: + printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); return (-1); } break; case 'e': + switch (AcpiGbl_Optarg[0]) { case 'f': + #ifdef ACPI_DBG_TRACK_ALLOCATIONS AcpiGbl_DisplayFinalMemStats = TRUE; #endif break; case 'i': + AcpiGbl_DoInterfaceTests = TRUE; break; case 'm': + AcpiGbl_AllMethodsSerialized = TRUE; printf ("Enabling AML Interpreter serialized mode\n"); break; case 's': + AcpiGbl_EnableInterpreterSlack = TRUE; printf ("Enabling AML Interpreter slack mode\n"); break; case 't': + AcpiGbl_DebugTimeout = TRUE; break; default: + printf ("Unknown option: -e%s\n", AcpiGbl_Optarg); return (-1); } break; case 'f': + AcpiGbl_RegionFillValue = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); break; case 'g': + AcpiGbl_DbOpt_tables = TRUE; AcpiGbl_DbFilename = NULL; break; + case 'h': + case '?': + + usage(); + return (0); + case 'm': + AcpiGbl_ExecutionMode = AE_MODE_BATCH_SINGLE; switch (AcpiGbl_Optarg[0]) { case '^': + strcpy (BatchBuffer, "MAIN"); break; default: + strcpy (BatchBuffer, AcpiGbl_Optarg); break; } break; case 'o': + AcpiGbl_DbOpt_disasm = TRUE; AcpiGbl_DbOpt_stats = TRUE; break; case 'r': + AcpiGbl_UseHwReducedFadt = TRUE; printf ("Using ACPI 5.0 Hardware Reduced Mode via version 5 FADT\n"); break; case 'v': + switch (AcpiGbl_Optarg[0]) { case 'i': + AcpiDbgLevel |= ACPI_LV_INIT_NAMES; break; case 'r': + AcpiGbl_DisplayRegionAccess = TRUE; break; default: + printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); return (-1); } break; case 'x': + AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 0); AcpiGbl_DbConsoleDebugLevel = AcpiDbgLevel; printf ("Debug Level: 0x%8.8X\n", AcpiDbgLevel); break; - case '?': - case 'h': default: + usage(); return (-1); } @@ -335,13 +364,9 @@ main ( char *FullPathname; -#ifdef _DEBUG - _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF | - _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)); -#endif + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ printf (ACPI_COMMON_SIGNON ("AML Execution/Debug Utility")); - if (argc < 2) { usage (); @@ -495,6 +520,14 @@ main ( goto EnterDebugger; } + /* + * Install handlers for "device driver" space IDs (EC,SMBus, etc.) + * and fixed event handlers + */ + AeInstallLateHandlers (); + + /* Finish the ACPICA initialization */ + Status = AcpiInitializeObjects (InitFlags); if (ACPI_FAILURE (Status)) { @@ -503,11 +536,6 @@ main ( goto EnterDebugger; } - /* - * Install handlers for "device driver" space IDs (EC,SMBus, etc.) - * and fixed event handlers - */ - AeInstallLateHandlers (); AeMiscellaneousTests (); } diff --git a/source/tools/acpihelp/ahmain.c b/source/tools/acpihelp/ahmain.c index 5f46ec3..31748b2 100644 --- a/source/tools/acpihelp/ahmain.c +++ b/source/tools/acpihelp/ahmain.c @@ -103,6 +103,7 @@ main ( int j; + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ printf (ACPI_COMMON_SIGNON ("ACPI Help Utility")); DecodeType = AH_DECODE_DEFAULT; @@ -117,35 +118,43 @@ main ( while ((j = AcpiGetopt (argc, argv, "ehikmops")) != EOF) switch (j) { case 'e': + DecodeType = AH_DECODE_EXCEPTION; break; case 'i': + DecodeType = AH_DISPLAY_DEVICE_IDS; break; case 'k': + DecodeType = AH_DECODE_ASL_KEYWORD; break; case 'm': + DecodeType = AH_DECODE_AML; break; case 'o': + DecodeType = AH_DECODE_AML_OPCODE; break; case 'p': + DecodeType = AH_DECODE_PREDEFINED_NAME; break; case 's': + DecodeType = AH_DECODE_ASL; break; case 'h': default: + AhDisplayUsage (); return (-1); } @@ -157,34 +166,42 @@ main ( switch (DecodeType) { case AH_DECODE_AML: + AhFindAmlOpcode (Name); break; case AH_DECODE_AML_OPCODE: + AhDecodeAmlOpcode (Name); break; case AH_DECODE_PREDEFINED_NAME: + AhFindPredefinedNames (Name); break; case AH_DECODE_ASL: + AhFindAslOperators (Name); break; case AH_DECODE_ASL_KEYWORD: + AhFindAslKeywords (Name); break; case AH_DISPLAY_DEVICE_IDS: + AhDisplayDeviceIds (); break; case AH_DECODE_EXCEPTION: + AhDecodeException (Name); break; default: + if (!Name) { AhFindAslOperators (Name); diff --git a/source/tools/acpinames/anmain.c b/source/tools/acpinames/anmain.c index 5cd1a3e..2bc4c6e 100644 --- a/source/tools/acpinames/anmain.c +++ b/source/tools/acpinames/anmain.c @@ -239,6 +239,7 @@ main ( int j; + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ printf (ACPI_COMMON_SIGNON ("ACPI Namespace Dump Utility")); if (argc < 2) @@ -262,6 +263,7 @@ main ( case '?': case 'h': default: + usage(); return (0); } diff --git a/source/tools/acpisrc/asconvrt.c b/source/tools/acpisrc/asconvrt.c index 22eee86..0f2da2b 100644 --- a/source/tools/acpisrc/asconvrt.c +++ b/source/tools/acpisrc/asconvrt.c @@ -1333,14 +1333,17 @@ AsInsertPrefix ( switch (Type) { case SRC_TYPE_STRUCT: + InsertString = "struct "; break; case SRC_TYPE_UNION: + InsertString = "union "; break; default: + return; } diff --git a/source/tools/acpisrc/asfile.c b/source/tools/acpisrc/asfile.c index c21703c..9b8ec2f 100644 --- a/source/tools/acpisrc/asfile.c +++ b/source/tools/acpisrc/asfile.c @@ -143,6 +143,7 @@ AsDoWildcard ( break; default: + break; } } @@ -311,6 +312,7 @@ AsConvertFile ( switch (FileType) { case FILE_TYPE_SOURCE: + Functions = ConversionTable->SourceFunctions; StringTable = ConversionTable->SourceStringTable; LineTable = ConversionTable->SourceLineTable; @@ -320,6 +322,7 @@ AsConvertFile ( break; case FILE_TYPE_HEADER: + Functions = ConversionTable->HeaderFunctions; StringTable = ConversionTable->HeaderStringTable; LineTable = ConversionTable->HeaderLineTable; @@ -329,6 +332,7 @@ AsConvertFile ( break; default: + printf ("Unknown file type, cannot process\n"); return; } @@ -406,89 +410,76 @@ AsConvertFile ( switch ((1 << i) & Functions) { case 0: + /* This function not configured */ break; - case CVT_COUNT_TABS: AsCountTabs (FileBuffer, Filename); break; - case CVT_COUNT_NON_ANSI_COMMENTS: AsCountNonAnsiComments (FileBuffer, Filename); break; - case CVT_CHECK_BRACES: AsCheckForBraces (FileBuffer, Filename); break; - case CVT_TRIM_LINES: AsTrimLines (FileBuffer, Filename); break; - case CVT_COUNT_LINES: AsCountSourceLines (FileBuffer, Filename); break; - case CVT_BRACES_ON_SAME_LINE: AsBracesOnSameLine (FileBuffer); break; - case CVT_MIXED_CASE_TO_UNDERSCORES: AsMixedCaseToUnderscores (FileBuffer, Filename); break; - case CVT_LOWER_CASE_IDENTIFIERS: AsLowerCaseIdentifiers (FileBuffer); break; - case CVT_REMOVE_DEBUG_MACROS: AsRemoveDebugMacros (FileBuffer); break; - case CVT_TRIM_WHITESPACE: AsTrimWhitespace (FileBuffer); break; - case CVT_REMOVE_EMPTY_BLOCKS: AsRemoveEmptyBlocks (FileBuffer, Filename); break; - case CVT_REDUCE_TYPEDEFS: AsReduceTypedefs (FileBuffer, "typedef union"); AsReduceTypedefs (FileBuffer, "typedef struct"); break; - case CVT_SPACES_TO_TABS4: AsTabify4 (FileBuffer); break; - case CVT_SPACES_TO_TABS8: AsTabify8 (FileBuffer); diff --git a/source/tools/acpisrc/asmain.c b/source/tools/acpisrc/asmain.c index d3c68c5..ee2f3a9 100644 --- a/source/tools/acpisrc/asmain.c +++ b/source/tools/acpisrc/asmain.c @@ -320,6 +320,7 @@ main ( UINT32 FileType; + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ printf (ACPI_COMMON_SIGNON ("ACPI Source Code Conversion Utility")); if (argc < 2) @@ -333,6 +334,7 @@ main ( while ((j = AcpiGetopt (argc, argv, "cdhlqsuvy")) != EOF) switch(j) { case 'l': + /* Linux code generation */ printf ("Creating Linux source code\n"); @@ -342,6 +344,7 @@ main ( break; case 'c': + /* Cleanup code */ printf ("Code cleanup\n"); @@ -350,6 +353,7 @@ main ( break; case 'h': + /* Inject Dual-license header */ printf ("Inserting Dual-license header to all modules\n"); @@ -357,11 +361,13 @@ main ( break; case 's': + /* Statistics only */ break; case 'u': + /* custom conversion */ printf ("Custom source translation\n"); @@ -369,30 +375,35 @@ main ( break; case 'v': + /* Verbose mode */ Gbl_VerboseMode = TRUE; break; case 'y': + /* Batch mode */ Gbl_BatchMode = TRUE; break; case 'd': + /* Leave debug statements in */ Gbl_DebugStatementsMode = TRUE; break; case 'q': + /* Quiet mode */ Gbl_QuietMode = TRUE; break; default: + AsDisplayUsage (); return (-1); } diff --git a/source/tools/acpixtract/acpixtract.c b/source/tools/acpixtract/acpixtract.c index 7f279e9..efed936 100644 --- a/source/tools/acpixtract/acpixtract.c +++ b/source/tools/acpixtract/acpixtract.c @@ -606,6 +606,7 @@ AxExtractTables ( continue; default: + Status = -1; goto CleanupAndExit; } diff --git a/source/tools/acpixtract/axmain.c b/source/tools/acpixtract/axmain.c index bbf8a70..b0cadfc 100644 --- a/source/tools/acpixtract/axmain.c +++ b/source/tools/acpixtract/axmain.c @@ -117,6 +117,7 @@ main ( int j; + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ printf (ACPI_COMMON_SIGNON ("ACPI Binary Table Extraction Utility")); if (argc < 2) @@ -130,19 +131,23 @@ main ( while ((j = AcpiGetopt (argc, argv, "ahls:")) != EOF) switch (j) { case 'a': + AxAction = AX_EXTRACT_ALL; /* Extract all tables found */ break; case 'l': + AxAction = AX_LIST_ALL; /* List tables only, do not extract */ break; case 's': + AxAction = AX_EXTRACT_SIGNATURE; /* Extract only tables with this sig */ break; case 'h': default: + DisplayUsage (); return (0); } @@ -161,14 +166,17 @@ main ( switch (AxAction) { case AX_EXTRACT_ALL: + Status = AxExtractTables (Filename, NULL, AX_OPTIONAL_TABLES); break; case AX_LIST_ALL: + Status = AxListTables (Filename); break; case AX_EXTRACT_SIGNATURE: + Status = AxExtractTables (Filename, AcpiGbl_Optarg, AX_REQUIRED_TABLE); break; diff --git a/source/tools/examples/examples.c b/source/tools/examples/examples.c index 2c7191a..d90715d 100644 --- a/source/tools/examples/examples.c +++ b/source/tools/examples/examples.c @@ -119,6 +119,7 @@ main ( ACPI_FUNCTION_NAME (Examples-main); + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ InitializeFullAcpi (); /* Enable debug output, example debug print */ diff --git a/tests/aapits/atmain.c b/tests/aapits/atmain.c index eac2230..fc926a1 100644 --- a/tests/aapits/atmain.c +++ b/tests/aapits/atmain.c @@ -289,6 +289,8 @@ main( UINT32 j; + ACPI_DEBUG_INITIALIZE (); /* For debug version only */ + signal (SIGINT, AtSigHandler); signal (SIGILL, AtSigHandler); signal (SIGFPE, AtSigHandler); diff --git a/tests/aslts.sh b/tests/aslts.sh index 154e5b3..bf6be0b 100755 --- a/tests/aslts.sh +++ b/tests/aslts.sh @@ -56,14 +56,10 @@ build_acpi_tools() { make iasl make acpiexec - if [ -d "bin64" ] && [ -f "bin64/iasl" ]; then - echo "Installing 64-bit tools" - cp bin64/iasl $tmp_iasl - cp bin64/acpiexec $tmp_acpiexec - elif [ -d "bin32" ] && [ -f "bin32/iasl" ]; then - echo "Installing 32-bit tools" - cp bin32/iasl $tmp_iasl - cp bin32/acpiexec $tmp_acpiexec + if [ -d "bin" ] && [ -f "bin/iasl" ]; then + echo "Installing ACPICA tools" + cp bin/iasl $tmp_iasl + cp bin/acpiexec $tmp_acpiexec else echo "Could not find iASL/acpiexec tools" exit diff --git a/tests/aslts/src/runtime/collections/Identity2MS/abbu/misc/ms1.asl b/tests/aslts/src/runtime/collections/Identity2MS/abbu/misc/ms1.asl index d9b8816..0e0b6f1 100644 --- a/tests/aslts/src/runtime/collections/Identity2MS/abbu/misc/ms1.asl +++ b/tests/aslts/src/runtime/collections/Identity2MS/abbu/misc/ms1.asl @@ -400,7 +400,8 @@ Method(c113) { IIN0() ms13(3) Return(POUT) } /* * Bug 114 issue: * - * SUMMARY: Method object as a Source of Index operation is treated by iASL mistakenly as a call to that Method + * SUMMARY: Method object as a Source of Index operation is treated by iASL as a call to that Method + * Note: M001 will become a method call. No parens needed because it has no argument. */ Method(ms14, 1, Serialized) { @@ -430,20 +431,16 @@ Method(ms14, 1, Serialized) OUTP("Index(m001, 0, Local0)") Index(m001, 0, Local0) if (LAnd(ABUU, LNot(q005))) { - } elseif (i001) { + } elseif (LNot(i001)) { err(ts, z179, 0x01a, 0, 0, i001, 0) - } else { - CH04(ts, 0, 0xff, z179, 0x01b, 0, 0) } } elseif (LEqual(arg0, 1)) { OUTP("Start of test: Method returns (Package(){10,2,3,4,5})") OUTP("Index(m001, 0, Local0)") Index(m001, 0, Local0) if (LAnd(ABUU, LNot(q005))) { - } elseif (i001) { + } elseif (LNot(i001)) { err(ts, z179, 0x01c, 0, 0, i001, 0) - } else { - CH04(ts, 0, 0xff, z179, 0x01d, 0, 0) } } elseif (LEqual(arg0, 2)) { OUTP("Start of test: Name(b001, Buffer(){10,2,3,4,5})") diff --git a/tests/aslts/src/runtime/collections/functional/table/load.asl b/tests/aslts/src/runtime/collections/functional/table/load.asl index ddf0594..729bb7c 100644 --- a/tests/aslts/src/runtime/collections/functional/table/load.asl +++ b/tests/aslts/src/runtime/collections/functional/table/load.asl @@ -1590,7 +1590,13 @@ Device(DTM0) { // Load operator execution, OpRegion Field case Load(RFU0, HI0) - CH04(arg0, 0, 42, z174, 0x096, 0, 0) // AE_INVALID_TABLE_LENGTH + if(LNot(arg1)){ + // If the table length in the header is larger than the buffer. + CH04(arg0, 0, 54, z174, 0x096, 0, 0) // AE_AML_BUFFER_LIMIT + } else { + // If the table length is smaller than an ACPI table header. + CH04(arg0, 0, 42, z174, 0x096, 0, 0) // AE_INVALID_TABLE_LENGTH + } if (CondRefof(\SSS0, Local0)) { err(arg0, z174, 0x097, 0, 0, "\\SSS0", 1) diff --git a/tests/aslts/src/runtime/collections/functional/table/loadtable.asl b/tests/aslts/src/runtime/collections/functional/table/loadtable.asl index 743b4c5..32ab109 100644 --- a/tests/aslts/src/runtime/collections/functional/table/loadtable.asl +++ b/tests/aslts/src/runtime/collections/functional/table/loadtable.asl @@ -1778,31 +1778,31 @@ Device(DTM2) { } else { LoadTable(Local1, "", "", "\\", "\\DTM2.PLDT", 1) if (SLCK) { - CH04(arg0, 0, 47, z176, 0x10e, 0, 0) // AE_AML_OPERAND_TYPE + CH04(arg0, 0, 61, z176, 0x10e, 0, 0) // AE_AML_STRING_LIMIT } else { CH04(arg0, 0, 49, z176, 0x10e, 0, 0) // AE_AML_UNINITIALIZED_LOCAL } LoadTable("OEM1", Local1, "", "\\", "\\DTM2.PLDT", 1) if (SLCK) { - CH04(arg0, 0, 47, z176, 0x10f, 0, 0) // AE_AML_OPERAND_TYPE + CH04(arg0, 0, 61, z176, 0x10f, 0, 0) // AE_AML_STRING_LIMIT } else { CH04(arg0, 0, 49, z176, 0x10f, 0, 0) // AE_AML_UNINITIALIZED_LOCAL } LoadTable("OEM1", "", Local1, "\\", "\\DTM2.PLDT", 1) if (SLCK) { - CH04(arg0, 0, 47, z176, 0x110, 0, 0) // AE_AML_OPERAND_TYPE + CH04(arg0, 0, 61, z176, 0x110, 0, 0) // AE_AML_STRING_LIMIT } else { CH04(arg0, 0, 49, z176, 0x110, 0, 0) // AE_AML_UNINITIALIZED_LOCAL } LoadTable("OEM1", "", "", Local1, "\\DTM2.PLDT", 1) if (SLCK) { - CH04(arg0, 0, 47, z176, 0x111, 0, 0) // AE_AML_OPERAND_TYPE + CH04(arg0, 0, 30, z176, 0x111, 0, 0) // AE_BAD_PATHNAME } else { CH04(arg0, 0, 49, z176, 0x111, 0, 0) // AE_AML_UNINITIALIZED_LOCAL } LoadTable("OEM1", "", "", "\\", Local1, 1) if (SLCK) { - CH04(arg0, 0, 47, z176, 0x112, 0, 0) // AE_AML_OPERAND_TYPE + CH04(arg0, 0, 30, z176, 0x112, 0, 0) // AE_BAD_PATHNAME } else { CH04(arg0, 0, 49, z176, 0x112, 0, 0) // AE_AML_UNINITIALIZED_LOCAL } diff --git a/tests/aslts/src/runtime/collections/functional/table/unload.asl b/tests/aslts/src/runtime/collections/functional/table/unload.asl index 6febb5a..a68495b 100644 --- a/tests/aslts/src/runtime/collections/functional/table/unload.asl +++ b/tests/aslts/src/runtime/collections/functional/table/unload.asl @@ -633,7 +633,7 @@ Device(DTM1) { if (SLCK) { CH04(arg0, 0, 47, z175, 0x046, 0, 0) // AE_AML_OPERAND_TYPE } else { - CH04(arg0, 0, 62, z175, 0x047, 0, 0) // AE_AML_NO_RETURN_VALUE + CH04(arg0, 0, 47, z175, 0x047, 0, 0) // AE_AML_OPERAND_TYPE } UnLoad(DDB0) diff --git a/tests/misc/grammar.aml b/tests/misc/grammar.aml index 8c7529e..0177338 100755 Binary files a/tests/misc/grammar.aml and b/tests/misc/grammar.aml differ