From 998feeb531404850ce42773623ece028199eadef Mon Sep 17 00:00:00 2001
From: Sascha Wildner <saw@online.de>
Date: Fri, 27 Jun 2014 22:12:36 +0200
Subject: [PATCH] WIP acpi-20140627

---
 sys/contrib/dev/acpica/Makefile                    |   12 +-
 sys/contrib/dev/acpica/changes.txt                 |  101 ++
 .../dev/acpica/generate/unix/acpibin/Makefile      |    3 +
 .../dev/acpica/generate/unix/acpidump/Makefile     |    5 +
 .../dev/acpica/generate/unix/acpiexamples/Makefile |   22 +-
 .../dev/acpica/generate/unix/acpiexec/Makefile     |    3 +
 .../dev/acpica/generate/unix/acpihelp/Makefile     |   11 +-
 .../dev/acpica/generate/unix/acpinames/Makefile    |   12 +-
 .../dev/acpica/generate/unix/acpisrc/Makefile      |   13 +-
 .../dev/acpica/generate/unix/acpixtract/Makefile   |   14 +-
 sys/contrib/dev/acpica/generate/unix/iasl/Makefile |    3 +
 sys/contrib/dev/acpica/source/common/ahpredef.c    |    1 -
 sys/contrib/dev/acpica/source/common/cmfsize.c     |   20 +-
 sys/contrib/dev/acpica/source/common/getopt.c      |   14 +-
 .../dev/acpica/source/compiler/aslanalyze.c        |   48 -
 .../dev/acpica/source/compiler/aslcompiler.h       |    9 -
 sys/contrib/dev/acpica/source/compiler/aslmain.c   |    1 +
 .../dev/acpica/source/compiler/aslmessages.c       |    1 -
 .../dev/acpica/source/compiler/aslmessages.h       |    1 -
 sys/contrib/dev/acpica/source/compiler/aslmethod.c |   20 -
 .../dev/acpica/source/compiler/asloptions.c        |    2 +-
 sys/contrib/dev/acpica/source/compiler/aslstubs.c  |   25 -
 .../acpica/source/components/debugger/dbfileio.c   |  316 +----
 .../dev/acpica/source/components/debugger/dbtest.c |    1 +
 .../source/components/disassembler/dmbuffer.c      |   72 +-
 .../acpica/source/components/disassembler/dmwalk.c |   28 +-
 .../acpica/source/components/executer/exfield.c    |  103 +-
 .../dev/acpica/source/components/hardware/hwregs.c |    8 +-
 .../acpica/source/components/namespace/nsobject.c  |   11 +
 .../dev/acpica/source/components/tables/tbdata.c   |   65 +-
 .../dev/acpica/source/components/tables/tbinstal.c |    8 +-
 .../dev/acpica/source/components/tables/tbutils.c  |    4 -
 .../acpica/source/components/utilities/utbuffer.c  |  135 ++
 .../acpica/source/components/utilities/utclib.c    |    6 +-
 .../acpica/source/components/utilities/utcopy.c    |    7 +
 .../acpica/source/components/utilities/utdebug.c   |   30 +
 .../acpica/source/components/utilities/utfileio.c  |  363 ++++++
 .../acpica/source/components/utilities/utglobal.c  |  157 ---
 .../acpica/source/components/utilities/utinit.c    |  156 +++
 .../acpica/source/components/utilities/utprint.c   |  796 ++++++++++++
 sys/contrib/dev/acpica/source/include/acapps.h     |    9 +-
 sys/contrib/dev/acpica/source/include/acdebug.h    |    5 -
 sys/contrib/dev/acpica/source/include/acglobal.h   |    8 +-
 sys/contrib/dev/acpica/source/include/acnames.h    |    1 -
 sys/contrib/dev/acpica/source/include/acpi.h       |    4 +-
 sys/contrib/dev/acpica/source/include/acpiosxf.h   |   49 +
 sys/contrib/dev/acpica/source/include/acpixf.h     |   36 +-
 sys/contrib/dev/acpica/source/include/acpredef.h   |    6 -
 sys/contrib/dev/acpica/source/include/actables.h   |   14 +-
 sys/contrib/dev/acpica/source/include/actypes.h    |   16 +
 sys/contrib/dev/acpica/source/include/acutils.h    |   70 +-
 .../dev/acpica/source/include/platform/accygwin.h  |    9 +-
 .../dev/acpica/source/include/platform/acefi.h     |   61 +
 .../dev/acpica/source/include/platform/acenv.h     |   53 +-
 .../dev/acpica/source/include/platform/acenvex.h   |   63 +
 .../dev/acpica/source/include/platform/aclinux.h   |  194 +--
 .../dev/acpica/source/include/platform/aclinuxex.h |  137 +++
 .../source/os_specific/service_layers/osefitbl.c   | 1033 ++++++++++++++++
 .../source/os_specific/service_layers/osefixf.c    | 1300 ++++++++++++++++++++
 .../source/os_specific/service_layers/oslibcfs.c   |  251 ++++
 .../source/os_specific/service_layers/oslinuxtbl.c |   61 +-
 .../source/os_specific/service_layers/osunixxf.c   |   66 +-
 .../source/os_specific/service_layers/oswinxf.c    |   65 +-
 .../dev/acpica/source/tools/acpibin/abcompare.c    |   27 -
 .../dev/acpica/source/tools/acpibin/abmain.c       |    2 +-
 .../dev/acpica/source/tools/acpidump/acpidump.h    |    3 +-
 .../dev/acpica/source/tools/acpidump/apdump.c      |   76 +-
 .../dev/acpica/source/tools/acpidump/apfiles.c     |   89 +-
 .../dev/acpica/source/tools/acpidump/apmain.c      |   80 +-
 .../dev/acpica/source/tools/acpiexec/aehandlers.c  |   16 +-
 .../dev/acpica/source/tools/acpiexec/aemain.c      |   23 +-
 .../dev/acpica/source/tools/acpiexec/aetables.c    |    8 +-
 .../dev/acpica/source/tools/acpihelp/ahmain.c      |   19 +-
 .../dev/acpica/source/tools/acpinames/anmain.c     |   26 +-
 .../dev/acpica/source/tools/acpinames/anstubs.c    |  174 ---
 .../dev/acpica/source/tools/acpinames/antables.c   |    8 +-
 .../dev/acpica/source/tools/acpisrc/asmain.c       |    5 +-
 .../dev/acpica/source/tools/acpisrc/astable.c      |    6 +
 .../dev/acpica/source/tools/acpixtract/axmain.c    |    7 +-
 .../dev/acpica/source/tools/examples/examples.c    |   61 +
 .../dev/acpica/source/tools/examples/exstubs.c     |  250 ----
 .../dev/acpica/source/tools/examples/extables.c    |   41 +-
 usr.sbin/acpi/acpibin/Makefile                     |    3 +
 usr.sbin/acpi/acpidump/Makefile                    |    5 +
 usr.sbin/acpi/acpiexec/Makefile                    |    3 +
 usr.sbin/acpi/acpihelp/Makefile                    |    8 +-
 usr.sbin/acpi/acpinames/Makefile                   |   11 +-
 usr.sbin/acpi/acpixtract/Makefile                  |   10 +-
 usr.sbin/acpi/iasl/Makefile                        |    3 +
 89 files changed, 5567 insertions(+), 1515 deletions(-)
 create mode 100644 sys/contrib/dev/acpica/source/components/utilities/utfileio.c
 create mode 100644 sys/contrib/dev/acpica/source/components/utilities/utprint.c
 create mode 100644 sys/contrib/dev/acpica/source/include/platform/acenvex.h
 create mode 100644 sys/contrib/dev/acpica/source/include/platform/aclinuxex.h
 create mode 100644 sys/contrib/dev/acpica/source/os_specific/service_layers/osefitbl.c
 create mode 100644 sys/contrib/dev/acpica/source/os_specific/service_layers/osefixf.c
 create mode 100644 sys/contrib/dev/acpica/source/os_specific/service_layers/oslibcfs.c

diff --git a/sys/contrib/dev/acpica/Makefile b/sys/contrib/dev/acpica/Makefile
index 5ee33d7..80bf379 100644
--- a/sys/contrib/dev/acpica/Makefile
+++ b/sys/contrib/dev/acpica/Makefile
@@ -10,7 +10,13 @@
 # code directories. This prevents collisions between different
 # compilations of the same source file with different compile options.
 #
-BUILD_DIRECTORY_PATH = "generate/unix"
 
-include generate/unix/Makefile.config
-include generate/unix/Makefile.common
+ifeq ($(OS),efi)
+	BUILD_DIRECTORY_PATH = "generate/efi"
+	include generate/efi/Makefile.config
+	include generate/efi/Makefile.common
+else
+	BUILD_DIRECTORY_PATH = "generate/unix"
+	include generate/unix/Makefile.config
+	include generate/unix/Makefile.common
+endif
diff --git a/sys/contrib/dev/acpica/changes.txt b/sys/contrib/dev/acpica/changes.txt
index e93fc4d..3acf4fd 100644
--- a/sys/contrib/dev/acpica/changes.txt
+++ b/sys/contrib/dev/acpica/changes.txt
@@ -1,4 +1,105 @@
 ----------------------------------------
+27 June 2014. Summary of changes for version 20140627:
+
+1) ACPICA kernel-resident subsystem:
+
+Formatted Output: Implemented local versions of standard formatted output 
+utilities such as printf, etc. Over time, it has been discovered that 
+there are in fact many portability issues with printf, and the addition 
+of this feature will fix/prevent these issues once and for all. Some 
+known issues are summarized below:
+
+1) Output of 64-bit values is not portable. For example, UINT64 is %ull 
+for the Linux kernel and is %uI64 for some MSVC versions.
+2) Invoking printf consistently in a manner that is portable across both 
+32-bit and 64-bit platforms is difficult at best in many situations.
+3) The output format for pointers varies from system to system (leading 
+zeros especially), and leads to inconsistent output from ACPICA across 
+platforms.
+4) Certain platform-specific printf formats may conflict with ACPICA use.
+5) If there is no local C library available, ACPICA now has local support 
+for printf.
+
+-- To address these printf issues in a complete manner, ACPICA now 
+directly implements a small subset of printf format specifiers, only 
+those that it requires. Adds a new file, utilities/utprint.c. Lv Zheng.
+
+Implemented support for ACPICA generation within the EFI environment. 
+Initially, the AcpiDump utility is supported in the UEFI shell 
+environment. Lv Zheng.
+
+Added a new external interface, AcpiLogError, to improve ACPICA 
+portability. This allows the host to redirect error messages from the 
+ACPICA utilities. Lv Zheng.
+
+Added and deployed new OSL file I/O interfaces to improve ACPICA 
+portability:
+  AcpiOsOpenFile
+  AcpiOsCloseFile
+  AcpiOsReadFile
+  AcpiOsWriteFile
+  AcpiOsGetFileOffset
+  AcpiOsSetFileOffset
+There are C library implementations of these functions in the new file 
+service_layers/oslibcfs.c -- however, the functions can be implemented by 
+the local host in any way necessary. Lv Zheng.
+
+Implemented a mechanism to disable/enable ACPI table checksum validation 
+at runtime. This can be useful when loading tables very early during OS 
+initialization when it may not be possible to map the entire table in 
+order to compute the checksum. Lv Zheng.
+
+Fixed a buffer allocation issue for the Generic Serial Bus support. 
+Originally, a fixed buffer length was used. This change allows for 
+variable-length buffers based upon the protocol indicated by the field 
+access attributes. Reported by Lan Tianyu. Lv Zheng.
+
+Fixed a problem where an object detached from a namespace node was not 
+properly terminated/cleared and could cause a circular list problem if 
+reattached. ACPICA BZ 1063. David Box.
+
+Fixed a possible recursive lock acquisition in hwregs.c. Rakib Mullick.
+
+Fixed a possible memory leak in an error return path within the function 
+AcpiUtCopyIobjectToIobject. ACPICA BZ 1087. Colin Ian King.
+
+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:  98.7K Code, 27.2K Data, 125.9K Total
+    Debug Version:     191.7K Code, 79.6K Data, 271.3K Total
+  Previous Release:
+    Non-Debug Version:  96.8K Code, 27.2K Data, 124.0K Total
+    Debug Version:     189.5K Code, 79.7K Data, 269.2K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Disassembler: Add dump of ASCII equivalent text within a comment at the 
+end of each line of the output for the Buffer() ASL operator.
+
+AcpiDump: Miscellaneous changes:
+  Fixed repetitive table dump in -n mode.
+  For older EFI platforms, use the ACPI 1.0 GUID during RSDP search if 
+the ACPI 2.0 GUID fails.
+
+iASL: Fixed a problem where the compiler could fault if incorrectly given 
+an acpidump output file as input. ACPICA BZ 1088. David Box.
+
+AcpiExec/AcpiNames: Fixed a problem where these utilities could fault if 
+they are invoked without any arguments.
+
+Debugger: Fixed a possible memory leak in an error return path. ACPICA BZ 
+1086. Colin Ian King.
+
+Disassembler: Cleaned up a block of code that extracts a parent Op 
+object. Added a comment that explains that the parent is guaranteed to be 
+valid in this case. ACPICA BZ 1069.
+
+----------------------------------------
 24 April 2014. Summary of changes for version 20140424:
 
 1) ACPICA kernel-resident subsystem:
diff --git a/sys/contrib/dev/acpica/generate/unix/acpibin/Makefile b/sys/contrib/dev/acpica/generate/unix/acpibin/Makefile
index c33c085..1be484d 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpibin/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpibin/Makefile
@@ -34,6 +34,7 @@ OBJECTS = \
 	$(OBJDIR)/utalloc.o\
 	$(OBJDIR)/utbuffer.o\
 	$(OBJDIR)/utcache.o\
+	$(OBJDIR)/utdebug.o\
 	$(OBJDIR)/utdecode.o\
 	$(OBJDIR)/utexcep.o\
 	$(OBJDIR)/utglobal.o\
@@ -41,9 +42,11 @@ OBJECTS = \
 	$(OBJDIR)/utmath.o\
 	$(OBJDIR)/utmisc.o\
 	$(OBJDIR)/utmutex.o\
+	$(OBJDIR)/utprint.o\
 	$(OBJDIR)/utstate.o\
 	$(OBJDIR)/utstring.o\
 	$(OBJDIR)/utxferror.o\
+	$(OBJDIR)/oslibcfs.o\
 	$(OBJDIR)/osunixxf.o
 
 #
diff --git a/sys/contrib/dev/acpica/generate/unix/acpidump/Makefile b/sys/contrib/dev/acpica/generate/unix/acpidump/Makefile
index 8a9cda5..64256ea 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpidump/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpidump/Makefile
@@ -33,13 +33,18 @@ OBJECTS = \
 	$(OBJDIR)/apmain.o\
 	$(OBJDIR)/cmfsize.o\
 	$(OBJDIR)/getopt.o\
+	$(OBJDIR)/oslibcfs.o\
 	$(OBJDIR)/osunixdir.o\
 	$(OBJDIR)/osunixmap.o\
+	$(OBJDIR)/osunixxf.o\
 	$(OBJDIR)/tbprint.o\
 	$(OBJDIR)/tbxfroot.o\
 	$(OBJDIR)/utbuffer.o\
+	$(OBJDIR)/utdebug.o\
 	$(OBJDIR)/utexcep.o\
+	$(OBJDIR)/utglobal.o\
 	$(OBJDIR)/utmath.o\
+	$(OBJDIR)/utprint.o\
 	$(OBJDIR)/utstring.o\
 	$(OBJDIR)/utxferror.o
 
diff --git a/sys/contrib/dev/acpica/generate/unix/acpiexamples/Makefile b/sys/contrib/dev/acpica/generate/unix/acpiexamples/Makefile
index c2f3c73..8bcdb9b 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpiexamples/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpiexamples/Makefile
@@ -20,9 +20,10 @@ PROG = $(OBJDIR)/acpiexamples
 #
 vpath %.c \
     $(ACPIEXAMPLES)\
-    $(ACPICA_DEBUGGER)\
     $(ACPICA_DISPATCHER)\
+    $(ACPICA_EVENTS)\
     $(ACPICA_EXECUTER)\
+    $(ACPICA_HARDWARE)\
     $(ACPICA_NAMESPACE)\
     $(ACPICA_PARSER)\
     $(ACPICA_TABLES)\
@@ -51,6 +52,12 @@ OBJECTS = \
 	$(OBJDIR)/dswload2.o\
 	$(OBJDIR)/dswscope.o\
 	$(OBJDIR)/dswstate.o\
+	$(OBJDIR)/evhandler.o\
+	$(OBJDIR)/evmisc.o\
+	$(OBJDIR)/evregion.o\
+	$(OBJDIR)/evrgnini.o\
+	$(OBJDIR)/evxface.o\
+	$(OBJDIR)/evxfregn.o\
 	$(OBJDIR)/exconfig.o\
 	$(OBJDIR)/exconvrt.o\
 	$(OBJDIR)/excreate.o\
@@ -75,8 +82,10 @@ OBJECTS = \
 	$(OBJDIR)/exstorob.o\
 	$(OBJDIR)/exsystem.o\
 	$(OBJDIR)/exutils.o\
+	$(OBJDIR)/hwpci.o\
 	$(OBJDIR)/nsaccess.o\
 	$(OBJDIR)/nsalloc.o\
+	$(OBJDIR)/nsarguments.o\
 	$(OBJDIR)/nsconvert.o\
 	$(OBJDIR)/nsdump.o\
 	$(OBJDIR)/nseval.o\
@@ -85,12 +94,17 @@ OBJECTS = \
 	$(OBJDIR)/nsnames.o\
 	$(OBJDIR)/nsobject.o\
 	$(OBJDIR)/nsparse.o\
+	$(OBJDIR)/nspredef.o\
+	$(OBJDIR)/nsprepkg.o\
+	$(OBJDIR)/nsrepair.o\
+	$(OBJDIR)/nsrepair2.o\
 	$(OBJDIR)/nssearch.o\
 	$(OBJDIR)/nsutils.o\
 	$(OBJDIR)/nswalk.o\
 	$(OBJDIR)/nsxfeval.o\
 	$(OBJDIR)/nsxfname.o\
 	$(OBJDIR)/nsxfobj.o\
+	$(OBJDIR)/oslibcfs.o\
 	$(OBJDIR)/osunixxf.o\
 	$(OBJDIR)/psargs.o\
 	$(OBJDIR)/psloop.o\
@@ -121,8 +135,11 @@ OBJECTS = \
 	$(OBJDIR)/utdecode.o\
 	$(OBJDIR)/utdelete.o\
 	$(OBJDIR)/uterror.o\
+	$(OBJDIR)/uteval.o\
 	$(OBJDIR)/utexcep.o\
 	$(OBJDIR)/utglobal.o\
+	$(OBJDIR)/utids.o\
+	$(OBJDIR)/utinit.o\
 	$(OBJDIR)/utlock.o\
 	$(OBJDIR)/utmath.o\
 	$(OBJDIR)/utmisc.o\
@@ -130,6 +147,9 @@ OBJECTS = \
 	$(OBJDIR)/utobject.o\
 	$(OBJDIR)/utosi.o\
 	$(OBJDIR)/utownerid.o\
+	$(OBJDIR)/utpredef.o\
+	$(OBJDIR)/utprint.o\
+	$(OBJDIR)/utresrc.o\
 	$(OBJDIR)/utstate.o\
 	$(OBJDIR)/utstring.o\
 	$(OBJDIR)/utxface.o\
diff --git a/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile b/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile
index 84cc978..6c5c632 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpiexec/Makefile
@@ -155,6 +155,7 @@ OBJECTS = \
 	$(OBJDIR)/nsxfeval.o\
 	$(OBJDIR)/nsxfname.o\
 	$(OBJDIR)/nsxfobj.o\
+	$(OBJDIR)/oslibcfs.o\
 	$(OBJDIR)/osunixxf.o\
 	$(OBJDIR)/psargs.o\
 	$(OBJDIR)/psloop.o\
@@ -201,6 +202,7 @@ OBJECTS = \
 	$(OBJDIR)/uterror.o\
 	$(OBJDIR)/uteval.o\
 	$(OBJDIR)/utexcep.o\
+	$(OBJDIR)/utfileio.o\
 	$(OBJDIR)/utglobal.o\
 	$(OBJDIR)/utids.o\
 	$(OBJDIR)/utinit.o\
@@ -212,6 +214,7 @@ OBJECTS = \
 	$(OBJDIR)/utosi.o\
 	$(OBJDIR)/utownerid.o\
 	$(OBJDIR)/utpredef.o\
+	$(OBJDIR)/utprint.o\
 	$(OBJDIR)/utresrc.o\
 	$(OBJDIR)/utstate.o\
 	$(OBJDIR)/utstring.o\
diff --git a/sys/contrib/dev/acpica/generate/unix/acpihelp/Makefile b/sys/contrib/dev/acpica/generate/unix/acpihelp/Makefile
index da6ee49..25c8c0a 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpihelp/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpihelp/Makefile
@@ -21,7 +21,8 @@ PROG = $(OBJDIR)/acpihelp
 vpath %.c \
     $(ACPIHELP)\
     $(ACPICA_COMMON)\
-    $(ACPICA_UTILITIES)
+    $(ACPICA_UTILITIES)\
+    $(ACPICA_OSL)
 
 HEADERS = \
     $(wildcard $(ACPIHELP)/*.h)
@@ -35,8 +36,14 @@ OBJECTS = \
 	$(OBJDIR)/ahpredef.o\
 	$(OBJDIR)/ahmain.o\
 	$(OBJDIR)/getopt.o\
+	$(OBJDIR)/oslibcfs.o\
+	$(OBJDIR)/osunixxf.o\
+	$(OBJDIR)/utdebug.o\
 	$(OBJDIR)/utexcep.o\
-	$(OBJDIR)/utpredef.o
+	$(OBJDIR)/utglobal.o\
+	$(OBJDIR)/utmath.o\
+	$(OBJDIR)/utpredef.o\
+	$(OBJDIR)/utprint.o
 
 #
 # Flags specific to acpihelp
diff --git a/sys/contrib/dev/acpica/generate/unix/acpinames/Makefile b/sys/contrib/dev/acpica/generate/unix/acpinames/Makefile
index 00a0026..27c7b95 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpinames/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpinames/Makefile
@@ -21,7 +21,6 @@ PROG = $(OBJDIR)/acpinames
 #
 vpath %.c \
     $(ACPINAMES)\
-    $(ACPICA_DEBUGGER)\
     $(ACPICA_DISPATCHER)\
     $(ACPICA_EXECUTER)\
     $(ACPICA_NAMESPACE)\
@@ -39,7 +38,6 @@ OBJECTS = \
 	$(OBJDIR)/anstubs.o\
 	$(OBJDIR)/antables.o\
 	$(OBJDIR)/cmfsize.o\
-	$(OBJDIR)/dbfileio.o\
 	$(OBJDIR)/dsfield.o\
 	$(OBJDIR)/dsmthdat.o\
 	$(OBJDIR)/dsobject.o\
@@ -49,9 +47,12 @@ OBJECTS = \
 	$(OBJDIR)/dswscope.o\
 	$(OBJDIR)/dswstate.o\
 	$(OBJDIR)/excreate.o\
+	$(OBJDIR)/exdump.o\
+	$(OBJDIR)/exmutex.o\
 	$(OBJDIR)/exnames.o\
 	$(OBJDIR)/exresnte.o\
 	$(OBJDIR)/exresolv.o\
+	$(OBJDIR)/exsystem.o\
 	$(OBJDIR)/exutils.o\
 	$(OBJDIR)/getopt.o\
 	$(OBJDIR)/nsaccess.o\
@@ -68,6 +69,7 @@ OBJECTS = \
 	$(OBJDIR)/nsxfeval.o\
 	$(OBJDIR)/nsxfname.o\
 	$(OBJDIR)/nsxfobj.o\
+	$(OBJDIR)/oslibcfs.o\
 	$(OBJDIR)/osunixxf.o\
 	$(OBJDIR)/psargs.o\
 	$(OBJDIR)/psloop.o\
@@ -91,13 +93,18 @@ OBJECTS = \
 	$(OBJDIR)/tbxfroot.o\
 	$(OBJDIR)/utaddress.o\
 	$(OBJDIR)/utalloc.o\
+	$(OBJDIR)/utbuffer.o\
 	$(OBJDIR)/utcache.o\
 	$(OBJDIR)/utdebug.o\
 	$(OBJDIR)/utdecode.o\
 	$(OBJDIR)/utdelete.o\
 	$(OBJDIR)/uterror.o\
+	$(OBJDIR)/uteval.o\
 	$(OBJDIR)/utexcep.o\
+	$(OBJDIR)/utfileio.o\
 	$(OBJDIR)/utglobal.o\
+	$(OBJDIR)/utids.o\
+	$(OBJDIR)/utinit.o\
 	$(OBJDIR)/utlock.o\
 	$(OBJDIR)/utmath.o\
 	$(OBJDIR)/utmisc.o\
@@ -105,6 +112,7 @@ OBJECTS = \
 	$(OBJDIR)/utobject.o\
 	$(OBJDIR)/utosi.o\
 	$(OBJDIR)/utownerid.o\
+	$(OBJDIR)/utprint.o\
 	$(OBJDIR)/utstate.o\
 	$(OBJDIR)/utstring.o\
 	$(OBJDIR)/utxface.o\
diff --git a/sys/contrib/dev/acpica/generate/unix/acpisrc/Makefile b/sys/contrib/dev/acpica/generate/unix/acpisrc/Makefile
index 50199ce..5d40c09 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpisrc/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpisrc/Makefile
@@ -19,6 +19,7 @@ PROG = $(OBJDIR)/acpisrc
 #
 vpath %.c \
     $(ACPISRC)\
+    $(ACPICA_UTILITIES)\
     $(ACPICA_COMMON)\
     $(ACPICA_OSL)
 
@@ -33,9 +34,17 @@ OBJECTS = \
     $(OBJDIR)/asremove.o\
     $(OBJDIR)/astable.o\
     $(OBJDIR)/asutils.o\
-	$(OBJDIR)/cmfsize.o\
+    $(OBJDIR)/cmfsize.o\
     $(OBJDIR)/getopt.o \
-    $(OBJDIR)/osunixdir.o
+    $(OBJDIR)/oslibcfs.o\
+    $(OBJDIR)/osunixdir.o\
+    $(OBJDIR)/osunixxf.o\
+    $(OBJDIR)/utdebug.o\
+    $(OBJDIR)/utexcep.o\
+    $(OBJDIR)/utglobal.o\
+    $(OBJDIR)/utmath.o\
+    $(OBJDIR)/utprint.o\
+    $(OBJDIR)/utxferror.o
 
 #
 # Compile flags specific to acpisrc
diff --git a/sys/contrib/dev/acpica/generate/unix/acpixtract/Makefile b/sys/contrib/dev/acpica/generate/unix/acpixtract/Makefile
index 1e5b101..750583e 100644
--- a/sys/contrib/dev/acpica/generate/unix/acpixtract/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/acpixtract/Makefile
@@ -19,7 +19,9 @@ PROG = $(OBJDIR)/acpixtract
 #
 vpath %.c \
     $(ACPIXTRACT)\
-    $(ACPICA_COMMON)
+    $(ACPICA_UTILITIES)\
+    $(ACPICA_COMMON)\
+    $(ACPICA_OSL)
 
 HEADERS = \
     $(wildcard $(ACPIXTRACT)/*.h)
@@ -27,7 +29,15 @@ HEADERS = \
 OBJECTS = \
     $(OBJDIR)/acpixtract.o\
     $(OBJDIR)/axmain.o\
-    $(OBJDIR)/getopt.o
+    $(OBJDIR)/getopt.o\
+    $(OBJDIR)/oslibcfs.o\
+    $(OBJDIR)/osunixxf.o\
+    $(OBJDIR)/utdebug.o\
+    $(OBJDIR)/utexcep.o\
+    $(OBJDIR)/utglobal.o\
+    $(OBJDIR)/utmath.o\
+    $(OBJDIR)/utprint.o\
+    $(OBJDIR)/utxferror.o
 
 #
 # Flags specific to acpixtract
diff --git a/sys/contrib/dev/acpica/generate/unix/iasl/Makefile b/sys/contrib/dev/acpica/generate/unix/iasl/Makefile
index 8cc8d81..7fd7bbe 100644
--- a/sys/contrib/dev/acpica/generate/unix/iasl/Makefile
+++ b/sys/contrib/dev/acpica/generate/unix/iasl/Makefile
@@ -160,6 +160,7 @@ OBJECTS = \
 	$(OBJDIR)/nswalk.o\
 	$(OBJDIR)/nsxfobj.o\
 	$(OBJDIR)/osunixxf.o\
+	$(OBJDIR)/oslibcfs.o\
 	$(OBJDIR)/prexpress.o\
 	$(OBJDIR)/prmacros.o\
 	$(OBJDIR)/prscan.o\
@@ -190,6 +191,7 @@ OBJECTS = \
 	$(OBJDIR)/utdelete.o\
 	$(OBJDIR)/uterror.o\
 	$(OBJDIR)/utexcep.o\
+	$(OBJDIR)/utfileio.o\
 	$(OBJDIR)/utglobal.o\
 	$(OBJDIR)/utinit.o\
 	$(OBJDIR)/utlock.o\
@@ -199,6 +201,7 @@ OBJECTS = \
 	$(OBJDIR)/utobject.o\
 	$(OBJDIR)/utownerid.o\
 	$(OBJDIR)/utpredef.o\
+	$(OBJDIR)/utprint.o\
 	$(OBJDIR)/utresrc.o\
 	$(OBJDIR)/utstate.o\
 	$(OBJDIR)/utstring.o\
diff --git a/sys/contrib/dev/acpica/source/common/ahpredef.c b/sys/contrib/dev/acpica/source/common/ahpredef.c
index 2ac216f..6f4258b 100644
--- a/sys/contrib/dev/acpica/source/common/ahpredef.c
+++ b/sys/contrib/dev/acpica/source/common/ahpredef.c
@@ -217,7 +217,6 @@ const AH_PREDEFINED_NAME    AslPredefinedInfo[] =
     AH_PREDEF ("_PR3",    "Power Resources for D3hot", "Returns a list of dependent power resources to enter state D3hot"),
     AH_PREDEF ("_PRE",    "Power Resources for Enumeration", "Returns a list of dependent power resources to enumerate devices on a bus"),
     AH_PREDEF ("_PRL",    "Power Source Redundancy List", "Returns a list of power source devices in the same redundancy grouping"),
-    AH_PREDEF ("_PRP",    "Device Properties", "Returns a list of device property information"),
     AH_PREDEF ("_PRS",    "Possible Resource Settings", "Returns a list of a device's possible resource settings"),
     AH_PREDEF ("_PRT",    "PCI Routing Table", "Returns a list of PCI interrupt mappings"),
     AH_PREDEF ("_PRW",    "Power Resources for Wake", "Returns a list of dependent power resources for waking"),
diff --git a/sys/contrib/dev/acpica/source/common/cmfsize.c b/sys/contrib/dev/acpica/source/common/cmfsize.c
index c8d5a56..904d7d8 100644
--- a/sys/contrib/dev/acpica/source/common/cmfsize.c
+++ b/sys/contrib/dev/acpica/source/common/cmfsize.c
@@ -59,33 +59,34 @@
  * RETURN:      File Size. On error, -1 (ACPI_UINT32_MAX)
  *
  * DESCRIPTION: Get the size of a file. Uses seek-to-EOF. File must be open.
- *              Does not disturb the current file pointer. Uses perror for
- *              error messages.
+ *              Does not disturb the current file pointer.
  *
  ******************************************************************************/
 
 UINT32
 CmGetFileSize (
-    FILE                    *File)
+    ACPI_FILE               File)
 {
     long                    FileSize;
     long                    CurrentOffset;
+    ACPI_STATUS             Status;
 
 
     /* Save the current file pointer, seek to EOF to obtain file size */
 
-    CurrentOffset = ftell (File);
+    CurrentOffset = AcpiOsGetFileOffset (File);
     if (CurrentOffset < 0)
     {
         goto OffsetError;
     }
 
-    if (fseek (File, 0, SEEK_END))
+    Status = AcpiOsSetFileOffset (File, 0, ACPI_FILE_END);
+    if (ACPI_FAILURE (Status))
     {
         goto SeekError;
     }
 
-    FileSize = ftell (File);
+    FileSize = AcpiOsGetFileOffset (File);
     if (FileSize < 0)
     {
         goto OffsetError;
@@ -93,7 +94,8 @@ CmGetFileSize (
 
     /* Restore original file pointer */
 
-    if (fseek (File, CurrentOffset, SEEK_SET))
+    Status = AcpiOsSetFileOffset (File, CurrentOffset, ACPI_FILE_BEGIN);
+    if (ACPI_FAILURE (Status))
     {
         goto SeekError;
     }
@@ -102,10 +104,10 @@ CmGetFileSize (
 
 
 OffsetError:
-    perror ("Could not get file offset");
+    AcpiLogError ("Could not get file offset");
     return (ACPI_UINT32_MAX);
 
 SeekError:
-    perror ("Could not seek file");
+    AcpiLogError ("Could not set file offset");
     return (ACPI_UINT32_MAX);
 }
diff --git a/sys/contrib/dev/acpica/source/common/getopt.c b/sys/contrib/dev/acpica/source/common/getopt.c
index bca9a6f..5ae1e0a 100644
--- a/sys/contrib/dev/acpica/source/common/getopt.c
+++ b/sys/contrib/dev/acpica/source/common/getopt.c
@@ -51,14 +51,12 @@
  *    "f|"      - Option has required single-char sub-options
  */
 
-#include <stdio.h>
-#include <string.h>
 #include "acpi.h"
 #include "accommon.h"
 #include "acapps.h"
 
 #define ACPI_OPTION_ERROR(msg, badchar) \
-    if (AcpiGbl_Opterr) {fprintf (stderr, "%s%c\n", msg, badchar);}
+    if (AcpiGbl_Opterr) {AcpiLogError ("%s%c\n", msg, badchar);}
 
 
 int                 AcpiGbl_Opterr = 1;
@@ -123,7 +121,7 @@ AcpiGetoptArgument (
  * PARAMETERS:  argc, argv          - from main
  *              opts                - options info list
  *
- * RETURN:      Option character or EOF
+ * RETURN:      Option character or ACPI_OPT_END
  *
  * DESCRIPTION: Get the next option
  *
@@ -145,12 +143,12 @@ AcpiGetopt(
             argv[AcpiGbl_Optind][0] != '-' ||
             argv[AcpiGbl_Optind][1] == '\0')
         {
-            return (EOF);
+            return (ACPI_OPT_END);
         }
-        else if (strcmp (argv[AcpiGbl_Optind], "--") == 0)
+        else if (ACPI_STRCMP (argv[AcpiGbl_Optind], "--") == 0)
         {
             AcpiGbl_Optind++;
-            return (EOF);
+            return (ACPI_OPT_END);
         }
     }
 
@@ -161,7 +159,7 @@ AcpiGetopt(
     /* Make sure that the option is legal */
 
     if (CurrentChar == ':' ||
-       (OptsPtr = strchr (opts, CurrentChar)) == NULL)
+       (OptsPtr = ACPI_STRCHR (opts, CurrentChar)) == NULL)
     {
         ACPI_OPTION_ERROR ("Illegal option: -", CurrentChar);
 
diff --git a/sys/contrib/dev/acpica/source/compiler/aslanalyze.c b/sys/contrib/dev/acpica/source/compiler/aslanalyze.c
index 940f220..112c121 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslanalyze.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslanalyze.c
@@ -569,51 +569,3 @@ ApCheckRegMethod (
 
     AslError (ASL_WARNING, ASL_MSG_NO_REGION, Op, NULL);
 }
-
-
-/*******************************************************************************
- *
- * FUNCTION:    ApFindNameInScope
- *
- * PARAMETERS:  Name                - Name to search for
- *              Op                  - Current parse op
- *
- * RETURN:      TRUE if name found in the same scope as Op.
- *
- * DESCRIPTION: Determine if a name appears in the same scope as Op, as either
- *              a Method() or a Name().
- *
- ******************************************************************************/
-
-BOOLEAN
-ApFindNameInScope (
-    char                    *Name,
-    ACPI_PARSE_OBJECT       *Op)
-{
-    ACPI_PARSE_OBJECT       *Next;
-    ACPI_PARSE_OBJECT       *Parent;
-
-
-    /* Get the start of the current scope */
-
-    Parent = Op->Asl.Parent;
-    Next = Parent->Asl.Child;
-
-    /* Search entire scope for a match to the name */
-
-    while (Next)
-    {
-        if ((Next->Asl.ParseOpcode == PARSEOP_METHOD) ||
-            (Next->Asl.ParseOpcode == PARSEOP_NAME))
-        {
-            if (ACPI_COMPARE_NAME (Name, Next->Asl.NameSeg))
-            {
-                return (TRUE);
-            }
-        }
-
-        Next = Next->Asl.Next;
-    }
-
-    return (FALSE);
-}
diff --git a/sys/contrib/dev/acpica/source/compiler/aslcompiler.h b/sys/contrib/dev/acpica/source/compiler/aslcompiler.h
index 1f94245..40dcd69 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslcompiler.h
+++ b/sys/contrib/dev/acpica/source/compiler/aslcompiler.h
@@ -275,11 +275,6 @@ void
 ApCheckRegMethod (
     ACPI_PARSE_OBJECT       *Op);
 
-BOOLEAN
-ApFindNameInScope (
-    char                    *Name,
-    ACPI_PARSE_OBJECT       *Op);
-
 
 /*
  * aslerror - error handling/reporting
@@ -350,10 +345,6 @@ void
 AeClearErrorLog (
     void);
 
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void);
-
 
 /*
  * asllisting - generate all "listing" type files
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmain.c b/sys/contrib/dev/acpica/source/compiler/aslmain.c
index 6e92d53..3034281 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmain.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslmain.c
@@ -341,6 +341,7 @@ main (
         return (-1);
     }
 
+    AcpiOsInitialize ();
     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
 
     /* Initialize preprocessor and compiler before command line processing */
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmessages.c b/sys/contrib/dev/acpica/source/compiler/aslmessages.c
index c9d196f..926bc46 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmessages.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslmessages.c
@@ -233,7 +233,6 @@ const char                      *AslCompilerMsgs [] =
 /*    ASL_MSG_WRITE */                      "Could not write file",
 /*    ASL_MSG_RANGE */                      "Constant out of range",
 /*    ASL_MSG_BUFFER_ALLOCATION */          "Could not allocate line buffer",
-/*    ASL_MSG_MISSING_DEPENDENCY */         "Missing dependency"
 };
 
 /* Table compiler */
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmessages.h b/sys/contrib/dev/acpica/source/compiler/aslmessages.h
index 48ebcbf..851d46c 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmessages.h
+++ b/sys/contrib/dev/acpica/source/compiler/aslmessages.h
@@ -235,7 +235,6 @@ typedef enum
     ASL_MSG_WRITE,
     ASL_MSG_RANGE,
     ASL_MSG_BUFFER_ALLOCATION,
-    ASL_MSG_MISSING_DEPENDENCY,
 
     /* These messages are used by the Data Table compiler only */
 
diff --git a/sys/contrib/dev/acpica/source/compiler/aslmethod.c b/sys/contrib/dev/acpica/source/compiler/aslmethod.c
index 9b0a7a1..a9b0640 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslmethod.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslmethod.c
@@ -108,17 +108,6 @@ MtMethodAnalysisWalkBegin (
 
         WalkInfo->MethodStack = MethodInfo;
 
-        /* Special handling for _PRP, must have a _HID also */
-
-        if (!ACPI_STRCMP (METHOD_NAME__PRP, Op->Asl.NameSeg))
-        {
-            if (!ApFindNameInScope (METHOD_NAME__HID, Op))
-            {
-                AslError (ASL_WARNING, ASL_MSG_MISSING_DEPENDENCY, Op,
-                    "_PRP requires _HID in same scope");
-            }
-        }
-
         /* Get the name node */
 
         Next = Op->Asl.Child;
@@ -424,15 +413,6 @@ MtMethodAnalysisWalkBegin (
             }
         }
 
-        else if (!ACPI_STRCMP (METHOD_NAME__PRP, Op->Asl.NameSeg))
-        {
-            if (!ApFindNameInScope (METHOD_NAME__HID, Op))
-            {
-                AslError (ASL_WARNING, ASL_MSG_MISSING_DEPENDENCY, Op,
-                    "_PRP requires _HID in same scope");
-            }
-        }
-
         break;
 
     default:
diff --git a/sys/contrib/dev/acpica/source/compiler/asloptions.c b/sys/contrib/dev/acpica/source/compiler/asloptions.c
index 8d52826..039fc7d 100644
--- a/sys/contrib/dev/acpica/source/compiler/asloptions.c
+++ b/sys/contrib/dev/acpica/source/compiler/asloptions.c
@@ -168,7 +168,7 @@ AslDoOptions (
 
     /* Get the command line options */
 
-    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
+    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
     {
     case '@':   /* Begin a response file */
 
diff --git a/sys/contrib/dev/acpica/source/compiler/aslstubs.c b/sys/contrib/dev/acpica/source/compiler/aslstubs.c
index 589edb2..6bbb89a 100644
--- a/sys/contrib/dev/acpica/source/compiler/aslstubs.c
+++ b/sys/contrib/dev/acpica/source/compiler/aslstubs.c
@@ -57,13 +57,6 @@
  * Things like Events, Global Lock, etc. are not used
  * by the compiler, so they are stubbed out here.
  */
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void)
-{
-    return (0);
-}
-
 void
 AcpiNsExecModuleCodeList (
     void)
@@ -232,21 +225,3 @@ AcpiTbFindTable (
 {
     return (AE_SUPPORT);
 }
-
-/* OSL interfaces */
-
-ACPI_THREAD_ID
-AcpiOsGetThreadId (
-    void)
-{
-    return (1);
-}
-
-ACPI_STATUS
-AcpiOsExecute (
-    ACPI_EXECUTE_TYPE       Type,
-    ACPI_OSD_EXEC_CALLBACK  Function,
-    void                    *Context)
-{
-    return (AE_SUPPORT);
-}
diff --git a/sys/contrib/dev/acpica/source/components/debugger/dbfileio.c b/sys/contrib/dev/acpica/source/components/debugger/dbfileio.c
index a09c1de8..ee4ba15 100644
--- a/sys/contrib/dev/acpica/source/components/debugger/dbfileio.c
+++ b/sys/contrib/dev/acpica/source/components/debugger/dbfileio.c
@@ -46,14 +46,7 @@
 #include "acpi.h"
 #include "accommon.h"
 #include "acdebug.h"
-
-#ifdef ACPI_APPLICATION
 #include "actables.h"
-#endif
-
-#ifdef ACPI_ASL_COMPILER
-#include "aslcompiler.h"
-#endif
 
 #if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
 
@@ -62,18 +55,6 @@
 
 #ifdef ACPI_DEBUGGER
 
-/* Local prototypes */
-
-#ifdef ACPI_APPLICATION
-
-static ACPI_STATUS
-AcpiDbCheckTextModeCorruption (
-    UINT8                   *Table,
-    UINT32                  TableLength,
-    UINT32                  FileLength);
-
-#endif
-
 /*******************************************************************************
  *
  * FUNCTION:    AcpiDbCloseDebugFile
@@ -146,245 +127,6 @@ AcpiDbOpenDebugFile (
 
 /*******************************************************************************
  *
- * FUNCTION:    AcpiDbCheckTextModeCorruption
- *
- * PARAMETERS:  Table           - Table buffer
- *              TableLength     - Length of table from the table header
- *              FileLength      - Length of the file that contains the table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Check table for text mode file corruption where all linefeed
- *              characters (LF) have been replaced by carriage return linefeed
- *              pairs (CR/LF).
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-AcpiDbCheckTextModeCorruption (
-    UINT8                   *Table,
-    UINT32                  TableLength,
-    UINT32                  FileLength)
-{
-    UINT32                  i;
-    UINT32                  Pairs = 0;
-
-
-    if (TableLength != FileLength)
-    {
-        ACPI_WARNING ((AE_INFO,
-            "File length (0x%X) is not the same as the table length (0x%X)",
-            FileLength, TableLength));
-    }
-
-    /* Scan entire table to determine if each LF has been prefixed with a CR */
-
-    for (i = 1; i < FileLength; i++)
-    {
-        if (Table[i] == 0x0A)
-        {
-            if (Table[i - 1] != 0x0D)
-            {
-                /* The LF does not have a preceding CR, table not corrupted */
-
-                return (AE_OK);
-            }
-            else
-            {
-                /* Found a CR/LF pair */
-
-                Pairs++;
-            }
-            i++;
-        }
-    }
-
-    if (!Pairs)
-    {
-        return (AE_OK);
-    }
-
-    /*
-     * Entire table scanned, each CR is part of a CR/LF pair --
-     * meaning that the table was treated as a text file somewhere.
-     *
-     * NOTE: We can't "fix" the table, because any existing CR/LF pairs in the
-     * original table are left untouched by the text conversion process --
-     * meaning that we cannot simply replace CR/LF pairs with LFs.
-     */
-    AcpiOsPrintf ("Table has been corrupted by text mode conversion\n");
-    AcpiOsPrintf ("All LFs (%u) were changed to CR/LF pairs\n", Pairs);
-    AcpiOsPrintf ("Table cannot be repaired!\n");
-    return (AE_BAD_VALUE);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiDbReadTable
- *
- * PARAMETERS:  fp              - File that contains table
- *              Table           - Return value, buffer with table
- *              TableLength     - Return value, length of table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load the DSDT from the file pointer
- *
- ******************************************************************************/
-
-static ACPI_STATUS
-AcpiDbReadTable (
-    FILE                    *fp,
-    ACPI_TABLE_HEADER       **Table,
-    UINT32                  *TableLength)
-{
-    ACPI_TABLE_HEADER       TableHeader;
-    UINT32                  Actual;
-    ACPI_STATUS             Status;
-    UINT32                  FileSize;
-    BOOLEAN                 StandardHeader = TRUE;
-
-
-    /* Get the file size */
-
-    FileSize = CmGetFileSize (fp);
-    if (FileSize == ACPI_UINT32_MAX)
-    {
-        return (AE_ERROR);
-    }
-
-    if (FileSize < 4)
-    {
-        return (AE_BAD_HEADER);
-    }
-
-    /* Read the signature */
-
-    if (fread (&TableHeader, 1, 4, fp) != 4)
-    {
-        AcpiOsPrintf ("Could not read the table signature\n");
-        return (AE_BAD_HEADER);
-    }
-
-    fseek (fp, 0, SEEK_SET);
-
-    /* The RSDP table does not have standard ACPI header */
-
-    if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD "))
-    {
-        *TableLength = FileSize;
-        StandardHeader = FALSE;
-    }
-    else
-    {
-        /* Read the table header */
-
-        if (fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), fp) !=
-                sizeof (ACPI_TABLE_HEADER))
-        {
-            AcpiOsPrintf ("Could not read the table header\n");
-            return (AE_BAD_HEADER);
-        }
-
-#if 0
-        /* Validate the table header/length */
-
-        Status = AcpiTbValidateTableHeader (&TableHeader);
-        if (ACPI_FAILURE (Status))
-        {
-            AcpiOsPrintf ("Table header is invalid!\n");
-            return (Status);
-        }
-#endif
-
-        /* File size must be at least as long as the Header-specified length */
-
-        if (TableHeader.Length > FileSize)
-        {
-            AcpiOsPrintf (
-                "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
-                TableHeader.Length, FileSize);
-
-#ifdef ACPI_ASL_COMPILER
-            Status = FlCheckForAscii (fp, NULL, FALSE);
-            if (ACPI_SUCCESS (Status))
-            {
-                AcpiOsPrintf ("File appears to be ASCII only, must be binary\n",
-                    TableHeader.Length, FileSize);
-            }
-#endif
-            return (AE_BAD_HEADER);
-        }
-
-#ifdef ACPI_OBSOLETE_CODE
-        /* We only support a limited number of table types */
-
-        if (!ACPI_COMPARE_NAME ((char *) TableHeader.Signature, ACPI_SIG_DSDT) &&
-            !ACPI_COMPARE_NAME ((char *) TableHeader.Signature, ACPI_SIG_PSDT) &&
-            !ACPI_COMPARE_NAME ((char *) TableHeader.Signature, ACPI_SIG_SSDT))
-        {
-            AcpiOsPrintf ("Table signature [%4.4s] is invalid or not supported\n",
-                (char *) TableHeader.Signature);
-            ACPI_DUMP_BUFFER (&TableHeader, sizeof (ACPI_TABLE_HEADER));
-            return (AE_ERROR);
-        }
-#endif
-
-        *TableLength = TableHeader.Length;
-    }
-
-    /* Allocate a buffer for the table */
-
-    *Table = AcpiOsAllocate ((size_t) FileSize);
-    if (!*Table)
-    {
-        AcpiOsPrintf (
-            "Could not allocate memory for ACPI table %4.4s (size=0x%X)\n",
-            TableHeader.Signature, *TableLength);
-        return (AE_NO_MEMORY);
-    }
-
-    /* Get the rest of the table */
-
-    fseek (fp, 0, SEEK_SET);
-    Actual = fread (*Table, 1, (size_t) FileSize, fp);
-    if (Actual == FileSize)
-    {
-        if (StandardHeader)
-        {
-            /* Now validate the checksum */
-
-            Status = AcpiTbVerifyChecksum ((void *) *Table,
-                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, *Table)->Length);
-
-            if (Status == AE_BAD_CHECKSUM)
-            {
-                Status = AcpiDbCheckTextModeCorruption ((UINT8 *) *Table,
-                            FileSize, (*Table)->Length);
-                return (Status);
-            }
-        }
-        return (AE_OK);
-    }
-
-    if (Actual > 0)
-    {
-        AcpiOsPrintf ("Warning - reading table, asked for %X got %X\n",
-            FileSize, Actual);
-        return (AE_OK);
-    }
-
-    AcpiOsPrintf ("Error - could not read the table file\n");
-    AcpiOsFree (*Table);
-    *Table = NULL;
-    *TableLength = 0;
-    return (AE_ERROR);
-}
-
-
-/*******************************************************************************
- *
  * FUNCTION:    AeLocalLoadTable
  *
  * PARAMETERS:  Table           - pointer to a buffer containing the entire
@@ -456,62 +198,6 @@ AeLocalLoadTable (
 
     return_ACPI_STATUS (Status);
 }
-
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiDbReadTableFromFile
- *
- * PARAMETERS:  Filename         - File where table is located
- *              Table            - Where a pointer to the table is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get an ACPI table from a file
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiDbReadTableFromFile (
-    char                    *Filename,
-    ACPI_TABLE_HEADER       **Table)
-{
-    FILE                    *File;
-    UINT32                  FileSize;
-    UINT32                  TableLength;
-    ACPI_STATUS             Status = AE_ERROR;
-
-
-    /* Open the file, get current size */
-
-    File = fopen (Filename, "rb");
-    if (!File)
-    {
-        perror ("Could not open input file");
-        return (Status);
-    }
-
-    FileSize = CmGetFileSize (File);
-    if (FileSize == ACPI_UINT32_MAX)
-    {
-        goto Exit;
-    }
-
-    /* Get the entire file */
-
-    fprintf (stderr, "Loading Acpi table from file %10s - Length %.8u (%06X)\n",
-        Filename, FileSize, FileSize);
-
-    Status = AcpiDbReadTable (File, Table, &TableLength);
-    if (ACPI_FAILURE (Status))
-    {
-        AcpiOsPrintf ("Could not get table from the file\n");
-    }
-
-Exit:
-    fclose(File);
-    return (Status);
- }
 #endif
 
 
@@ -539,7 +225,7 @@ AcpiDbGetTableFromFile (
     BOOLEAN                 IsAmlTable = TRUE;
 
 
-    Status = AcpiDbReadTableFromFile (Filename, &Table);
+    Status = AcpiUtReadTableFromFile (Filename, &Table);
     if (ACPI_FAILURE (Status))
     {
         return (Status);
diff --git a/sys/contrib/dev/acpica/source/components/debugger/dbtest.c b/sys/contrib/dev/acpica/source/components/debugger/dbtest.c
index d88372b..33ee4e4 100644
--- a/sys/contrib/dev/acpica/source/components/debugger/dbtest.c
+++ b/sys/contrib/dev/acpica/source/components/debugger/dbtest.c
@@ -1042,6 +1042,7 @@ AcpiDbEvaluateOnePredefinedName (
     Status = AcpiGetObjectInfo (ObjHandle, &ObjInfo);
     if (ACPI_FAILURE (Status))
     {
+        ACPI_FREE (Pathname);
         return (Status);
     }
 
diff --git a/sys/contrib/dev/acpica/source/components/disassembler/dmbuffer.c b/sys/contrib/dev/acpica/source/components/disassembler/dmbuffer.c
index 85f0618..739fb44 100644
--- a/sys/contrib/dev/acpica/source/components/disassembler/dmbuffer.c
+++ b/sys/contrib/dev/acpica/source/components/disassembler/dmbuffer.c
@@ -71,6 +71,8 @@ AcpiDmPldBuffer (
     UINT8                   *ByteData,
     UINT32                  ByteCount);
 
+#define ACPI_BUFFER_BYTES_PER_LINE      8
+
 
 /*******************************************************************************
  *
@@ -94,6 +96,9 @@ AcpiDmDisasmByteList (
     UINT32                  ByteCount)
 {
     UINT32                  i;
+    UINT32                  j;
+    UINT32                  CurrentIndex;
+    UINT8                   BufChar;
 
 
     if (!ByteCount)
@@ -101,39 +106,68 @@ AcpiDmDisasmByteList (
         return;
     }
 
-    /* Dump the byte list */
-
-    for (i = 0; i < ByteCount; i++)
+    for (i = 0; i < ByteCount; i += ACPI_BUFFER_BYTES_PER_LINE)
     {
-        /* New line every 8 bytes */
+        /* Line indent and offset prefix for each new line */
+
+        AcpiDmIndent (Level);
+        if (ByteCount > ACPI_BUFFER_BYTES_PER_LINE)
+        {
+            AcpiOsPrintf ("/* %04X */ ", i);
+        }
+
+        /* Dump the actual hex values */
 
-        if (((i % 8) == 0) && (i < ByteCount))
+        for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
         {
-            if (i > 0)
+            CurrentIndex = i + j;
+            if (CurrentIndex >= ByteCount)
             {
-                AcpiOsPrintf ("\n");
+                /* Dump fill spaces */
+
+                AcpiOsPrintf ("      ");
+                continue;
             }
 
-            AcpiDmIndent (Level);
-            if (ByteCount > 8)
+            AcpiOsPrintf (" 0x%2.2X", ByteData[CurrentIndex]);
+
+            /* Add comma if there are more bytes to display */
+
+            if (CurrentIndex < (ByteCount - 1))
             {
-                AcpiOsPrintf ("/* %04X */  ", i);
+                AcpiOsPrintf (",");
+            }
+            else
+            {
+                AcpiOsPrintf (" ");
             }
         }
 
-        AcpiOsPrintf (" 0x%2.2X", (UINT32) ByteData[i]);
-
-        /* Add comma if there are more bytes to display */
+        /* Dump the ASCII equivalents within a comment */
 
-        if (i < (ByteCount -1))
+        AcpiOsPrintf ("  /* ");
+        for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++)
         {
-            AcpiOsPrintf (",");
+            CurrentIndex = i + j;
+            if (CurrentIndex >= ByteCount)
+            {
+                break;
+            }
+
+            BufChar = ByteData[CurrentIndex];
+            if (ACPI_IS_PRINT (BufChar))
+            {
+                AcpiOsPrintf ("%c", BufChar);
+            }
+            else
+            {
+                AcpiOsPrintf (".");
+            }
         }
-    }
 
-    if (Level)
-    {
-        AcpiOsPrintf ("\n");
+        /* Finished with this line */
+
+        AcpiOsPrintf (" */\n");
     }
 }
 
diff --git a/sys/contrib/dev/acpica/source/components/disassembler/dmwalk.c b/sys/contrib/dev/acpica/source/components/disassembler/dmwalk.c
index 3cf74b3..0aa3052 100644
--- a/sys/contrib/dev/acpica/source/components/disassembler/dmwalk.c
+++ b/sys/contrib/dev/acpica/source/components/disassembler/dmwalk.c
@@ -958,6 +958,13 @@ AcpiDmAscendingOp (
         }
 
         /*
+         * The parent Op is guaranteed to be valid because of the flag
+         * ACPI_PARSEOP_PARAMLIST -- which means that this op is part of
+         * a parameter list and thus has a valid parent.
+         */
+        ParentOp = Op->Common.Parent;
+
+        /*
          * Just completed a parameter node for something like "Buffer (param)".
          * Close the paren and open up the term list block with a brace
          */
@@ -965,25 +972,24 @@ AcpiDmAscendingOp (
         {
             AcpiOsPrintf (")");
 
-            /* Emit description comment for Name() with a predefined ACPI name */
-
-            ParentOp = Op->Common.Parent;
-            if (ParentOp)
+            /*
+             * Emit a description comment for a Name() operator that is a
+             * predefined ACPI name. Must check the grandparent.
+             */
+            ParentOp = ParentOp->Common.Parent;
+            if (ParentOp &&
+                (ParentOp->Asl.AmlOpcode == AML_NAME_OP))
             {
-                ParentOp = ParentOp->Common.Parent;
-                if (ParentOp && ParentOp->Asl.AmlOpcode == AML_NAME_OP)
-                {
-                    AcpiDmPredefinedDescription (ParentOp);
-                }
+                AcpiDmPredefinedDescription (ParentOp);
             }
+
             AcpiOsPrintf ("\n");
             AcpiDmIndent (Level - 1);
             AcpiOsPrintf ("{\n");
         }
         else
         {
-            Op->Common.Parent->Common.DisasmFlags |=
-                                    ACPI_PARSEOP_EMPTY_TERMLIST;
+            ParentOp->Common.DisasmFlags |= ACPI_PARSEOP_EMPTY_TERMLIST;
             AcpiOsPrintf (") {");
         }
     }
diff --git a/sys/contrib/dev/acpica/source/components/executer/exfield.c b/sys/contrib/dev/acpica/source/components/executer/exfield.c
index aedc8d9..a1de0ca 100644
--- a/sys/contrib/dev/acpica/source/components/executer/exfield.c
+++ b/sys/contrib/dev/acpica/source/components/executer/exfield.c
@@ -48,11 +48,80 @@
 #include "accommon.h"
 #include "acdispat.h"
 #include "acinterp.h"
+#include "amlcode.h"
 
 
 #define _COMPONENT          ACPI_EXECUTER
         ACPI_MODULE_NAME    ("exfield")
 
+/* Local prototypes */
+
+static UINT32
+AcpiExGetSerialAccessLength (
+    UINT32                  AccessorType,
+    UINT32                  AccessLength);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiExGetSerialAccessLength
+ *
+ * PARAMETERS:  AccessorType    - The type of the protocol indicated by region
+ *                                field access attributes
+ *              AccessLength    - The access length of the region field
+ *
+ * RETURN:      Decoded access length
+ *
+ * DESCRIPTION: This routine returns the length of the GenericSerialBus
+ *              protocol bytes
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiExGetSerialAccessLength (
+    UINT32                  AccessorType,
+    UINT32                  AccessLength)
+{
+    UINT32                  Length;
+
+
+    switch (AccessorType)
+    {
+    case AML_FIELD_ATTRIB_QUICK:
+
+        Length = 0;
+        break;
+
+    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_MULTIBYTE:
+    case AML_FIELD_ATTRIB_RAW_BYTES:
+    case AML_FIELD_ATTRIB_RAW_PROCESS:
+
+        Length = AccessLength;
+        break;
+
+    case AML_FIELD_ATTRIB_BLOCK:
+    case AML_FIELD_ATTRIB_BLOCK_CALL:
+    default:
+
+        Length = ACPI_GSBUS_BUFFER_SIZE - 2;
+        break;
+    }
+
+    return (Length);
+}
+
 
 /*******************************************************************************
  *
@@ -80,6 +149,7 @@ AcpiExReadDataFromField (
     ACPI_SIZE               Length;
     void                    *Buffer;
     UINT32                  Function;
+    UINT16                  AccessorType;
 
 
     ACPI_FUNCTION_TRACE_PTR (ExReadDataFromField, ObjDesc);
@@ -129,8 +199,20 @@ AcpiExReadDataFromField (
         }
         else if (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS)
         {
-            Length = ACPI_GSBUS_BUFFER_SIZE;
-            Function = ACPI_READ | (ObjDesc->Field.Attribute << 16);
+            AccessorType = ObjDesc->Field.Attribute;
+            Length = AcpiExGetSerialAccessLength (AccessorType,
+                ObjDesc->Field.AccessLength);
+
+	    /*
+             * Add additional 2 bytes for modeled GenericSerialBus data buffer:
+             * typedef struct {
+             *     BYTEStatus; // Byte 0 of the data buffer
+             *     BYTELength; // Byte 1 of the data buffer
+             *     BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer,
+             * }
+	     */
+            Length += 2;
+            Function = ACPI_READ | (AccessorType << 16);
         }
         else /* IPMI */
         {
@@ -251,6 +333,7 @@ AcpiExWriteDataToField (
     void                    *Buffer;
     ACPI_OPERAND_OBJECT     *BufferDesc;
     UINT32                  Function;
+    UINT16                  AccessorType;
 
 
     ACPI_FUNCTION_TRACE_PTR (ExWriteDataToField, ObjDesc);
@@ -310,8 +393,20 @@ AcpiExWriteDataToField (
         }
         else if (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS)
         {
-            Length = ACPI_GSBUS_BUFFER_SIZE;
-            Function = ACPI_WRITE | (ObjDesc->Field.Attribute << 16);
+            AccessorType = ObjDesc->Field.Attribute;
+            Length = AcpiExGetSerialAccessLength (AccessorType,
+                ObjDesc->Field.AccessLength);
+
+	    /*
+             * Add additional 2 bytes for modeled GenericSerialBus data buffer:
+             * typedef struct {
+             *     BYTEStatus; // Byte 0 of the data buffer
+             *     BYTELength; // Byte 1 of the data buffer
+             *     BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer,
+             * }
+	     */
+            Length += 2;
+            Function = ACPI_WRITE | (AccessorType << 16);
         }
         else /* IPMI */
         {
diff --git a/sys/contrib/dev/acpica/source/components/hardware/hwregs.c b/sys/contrib/dev/acpica/source/components/hardware/hwregs.c
index a24fc5c..94c508a 100644
--- a/sys/contrib/dev/acpica/source/components/hardware/hwregs.c
+++ b/sys/contrib/dev/acpica/source/components/hardware/hwregs.c
@@ -310,17 +310,19 @@ AcpiHwClearAcpiStatus (
 
     Status = AcpiHwRegisterWrite (ACPI_REGISTER_PM1_STATUS,
                 ACPI_BITMASK_ALL_FIXED_STATUS);
+
+    AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
+
     if (ACPI_FAILURE (Status))
     {
-        goto UnlockAndExit;
+        goto Exit;
     }
 
     /* Clear the GPE Bits in all GPE registers in all GPE blocks */
 
     Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock, NULL);
 
-UnlockAndExit:
-    AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
+Exit:
     return_ACPI_STATUS (Status);
 }
 
diff --git a/sys/contrib/dev/acpica/source/components/namespace/nsobject.c b/sys/contrib/dev/acpica/source/components/namespace/nsobject.c
index 3317591..9221ac0 100644
--- a/sys/contrib/dev/acpica/source/components/namespace/nsobject.c
+++ b/sys/contrib/dev/acpica/source/components/namespace/nsobject.c
@@ -265,6 +265,17 @@ AcpiNsDetachObject (
         }
     }
 
+    /*
+     * Detach the object from any data objects (which are still held by
+     * the namespace node)
+     */
+
+    if (ObjDesc->Common.NextObject &&
+       ((ObjDesc->Common.NextObject)->Common.Type == ACPI_TYPE_LOCAL_DATA))
+    {
+       ObjDesc->Common.NextObject = NULL;
+    }
+
     /* Reset the node type to untyped */
 
     Node->Type = ACPI_TYPE_ANY;
diff --git a/sys/contrib/dev/acpica/source/components/tables/tbdata.c b/sys/contrib/dev/acpica/source/components/tables/tbdata.c
index 549c555..e0c5f3a 100644
--- a/sys/contrib/dev/acpica/source/components/tables/tbdata.c
+++ b/sys/contrib/dev/acpica/source/components/tables/tbdata.c
@@ -352,7 +352,43 @@ AcpiTbInvalidateTable (
 
 /******************************************************************************
  *
- * FUNCTION:    AcpiTbVerifyTable
+ * FUNCTION:    AcpiTbValidateTempTable
+ *
+ * PARAMETERS:  TableDesc           - Table descriptor
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: This function is called to validate the table, the returned
+ *              table descriptor is in "VALIDATED" state.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiTbValidateTempTable (
+    ACPI_TABLE_DESC         *TableDesc)
+{
+
+    if (!TableDesc->Pointer && !AcpiGbl_VerifyTableChecksum)
+    {
+        /*
+         * Only validates the header of the table.
+         * Note that Length contains the size of the mapping after invoking
+         * this work around, this value is required by
+         * AcpiTbReleaseTempTable().
+         * We can do this because in AcpiInitTableDescriptor(), the Length
+         * field of the installed descriptor is filled with the actual
+         * table length obtaining from the table header.
+         */
+        TableDesc->Length = sizeof (ACPI_TABLE_HEADER);
+    }
+
+    return (AcpiTbValidateTable (TableDesc));
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiTbVerifyTempTable
  *
  * PARAMETERS:  TableDesc           - Table descriptor
  *              Signature           - Table signature to verify
@@ -365,19 +401,19 @@ AcpiTbInvalidateTable (
  *****************************************************************************/
 
 ACPI_STATUS
-AcpiTbVerifyTable (
+AcpiTbVerifyTempTable (
     ACPI_TABLE_DESC         *TableDesc,
     char                    *Signature)
 {
     ACPI_STATUS             Status = AE_OK;
 
 
-    ACPI_FUNCTION_TRACE (TbVerifyTable);
+    ACPI_FUNCTION_TRACE (TbVerifyTempTable);
 
 
     /* Validate the table */
 
-    Status = AcpiTbValidateTable (TableDesc);
+    Status = AcpiTbValidateTempTable (TableDesc);
     if (ACPI_FAILURE (Status))
     {
         return_ACPI_STATUS (AE_NO_MEMORY);
@@ -397,16 +433,19 @@ AcpiTbVerifyTable (
 
     /* Verify the checksum */
 
-    Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
-    if (ACPI_FAILURE (Status))
+    if (AcpiGbl_VerifyTableChecksum)
     {
-        ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
-            "%4.4s " ACPI_PRINTF_UINT
-            " Attempted table install failed",
-            AcpiUtValidAcpiName (TableDesc->Signature.Ascii) ?
-                TableDesc->Signature.Ascii : "????",
-            ACPI_FORMAT_TO_UINT (TableDesc->Address)));
-        goto InvalidateAndExit;
+        Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
+        if (ACPI_FAILURE (Status))
+        {
+            ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
+                "%4.4s " ACPI_PRINTF_UINT
+                " Attempted table install failed",
+                AcpiUtValidAcpiName (TableDesc->Signature.Ascii) ?
+                    TableDesc->Signature.Ascii : "????",
+                ACPI_FORMAT_TO_UINT (TableDesc->Address)));
+            goto InvalidateAndExit;
+        }
     }
 
     return_ACPI_STATUS (AE_OK);
diff --git a/sys/contrib/dev/acpica/source/components/tables/tbinstal.c b/sys/contrib/dev/acpica/source/components/tables/tbinstal.c
index 9dcaa91..791979c 100644
--- a/sys/contrib/dev/acpica/source/components/tables/tbinstal.c
+++ b/sys/contrib/dev/acpica/source/components/tables/tbinstal.c
@@ -210,7 +210,7 @@ AcpiTbInstallFixedTable (
 
     /* Validate and verify a table before installation */
 
-    Status = AcpiTbVerifyTable (&NewTableDesc, Signature);
+    Status = AcpiTbVerifyTempTable (&NewTableDesc, Signature);
     if (ACPI_FAILURE (Status))
     {
         goto ReleaseAndExit;
@@ -290,7 +290,7 @@ AcpiTbInstallStandardTable (
 
     /* Validate and verify a table before installation */
 
-    Status = AcpiTbVerifyTable (&NewTableDesc, NULL);
+    Status = AcpiTbVerifyTempTable (&NewTableDesc, NULL);
     if (ACPI_FAILURE (Status))
     {
         goto ReleaseAndExit;
@@ -455,7 +455,7 @@ FinishOverride:
 
     /* Validate and verify a table before overriding */
 
-    Status = AcpiTbVerifyTable (&NewTableDesc, NULL);
+    Status = AcpiTbVerifyTempTable (&NewTableDesc, NULL);
     if (ACPI_FAILURE (Status))
     {
         return;
@@ -477,7 +477,7 @@ FinishOverride:
      */
     AcpiTbInitTableDescriptor (OldTableDesc, NewTableDesc.Address,
         NewTableDesc.Flags, NewTableDesc.Pointer);
-    AcpiTbValidateTable (OldTableDesc);
+    AcpiTbValidateTempTable (OldTableDesc);
 
     /* Release the temporary table descriptor */
 
diff --git a/sys/contrib/dev/acpica/source/components/tables/tbutils.c b/sys/contrib/dev/acpica/source/components/tables/tbutils.c
index 4b207d9..56fd46d 100644
--- a/sys/contrib/dev/acpica/source/components/tables/tbutils.c
+++ b/sys/contrib/dev/acpica/source/components/tables/tbutils.c
@@ -427,10 +427,6 @@ NextTable:
         TableEntry += TableEntrySize;
     }
 
-    /*
-     * It is not possible to map more than one entry in some environments,
-     * so unmap the root table here before mapping other tables
-     */
     AcpiOsUnmapMemory (Table, Length);
 
     return_ACPI_STATUS (AE_OK);
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utbuffer.c b/sys/contrib/dev/acpica/source/components/utilities/utbuffer.c
index 6b110f5..a946aab 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utbuffer.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utbuffer.c
@@ -218,3 +218,138 @@ AcpiUtDebugDumpBuffer (
 
     AcpiUtDumpBuffer (Buffer, Count, Display, 0);
 }
+
+
+#ifdef ACPI_APPLICATION
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtDumpBufferToFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              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 to a file.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDumpBufferToFile (
+    ACPI_FILE               File,
+    UINT8                   *Buffer,
+    UINT32                  Count,
+    UINT32                  Display,
+    UINT32                  BaseOffset)
+{
+    UINT32                  i = 0;
+    UINT32                  j;
+    UINT32                  Temp32;
+    UINT8                   BufChar;
+
+
+    if (!Buffer)
+    {
+        AcpiUtFilePrintf (File, "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 */
+
+        AcpiUtFilePrintf (File, "%6.4X: ", (BaseOffset + i));
+
+        /* Print 16 hex chars */
+
+        for (j = 0; j < 16;)
+        {
+            if (i + j >= Count)
+            {
+                /* Dump fill spaces */
+
+                AcpiUtFilePrintf (File, "%*s", ((Display * 2) + 1), " ");
+                j += Display;
+                continue;
+            }
+
+            switch (Display)
+            {
+            case DB_BYTE_DISPLAY:
+            default:    /* Default is BYTE display */
+
+                AcpiUtFilePrintf (File, "%02X ", Buffer[(ACPI_SIZE) i + j]);
+                break;
+
+            case DB_WORD_DISPLAY:
+
+                ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
+                AcpiUtFilePrintf (File, "%04X ", Temp32);
+                break;
+
+            case DB_DWORD_DISPLAY:
+
+                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
+                AcpiUtFilePrintf (File, "%08X ", Temp32);
+                break;
+
+            case DB_QWORD_DISPLAY:
+
+                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
+                AcpiUtFilePrintf (File, "%08X", Temp32);
+
+                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
+                AcpiUtFilePrintf (File, "%08X ", Temp32);
+                break;
+            }
+
+            j += Display;
+        }
+
+        /*
+         * Print the ASCII equivalent characters but watch out for the bad
+         * unprintable ones (printable chars are 0x20 through 0x7E)
+         */
+        AcpiUtFilePrintf (File, " ");
+        for (j = 0; j < 16; j++)
+        {
+            if (i + j >= Count)
+            {
+                AcpiUtFilePrintf (File, "\n");
+                return;
+            }
+
+            BufChar = Buffer[(ACPI_SIZE) i + j];
+            if (ACPI_IS_PRINT (BufChar))
+            {
+                AcpiUtFilePrintf (File, "%c", BufChar);
+            }
+            else
+            {
+                AcpiUtFilePrintf (File, ".");
+            }
+        }
+
+        /* Done with that line. */
+
+        AcpiUtFilePrintf (File, "\n");
+        i += 16;
+    }
+
+    return;
+}
+#endif
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utclib.c b/sys/contrib/dev/acpica/source/components/utilities/utclib.c
index 33bf350..7892df4 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utclib.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utclib.c
@@ -308,8 +308,6 @@ AcpiUtStrcmp (
 }
 
 
-#ifdef ACPI_FUTURE_IMPLEMENTATION
-/* Not used at this time */
 /*******************************************************************************
  *
  * FUNCTION:    AcpiUtStrchr (strchr)
@@ -334,13 +332,13 @@ AcpiUtStrchr (
     {
         if ((*String) == (char) ch)
         {
-            return ((char *) String);
+            return (__DECONST(char *, String));
         }
     }
 
     return (NULL);
 }
-#endif
+
 
 /*******************************************************************************
  *
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utcopy.c b/sys/contrib/dev/acpica/source/components/utilities/utcopy.c
index 26eb878..6ab8709 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utcopy.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utcopy.c
@@ -1063,5 +1063,12 @@ AcpiUtCopyIobjectToIobject (
         Status = AcpiUtCopySimpleObject (SourceDesc, *DestDesc);
     }
 
+    /* Delete the allocated object if copy failed */
+
+    if (ACPI_FAILURE (Status))
+    {
+        AcpiUtRemoveReference(*DestDesc);
+    }
+
     return_ACPI_STATUS (Status);
 }
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utdebug.c b/sys/contrib/dev/acpica/source/components/utilities/utdebug.c
index 4a25fb2..973d4ec 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utdebug.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utdebug.c
@@ -636,3 +636,33 @@ AcpiUtPtrExit (
 }
 
 #endif
+
+
+#ifdef ACPI_APPLICATION
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiLogError
+ *
+ * PARAMETERS:  Format              - Printf format field
+ *              ...                 - Optional printf arguments
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Print error message to the console, used by applications.
+ *
+ ******************************************************************************/
+
+void  ACPI_INTERNAL_VAR_XFACE
+AcpiLogError (
+    const char              *Format,
+    ...)
+{
+    va_list                 Args;
+
+    va_start (Args, Format);
+    (void) AcpiUtFileVprintf (ACPI_FILE_ERR, Format, Args);
+    va_end (Args);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiLogError)
+#endif
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utfileio.c b/sys/contrib/dev/acpica/source/components/utilities/utfileio.c
new file mode 100644
index 0000000..1d9adbb
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/components/utilities/utfileio.c
@@ -0,0 +1,363 @@
+/*******************************************************************************
+ *
+ * Module Name: utfileio - simple file I/O routines
+ *
+ ******************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2014, 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 "acapps.h"
+
+#ifdef ACPI_ASL_COMPILER
+#include "aslcompiler.h"
+#endif
+
+
+#define _COMPONENT          ACPI_CA_DEBUGGER
+        ACPI_MODULE_NAME    ("utfileio")
+
+
+#ifdef ACPI_APPLICATION
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiUtCheckTextModeCorruption (
+    UINT8                   *Table,
+    UINT32                  TableLength,
+    UINT32                  FileLength);
+
+static ACPI_STATUS
+AcpiUtReadTable (
+    FILE                    *fp,
+    ACPI_TABLE_HEADER       **Table,
+    UINT32                  *TableLength);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtCheckTextModeCorruption
+ *
+ * PARAMETERS:  Table           - Table buffer
+ *              TableLength     - Length of table from the table header
+ *              FileLength      - Length of the file that contains the table
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Check table for text mode file corruption where all linefeed
+ *              characters (LF) have been replaced by carriage return linefeed
+ *              pairs (CR/LF).
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCheckTextModeCorruption (
+    UINT8                   *Table,
+    UINT32                  TableLength,
+    UINT32                  FileLength)
+{
+    UINT32                  i;
+    UINT32                  Pairs = 0;
+
+
+    if (TableLength != FileLength)
+    {
+        ACPI_WARNING ((AE_INFO,
+            "File length (0x%X) is not the same as the table length (0x%X)",
+            FileLength, TableLength));
+    }
+
+    /* Scan entire table to determine if each LF has been prefixed with a CR */
+
+    for (i = 1; i < FileLength; i++)
+    {
+        if (Table[i] == 0x0A)
+        {
+            if (Table[i - 1] != 0x0D)
+            {
+                /* The LF does not have a preceding CR, table not corrupted */
+
+                return (AE_OK);
+            }
+            else
+            {
+                /* Found a CR/LF pair */
+
+                Pairs++;
+            }
+            i++;
+        }
+    }
+
+    if (!Pairs)
+    {
+        return (AE_OK);
+    }
+
+    /*
+     * Entire table scanned, each CR is part of a CR/LF pair --
+     * meaning that the table was treated as a text file somewhere.
+     *
+     * NOTE: We can't "fix" the table, because any existing CR/LF pairs in the
+     * original table are left untouched by the text conversion process --
+     * meaning that we cannot simply replace CR/LF pairs with LFs.
+     */
+    AcpiOsPrintf ("Table has been corrupted by text mode conversion\n");
+    AcpiOsPrintf ("All LFs (%u) were changed to CR/LF pairs\n", Pairs);
+    AcpiOsPrintf ("Table cannot be repaired!\n");
+    return (AE_BAD_VALUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtReadTable
+ *
+ * PARAMETERS:  fp              - File that contains table
+ *              Table           - Return value, buffer with table
+ *              TableLength     - Return value, length of table
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Load the DSDT from the file pointer
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtReadTable (
+    FILE                    *fp,
+    ACPI_TABLE_HEADER       **Table,
+    UINT32                  *TableLength)
+{
+    ACPI_TABLE_HEADER       TableHeader;
+    UINT32                  Actual;
+    ACPI_STATUS             Status;
+    UINT32                  FileSize;
+    BOOLEAN                 StandardHeader = TRUE;
+    INT32                   Count;
+
+    /* Get the file size */
+
+    FileSize = CmGetFileSize (fp);
+    if (FileSize == ACPI_UINT32_MAX)
+    {
+        return (AE_ERROR);
+    }
+
+    if (FileSize < 4)
+    {
+        return (AE_BAD_HEADER);
+    }
+
+    /* Read the signature */
+
+    fseek (fp, 0, SEEK_SET);
+
+    Count = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), fp);
+    if (Count != sizeof (ACPI_TABLE_HEADER))
+    {
+        AcpiOsPrintf ("Could not read the table header\n");
+        return (AE_BAD_HEADER);
+    }
+
+    /* The RSDP table does not have standard ACPI header */
+
+    if (ACPI_VALIDATE_RSDP_SIG (TableHeader.Signature))
+    {
+        *TableLength = FileSize;
+        StandardHeader = FALSE;
+    }
+    else
+    {
+
+#if 0
+        /* Validate the table header/length */
+
+        Status = AcpiTbValidateTableHeader (&TableHeader);
+        if (ACPI_FAILURE (Status))
+        {
+            AcpiOsPrintf ("Table header is invalid!\n");
+            return (Status);
+        }
+#endif
+
+        /* File size must be at least as long as the Header-specified length */
+
+        if (TableHeader.Length > FileSize)
+        {
+            AcpiOsPrintf (
+                "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
+                TableHeader.Length, FileSize);
+
+#ifdef ACPI_ASL_COMPILER
+            Status = FlCheckForAscii (fp, NULL, FALSE);
+            if (ACPI_SUCCESS (Status))
+            {
+                AcpiOsPrintf ("File appears to be ASCII only, must be binary\n",
+                    TableHeader.Length, FileSize);
+            }
+#endif
+            return (AE_BAD_HEADER);
+        }
+
+#ifdef ACPI_OBSOLETE_CODE
+        /* We only support a limited number of table types */
+
+        if (!ACPI_COMPARE_NAME ((char *) TableHeader.Signature, ACPI_SIG_DSDT) &&
+            !ACPI_COMPARE_NAME ((char *) TableHeader.Signature, ACPI_SIG_PSDT) &&
+            !ACPI_COMPARE_NAME ((char *) TableHeader.Signature, ACPI_SIG_SSDT))
+        {
+            AcpiOsPrintf ("Table signature [%4.4s] is invalid or not supported\n",
+                (char *) TableHeader.Signature);
+            ACPI_DUMP_BUFFER (&TableHeader, sizeof (ACPI_TABLE_HEADER));
+            return (AE_ERROR);
+        }
+#endif
+
+        *TableLength = TableHeader.Length;
+    }
+
+    /* Allocate a buffer for the table */
+
+    *Table = AcpiOsAllocate ((size_t) FileSize);
+    if (!*Table)
+    {
+        AcpiOsPrintf (
+            "Could not allocate memory for ACPI table %4.4s (size=0x%X)\n",
+            TableHeader.Signature, *TableLength);
+        return (AE_NO_MEMORY);
+    }
+
+    /* Get the rest of the table */
+
+    fseek (fp, 0, SEEK_SET);
+    Actual = fread (*Table, 1, (size_t) FileSize, fp);
+    if (Actual == FileSize)
+    {
+        if (StandardHeader)
+        {
+            /* Now validate the checksum */
+
+            Status = AcpiTbVerifyChecksum ((void *) *Table,
+                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, *Table)->Length);
+
+            if (Status == AE_BAD_CHECKSUM)
+            {
+                Status = AcpiUtCheckTextModeCorruption ((UINT8 *) *Table,
+                            FileSize, (*Table)->Length);
+                return (Status);
+            }
+        }
+        return (AE_OK);
+    }
+
+    if (Actual > 0)
+    {
+        AcpiOsPrintf ("Warning - reading table, asked for %X got %X\n",
+            FileSize, Actual);
+        return (AE_OK);
+    }
+
+    AcpiOsPrintf ("Error - could not read the table file\n");
+    AcpiOsFree (*Table);
+    *Table = NULL;
+    *TableLength = 0;
+    return (AE_ERROR);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtReadTableFromFile
+ *
+ * PARAMETERS:  Filename         - File where table is located
+ *              Table            - Where a pointer to the table is returned
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Get an ACPI table from a file
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtReadTableFromFile (
+    char                    *Filename,
+    ACPI_TABLE_HEADER       **Table)
+{
+    FILE                    *File;
+    UINT32                  FileSize;
+    UINT32                  TableLength;
+    ACPI_STATUS             Status = AE_ERROR;
+
+
+    /* Open the file, get current size */
+
+    File = fopen (Filename, "rb");
+    if (!File)
+    {
+        perror ("Could not open input file");
+        return (Status);
+    }
+
+    FileSize = CmGetFileSize (File);
+    if (FileSize == ACPI_UINT32_MAX)
+    {
+        goto Exit;
+    }
+
+    /* Get the entire file */
+
+    fprintf (stderr, "Loading Acpi table from file %10s - Length %.8u (%06X)\n",
+        Filename, FileSize, FileSize);
+
+    Status = AcpiUtReadTable (File, Table, &TableLength);
+    if (ACPI_FAILURE (Status))
+    {
+        AcpiOsPrintf ("Could not get table from the file\n");
+    }
+
+Exit:
+    fclose(File);
+    return (Status);
+}
+
+#endif
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utglobal.c b/sys/contrib/dev/acpica/source/components/utilities/utglobal.c
index c89d414..3504348 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utglobal.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utglobal.c
@@ -173,163 +173,6 @@ ACPI_FIXED_EVENT_INFO       AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] =
 };
 #endif /* !ACPI_REDUCED_HARDWARE */
 
-
-/*******************************************************************************
- *
- * FUNCTION:    AcpiUtInitGlobals
- *
- * PARAMETERS:  None
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
- *              initialization should be initialized here. This allows for
- *              a warm restart.
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiUtInitGlobals (
-    void)
-{
-    ACPI_STATUS             Status;
-    UINT32                  i;
-
-
-    ACPI_FUNCTION_TRACE (UtInitGlobals);
-
-
-    /* Create all memory caches */
-
-    Status = AcpiUtCreateCaches ();
-    if (ACPI_FAILURE (Status))
-    {
-        return_ACPI_STATUS (Status);
-    }
-
-    /* Address Range lists */
-
-    for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++)
-    {
-        AcpiGbl_AddressRangeList[i] = NULL;
-    }
-
-    /* Mutex locked flags */
-
-    for (i = 0; i < ACPI_NUM_MUTEX; i++)
-    {
-        AcpiGbl_MutexInfo[i].Mutex          = NULL;
-        AcpiGbl_MutexInfo[i].ThreadId       = ACPI_MUTEX_NOT_ACQUIRED;
-        AcpiGbl_MutexInfo[i].UseCount       = 0;
-    }
-
-    for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
-    {
-        AcpiGbl_OwnerIdMask[i]              = 0;
-    }
-
-    /* Last OwnerID is never valid */
-
-    AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
-
-    /* Event counters */
-
-    AcpiMethodCount                     = 0;
-    AcpiSciCount                        = 0;
-    AcpiGpeCount                        = 0;
-
-    for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
-    {
-        AcpiFixedEventCount[i]              = 0;
-    }
-
-#if (!ACPI_REDUCED_HARDWARE)
-
-    /* GPE/SCI support */
-
-    AcpiGbl_AllGpesInitialized          = FALSE;
-    AcpiGbl_GpeXruptListHead            = NULL;
-    AcpiGbl_GpeFadtBlocks[0]            = NULL;
-    AcpiGbl_GpeFadtBlocks[1]            = NULL;
-    AcpiCurrentGpeCount                 = 0;
-
-    AcpiGbl_GlobalEventHandler          = NULL;
-    AcpiGbl_SciHandlerList              = NULL;
-
-#endif /* !ACPI_REDUCED_HARDWARE */
-
-    /* Global handlers */
-
-    AcpiGbl_GlobalNotify[0].Handler     = NULL;
-    AcpiGbl_GlobalNotify[1].Handler     = NULL;
-    AcpiGbl_ExceptionHandler            = NULL;
-    AcpiGbl_InitHandler                 = NULL;
-    AcpiGbl_TableHandler                = NULL;
-    AcpiGbl_InterfaceHandler            = NULL;
-
-    /* Global Lock support */
-
-    AcpiGbl_GlobalLockSemaphore         = NULL;
-    AcpiGbl_GlobalLockMutex             = NULL;
-    AcpiGbl_GlobalLockAcquired          = FALSE;
-    AcpiGbl_GlobalLockHandle            = 0;
-    AcpiGbl_GlobalLockPresent           = FALSE;
-
-    /* Miscellaneous variables */
-
-    AcpiGbl_DSDT                        = NULL;
-    AcpiGbl_CmSingleStep                = FALSE;
-    AcpiGbl_Shutdown                    = FALSE;
-    AcpiGbl_NsLookupCount               = 0;
-    AcpiGbl_PsFindCount                 = 0;
-    AcpiGbl_AcpiHardwarePresent         = TRUE;
-    AcpiGbl_LastOwnerIdIndex            = 0;
-    AcpiGbl_NextOwnerIdOffset           = 0;
-    AcpiGbl_TraceDbgLevel               = 0;
-    AcpiGbl_TraceDbgLayer               = 0;
-    AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
-    AcpiGbl_DbOutputFlags               = ACPI_DB_CONSOLE_OUTPUT;
-    AcpiGbl_OsiMutex                    = NULL;
-    AcpiGbl_RegMethodsExecuted          = FALSE;
-
-    /* Hardware oriented */
-
-    AcpiGbl_EventsInitialized           = FALSE;
-    AcpiGbl_SystemAwakeAndRunning       = TRUE;
-
-    /* Namespace */
-
-    AcpiGbl_ModuleCodeList              = NULL;
-    AcpiGbl_RootNode                    = NULL;
-    AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
-    AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
-    AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
-    AcpiGbl_RootNodeStruct.Parent       = NULL;
-    AcpiGbl_RootNodeStruct.Child        = NULL;
-    AcpiGbl_RootNodeStruct.Peer         = NULL;
-    AcpiGbl_RootNodeStruct.Object       = NULL;
-
-
-#ifdef ACPI_DISASSEMBLER
-    AcpiGbl_ExternalList                = NULL;
-    AcpiGbl_NumExternalMethods          = 0;
-    AcpiGbl_ResolvedExternalMethods     = 0;
-#endif
-
-#ifdef ACPI_DEBUG_OUTPUT
-    AcpiGbl_LowestStackPointer          = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
-#endif
-
-#ifdef ACPI_DBG_TRACK_ALLOCATIONS
-    AcpiGbl_DisplayFinalMemStats        = FALSE;
-    AcpiGbl_DisableMemTracking          = FALSE;
-#endif
-
-    ACPI_DEBUGGER_EXEC (AcpiGbl_DbTerminateThreads = FALSE);
-
-    return_ACPI_STATUS (AE_OK);
-}
-
 /* Public globals */
 
 ACPI_EXPORT_SYMBOL (AcpiGbl_FADT)
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utinit.c b/sys/contrib/dev/acpica/source/components/utilities/utinit.c
index f2de225..17030be 100644
--- a/sys/contrib/dev/acpica/source/components/utilities/utinit.c
+++ b/sys/contrib/dev/acpica/source/components/utilities/utinit.c
@@ -116,6 +116,162 @@ AcpiUtFreeGpeLists (
 #endif /* !ACPI_REDUCED_HARDWARE */
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtInitGlobals
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Initialize ACPICA globals. All globals that require specific
+ *              initialization should be initialized here. This allows for
+ *              a warm restart.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtInitGlobals (
+    void)
+{
+    ACPI_STATUS             Status;
+    UINT32                  i;
+
+
+    ACPI_FUNCTION_TRACE (UtInitGlobals);
+
+
+    /* Create all memory caches */
+
+    Status = AcpiUtCreateCaches ();
+    if (ACPI_FAILURE (Status))
+    {
+        return_ACPI_STATUS (Status);
+    }
+
+    /* Address Range lists */
+
+    for (i = 0; i < ACPI_ADDRESS_RANGE_MAX; i++)
+    {
+        AcpiGbl_AddressRangeList[i] = NULL;
+    }
+
+    /* Mutex locked flags */
+
+    for (i = 0; i < ACPI_NUM_MUTEX; i++)
+    {
+        AcpiGbl_MutexInfo[i].Mutex          = NULL;
+        AcpiGbl_MutexInfo[i].ThreadId       = ACPI_MUTEX_NOT_ACQUIRED;
+        AcpiGbl_MutexInfo[i].UseCount       = 0;
+    }
+
+    for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
+    {
+        AcpiGbl_OwnerIdMask[i]              = 0;
+    }
+
+    /* Last OwnerID is never valid */
+
+    AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
+
+    /* Event counters */
+
+    AcpiMethodCount                     = 0;
+    AcpiSciCount                        = 0;
+    AcpiGpeCount                        = 0;
+
+    for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
+    {
+        AcpiFixedEventCount[i]              = 0;
+    }
+
+#if (!ACPI_REDUCED_HARDWARE)
+
+    /* GPE/SCI support */
+
+    AcpiGbl_AllGpesInitialized          = FALSE;
+    AcpiGbl_GpeXruptListHead            = NULL;
+    AcpiGbl_GpeFadtBlocks[0]            = NULL;
+    AcpiGbl_GpeFadtBlocks[1]            = NULL;
+    AcpiCurrentGpeCount                 = 0;
+
+    AcpiGbl_GlobalEventHandler          = NULL;
+    AcpiGbl_SciHandlerList              = NULL;
+
+#endif /* !ACPI_REDUCED_HARDWARE */
+
+    /* Global handlers */
+
+    AcpiGbl_GlobalNotify[0].Handler     = NULL;
+    AcpiGbl_GlobalNotify[1].Handler     = NULL;
+    AcpiGbl_ExceptionHandler            = NULL;
+    AcpiGbl_InitHandler                 = NULL;
+    AcpiGbl_TableHandler                = NULL;
+    AcpiGbl_InterfaceHandler            = NULL;
+
+    /* Global Lock support */
+
+    AcpiGbl_GlobalLockSemaphore         = NULL;
+    AcpiGbl_GlobalLockMutex             = NULL;
+    AcpiGbl_GlobalLockAcquired          = FALSE;
+    AcpiGbl_GlobalLockHandle            = 0;
+    AcpiGbl_GlobalLockPresent           = FALSE;
+
+    /* Miscellaneous variables */
+
+    AcpiGbl_DSDT                        = NULL;
+    AcpiGbl_CmSingleStep                = FALSE;
+    AcpiGbl_Shutdown                    = FALSE;
+    AcpiGbl_NsLookupCount               = 0;
+    AcpiGbl_PsFindCount                 = 0;
+    AcpiGbl_AcpiHardwarePresent         = TRUE;
+    AcpiGbl_LastOwnerIdIndex            = 0;
+    AcpiGbl_NextOwnerIdOffset           = 0;
+    AcpiGbl_TraceDbgLevel               = 0;
+    AcpiGbl_TraceDbgLayer               = 0;
+    AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
+    AcpiGbl_OsiMutex                    = NULL;
+    AcpiGbl_RegMethodsExecuted          = FALSE;
+
+    /* Hardware oriented */
+
+    AcpiGbl_EventsInitialized           = FALSE;
+    AcpiGbl_SystemAwakeAndRunning       = TRUE;
+
+    /* Namespace */
+
+    AcpiGbl_ModuleCodeList              = NULL;
+    AcpiGbl_RootNode                    = NULL;
+    AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
+    AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
+    AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
+    AcpiGbl_RootNodeStruct.Parent       = NULL;
+    AcpiGbl_RootNodeStruct.Child        = NULL;
+    AcpiGbl_RootNodeStruct.Peer         = NULL;
+    AcpiGbl_RootNodeStruct.Object       = NULL;
+
+
+#ifdef ACPI_DISASSEMBLER
+    AcpiGbl_ExternalList                = NULL;
+    AcpiGbl_NumExternalMethods          = 0;
+    AcpiGbl_ResolvedExternalMethods     = 0;
+#endif
+
+#ifdef ACPI_DEBUG_OUTPUT
+    AcpiGbl_LowestStackPointer          = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
+#endif
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+    AcpiGbl_DisplayFinalMemStats        = FALSE;
+    AcpiGbl_DisableMemTracking          = FALSE;
+#endif
+
+    ACPI_DEBUGGER_EXEC (AcpiGbl_DbTerminateThreads = FALSE);
+
+    return_ACPI_STATUS (AE_OK);
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    AcpiUtTerminate
diff --git a/sys/contrib/dev/acpica/source/components/utilities/utprint.c b/sys/contrib/dev/acpica/source/components/utilities/utprint.c
new file mode 100644
index 0000000..0194d56
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/components/utilities/utprint.c
@@ -0,0 +1,796 @@
+/******************************************************************************
+ *
+ * Module Name: utprint - Formatted printing routines
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2014, 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"
+
+#define _COMPONENT          ACPI_UTILITIES
+        ACPI_MODULE_NAME    ("utprint")
+
+
+#define ACPI_FORMAT_SIGN            0x01
+#define ACPI_FORMAT_SIGN_PLUS       0x02
+#define ACPI_FORMAT_SIGN_PLUS_SPACE 0x04
+#define ACPI_FORMAT_ZERO            0x08
+#define ACPI_FORMAT_LEFT            0x10
+#define ACPI_FORMAT_UPPER           0x20
+#define ACPI_FORMAT_PREFIX          0x40
+
+
+/* Local prototypes */
+
+static ACPI_SIZE
+AcpiUtBoundStringLength (
+    const char              *String,
+    ACPI_SIZE               Count);
+
+static char *
+AcpiUtBoundStringOutput (
+    char                    *String,
+    const char              *End,
+    char                    c);
+
+static char *
+AcpiUtFormatNumber (
+    char                    *String,
+    char                    *End,
+    UINT64                  Number,
+    UINT8                   Base,
+    INT32                   Width,
+    INT32                   Precision,
+    UINT8                   Type);
+
+static char *
+AcpiUtPutNumber (
+    char                    *String,
+    UINT64                  Number,
+    UINT8                   Base,
+    BOOLEAN                 Upper);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtBoundStringLength
+ *
+ * PARAMETERS:  String              - String with boundary
+ *              Count               - Boundary of the string
+ *
+ * RETURN:      Length of the string.
+ *
+ * DESCRIPTION: Calculate the length of a string with boundary.
+ *
+ ******************************************************************************/
+
+static ACPI_SIZE
+AcpiUtBoundStringLength (
+    const char              *String,
+    ACPI_SIZE               Count)
+{
+    UINT32                  Length = 0;
+
+
+    while (*String && Count)
+    {
+        Length++;
+        String++;
+        Count--;
+    }
+
+    return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtBoundStringOutput
+ *
+ * PARAMETERS:  String              - String with boundary
+ *              End                 - Boundary of the string
+ *              c                   - Character to be output to the string
+ *
+ * RETURN:      Updated position for next valid character
+ *
+ * DESCRIPTION: Output a character into a string with boundary check.
+ *
+ ******************************************************************************/
+
+static char *
+AcpiUtBoundStringOutput (
+    char                    *String,
+    const char              *End,
+    char                    c)
+{
+
+    if (String < End)
+    {
+        *String = c;
+    }
+    ++String;
+
+    return (String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtPutNumber
+ *
+ * PARAMETERS:  String              - Buffer to hold reverse-ordered string
+ *              Number              - Integer to be converted
+ *              Base                - Base of the integer
+ *              Upper               - Whether or not using upper cased digits
+ *
+ * RETURN:      Updated position for next valid character
+ *
+ * DESCRIPTION: Convert an integer into a string, note that, the string holds a
+ *              reversed ordered number without the trailing zero.
+ *
+ ******************************************************************************/
+
+static char *
+AcpiUtPutNumber (
+    char                    *String,
+    UINT64                  Number,
+    UINT8                   Base,
+    BOOLEAN                 Upper)
+{
+    const char              LowerDigits[] = "0123456789abcdef";
+    const char              UpperDigits[] = "0123456789ABCDEF";
+    const char              *Digits;
+    UINT64                  DigitIndex;
+    char                    *Pos;
+
+
+    Pos = String;
+    Digits = Upper ? UpperDigits : LowerDigits;
+
+    if (Number == 0)
+    {
+        *(Pos++) = '0';
+    }
+    else
+    {
+        while (Number)
+        {
+            (void) AcpiUtDivide (Number, Base, &Number, &DigitIndex);
+            *(Pos++) = Digits[DigitIndex];
+        }
+    }
+    /* *(Pos++) = '0'; */
+
+    return (Pos);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtScanNumber
+ *
+ * PARAMETERS:  String              - String buffer
+ *              NumberPtr           - Where the number is returned
+ *
+ * RETURN:      Updated position for next valid character
+ *
+ * DESCRIPTION: Scan a string for a decimal integer.
+ *
+ ******************************************************************************/
+
+const char *
+AcpiUtScanNumber (
+    const char              *String,
+    UINT64                  *NumberPtr)
+{
+    UINT64                  Number = 0;
+
+
+    while (ACPI_IS_DIGIT (*String))
+    {
+        Number *= 10;
+        Number += *(String++) - '0';
+    }
+    *NumberPtr = Number;
+
+    return (String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtPrintNumber
+ *
+ * PARAMETERS:  String              - String buffer
+ *              Number              - The number to be converted
+ *
+ * RETURN:      Updated position for next valid character
+ *
+ * DESCRIPTION: Print a decimal integer into a string.
+ *
+ ******************************************************************************/
+
+const char *
+AcpiUtPrintNumber (
+    char                    *String,
+    UINT64                  Number)
+{
+    char                    AsciiString[20];
+    const char              *Pos1;
+    char                    *Pos2;
+
+
+    Pos1 = AcpiUtPutNumber (AsciiString, Number, 10, FALSE);
+    Pos2 = String;
+
+    while (Pos1 != AsciiString)
+    {
+        *(Pos2++) = *(--Pos1);
+    }
+    *Pos2 = 0;
+
+    return (String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtFormatNumber
+ *
+ * PARAMETERS:  String              - String buffer with boundary
+ *              End                 - Boundary of the string
+ *              Number              - The number to be converted
+ *              Base                - Base of the integer
+ *              Width               - Field width
+ *              Precision           - Precision of the integer
+ *              Type                - Special printing flags
+ *
+ * RETURN:      Updated position for next valid character
+ *
+ * DESCRIPTION: Print an integer into a string with any base and any precision.
+ *
+ ******************************************************************************/
+
+static char *
+AcpiUtFormatNumber (
+    char                    *String,
+    char                    *End,
+    UINT64                  Number,
+    UINT8                   Base,
+    INT32                   Width,
+    INT32                   Precision,
+    UINT8                   Type)
+{
+    char                    Sign;
+    char                    Zero;
+    BOOLEAN                 NeedPrefix;
+    BOOLEAN                 Upper;
+    INT32                   i;
+    char                    ReversedString[66];
+
+
+    /* Perform sanity checks */
+
+    if (Base < 2 || Base > 16)
+    {
+        return NULL;
+    }
+    if (Type & ACPI_FORMAT_LEFT)
+    {
+        Type &= ~ACPI_FORMAT_ZERO;
+    }
+
+    NeedPrefix = ((Type & ACPI_FORMAT_PREFIX) && Base != 10) ? TRUE : FALSE;
+    Upper = (Type & ACPI_FORMAT_UPPER) ? TRUE : FALSE;
+    Zero = (Type & ACPI_FORMAT_ZERO) ? '0' : ' ';
+
+    /* Calculate size according to sign and prefix */
+
+    Sign = '\0';
+    if (Type & ACPI_FORMAT_SIGN)
+    {
+        if ((INT64) Number < 0)
+        {
+            Sign = '-';
+            Number = - (INT64) Number;
+            Width--;
+        }
+        else if (Type & ACPI_FORMAT_SIGN_PLUS)
+        {
+            Sign = '+';
+            Width--;
+        }
+        else if (Type & ACPI_FORMAT_SIGN_PLUS_SPACE)
+        {
+            Sign = ' ';
+            Width--;
+        }
+    }
+    if (NeedPrefix)
+    {
+        Width--;
+        if (Base == 16)
+        {
+            Width--;
+        }
+    }
+
+    /* Generate full string in reverse order */
+
+    i = ACPI_PTR_DIFF (
+            AcpiUtPutNumber (ReversedString, Number, Base, Upper),
+	    ReversedString);
+
+    /* Printing 100 using %2d gives "100", not "00" */
+
+    if (i > Precision)
+    {
+        Precision = i;
+    }
+    Width -= Precision;
+
+    /* Output the string */
+
+    if (!(Type & (ACPI_FORMAT_ZERO | ACPI_FORMAT_LEFT)))
+    {
+        while (--Width >= 0)
+        {
+            String = AcpiUtBoundStringOutput (String, End, ' ');
+        }
+    }
+    if (Sign)
+    {
+        String = AcpiUtBoundStringOutput (String, End, Sign);
+    }
+    if (NeedPrefix)
+    {
+        String = AcpiUtBoundStringOutput (String, End, '0');
+        if (Base == 16)
+        {
+            String = AcpiUtBoundStringOutput (String, End,
+                        Upper ? 'X' : 'x');
+	}
+    }
+    if (!(Type & ACPI_FORMAT_LEFT))
+    {
+        while (--Width >= 0)
+        {
+            String = AcpiUtBoundStringOutput (String, End, Zero);
+        }
+    }
+    while (i <= --Precision)
+    {
+        String = AcpiUtBoundStringOutput (String, End, '0');
+    }
+    while (--i >= 0)
+    {
+        String = AcpiUtBoundStringOutput (String, End,
+                    ReversedString[i]);
+    }
+    while (--Width >= 0)
+    {
+        String = AcpiUtBoundStringOutput (String, End, ' ');
+    }
+
+    return (String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtVsnprintf
+ *
+ * PARAMETERS:  String              - String with boundary
+ *              Size                - Boundary of the string
+ *              Format              - Standard printf format
+ *              Args                - Argument list
+ *
+ * RETURN:      Size of successfully output bytes
+ *
+ * DESCRIPTION: Formatted output to a string using argument list pointer.
+ *
+ ******************************************************************************/
+
+int
+AcpiUtVsnprintf (
+    char                    *String,
+    ACPI_SIZE               Size,
+    const char              *Format,
+    va_list                 Args)
+{
+    UINT8                   Base = 10;
+    UINT8                   Type = 0;
+    INT32                   Width = -1;
+    INT32                   Precision = -1;
+    char                    Qualifier = 0;
+    UINT64                  Number;
+    char                    *Pos;
+    char                    *End;
+    char                    c;
+    const char              *s;
+    const void              *p;
+    INT32                   Length;
+    int                     i;
+
+
+    Pos = String;
+    End = String + Size;
+
+    for (; *Format ; ++Format)
+    {
+        if (*Format != '%')
+        {
+            Pos = AcpiUtBoundStringOutput (Pos, End, *Format);
+            continue;
+        }
+
+        /* Process sign */
+
+        do
+        {
+            ++Format;
+            if (*Format == '#')
+            {
+                Type |= ACPI_FORMAT_PREFIX;
+            }
+            else if (*Format == '0')
+            {
+                Type |= ACPI_FORMAT_ZERO;
+            }
+            else if (*Format == '+')
+            {
+                Type |= ACPI_FORMAT_SIGN_PLUS;
+            }
+            else if (*Format == ' ')
+            {
+                Type |= ACPI_FORMAT_SIGN_PLUS_SPACE;
+            }
+            else if (*Format == '-')
+            {
+                Type |= ACPI_FORMAT_LEFT;
+            }
+            else
+            {
+                break;
+            }
+        } while (1);
+
+        /* Process width */
+
+        if (ACPI_IS_DIGIT (*Format))
+        {
+            Format = AcpiUtScanNumber (Format, &Number);
+            Width = (INT32) Number;
+        }
+        else if (*Format == '*')
+        {
+            ++Format;
+            Width = va_arg(Args, int);
+            if (Width < 0)
+            {
+                Width = -Width;
+                Type |= ACPI_FORMAT_LEFT;
+            }
+        }
+
+        /* Process precision */
+
+        if (*Format == '.')
+        {
+            ++Format;
+            if (ACPI_IS_DIGIT(*Format))
+            {
+                Format = AcpiUtScanNumber (Format, &Number);
+                Precision = (INT32) Number;
+            }
+            else if (*Format == '*')
+            {
+                ++Format;
+                Precision = va_arg(Args, int);
+            }
+            if (Precision < 0)
+            {
+                Precision = 0;
+            }
+        }
+
+        /* Process qualifier */
+
+        if (*Format == 'h' || *Format == 'l' || *Format == 'L')
+        {
+            Qualifier = *Format;
+            ++Format;
+            if (Qualifier == 'l' && *Format == 'l')
+            {
+                Qualifier = 'L';
+                ++Format;
+            }
+        }
+
+        switch (*Format)
+        {
+        case '%':
+
+            Pos = AcpiUtBoundStringOutput (Pos, End, '%');
+            continue;
+
+        case 'c':
+
+            if (!(Type & ACPI_FORMAT_LEFT))
+            {
+                while (--Width > 0)
+                {
+                    Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
+                }
+            }
+            c = (char) va_arg (Args, int);
+            Pos = AcpiUtBoundStringOutput (Pos, End, c);
+            while (--Width > 0)
+            {
+                Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
+            }
+            continue;
+
+        case 's':
+
+            s = va_arg (Args, char *);
+            if (!s)
+            {
+                s = "<NULL>";
+            }
+            Length = AcpiUtBoundStringLength (s, Precision);
+            if (!(Type & ACPI_FORMAT_LEFT))
+            {
+                while (Length < Width--)
+                {
+                    Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
+                }
+            }
+            for (i = 0; i < Length; ++i)
+            {
+                Pos = AcpiUtBoundStringOutput (Pos, End, *s);
+                ++s;
+            }
+            while (Length < Width--)
+            {
+                Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
+            }
+            continue;
+
+        case 'o':
+
+            Base = 8;
+            break;
+
+        case 'X':
+
+            Type |= ACPI_FORMAT_UPPER;
+
+        case 'x':
+
+            Base = 16;
+            break;
+
+        case 'd':
+        case 'i':
+
+            Type |= ACPI_FORMAT_SIGN;
+
+        case 'u':
+
+            break;
+
+        case 'p':
+
+            if (Width == -1)
+            {
+                Width = 2 * sizeof (void *);
+                Type |= ACPI_FORMAT_ZERO;
+            }
+            p = va_arg (Args, void *);
+            Pos = AcpiUtFormatNumber (Pos, End,
+                    ACPI_TO_INTEGER (p),
+                    16, Width, Precision, Type);
+            continue;
+
+        default:
+
+            Pos = AcpiUtBoundStringOutput (Pos, End, '%');
+            if (*Format)
+            {
+                Pos = AcpiUtBoundStringOutput (Pos, End, *Format);
+            }
+            else
+            {
+                --Format;
+            }
+            continue;
+        }
+
+        if (Qualifier == 'L')
+        {
+            Number = va_arg (Args, UINT64);
+            if (Type & ACPI_FORMAT_SIGN)
+            {
+                Number = (INT64) Number;
+            }
+        }
+        else if (Qualifier == 'l')
+        {
+            Number = va_arg (Args, unsigned long);
+            if (Type & ACPI_FORMAT_SIGN)
+            {
+                Number = (INT32) Number;
+            }
+        }
+        else if (Qualifier == 'h')
+        {
+            Number = (UINT16) va_arg (Args, int);
+            if (Type & ACPI_FORMAT_SIGN)
+            {
+                Number = (INT16) Number;
+            }
+        }
+        else
+        {
+            Number = va_arg (Args, unsigned int);
+            if (Type & ACPI_FORMAT_SIGN)
+            {
+                Number = (signed int) Number;
+            }
+        }
+        Pos = AcpiUtFormatNumber(Pos, End, Number, Base,
+                Width, Precision, Type);
+    }
+
+    if (Size > 0)
+    {
+        if (Pos < End)
+        {
+            *Pos = '\0';
+        }
+        else
+        {
+            End[-1] = '\0';
+        }
+    }
+
+    return (ACPI_PTR_DIFF (Pos, String));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtSnprintf
+ *
+ * PARAMETERS:  String              - String with boundary
+ *              Size                - Boundary of the string
+ *              Format, ...         - Standard printf format
+ *
+ * RETURN:      Size of successfully output bytes
+ *
+ * DESCRIPTION: Formatted output to a string.
+ *
+ ******************************************************************************/
+
+int
+AcpiUtSnprintf (
+    char                    *String,
+    ACPI_SIZE               Size,
+    const char              *Format,
+    ...)
+{
+    va_list                 Args;
+    int                     Length;
+
+
+    va_start (Args, Format);
+    Length = AcpiUtVsnprintf (String, Size, Format, Args);
+    va_end (Args);
+
+    return (Length);
+}
+
+
+#ifdef ACPI_APPLICATION
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtFileVprintf
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Format              - Standard printf format
+ *              Args                - Argument list
+ *
+ * RETURN:      Size of successfully output bytes
+ *
+ * DESCRIPTION: Formatted output to a file using argument list pointer.
+ *
+ ******************************************************************************/
+
+int
+AcpiUtFileVprintf (
+    ACPI_FILE               File,
+    const char              *Format,
+    va_list                 Args)
+{
+    ACPI_CPU_FLAGS          Flags;
+    int                     Length;
+
+
+    Flags = AcpiOsAcquireLock (AcpiGbl_PrintLock);
+    Length = AcpiUtVsnprintf(AcpiGbl_PrintBuffer,
+                sizeof (AcpiGbl_PrintBuffer), Format, Args);
+    (void) AcpiOsWriteFile (File, AcpiGbl_PrintBuffer, Length, 1);
+    AcpiOsReleaseLock (AcpiGbl_PrintLock, Flags);
+
+    return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiUtFilePrintf
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Format, ...         - Standard printf format
+ *
+ * RETURN:      Size of successfully output bytes
+ *
+ * DESCRIPTION: Formatted output to a file.
+ *
+ ******************************************************************************/
+
+int
+AcpiUtFilePrintf (
+    ACPI_FILE               File,
+    const char              *Format,
+    ...)
+{
+    va_list                 Args;
+    int                     Length;
+
+
+    va_start (Args, Format);
+    Length = AcpiUtFileVprintf (File, Format, Args);
+    va_end (Args);
+
+    return (Length);
+}
+#endif
diff --git a/sys/contrib/dev/acpica/source/include/acapps.h b/sys/contrib/dev/acpica/source/include/acapps.h
index fa8e386..f754789 100644
--- a/sys/contrib/dev/acpica/source/include/acapps.h
+++ b/sys/contrib/dev/acpica/source/include/acapps.h
@@ -84,10 +84,13 @@
 /* Macros for usage messages */
 
 #define ACPI_USAGE_HEADER(Usage) \
-    printf ("Usage: %s\nOptions:\n", Usage);
+    AcpiOsPrintf ("Usage: %s\nOptions:\n", Usage);
+
+#define ACPI_USAGE_TEXT(Description) \
+    AcpiOsPrintf (Description);
 
 #define ACPI_OPTION(Name, Description) \
-    printf ("  %-18s%s\n", Name, Description);
+    AcpiOsPrintf ("  %-18s%s\n", Name, Description);
 
 
 #define FILE_SUFFIX_DISASSEMBLY     "dsl"
@@ -119,7 +122,7 @@ extern char                 *AcpiGbl_Optarg;
  */
 UINT32
 CmGetFileSize (
-    FILE                    *File);
+    ACPI_FILE               File);
 
 
 #ifndef ACPI_DUMP_APP
diff --git a/sys/contrib/dev/acpica/source/include/acdebug.h b/sys/contrib/dev/acpica/source/include/acdebug.h
index f85ec01..a856257 100644
--- a/sys/contrib/dev/acpica/source/include/acdebug.h
+++ b/sys/contrib/dev/acpica/source/include/acdebug.h
@@ -377,11 +377,6 @@ AcpiDbGetTableFromFile (
     char                    *Filename,
     ACPI_TABLE_HEADER       **Table);
 
-ACPI_STATUS
-AcpiDbReadTableFromFile (
-    char                    *Filename,
-    ACPI_TABLE_HEADER       **Table);
-
 
 /*
  * dbhistry - debugger HISTORY command
diff --git a/sys/contrib/dev/acpica/source/include/acglobal.h b/sys/contrib/dev/acpica/source/include/acglobal.h
index 06225c1..a83f8c3 100644
--- a/sys/contrib/dev/acpica/source/include/acglobal.h
+++ b/sys/contrib/dev/acpica/source/include/acglobal.h
@@ -301,7 +301,7 @@ ACPI_GLOBAL (UINT32,                    AcpiGbl_TraceDbgLayer);
  *
  ****************************************************************************/
 
-ACPI_GLOBAL (UINT8,                     AcpiGbl_DbOutputFlags);
+ACPI_INIT_GLOBAL (UINT8,                AcpiGbl_DbOutputFlags, ACPI_DB_CONSOLE_OUTPUT);
 
 #ifdef ACPI_DISASSEMBLER
 
@@ -367,6 +367,12 @@ ACPI_GLOBAL (UINT32,                    AcpiGbl_NumObjects);
 #ifdef ACPI_APPLICATION
 
 ACPI_INIT_GLOBAL (ACPI_FILE,            AcpiGbl_DebugFile, NULL);
+ACPI_INIT_GLOBAL (ACPI_FILE,            AcpiGbl_OutputFile, NULL);
+
+/* Print buffer */
+
+ACPI_GLOBAL (ACPI_SPINLOCK,             AcpiGbl_PrintLock);     /* For print buffer */
+ACPI_GLOBAL (char,                      AcpiGbl_PrintBuffer[1024]);
 
 #endif /* ACPI_APPLICATION */
 
diff --git a/sys/contrib/dev/acpica/source/include/acnames.h b/sys/contrib/dev/acpica/source/include/acnames.h
index 3db143c..f5daace 100644
--- a/sys/contrib/dev/acpica/source/include/acnames.h
+++ b/sys/contrib/dev/acpica/source/include/acnames.h
@@ -55,7 +55,6 @@
 #define METHOD_NAME__HID        "_HID"
 #define METHOD_NAME__INI        "_INI"
 #define METHOD_NAME__PLD        "_PLD"
-#define METHOD_NAME__PRP        "_PRP"
 #define METHOD_NAME__PRS        "_PRS"
 #define METHOD_NAME__PRT        "_PRT"
 #define METHOD_NAME__PRW        "_PRW"
diff --git a/sys/contrib/dev/acpica/source/include/acpi.h b/sys/contrib/dev/acpica/source/include/acpi.h
index 8c65613..fb1f565 100644
--- a/sys/contrib/dev/acpica/source/include/acpi.h
+++ b/sys/contrib/dev/acpica/source/include/acpi.h
@@ -62,8 +62,6 @@
 #include "acrestyp.h"           /* Resource Descriptor structs */
 #include "acpiosxf.h"           /* OSL interfaces (ACPICA-to-OS) */
 #include "acpixf.h"             /* ACPI core subsystem external interfaces */
-#ifdef ACPI_NATIVE_INTERFACE_HEADER
-#include ACPI_NATIVE_INTERFACE_HEADER
-#endif
+#include "platform/acenvex.h"   /* Extra environment-specific items */
 
 #endif /* __ACPI_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/acpiosxf.h b/sys/contrib/dev/acpica/source/include/acpiosxf.h
index 3fb6ea5..a006759 100644
--- a/sys/contrib/dev/acpica/source/include/acpiosxf.h
+++ b/sys/contrib/dev/acpica/source/include/acpiosxf.h
@@ -582,4 +582,53 @@ AcpiOsCloseDirectory (
 #endif
 
 
+/*
+ * File I/O and related support
+ */
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsOpenFile
+ACPI_FILE
+AcpiOsOpenFile (
+    const char              *Path,
+    UINT8                   Modes);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCloseFile
+void
+AcpiOsCloseFile (
+    ACPI_FILE               File);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadFile
+int
+AcpiOsReadFile (
+    ACPI_FILE               File,
+    void                    *Buffer,
+    ACPI_SIZE               Size,
+    ACPI_SIZE               Count);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWriteFile
+int
+AcpiOsWriteFile (
+    ACPI_FILE               File,
+    void                    *Buffer,
+    ACPI_SIZE               Size,
+    ACPI_SIZE               Count);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetFileOffset
+long
+AcpiOsGetFileOffset (
+    ACPI_FILE               File);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsSetFileOffset
+ACPI_STATUS
+AcpiOsSetFileOffset (
+    ACPI_FILE               File,
+    long                    Offset,
+    UINT8                   From);
+#endif
+
+
 #endif /* __ACPIOSXF_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/acpixf.h b/sys/contrib/dev/acpica/source/include/acpixf.h
index 53d2c1f..31adb70 100644
--- a/sys/contrib/dev/acpica/source/include/acpixf.h
+++ b/sys/contrib/dev/acpica/source/include/acpixf.h
@@ -46,7 +46,7 @@
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20140424
+#define ACPI_CA_VERSION                 0x20140627
 
 #include "acconfig.h"
 #include "actypes.h"
@@ -162,6 +162,15 @@ ACPI_INIT_GLOBAL (UINT8,            AcpiGbl_CreateOsiMethod, TRUE);
 ACPI_INIT_GLOBAL (UINT8,            AcpiGbl_UseDefaultRegisterWidths, TRUE);
 
 /*
+ * Whether or not to verify the table checksum before installation. Set
+ * this to TRUE to verify the table checksum before install it to the table
+ * manager. Note that enabling this option causes errors to happen in some
+ * OSPMs during early initialization stages. Default behavior is to do such
+ * verification.
+ */
+ACPI_INIT_GLOBAL (UINT8,            AcpiGbl_VerifyTableChecksum, TRUE);
+
+/*
  * Optionally enable output from the AML Debug Object.
  */
 ACPI_INIT_GLOBAL (UINT8,            AcpiGbl_EnableAmlDebugObject, FALSE);
@@ -334,6 +343,24 @@ ACPI_GLOBAL (BOOLEAN,               AcpiGbl_SystemAwakeAndRunning);
 #endif /* ACPI_DEBUG_OUTPUT */
 
 
+/*
+ * Application prototypes
+ *
+ * All interfaces used by application will be configured
+ * out of the ACPICA build unless the ACPI_APPLICATION
+ * flag is defined.
+ */
+#ifdef ACPI_APPLICATION
+#define ACPI_APP_DEPENDENT_RETURN_VOID(Prototype) \
+    Prototype;
+
+#else
+#define ACPI_APP_DEPENDENT_RETURN_VOID(Prototype) \
+    static ACPI_INLINE Prototype {return;}
+
+#endif /* ACPI_APPLICATION */
+
+
 /*****************************************************************************
  *
  * ACPICA public interface prototypes
@@ -1136,4 +1163,11 @@ AcpiDebugPrintRaw (
     const char              *Format,
     ...))
 
+ACPI_APP_DEPENDENT_RETURN_VOID (
+ACPI_PRINTF_LIKE(1)
+void ACPI_INTERNAL_VAR_XFACE
+AcpiLogError (
+    const char              *Format,
+    ...))
+
 #endif /* __ACXFACE_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/acpredef.h b/sys/contrib/dev/acpica/source/include/acpredef.h
index d7af2db..3ab4ae0 100644
--- a/sys/contrib/dev/acpica/source/include/acpredef.h
+++ b/sys/contrib/dev/acpica/source/include/acpredef.h
@@ -688,12 +688,6 @@ const ACPI_PREDEFINED_INFO          AcpiGbl_PredefinedMethods[] =
                 METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Variable-length (Refs) */
                     PACKAGE_INFO (ACPI_PTYPE1_VAR, ACPI_RTYPE_REFERENCE, 0,0,0,0),
 
-    {{"_PRP",   METHOD_0ARGS,
-                METHOD_RETURNS (ACPI_RTYPE_PACKAGE)}}, /* Variable-length (Pkgs) each: 1 Str, 1 Int/Str/Pkg */
-                    PACKAGE_INFO (ACPI_PTYPE2, ACPI_RTYPE_STRING, 1,
-                        ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING |
-                        ACPI_RTYPE_PACKAGE | ACPI_RTYPE_REFERENCE, 1,0),
-
     {{"_PRS",   METHOD_0ARGS,
                 METHOD_RETURNS (ACPI_RTYPE_BUFFER)}},
 
diff --git a/sys/contrib/dev/acpica/source/include/actables.h b/sys/contrib/dev/acpica/source/include/actables.h
index 672b6b4..e266924 100644
--- a/sys/contrib/dev/acpica/source/include/actables.h
+++ b/sys/contrib/dev/acpica/source/include/actables.h
@@ -86,6 +86,15 @@ void
 AcpiTbReleaseTempTable (
     ACPI_TABLE_DESC         *TableDesc);
 
+ACPI_STATUS
+AcpiTbValidateTempTable (
+    ACPI_TABLE_DESC         *TableDesc);
+
+ACPI_STATUS
+AcpiTbVerifyTempTable (
+    ACPI_TABLE_DESC         *TableDesc,
+    char                    *Signature);
+
 BOOLEAN
 AcpiTbIsTableLoaded (
     UINT32                  TableIndex);
@@ -135,11 +144,6 @@ void
 AcpiTbInvalidateTable (
     ACPI_TABLE_DESC         *TableDesc);
 
-ACPI_STATUS
-AcpiTbVerifyTable (
-    ACPI_TABLE_DESC         *TableDesc,
-    char                    *Signature);
-
 void
 AcpiTbOverrideTable (
     ACPI_TABLE_DESC         *OldTableDesc);
diff --git a/sys/contrib/dev/acpica/source/include/actypes.h b/sys/contrib/dev/acpica/source/include/actypes.h
index 7a8d5c5..5e1c307 100644
--- a/sys/contrib/dev/acpica/source/include/actypes.h
+++ b/sys/contrib/dev/acpica/source/include/actypes.h
@@ -127,6 +127,7 @@
 typedef unsigned char                   BOOLEAN;
 typedef unsigned char                   UINT8;
 typedef unsigned short                  UINT16;
+typedef short                           INT16;
 typedef COMPILER_DEPENDENT_UINT64       UINT64;
 typedef COMPILER_DEPENDENT_INT64        INT64;
 
@@ -1336,4 +1337,19 @@ typedef struct acpi_memory_list
 #define ACPI_OSI_WIN_8                  0x0C
 
 
+/* Definitions of file IO */
+
+#define ACPI_FILE_READING               0x01
+#define ACPI_FILE_WRITING               0x02
+#define ACPI_FILE_BINARY                0x04
+
+#define ACPI_FILE_BEGIN                 0x01
+#define ACPI_FILE_END                   0x02
+
+
+/* Definitions of getopt */
+
+#define ACPI_OPT_END                    -1
+
+
 #endif /* __ACTYPES_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/acutils.h b/sys/contrib/dev/acpica/source/include/acutils.h
index 5c87313..b006234 100644
--- a/sys/contrib/dev/acpica/source/include/acutils.h
+++ b/sys/contrib/dev/acpica/source/include/acutils.h
@@ -96,7 +96,6 @@ extern const char                       *AcpiGbl_PtDecode[];
 #ifdef ACPI_ASL_COMPILER
 
 #include <stdio.h>
-extern FILE                 *AcpiGbl_OutputFile;
 
 #define ACPI_MSG_REDIRECT_BEGIN \
     FILE                    *OutputFile = AcpiGbl_OutputFile; \
@@ -253,6 +252,11 @@ AcpiUtStrlen (
     const char              *String);
 
 char *
+AcpiUtStrchr (
+    const char              *String,
+    int                     ch);
+
+char *
 AcpiUtStrcpy (
     char                    *DstString,
     const char              *SrcString);
@@ -340,7 +344,7 @@ extern const UINT8 _acpi_ctype[];
 #define ACPI_IS_XDIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD))
 #define ACPI_IS_UPPER(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP))
 #define ACPI_IS_LOWER(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO))
-#define ACPI_IS_PRINT(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_SP | _ACPI_PU))
+#define ACPI_IS_PRINT(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_XS | _ACPI_PU))
 #define ACPI_IS_ALPHA(c)  (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP))
 
 #endif /* !ACPI_USE_SYSTEM_CLIBRARY */
@@ -482,6 +486,16 @@ AcpiUtDumpBuffer (
     UINT32                  Display,
     UINT32                  Offset);
 
+#ifdef ACPI_APPLICATION
+void
+AcpiUtDumpBufferToFile (
+    ACPI_FILE               File,
+    UINT8                   *Buffer,
+    UINT32                  Count,
+    UINT32                  Display,
+    UINT32                  BaseOffset);
+#endif
+
 void
 AcpiUtReportError (
     char                    *ModuleName,
@@ -551,6 +565,17 @@ AcpiUtExecutePowerMethods (
 
 
 /*
+ * utfileio - file operations
+ */
+#ifdef ACPI_APPLICATION
+ACPI_STATUS
+AcpiUtReadTableFromFile (
+    char                    *Filename,
+    ACPI_TABLE_HEADER       **Table);
+#endif
+
+
+/*
  * utids - device ID support
  */
 ACPI_STATUS
@@ -1110,4 +1135,45 @@ const AH_DEVICE_ID *
 AcpiAhMatchHardwareId (
     char                    *Hid);
 
+/*
+ * utprint - printf/vprintf output functions
+ */
+const char *
+AcpiUtScanNumber (
+    const char              *String,
+    UINT64                  *NumberPtr);
+
+const char *
+AcpiUtPrintNumber (
+    char                    *String,
+    UINT64                  Number);
+
+int
+AcpiUtVsnprintf (
+    char                    *String,
+    ACPI_SIZE               Size,
+    const char              *Format,
+    va_list                 Args);
+
+int
+AcpiUtSnprintf (
+    char                    *String,
+    ACPI_SIZE               Size,
+    const char              *Format,
+    ...);
+
+#ifdef ACPI_APPLICATION
+int
+AcpiUtFileVprintf (
+    ACPI_FILE               File,
+    const char              *Format,
+    va_list                 Args);
+
+int
+AcpiUtFilePrintf (
+    ACPI_FILE               File,
+    const char              *Format,
+    ...);
+#endif
+
 #endif /* _ACUTILS_H */
diff --git a/sys/contrib/dev/acpica/source/include/platform/accygwin.h b/sys/contrib/dev/acpica/source/include/platform/accygwin.h
index cf8a2a3..09581c4 100644
--- a/sys/contrib/dev/acpica/source/include/platform/accygwin.h
+++ b/sys/contrib/dev/acpica/source/include/platform/accygwin.h
@@ -92,11 +92,14 @@
 
 
 /*
- * The vsnprintf function is defined by c99, but cygwin/gcc does not
- * enable this prototype when the -ansi flag is set. Also related to
- * __STRICT_ANSI__. So, we just declare the prototype here.
+ * The vsnprintf/snprintf functions are defined by c99, but cygwin/gcc
+ * does not enable this prototype when the -ansi flag is set. Also related
+ * to __STRICT_ANSI__. So, we just declare the prototype here.
  */
 int
 vsnprintf (char *s, size_t n, const char *format, va_list ap);
 
+int
+snprintf (char *s, size_t n, const char *format, ...);
+
 #endif /* __ACCYGWIN_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/platform/acefi.h b/sys/contrib/dev/acpica/source/include/platform/acefi.h
index 1fafeb4..cc24fbb 100644
--- a/sys/contrib/dev/acpica/source/include/platform/acefi.h
+++ b/sys/contrib/dev/acpica/source/include/platform/acefi.h
@@ -44,11 +44,20 @@
 #ifndef __ACEFI_H__
 #define __ACEFI_H__
 
+#include <stdarg.h>
+#if defined(_GNU_EFI)
+#include <stdint.h>
+#include <unistd.h>
+#endif
 #include <efi.h>
 #include <efistdarg.h>
 #include <efilib.h>
 
 
+/* AED EFI definitions */
+
+#if defined(_AED_EFI)
+
 /* _int64 works for both IA32 and IA64 */
 
 #define COMPILER_DEPENDENT_INT64   __int64
@@ -71,5 +80,57 @@
 
 #pragma warning(disable:4142)
 
+#endif
+
+
+/* GNU EFI definitions */
+
+#if defined(_GNU_EFI)
+
+/* Using GCC for GNU EFI */
+
+#include "acgcc.h"
+
+#undef ACPI_USE_SYSTEM_CLIBRARY
+#undef ACPI_USE_STANDARD_HEADERS
+#undef ACPI_USE_NATIVE_DIVIDE
+#define ACPI_USE_SYSTEM_INTTYPES
+
+#define ACPI_FILE           SIMPLE_TEXT_OUTPUT_INTERFACE *
+#define ACPI_FILE_OUT       ST->ConOut
+#define ACPI_FILE_ERR       ST->ConOut
+
+/*
+ * Math helpers
+ */
+#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \
+    do {                                             \
+        UINT64 __n = ((UINT64) n_hi) << 32 | (n_lo); \
+        (q32) = DivU64x32 ((__n), (d32), &(r32));    \
+    } while (0)
+
+#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \
+    do {                                \
+        (n_lo) >>= 1;                   \
+        (n_lo) |= (((n_hi) & 1) << 31); \
+        (n_hi) >>= 1;                   \
+    } while (0)
+
+/*
+ * EFI specific prototypes
+ */
+EFI_STATUS
+efi_main (
+    EFI_HANDLE              Image,
+    EFI_SYSTEM_TABLE        *SystemTab);
+
+int
+acpi_main (
+    int                     argc,
+    char                    *argv[]);
+
+
+#endif
+
 
 #endif /* __ACEFI_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/platform/acenv.h b/sys/contrib/dev/acpica/source/include/platform/acenv.h
index 1a9ef38..a73d56f 100644
--- a/sys/contrib/dev/acpica/source/include/platform/acenv.h
+++ b/sys/contrib/dev/acpica/source/include/platform/acenv.h
@@ -88,20 +88,14 @@
 #define ACPI_DBG_TRACK_ALLOCATIONS
 #endif
 
-/* AcpiNames configuration. Single threaded with debugger output enabled. */
-
-#ifdef ACPI_NAMES_APP
-#define ACPI_DEBUGGER
-#define ACPI_APPLICATION
-#define ACPI_SINGLE_THREADED
-#endif
-
 /*
- * AcpiBin/AcpiDump/AcpiSrc/AcpiXtract/Example configuration. All single
- * threaded, with no debug output.
+ * AcpiBin/AcpiDump/AcpiHelp/AcpiNames/AcpiSrc/AcpiXtract/Example configuration.
+ * All single threaded.
  */
 #if (defined ACPI_BIN_APP)      || \
     (defined ACPI_DUMP_APP)     || \
+    (defined ACPI_HELP_APP)     || \
+    (defined ACPI_NAMES_APP)    || \
     (defined ACPI_SRC_APP)      || \
     (defined ACPI_XTRACT_APP)   || \
     (defined ACPI_EXAMPLE_APP)
@@ -109,12 +103,40 @@
 #define ACPI_SINGLE_THREADED
 #endif
 
+/* AcpiHelp configuration. Error messages disabled. */
+
 #ifdef ACPI_HELP_APP
-#define ACPI_APPLICATION
-#define ACPI_SINGLE_THREADED
 #define ACPI_NO_ERROR_MESSAGES
 #endif
 
+/* AcpiNames configuration. Debug output enabled. */
+
+#ifdef ACPI_NAMES_APP
+#define ACPI_DEBUG_OUTPUT
+#endif
+
+/* AcpiExec/AcpiNames/Example configuration. Native RSDP used. */
+
+#if (defined ACPI_EXEC_APP)     || \
+    (defined ACPI_EXAMPLE_APP)  || \
+    (defined ACPI_NAMES_APP)
+#define ACPI_USE_NATIVE_RSDP_POINTER
+#endif
+
+/* AcpiDump configuration. Native mapping used if provied by OSPMs */
+
+#ifdef ACPI_DUMP_APP
+#define ACPI_USE_NATIVE_MEMORY_MAPPING
+#define USE_NATIVE_ALLOCATE_ZEROED
+#endif
+
+/* AcpiNames/Example configuration. Hardware disabled */
+
+#if (defined ACPI_EXAMPLE_APP)  || \
+    (defined ACPI_NAMES_APP)
+#define ACPI_REDUCED_HARDWARE 1
+#endif
+
 /* Linkable ACPICA library */
 
 #ifdef ACPI_LIBRARY
@@ -188,6 +210,9 @@
 #elif defined(_AED_EFI)
 #include "acefi.h"
 
+#elif defined(_GNU_EFI)
+#include "acefi.h"
+
 #elif defined(__HAIKU__)
 #include "achaiku.h"
 
@@ -404,8 +429,12 @@ typedef char *va_list;
 #ifdef ACPI_APPLICATION
 #include <stdio.h>
 #define ACPI_FILE              FILE *
+#define ACPI_FILE_OUT          stdout
+#define ACPI_FILE_ERR          stderr
 #else
 #define ACPI_FILE              void *
+#define ACPI_FILE_OUT          NULL
+#define ACPI_FILE_ERR          NULL
 #endif /* ACPI_APPLICATION */
 #endif /* ACPI_FILE */
 
diff --git a/sys/contrib/dev/acpica/source/include/platform/acenvex.h b/sys/contrib/dev/acpica/source/include/platform/acenvex.h
new file mode 100644
index 0000000..a1de87f
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/include/platform/acenvex.h
@@ -0,0 +1,63 @@
+/******************************************************************************
+ *
+ * Name: acenvex.h - Extra host and compiler configuration
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2014, 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 __ACENVEX_H__
+#define __ACENVEX_H__
+
+/*! [Begin] no source code translation */
+
+/******************************************************************************
+ *
+ * Extra host configuration files. All ACPICA headers are included before
+ * including these files.
+ *
+ *****************************************************************************/
+
+#if defined(_LINUX) || defined(__linux__)
+#include "aclinuxex.h"
+
+#endif
+
+/*! [End] no source code translation !*/
+
+#endif /* __ACENVEX_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/platform/aclinux.h b/sys/contrib/dev/acpica/source/include/platform/aclinux.h
index a57f7f0..a51f288 100644
--- a/sys/contrib/dev/acpica/source/include/platform/aclinux.h
+++ b/sys/contrib/dev/acpica/source/include/platform/aclinux.h
@@ -48,13 +48,18 @@
 
 #define ACPI_USE_SYSTEM_CLIBRARY
 #define ACPI_USE_DO_WHILE_0
-#define ACPI_MUTEX_TYPE             ACPI_BINARY_SEMAPHORE
 
 
 #ifdef __KERNEL__
 
 #define ACPI_USE_SYSTEM_INTTYPES
 
+/* Compile for reduced hardware mode only with this kernel config */
+
+#ifdef CONFIG_ACPI_REDUCED_HARDWARE_ONLY
+#define ACPI_REDUCED_HARDWARE 1
+#endif
+
 #include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/ctype.h>
@@ -66,7 +71,7 @@
 #ifdef EXPORT_ACPI_INTERFACES
 #include <linux/export.h>
 #endif
-#include <asm/acpi.h>
+#include <asm/acenv.h>
 
 #ifndef CONFIG_ACPI
 
@@ -109,6 +114,42 @@
 #define ACPI_SPINLOCK               spinlock_t *
 #define ACPI_CPU_FLAGS              unsigned long
 
+/* Use native linux version of AcpiOsAllocateZeroed */
+
+#define USE_NATIVE_ALLOCATE_ZEROED
+
+/*
+ * Overrides for in-kernel ACPICA
+ */
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsInitialize
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsTerminate
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocate
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocateZeroed
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsFree
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireObject
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetThreadId
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateLock
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsMapMemory
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsUnmapMemory
+
+/*
+ * OSL interfaces used by debugger/disassembler
+ */
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadable
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritable
+
+/*
+ * OSL interfaces used by utilities
+ */
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetLine
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsOpenDirectory
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetNextFilename
+#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCloseDirectory
+
 #else /* !__KERNEL__ */
 
 #include <stdarg.h>
@@ -154,153 +195,4 @@
 
 #include "acgcc.h"
 
-
-#ifdef __KERNEL__
-
-/*
- * FIXME: Inclusion of actypes.h
- * Linux kernel need this before defining inline OSL interfaces as
- * actypes.h need to be included to find ACPICA type definitions.
- * Since from ACPICA's perspective, the actypes.h should be included after
- * acenv.h (aclinux.h), this leads to a inclusion mis-ordering issue.
- */
-#include <acpi/actypes.h>
-
-/*
- * Overrides for in-kernel ACPICA
- */
-ACPI_STATUS __init AcpiOsInitialize (
-    void);
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsInitialize
-
-ACPI_STATUS AcpiOsTerminate (
-    void);
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsTerminate
-
-/*
- * Memory allocation/deallocation
- */
-
-/*
- * The irqs_disabled() check is for resume from RAM.
- * Interrupts are off during resume, just like they are for boot.
- * However, boot has  (system_state != SYSTEM_RUNNING)
- * to quiet __might_sleep() in kmalloc() and resume does not.
- */
-static inline void *
-AcpiOsAllocate (
-    ACPI_SIZE               Size)
-{
-    return kmalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
-}
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocate
-
-/* Use native linux version of AcpiOsAllocateZeroed */
-
-static inline void *
-AcpiOsAllocateZeroed (
-    ACPI_SIZE               Size)
-{
-    return kzalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
-}
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAllocateZeroed
-#define USE_NATIVE_ALLOCATE_ZEROED
-
-static inline void
-AcpiOsFree (
-    void                   *Memory)
-{
-    kfree (Memory);
-}
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsFree
-
-static inline void *
-AcpiOsAcquireObject (
-    ACPI_CACHE_T           *Cache)
-{
-    return kmem_cache_zalloc (Cache,
-        irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
-}
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsAcquireObject
-
-static inline ACPI_THREAD_ID
-AcpiOsGetThreadId (
-    void)
-{
-    return (ACPI_THREAD_ID) (unsigned long) current;
-}
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetThreadId
-
-#ifndef CONFIG_PREEMPT
-
-/*
- * Used within ACPICA to show where it is safe to preempt execution
- * when CONFIG_PREEMPT=n
- */
-#define ACPI_PREEMPTION_POINT() \
-    do { \
-        if (!irqs_disabled()) \
-            cond_resched(); \
-    } while (0)
-
-#endif
-
-/*
- * When lockdep is enabled, the spin_lock_init() macro stringifies it's
- * argument and uses that as a name for the lock in debugging.
- * By executing spin_lock_init() in a macro the key changes from "lock" for
- * all locks to the name of the argument of acpi_os_create_lock(), which
- * prevents lockdep from reporting false positives for ACPICA locks.
- */
-#define AcpiOsCreateLock(__Handle) \
-    ({ \
-        spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
-        if (Lock) { \
-            *(__Handle) = Lock; \
-            spin_lock_init(*(__Handle)); \
-        } \
-        Lock ? AE_OK : AE_NO_MEMORY; \
-    })
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCreateLock
-
-void __iomem *
-AcpiOsMapMemory (
-    ACPI_PHYSICAL_ADDRESS   Where,
-    ACPI_SIZE               Length);
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsMapMemory
-
-void
-AcpiOsUnmapMemory (
-    void __iomem            *LogicalAddress,
-    ACPI_SIZE               Size);
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsUnmapMemory
-
-/*
- * OSL interfaces used by debugger/disassembler
- */
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsReadable
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsWritable
-
-/*
- * OSL interfaces used by utilities
- */
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsRedirectOutput
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetLine
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByName
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByIndex
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetTableByAddress
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsOpenDirectory
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsGetNextFilename
-#define ACPI_USE_ALTERNATE_PROTOTYPE_AcpiOsCloseDirectory
-
-/*
- * OSL interfaces added by Linux
- */
-void
-EarlyAcpiOsUnmapMemory (
-    void __iomem            *Virt,
-    ACPI_SIZE               Size);
-
-#endif /* __KERNEL__ */
-
 #endif /* __ACLINUX_H__ */
diff --git a/sys/contrib/dev/acpica/source/include/platform/aclinuxex.h b/sys/contrib/dev/acpica/source/include/platform/aclinuxex.h
new file mode 100644
index 0000000..87d4391
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/include/platform/aclinuxex.h
@@ -0,0 +1,137 @@
+/******************************************************************************
+ *
+ * Name: aclinuxex.h - Extra OS specific defines, etc. for Linux
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2014, 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 __ACLINUXEX_H__
+#define __ACLINUXEX_H__
+
+#ifdef __KERNEL__
+
+/*
+ * Overrides for in-kernel ACPICA
+ */
+ACPI_STATUS __init AcpiOsInitialize (
+    void);
+
+ACPI_STATUS AcpiOsTerminate (
+    void);
+
+/*
+ * The irqs_disabled() check is for resume from RAM.
+ * Interrupts are off during resume, just like they are for boot.
+ * However, boot has  (system_state != SYSTEM_RUNNING)
+ * to quiet __might_sleep() in kmalloc() and resume does not.
+ */
+static inline void *
+AcpiOsAllocate (
+    ACPI_SIZE               Size)
+{
+    return kmalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
+}
+
+static inline void *
+AcpiOsAllocateZeroed (
+    ACPI_SIZE               Size)
+{
+    return kzalloc (Size, irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
+}
+
+static inline void
+AcpiOsFree (
+    void                   *Memory)
+{
+    kfree (Memory);
+}
+
+static inline void *
+AcpiOsAcquireObject (
+    ACPI_CACHE_T           *Cache)
+{
+    return kmem_cache_zalloc (Cache,
+        irqs_disabled () ? GFP_ATOMIC : GFP_KERNEL);
+}
+
+static inline ACPI_THREAD_ID
+AcpiOsGetThreadId (
+    void)
+{
+    return (ACPI_THREAD_ID) (unsigned long) current;
+}
+
+/*
+ * When lockdep is enabled, the spin_lock_init() macro stringifies it's
+ * argument and uses that as a name for the lock in debugging.
+ * By executing spin_lock_init() in a macro the key changes from "lock" for
+ * all locks to the name of the argument of acpi_os_create_lock(), which
+ * prevents lockdep from reporting false positives for ACPICA locks.
+ */
+#define AcpiOsCreateLock(__Handle) \
+    ({ \
+        spinlock_t *Lock = ACPI_ALLOCATE(sizeof(*Lock)); \
+        if (Lock) { \
+            *(__Handle) = Lock; \
+            spin_lock_init(*(__Handle)); \
+        } \
+        Lock ? AE_OK : AE_NO_MEMORY; \
+    })
+
+void __iomem *
+AcpiOsMapMemory (
+    ACPI_PHYSICAL_ADDRESS   Where,
+    ACPI_SIZE               Length);
+
+void
+AcpiOsUnmapMemory (
+    void __iomem            *LogicalAddress,
+    ACPI_SIZE               Size);
+
+/*
+ * OSL interfaces added by Linux
+ */
+void
+EarlyAcpiOsUnmapMemory (
+    void __iomem            *Virt,
+    ACPI_SIZE               Size);
+
+#endif /* __KERNEL__ */
+
+#endif /* __ACLINUXEX_H__ */
diff --git a/sys/contrib/dev/acpica/source/os_specific/service_layers/osefitbl.c b/sys/contrib/dev/acpica/source/os_specific/service_layers/osefitbl.c
new file mode 100644
index 0000000..341f3dd
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/os_specific/service_layers/osefitbl.c
@@ -0,0 +1,1033 @@
+/******************************************************************************
+ *
+ * Module Name: osefitbl - EFI OSL for obtaining ACPI tables
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2014, 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"
+
+
+#define _COMPONENT          ACPI_OS_SERVICES
+        ACPI_MODULE_NAME    ("osefitbl")
+
+
+#ifndef PATH_MAX
+#define PATH_MAX 256
+#endif
+
+
+/* List of information about obtained ACPI tables */
+
+typedef struct osl_table_info
+{
+    struct osl_table_info   *Next;
+    UINT32                  Instance;
+    char                    Signature[ACPI_NAME_SIZE];
+
+} OSL_TABLE_INFO;
+
+/* Local prototypes */
+
+static ACPI_STATUS
+OslTableInitialize (
+    void);
+
+static ACPI_STATUS
+OslAddTableToList (
+    char                    *Signature,
+    UINT32                  Instance);
+
+static ACPI_STATUS
+OslMapTable (
+    ACPI_SIZE               Address,
+    char                    *Signature,
+    ACPI_TABLE_HEADER       **Table);
+
+static void
+OslUnmapTable (
+    ACPI_TABLE_HEADER       *Table);
+
+static ACPI_STATUS
+OslLoadRsdp (
+    void);
+
+static ACPI_STATUS
+OslListTables (
+    void);
+
+static ACPI_STATUS
+OslGetTable (
+    char                    *Signature,
+    UINT32                  Instance,
+    ACPI_TABLE_HEADER       **Table,
+    ACPI_PHYSICAL_ADDRESS   *Address);
+
+
+/* File locations */
+
+#define EFI_SYSTAB          "/sys/firmware/efi/systab"
+
+/* Initialization flags */
+
+UINT8                   Gbl_TableListInitialized = FALSE;
+
+/* Local copies of main ACPI tables */
+
+ACPI_TABLE_RSDP         Gbl_Rsdp;
+ACPI_TABLE_FADT         *Gbl_Fadt = NULL;
+ACPI_TABLE_RSDT         *Gbl_Rsdt = NULL;
+ACPI_TABLE_XSDT         *Gbl_Xsdt = NULL;
+
+/* Table addresses */
+
+ACPI_PHYSICAL_ADDRESS   Gbl_FadtAddress = 0;
+ACPI_PHYSICAL_ADDRESS   Gbl_RsdpAddress = 0;
+
+/* Revision of RSD PTR */
+
+UINT8                   Gbl_Revision = 0;
+
+OSL_TABLE_INFO          *Gbl_TableListHead = NULL;
+UINT32                  Gbl_TableCount = 0;
+
+
+/******************************************************************************
+ *
+ * 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)
+{
+    UINT32                  TableLength;
+    ACPI_TABLE_HEADER       *MappedTable;
+    ACPI_TABLE_HEADER       *LocalTable = NULL;
+    ACPI_STATUS             Status = AE_OK;
+
+
+    /* Get main ACPI tables from memory on first invocation of this function */
+
+    Status = OslTableInitialize ();
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Map the table and validate it */
+
+    Status = OslMapTable (Address, NULL, &MappedTable);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Copy table to local buffer and return it */
+
+    TableLength = ApGetTableLength (MappedTable);
+    if (TableLength == 0)
+    {
+        Status = AE_BAD_HEADER;
+        goto Exit;
+    }
+
+    LocalTable = ACPI_ALLOCATE_ZEROED (TableLength);
+    if (!LocalTable)
+    {
+        Status = AE_NO_MEMORY;
+        goto Exit;
+    }
+
+    ACPI_MEMCPY (LocalTable, MappedTable, TableLength);
+
+Exit:
+    OslUnmapTable (MappedTable);
+    *Table = LocalTable;
+    return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsGetTableByName
+ *
+ * PARAMETERS:  Signature       - ACPI Signature for desired table. Must be
+ *                                a null terminated 4-character string.
+ *              Instance        - Multiple table support for SSDT/UEFI (0...n)
+ *                                Must be 0 for other tables.
+ *              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
+ *
+ * NOTE:        Assumes the input signature is uppercase.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsGetTableByName (
+    char                    *Signature,
+    UINT32                  Instance,
+    ACPI_TABLE_HEADER       **Table,
+    ACPI_PHYSICAL_ADDRESS   *Address)
+{
+    ACPI_STATUS             Status;
+
+
+    /* Get main ACPI tables from memory on first invocation of this function */
+
+    Status = OslTableInitialize ();
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Not a main ACPI table, attempt to extract it from the RSDT/XSDT */
+
+    if (!Gbl_DumpCustomizedTables)
+    {
+        /* Attempt to get the table from the memory */
+
+        Status = OslGetTable (Signature, Instance, Table, Address);
+    }
+    else
+    {
+        /* Attempt to get the table from the static directory */
+
+        Status = AE_SUPPORT;
+    }
+
+    return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslAddTableToList
+ *
+ * PARAMETERS:  Signature       - Table signature
+ *              Instance        - Table instance
+ *
+ * RETURN:      Status; Successfully added if AE_OK.
+ *              AE_NO_MEMORY: Memory allocation error
+ *
+ * DESCRIPTION: Insert a table structure into OSL table list.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+OslAddTableToList (
+    char                    *Signature,
+    UINT32                  Instance)
+{
+    OSL_TABLE_INFO          *NewInfo;
+    OSL_TABLE_INFO          *Next;
+    UINT32                  NextInstance = 0;
+    BOOLEAN                 Found = FALSE;
+
+
+    NewInfo = ACPI_ALLOCATE_ZEROED (sizeof (OSL_TABLE_INFO));
+    if (!NewInfo)
+    {
+        return (AE_NO_MEMORY);
+    }
+
+    ACPI_MOVE_NAME (NewInfo->Signature, Signature);
+
+    if (!Gbl_TableListHead)
+    {
+        Gbl_TableListHead = NewInfo;
+    }
+    else
+    {
+        Next = Gbl_TableListHead;
+        while (1)
+        {
+            if (ACPI_COMPARE_NAME (Next->Signature, Signature))
+            {
+                if (Next->Instance == Instance)
+                {
+                    Found = TRUE;
+                }
+                if (Next->Instance >= NextInstance)
+                {
+                    NextInstance = Next->Instance + 1;
+                }
+            }
+
+            if (!Next->Next)
+            {
+                break;
+            }
+            Next = Next->Next;
+        }
+        Next->Next = NewInfo;
+    }
+
+    if (Found)
+    {
+        if (Instance)
+        {
+            AcpiLogError (
+                "%4.4s: Warning unmatched table instance %d, expected %d\n",
+                Signature, Instance, NextInstance);
+        }
+        Instance = NextInstance;
+    }
+
+    NewInfo->Instance = Instance;
+    Gbl_TableCount++;
+
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsGetTableByIndex
+ *
+ * PARAMETERS:  Index           - Which table to get
+ *              Table           - Where a pointer to the table is returned
+ *              Instance        - Where a pointer to the table instance no. 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,
+    UINT32                  *Instance,
+    ACPI_PHYSICAL_ADDRESS   *Address)
+{
+    OSL_TABLE_INFO          *Info;
+    ACPI_STATUS             Status;
+    UINT32                  i;
+
+
+    /* Get main ACPI tables from memory on first invocation of this function */
+
+    Status = OslTableInitialize ();
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Validate Index */
+
+    if (Index >= Gbl_TableCount)
+    {
+        return (AE_LIMIT);
+    }
+
+    /* Point to the table list entry specified by the Index argument */
+
+    Info = Gbl_TableListHead;
+    for (i = 0; i < Index; i++)
+    {
+        Info = Info->Next;
+    }
+
+    /* Now we can just get the table via the signature */
+
+    Status = AcpiOsGetTableByName (Info->Signature, Info->Instance,
+        Table, Address);
+
+    if (ACPI_SUCCESS (Status))
+    {
+        *Instance = Info->Instance;
+    }
+    return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslLoadRsdp
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Scan and load RSDP.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+OslLoadRsdp (
+    void)
+{
+    ACPI_TABLE_HEADER       *MappedTable;
+    UINT8                   *RsdpAddress;
+    ACPI_PHYSICAL_ADDRESS   RsdpBase;
+    ACPI_SIZE               RsdpSize;
+
+
+    /* Get RSDP from memory */
+
+    RsdpSize = sizeof (ACPI_TABLE_RSDP);
+    if (Gbl_RsdpBase)
+    {
+        RsdpBase = Gbl_RsdpBase;
+    }
+    else
+    {
+        RsdpBase = AcpiOsGetRootPointer ();
+    }
+
+    if (!RsdpBase)
+    {
+        RsdpBase = ACPI_HI_RSDP_WINDOW_BASE;
+        RsdpSize = ACPI_HI_RSDP_WINDOW_SIZE;
+    }
+
+    RsdpAddress = AcpiOsMapMemory (RsdpBase, RsdpSize);
+    if (!RsdpAddress)
+    {
+        return (AE_BAD_ADDRESS);
+    }
+
+    /* Search low memory for the RSDP */
+
+    MappedTable = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
+        AcpiTbScanMemoryForRsdp (RsdpAddress, RsdpSize));
+    if (!MappedTable)
+    {
+        AcpiOsUnmapMemory (RsdpAddress, RsdpSize);
+        return (AE_NOT_FOUND);
+    }
+
+    Gbl_RsdpAddress = RsdpBase + (ACPI_CAST8 (MappedTable) - RsdpAddress);
+
+    ACPI_MEMCPY (&Gbl_Rsdp, MappedTable, sizeof (ACPI_TABLE_RSDP));
+    AcpiOsUnmapMemory (RsdpAddress, RsdpSize);
+
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslCanUseXsdt
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      TRUE if XSDT is allowed to be used.
+ *
+ * DESCRIPTION: This function collects logic that can be used to determine if
+ *              XSDT should be used instead of RSDT.
+ *
+ *****************************************************************************/
+
+static BOOLEAN
+OslCanUseXsdt (
+    void)
+{
+    if (Gbl_Revision && !AcpiGbl_DoNotUseXsdt)
+    {
+        return (TRUE);
+    }
+    else
+    {
+        return (FALSE);
+    }
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslTableInitialize
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Initialize ACPI table data. Get and store main ACPI tables to
+ *              local variables. Main ACPI tables include RSDT, FADT, RSDT,
+ *              and/or XSDT.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+OslTableInitialize (
+    void)
+{
+    ACPI_STATUS             Status;
+    ACPI_PHYSICAL_ADDRESS   Address;
+
+
+    if (Gbl_TableListInitialized)
+    {
+        return (AE_OK);
+    }
+
+    /* Get RSDP from memory */
+
+    Status = OslLoadRsdp ();
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    /* Get XSDT from memory */
+
+    if (Gbl_Rsdp.Revision && !Gbl_DoNotDumpXsdt)
+    {
+        if (Gbl_Xsdt)
+        {
+            ACPI_FREE (Gbl_Xsdt);
+            Gbl_Xsdt = NULL;
+        }
+
+        Gbl_Revision = 2;
+        Status = OslGetTable (ACPI_SIG_XSDT, 0,
+            ACPI_CAST_PTR (ACPI_TABLE_HEADER *, &Gbl_Xsdt), &Address);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+    }
+
+    /* Get RSDT from memory */
+
+    if (Gbl_Rsdp.RsdtPhysicalAddress)
+    {
+        if (Gbl_Rsdt)
+        {
+            ACPI_FREE (Gbl_Rsdt);
+            Gbl_Rsdt = NULL;
+        }
+
+        Status = OslGetTable (ACPI_SIG_RSDT, 0,
+            ACPI_CAST_PTR (ACPI_TABLE_HEADER *, &Gbl_Rsdt), &Address);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+    }
+
+    /* Get FADT from memory */
+
+    if (Gbl_Fadt)
+    {
+        ACPI_FREE (Gbl_Fadt);
+        Gbl_Fadt = NULL;
+    }
+
+    Status = OslGetTable (ACPI_SIG_FADT, 0,
+        ACPI_CAST_PTR (ACPI_TABLE_HEADER *, &Gbl_Fadt), &Gbl_FadtAddress);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
+    if (!Gbl_DumpCustomizedTables)
+    {
+        /* Add mandatory tables to global table list first */
+
+        Status = OslAddTableToList (ACPI_RSDP_NAME, 0);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        Status = OslAddTableToList (ACPI_SIG_RSDT, 0);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        if (Gbl_Revision == 2)
+        {
+            Status = OslAddTableToList (ACPI_SIG_XSDT, 0);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
+        }
+
+        Status = OslAddTableToList (ACPI_SIG_DSDT, 0);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        Status = OslAddTableToList (ACPI_SIG_FACS, 0);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        /* Add all tables found in the memory */
+
+        Status = OslListTables ();
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+    }
+    else
+    {
+        /* Add all tables found in the static directory */
+
+        Status = AE_SUPPORT;
+    }
+
+    Gbl_TableListInitialized = TRUE;
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslListTables
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status; Table list is initialized if AE_OK.
+ *
+ * DESCRIPTION: Add ACPI tables to the table list from memory.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+OslListTables (
+    void)
+{
+    ACPI_TABLE_HEADER       *MappedTable = NULL;
+    UINT8                   *TableData;
+    UINT8                   NumberOfTables;
+    UINT8                   ItemSize;
+    ACPI_PHYSICAL_ADDRESS   TableAddress = 0;
+    ACPI_STATUS             Status = AE_OK;
+    UINT32                  i;
+
+
+    if (OslCanUseXsdt ())
+    {
+        ItemSize = sizeof (UINT64);
+        TableData = ACPI_CAST8 (Gbl_Xsdt) + sizeof (ACPI_TABLE_HEADER);
+        NumberOfTables =
+            (UINT8) ((Gbl_Xsdt->Header.Length - sizeof (ACPI_TABLE_HEADER))
+            / ItemSize);
+    }
+    else /* Use RSDT if XSDT is not available */
+    {
+        ItemSize = sizeof (UINT32);
+        TableData = ACPI_CAST8 (Gbl_Rsdt) + sizeof (ACPI_TABLE_HEADER);
+        NumberOfTables =
+            (UINT8) ((Gbl_Rsdt->Header.Length - sizeof (ACPI_TABLE_HEADER))
+            / ItemSize);
+    }
+
+    /* Search RSDT/XSDT for the requested table */
+
+    for (i = 0; i < NumberOfTables; ++i, TableData += ItemSize)
+    {
+        if (OslCanUseXsdt ())
+        {
+            TableAddress =
+                (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST64 (TableData));
+        }
+        else
+        {
+            TableAddress =
+                (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST32 (TableData));
+        }
+
+        /* Skip NULL entries in RSDT/XSDT */
+
+        if (!TableAddress)
+        {
+            continue;
+        }
+
+        Status = OslMapTable (TableAddress, NULL, &MappedTable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        OslAddTableToList (MappedTable->Signature, 0);
+        OslUnmapTable (MappedTable);
+    }
+
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslGetTable
+ *
+ * PARAMETERS:  Signature       - ACPI Signature for common table. Must be
+ *                                a null terminated 4-character string.
+ *              Instance        - Multiple table support for SSDT/UEFI (0...n)
+ *                                Must be 0 for other tables.
+ *              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 a BIOS provided ACPI table
+ *
+ * NOTE:        Assumes the input signature is uppercase.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+OslGetTable (
+    char                    *Signature,
+    UINT32                  Instance,
+    ACPI_TABLE_HEADER       **Table,
+    ACPI_PHYSICAL_ADDRESS   *Address)
+{
+    ACPI_TABLE_HEADER       *LocalTable = NULL;
+    ACPI_TABLE_HEADER       *MappedTable = NULL;
+    UINT8                   *TableData;
+    UINT8                   NumberOfTables;
+    UINT8                   ItemSize;
+    UINT32                  CurrentInstance = 0;
+    ACPI_PHYSICAL_ADDRESS   TableAddress = 0;
+    UINT32                  TableLength = 0;
+    ACPI_STATUS             Status = AE_OK;
+    UINT32                  i;
+
+
+    /* Handle special tables whose addresses are not in RSDT/XSDT */
+
+    if (ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME) ||
+        ACPI_COMPARE_NAME (Signature, ACPI_SIG_RSDT) ||
+        ACPI_COMPARE_NAME (Signature, ACPI_SIG_XSDT) ||
+        ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) ||
+        ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
+    {
+        /*
+         * Get the appropriate address, either 32-bit or 64-bit. Be very
+         * careful about the FADT length and validate table addresses.
+         * Note: The 64-bit addresses have priority.
+         */
+        if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT))
+        {
+            if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XDSDT) &&
+                Gbl_Fadt->XDsdt)
+            {
+                TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XDsdt;
+            }
+            else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_DSDT) &&
+                Gbl_Fadt->Dsdt)
+            {
+                TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Dsdt;
+            }
+        }
+        else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
+        {
+            if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XFACS) &&
+                Gbl_Fadt->XFacs)
+            {
+                TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XFacs;
+            }
+            else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_FACS) &&
+                Gbl_Fadt->Facs)
+            {
+                TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Facs;
+            }
+        }
+        else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_XSDT))
+        {
+            if (!Gbl_Revision)
+            {
+                return (AE_BAD_SIGNATURE);
+            }
+            TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.XsdtPhysicalAddress;
+        }
+        else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_RSDT))
+        {
+            TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.RsdtPhysicalAddress;
+        }
+        else
+        {
+            TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_RsdpAddress;
+            Signature = ACPI_SIG_RSDP;
+        }
+
+        /* Now we can get the requested special table */
+
+        Status = OslMapTable (TableAddress, Signature, &MappedTable);
+        if (ACPI_FAILURE (Status))
+        {
+            return (Status);
+        }
+
+        TableLength = ApGetTableLength (MappedTable);
+    }
+    else /* Case for a normal ACPI table */
+    {
+        if (OslCanUseXsdt ())
+        {
+            ItemSize = sizeof (UINT64);
+            TableData = ACPI_CAST8 (Gbl_Xsdt) + sizeof (ACPI_TABLE_HEADER);
+            NumberOfTables =
+                (UINT8) ((Gbl_Xsdt->Header.Length - sizeof (ACPI_TABLE_HEADER))
+                / ItemSize);
+        }
+        else /* Use RSDT if XSDT is not available */
+        {
+            ItemSize = sizeof (UINT32);
+            TableData = ACPI_CAST8 (Gbl_Rsdt) + sizeof (ACPI_TABLE_HEADER);
+            NumberOfTables =
+                (UINT8) ((Gbl_Rsdt->Header.Length - sizeof (ACPI_TABLE_HEADER))
+                / ItemSize);
+        }
+
+        /* Search RSDT/XSDT for the requested table */
+
+        for (i = 0; i < NumberOfTables; ++i, TableData += ItemSize)
+        {
+            if (OslCanUseXsdt ())
+            {
+                TableAddress =
+                    (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST64 (TableData));
+            }
+            else
+            {
+                TableAddress =
+                    (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST32 (TableData));
+            }
+
+            /* Skip NULL entries in RSDT/XSDT */
+
+            if (!TableAddress)
+            {
+                continue;
+            }
+
+            Status = OslMapTable (TableAddress, NULL, &MappedTable);
+            if (ACPI_FAILURE (Status))
+            {
+                return (Status);
+            }
+            TableLength = MappedTable->Length;
+
+            /* Does this table match the requested signature? */
+
+            if (!ACPI_COMPARE_NAME (MappedTable->Signature, Signature))
+            {
+                OslUnmapTable (MappedTable);
+                MappedTable = NULL;
+                continue;
+            }
+
+            /* Match table instance (for SSDT/UEFI tables) */
+
+            if (CurrentInstance != Instance)
+            {
+                OslUnmapTable (MappedTable);
+                MappedTable = NULL;
+                CurrentInstance++;
+                continue;
+            }
+
+            break;
+        }
+    }
+
+    if (!MappedTable)
+    {
+        return (AE_LIMIT);
+    }
+
+    if (TableLength == 0)
+    {
+        Status = AE_BAD_HEADER;
+        goto Exit;
+    }
+
+    /* Copy table to local buffer and return it */
+
+    LocalTable = ACPI_ALLOCATE_ZEROED (TableLength);
+    if (!LocalTable)
+    {
+        Status = AE_NO_MEMORY;
+        goto Exit;
+    }
+
+    ACPI_MEMCPY (LocalTable, MappedTable, TableLength);
+    *Address = TableAddress;
+    *Table = LocalTable;
+
+Exit:
+    OslUnmapTable (MappedTable);
+    return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslMapTable
+ *
+ * PARAMETERS:  Address             - Address of the table in memory
+ *              Signature           - Optional ACPI Signature for desired table.
+ *                                    Null terminated 4-character string.
+ *              Table               - Where a pointer to the mapped table is
+ *                                    returned
+ *
+ * RETURN:      Status; Mapped table is returned if AE_OK.
+ *              AE_NOT_FOUND: A valid table was not found at the address
+ *
+ * DESCRIPTION: Map entire ACPI table into caller's address space.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+OslMapTable (
+    ACPI_SIZE               Address,
+    char                    *Signature,
+    ACPI_TABLE_HEADER       **Table)
+{
+    ACPI_TABLE_HEADER       *MappedTable;
+    UINT32                  Length;
+
+
+    if (!Address)
+    {
+        return (AE_BAD_ADDRESS);
+    }
+
+    /*
+     * Map the header so we can get the table length.
+     * Use sizeof (ACPI_TABLE_HEADER) as:
+     * 1. it is bigger than 24 to include RSDP->Length
+     * 2. it is smaller than sizeof (ACPI_TABLE_RSDP)
+     */
+    MappedTable = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
+    if (!MappedTable)
+    {
+        AcpiLogError ("Could not map table header at 0x%8.8X%8.8X\n",
+            ACPI_FORMAT_UINT64 (Address));
+        return (AE_BAD_ADDRESS);
+    }
+
+    /* If specified, signature must match */
+
+    if (Signature)
+    {
+        if (ACPI_VALIDATE_RSDP_SIG (Signature))
+        {
+            if (!ACPI_VALIDATE_RSDP_SIG (MappedTable->Signature))
+            {
+                AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER));
+                return (AE_BAD_SIGNATURE);
+            }
+        }
+        else if (!ACPI_COMPARE_NAME (Signature, MappedTable->Signature))
+        {
+            AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER));
+            return (AE_BAD_SIGNATURE);
+        }
+    }
+
+    /* Map the entire table */
+
+    Length = ApGetTableLength (MappedTable);
+    AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER));
+    if (Length == 0)
+    {
+        return (AE_BAD_HEADER);
+    }
+
+    MappedTable = AcpiOsMapMemory (Address, Length);
+    if (!MappedTable)
+    {
+        AcpiLogError ("Could not map table at 0x%8.8X%8.8X length %8.8X\n",
+            ACPI_FORMAT_UINT64 (Address), Length);
+        return (AE_INVALID_TABLE_LENGTH);
+    }
+
+    (void) ApIsValidChecksum (MappedTable);
+
+    *Table = MappedTable;
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    OslUnmapTable
+ *
+ * PARAMETERS:  Table               - A pointer to the mapped table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Unmap entire ACPI table.
+ *
+ *****************************************************************************/
+
+static void
+OslUnmapTable (
+    ACPI_TABLE_HEADER       *Table)
+{
+    if (Table)
+    {
+        AcpiOsUnmapMemory (Table, ApGetTableLength (Table));
+    }
+}
diff --git a/sys/contrib/dev/acpica/source/os_specific/service_layers/osefixf.c b/sys/contrib/dev/acpica/source/os_specific/service_layers/osefixf.c
new file mode 100644
index 0000000..3f6c5da
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/os_specific/service_layers/osefixf.c
@@ -0,0 +1,1300 @@
+/******************************************************************************
+ *
+ * Module Name: osefixf - EFI OSL interfaces
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2014, 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 "acapps.h"
+
+
+/* Local definitions */
+
+#define ACPI_EFI_PRINT_LENGTH   256
+
+
+/* Local definitions */
+
+typedef struct acpi_efi_memory_descriptor {
+    EFI_MEMORY_DESCRIPTOR   *Descriptor;
+    UINTN                   EntryCount;
+    UINTN                   EntrySize;
+    UINTN                   Cookie;
+    UINT32                  Version;
+} ACPI_EFI_MEMORY_DESCRIPTOR;
+
+
+/* Local prototypes */
+
+static void *
+AcpiEfiAllocatePool (
+    ACPI_SIZE               Size);
+
+static ACPI_STATUS
+AcpiEfiArgify (
+    char                    *String,
+    int                     *ArgcPtr,
+    char                    ***ArgvPtr);
+
+static BOOLEAN
+AcpiEfiCompareGuid (
+    EFI_GUID                *Guid1,
+    EFI_GUID                *Guid2);
+
+static ACPI_STATUS
+AcpiEfiConvertArgcv (
+    CHAR16                  *LoadOpt,
+    UINT32                  LoadOptSize,
+    int                     *ArgcPtr,
+    char                    ***ArgvPtr,
+    char                    **BufferPtr);
+
+static ACPI_PHYSICAL_ADDRESS
+AcpiEfiGetRsdpViaGuid (
+    EFI_GUID                *Guid);
+
+static CHAR16 *
+AcpiEfiFlushFile (
+    ACPI_FILE               File,
+    CHAR16                  *Begin,
+    CHAR16                  *End,
+    CHAR16                  *Pos,
+    BOOLEAN                 FlushAll);
+
+static void
+AcpiEfiFreePool (
+    void                    *Mem);
+
+static ACPI_STATUS
+AcpiEfiInitializeMemoryMap (
+    void);
+
+static void
+AcpiEfiTerminateMemoryMap (
+    void);
+
+
+/* Local variables */
+
+static EFI_FILE_HANDLE      AcpiGbl_EfiCurrentVolume = NULL;
+static ACPI_EFI_MEMORY_DESCRIPTOR       AcpiGbl_EfiMemoryMap;
+static BOOLEAN                          AcpiGbl_EfiMemoryInitialized = FALSE;
+static UINTN                            AcpiGbl_EfiPoolAllocation = EfiBootServicesData;
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiGetRsdpViaGuid
+ *
+ * PARAMETERS:  Guid1               - GUID to compare
+ *              Guid2               - GUID to compare
+ *
+ * RETURN:      TRUE if Guid1 == Guid2
+ *
+ * DESCRIPTION: Compares two GUIDs
+ *
+ *****************************************************************************/
+
+static BOOLEAN
+AcpiEfiCompareGuid (
+    EFI_GUID                *Guid1,
+    EFI_GUID                *Guid2)
+{
+    INT32                   *g1;
+    INT32                   *g2;
+    INT32                   r;
+
+
+    g1 = (INT32 *) Guid1;
+    g2 = (INT32 *) Guid2;
+
+    r  = g1[0] - g2[0];
+    r |= g1[1] - g2[1];
+    r |= g1[2] - g2[2];
+    r |= g1[3] - g2[3];
+
+    return (r ? FALSE : TRUE);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiInitializeMemoryMap
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Initialize EFI memory map.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+AcpiEfiInitializeMemoryMap (
+    void)
+{
+    EFI_STATUS              Status;
+    ACPI_EFI_MEMORY_DESCRIPTOR *Map;
+    UINT32                  Length;
+
+
+    if (AcpiGbl_EfiMemoryInitialized)
+    {
+        return (AE_OK);
+    }
+
+    /* Initialize */
+
+    Map = &AcpiGbl_EfiMemoryMap;
+    Length = sizeof (EFI_MEMORY_DESCRIPTOR);
+    Map->Descriptor = NULL;
+    Status = EFI_BUFFER_TOO_SMALL;
+
+    /* Allocation and GetMemoryMap() loop */
+
+    while (!AcpiGbl_EfiMemoryInitialized &&
+           Status == EFI_BUFFER_TOO_SMALL)
+    {
+        Map->Descriptor = AcpiEfiAllocatePool (Length);
+        if (!Map->Descriptor)
+        {
+            return (AE_NO_MEMORY);
+        }
+        Status = uefi_call_wrapper (BS->GetMemoryMap, 5,
+                    &Length, Map->Descriptor,
+                    &Map->Cookie, &Map->EntrySize, &Map->Version);
+        if (!EFI_ERROR (Status))
+        {
+            AcpiGbl_EfiMemoryInitialized = TRUE;
+        }
+        else if (Status == EFI_BUFFER_TOO_SMALL)
+        {
+            AcpiEfiFreePool (Map->Descriptor);
+        }
+    }
+
+    /* Finalize */
+
+    if (!AcpiGbl_EfiMemoryInitialized)
+    {
+        if (Map->Descriptor)
+        {
+            AcpiEfiFreePool (Map->Descriptor);
+            Map->Descriptor = NULL;
+        }
+        return (AE_ERROR);
+    }
+    else
+    {
+        Map->EntryCount = Length / sizeof (EFI_MEMORY_DESCRIPTOR);
+    }
+
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiTerminateMemoryMap
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Terminate EFI memory map.
+ *
+ *****************************************************************************/
+
+static void
+AcpiEfiTerminateMemoryMap (
+    void)
+{
+
+    if (AcpiGbl_EfiMemoryInitialized)
+    {
+        AcpiEfiFreePool (AcpiGbl_EfiMemoryMap.Descriptor);
+        AcpiGbl_EfiMemoryInitialized = FALSE;
+    }
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiGetRsdpViaGuid
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      RSDP address if found
+ *
+ * DESCRIPTION: Find RSDP address via EFI using specified GUID.
+ *
+ *****************************************************************************/
+
+static ACPI_PHYSICAL_ADDRESS
+AcpiEfiGetRsdpViaGuid (
+    EFI_GUID                *Guid)
+{
+    unsigned long           Address = 0;
+    int                     i;
+
+
+    for (i = 0; i < ST->NumberOfTableEntries; i++)
+    {
+        if (AcpiEfiCompareGuid (&ST->ConfigurationTable[i].VendorGuid, Guid))
+        {
+            Address = (ACPI_PHYSICAL_ADDRESS)
+                    ST->ConfigurationTable[i].VendorTable;
+            break;
+        }
+    }
+
+    return ((ACPI_PHYSICAL_ADDRESS) (Address));
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiAllocatePool
+ *
+ * PARAMETERS:  Size                - Amount to allocate, in bytes
+ *
+ * RETURN:      Pointer to the new allocation. Null on error.
+ *
+ * DESCRIPTION: Allocate pool memory.
+ *
+ *****************************************************************************/
+
+static void *
+AcpiEfiAllocatePool (
+    ACPI_SIZE               Size)
+{
+    EFI_STATUS              EfiStatus;
+    void                    *Mem;
+
+
+    EfiStatus = uefi_call_wrapper (BS->AllocatePool, 3,
+        AcpiGbl_EfiPoolAllocation, Size, &Mem);
+    if (EFI_ERROR (EfiStatus))
+    {
+        AcpiLogError ("EFI_BOOT_SERVICES->AllocatePool(EfiLoaderData) failure.\n");
+        return (NULL);
+    }
+
+    return (Mem);
+}
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiFreePool
+ *
+ * PARAMETERS:  Mem                 - Pointer to previously allocated memory
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Free memory allocated via AcpiEfiAllocatePool
+ *
+ *****************************************************************************/
+
+static void
+AcpiEfiFreePool (
+    void                    *Mem)
+{
+
+    uefi_call_wrapper (BS->FreePool, 1, Mem);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsGetRootPointer
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      RSDP physical address
+ *
+ * DESCRIPTION: Gets the ACPI root pointer (RSDP)
+ *
+ *****************************************************************************/
+
+ACPI_PHYSICAL_ADDRESS
+AcpiOsGetRootPointer (
+    void)
+{
+    ACPI_PHYSICAL_ADDRESS   Address;
+    EFI_GUID                Guid10 = ACPI_TABLE_GUID;
+    EFI_GUID                Guid20 = ACPI_20_TABLE_GUID;
+
+
+    Address = AcpiEfiGetRsdpViaGuid (&Guid20);
+    if (!Address)
+    {
+        Address = AcpiEfiGetRsdpViaGuid (&Guid10);
+    }
+
+    return (Address);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsMapMemory
+ *
+ * PARAMETERS:  where               - Physical address of memory to be mapped
+ *              length              - How much memory to map
+ *
+ * RETURN:      Pointer to mapped memory. Null on error.
+ *
+ * DESCRIPTION: Map physical memory into caller's address space
+ *
+ *****************************************************************************/
+
+void *
+AcpiOsMapMemory (
+    ACPI_PHYSICAL_ADDRESS   where,
+    ACPI_SIZE               length)
+{
+    UINTN                   i;
+    EFI_MEMORY_DESCRIPTOR   *p;
+    UINT64                  Size;
+    EFI_PHYSICAL_ADDRESS    End;
+
+
+    for (i = 0, p = AcpiGbl_EfiMemoryMap.Descriptor;
+         i < AcpiGbl_EfiMemoryMap.EntryCount;
+         i++, p = ACPI_ADD_PTR (EFI_MEMORY_DESCRIPTOR, p, AcpiGbl_EfiMemoryMap.EntrySize))
+    {
+        Size = p->NumberOfPages << EFI_PAGE_SHIFT;
+        End = p->PhysicalStart + Size;
+
+        if (!(p->Attribute & EFI_MEMORY_RUNTIME) || !p->VirtualStart)
+        {
+            continue;
+        }
+
+        if (where >= p->PhysicalStart && where < End)
+        {
+            where += p->VirtualStart - p->PhysicalStart;
+            break;
+        }
+    }
+
+    /* Default to use the physical address */
+
+    return (ACPI_TO_POINTER ((ACPI_SIZE) where));
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsUnmapMemory
+ *
+ * PARAMETERS:  where               - Logical address of memory to be unmapped
+ *              length              - How much memory to unmap
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Delete a previously created mapping. Where and Length must
+ *              correspond to a previous mapping exactly.
+ *
+ *****************************************************************************/
+
+void
+AcpiOsUnmapMemory (
+    void                    *where,
+    ACPI_SIZE               length)
+{
+
+    return;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    Spinlock interfaces
+ *
+ * DESCRIPTION: No-op on single threaded BIOS
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsCreateLock (
+    ACPI_SPINLOCK           *OutHandle)
+{
+    return (AE_OK);
+}
+
+void
+AcpiOsDeleteLock (
+    ACPI_SPINLOCK           Handle)
+{
+}
+
+ACPI_CPU_FLAGS
+AcpiOsAcquireLock (
+    ACPI_SPINLOCK           Handle)
+{
+    return (0);
+}
+
+void
+AcpiOsReleaseLock (
+    ACPI_SPINLOCK           Handle,
+    ACPI_CPU_FLAGS          Flags)
+{
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsAllocate
+ *
+ * PARAMETERS:  Size                - Amount to allocate, in bytes
+ *
+ * RETURN:      Pointer to the new allocation. Null on error.
+ *
+ * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS.
+ *
+ *****************************************************************************/
+
+void *
+AcpiOsAllocate (
+    ACPI_SIZE               Size)
+{
+    EFI_STATUS              EfiStatus;
+    void                    *Mem;
+
+
+    EfiStatus = uefi_call_wrapper (BS->AllocatePool, 3,
+        EfiLoaderData, Size, &Mem);
+    if (EFI_ERROR (EfiStatus))
+    {
+        AcpiLogError ("EFI_BOOT_SERVICES->AllocatePool(EfiLoaderData) failure.\n");
+        return (NULL);
+    }
+
+    return (Mem);
+}
+
+
+#ifdef USE_NATIVE_ALLOCATE_ZEROED
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsAllocateZeroed
+ *
+ * PARAMETERS:  Size                - Amount to allocate, in bytes
+ *
+ * RETURN:      Pointer to the new allocation. Null on error.
+ *
+ * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS.
+ *
+ *****************************************************************************/
+
+void *
+AcpiOsAllocateZeroed (
+    ACPI_SIZE               Size)
+{
+    void                    *Mem;
+
+
+    Mem = AcpiOsAllocate (Size);
+    if (Mem)
+    {
+        ACPI_MEMSET (Mem, 0, Size);
+    }
+
+    return (Mem);
+}
+#endif
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsFree
+ *
+ * PARAMETERS:  Mem                 - Pointer to previously allocated memory
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Free memory allocated via AcpiOsAllocate
+ *
+ *****************************************************************************/
+
+void
+AcpiOsFree (
+    void                    *Mem)
+{
+
+    uefi_call_wrapper (BS->FreePool, 1, Mem);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsOpenFile
+ *
+ * PARAMETERS:  Path                - File path
+ *              Modes               - File operation type
+ *
+ * RETURN:      File descriptor
+ *
+ * DESCRIPTION: Open a file for reading (ACPI_FILE_READING) or/and writing
+ *              (ACPI_FILE_WRITING).
+ *
+ ******************************************************************************/
+
+ACPI_FILE
+AcpiOsOpenFile (
+    const char              *Path,
+    UINT8                   Modes)
+{
+    EFI_STATUS              EfiStatus = EFI_SUCCESS;
+    UINT64                  OpenModes;
+    EFI_FILE_HANDLE         EfiFile = NULL;
+    CHAR16                  *Path16 = NULL;
+    CHAR16                  *Pos16;
+    const char              *Pos;
+    INTN                    Count, i;
+
+
+    if (!Path)
+    {
+        return (NULL);
+    }
+
+    /* Convert modes */
+
+    OpenModes = EFI_FILE_MODE_READ;
+    if (Modes & ACPI_FILE_WRITING)
+    {
+        OpenModes |= (EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE);
+    }
+
+    /* Allocate path buffer */
+
+    Count = ACPI_STRLEN (Path);
+    Path16 = ACPI_ALLOCATE_ZEROED ((Count + 1) * sizeof (CHAR16));
+    if (!Path16)
+    {
+        EfiStatus = EFI_BAD_BUFFER_SIZE;
+        goto ErrorExit;
+    }
+    Pos = Path;
+    Pos16 = Path16;
+    while (*Pos == '/' || *Pos == '\\')
+    {
+        Pos++;
+        Count--;
+    }
+    for (i = 0; i < Count; i++)
+    {
+        if (*Pos == '/')
+        {
+            *Pos16++ = '\\';
+            Pos++;
+        }
+        else
+        {
+            *Pos16++ = *Pos++;
+        }
+    }
+    *Pos16 = '\0';
+
+    EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Open, 5,
+        AcpiGbl_EfiCurrentVolume, &EfiFile, Path16, OpenModes, 0);
+    if (EFI_ERROR (EfiStatus))
+    {
+        AcpiLogError ("EFI_FILE_HANDLE->Open() failure.\n");
+        goto ErrorExit;
+    }
+
+ErrorExit:
+
+    if (Path16)
+    {
+        ACPI_FREE (Path16);
+    }
+
+    return ((ACPI_FILE) EfiFile);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsCloseFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *
+ * RETURN:      None.
+ *
+ * DESCRIPTION: Close a file.
+ *
+ ******************************************************************************/
+
+void
+AcpiOsCloseFile (
+    ACPI_FILE               File)
+{
+    EFI_FILE_HANDLE         EfiFile;
+
+
+    if (File == ACPI_FILE_OUT ||
+        File == ACPI_FILE_ERR)
+    {
+        return;
+    }
+    EfiFile = (EFI_FILE_HANDLE) File;
+    (void) uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Close, 1, EfiFile);
+
+    return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsReadFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Buffer              - Data buffer
+ *              Size                - Data block size
+ *              Count               - Number of data blocks
+ *
+ * RETURN:      Size of successfully read buffer
+ *
+ * DESCRIPTION: Read from a file.
+ *
+ ******************************************************************************/
+
+int
+AcpiOsReadFile (
+    ACPI_FILE               File,
+    void                    *Buffer,
+    ACPI_SIZE               Size,
+    ACPI_SIZE               Count)
+{
+    int                     Length = -1;
+    EFI_FILE_HANDLE         EfiFile;
+    UINTN                   ReadSize;
+    EFI_STATUS              EfiStatus;
+
+
+    if (File == ACPI_FILE_OUT ||
+        File == ACPI_FILE_ERR)
+    {
+    }
+    else
+    {
+        EfiFile = (EFI_FILE_HANDLE) File;
+        if (!EfiFile)
+        {
+            goto ErrorExit;
+        }
+        ReadSize = Size * Count;
+
+        EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Read, 3,
+            EfiFile, &ReadSize, Buffer);
+        if (EFI_ERROR (EfiStatus))
+        {
+            AcpiLogError ("EFI_FILE_HANDLE->Read() failure.\n");
+            goto ErrorExit;
+        }
+        Length = ReadSize;
+    }
+
+ErrorExit:
+
+    return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiFlushFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Begin               - String with boundary
+ *              End                 - Boundary of the string
+ *              Pos                 - Current position
+ *              FlushAll            - Whether checking boundary before flushing
+ *
+ * RETURN:      Updated position
+ *
+ * DESCRIPTION: Flush cached buffer to the file.
+ *
+ ******************************************************************************/
+
+static CHAR16 *
+AcpiEfiFlushFile (
+    ACPI_FILE               File,
+    CHAR16                  *Begin,
+    CHAR16                  *End,
+    CHAR16                  *Pos,
+    BOOLEAN                 FlushAll)
+{
+
+    if (FlushAll || Pos >= (End - 1))
+    {
+        *Pos = 0;
+        uefi_call_wrapper (File->OutputString, 2, File, Begin);
+        Pos = Begin;
+    }
+
+    return (Pos);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsWriteFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Buffer              - Data buffer
+ *              Size                - Data block size
+ *              Count               - Number of data blocks
+ *
+ * RETURN:      Size of successfully written buffer
+ *
+ * DESCRIPTION: Write to a file.
+ *
+ ******************************************************************************/
+
+int
+AcpiOsWriteFile (
+    ACPI_FILE               File,
+    void                    *Buffer,
+    ACPI_SIZE               Size,
+    ACPI_SIZE               Count)
+{
+    int                     Length = -1;
+    CHAR16                  String[ACPI_EFI_PRINT_LENGTH];
+    const char              *Ascii;
+    CHAR16                  *End;
+    CHAR16                  *Pos;
+    int                     i, j;
+    EFI_FILE_HANDLE         EfiFile;
+    UINTN                   WriteSize;
+    EFI_STATUS              EfiStatus;
+
+
+    if (File == ACPI_FILE_OUT ||
+        File == ACPI_FILE_ERR)
+    {
+        Pos = String;
+        End = String + ACPI_EFI_PRINT_LENGTH - 1;
+        Ascii = ACPI_CAST_PTR (const char, Buffer);
+        Length = 0;
+
+        for (j = 0; j < Count; j++)
+        {
+            for (i = 0; i < Size; i++)
+            {
+                if (*Ascii == '\n')
+                {
+                    *Pos++ = '\r';
+                    Pos = AcpiEfiFlushFile (File, String,
+                            End, Pos, FALSE);
+                }
+                *Pos++ = *Ascii++;
+                Length++;
+                Pos = AcpiEfiFlushFile (File, String,
+                        End, Pos, FALSE);
+            }
+        }
+        Pos = AcpiEfiFlushFile (File, String, End, Pos, TRUE);
+    }
+    else
+    {
+        EfiFile = (EFI_FILE_HANDLE) File;
+        if (!EfiFile)
+        {
+            goto ErrorExit;
+        }
+        WriteSize = Size * Count;
+
+        EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Write, 3,
+            EfiFile, &WriteSize, Buffer);
+        if (EFI_ERROR (EfiStatus))
+        {
+            AcpiLogError ("EFI_FILE_HANDLE->Write() failure.\n");
+            goto ErrorExit;
+        }
+        Length = WriteSize;
+    }
+
+ErrorExit:
+
+    return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsGetFileOffset
+ *
+ * PARAMETERS:  File                - File descriptor
+ *
+ * RETURN:      Size of current position
+ *
+ * DESCRIPTION: Get current file offset.
+ *
+ ******************************************************************************/
+
+long
+AcpiOsGetFileOffset (
+    ACPI_FILE               File)
+{
+    long                    Offset = -1;
+
+
+    return (Offset);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsSetFileOffset
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Offset              - File offset
+ *              From                - From begin/end of file
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Set current file offset.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiOsSetFileOffset (
+    ACPI_FILE               File,
+    long                    Offset,
+    UINT8                   From)
+{
+
+    return (AE_SUPPORT);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsPrintf
+ *
+ * PARAMETERS:  Format, ...         - Standard printf format
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Formatted output.
+ *
+ *****************************************************************************/
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiOsPrintf (
+    const char              *Format,
+    ...)
+{
+    va_list                 Args;
+
+
+    va_start (Args, Format);
+    AcpiOsVprintf (Format, Args);
+    va_end (Args);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsVprintf
+ *
+ * PARAMETERS:  Format              - Standard printf format
+ *              Args                - Argument list
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Formatted output with arguments list pointer.
+ *
+ *****************************************************************************/
+
+void
+AcpiOsVprintf (
+    const char              *Format,
+    va_list                 Args)
+{
+
+    (void) AcpiUtFileVprintf (ACPI_FILE_OUT, Format, Args);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsInitialize
+ *
+ * PARAMETERS:  None
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Initialize this module.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsInitialize (
+    void)
+{
+
+    return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiArgify
+ *
+ * PARAMETERS:  String              - Pointer to command line argument strings
+ *                                    which are seperated with spaces
+ *              ArgcPtr             - Return number of the arguments
+ *              ArgvPtr             - Return vector of the arguments
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Convert EFI arguments into C arguments.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+AcpiEfiArgify (
+    char                    *String,
+    int                     *ArgcPtr,
+    char                    ***ArgvPtr)
+{
+    char                    *CopyBuffer;
+    int                     MaxArgc = *ArgcPtr;
+    int                     Argc = 0;
+    char                    **Argv = *ArgvPtr;
+    char                    *Arg;
+    BOOLEAN                 IsSingleQuote = FALSE;
+    BOOLEAN                 IsDoubleQuote = FALSE;
+    BOOLEAN                 IsEscape = FALSE;
+
+
+    if (String == NULL)
+    {
+        return (AE_BAD_PARAMETER);
+    }
+
+    CopyBuffer = String;
+
+    while (*String != '\0')
+    {
+        while (ACPI_IS_SPACE (*String))
+        {
+            *String++ = '\0';
+        }
+        Arg = CopyBuffer;
+        while (*String != '\0')
+        {
+            if (ACPI_IS_SPACE (*String) &&
+                !IsSingleQuote && !IsDoubleQuote && !IsEscape)
+            {
+                *Arg++ = '\0';
+                String++;
+                break;
+            }
+            if (IsEscape)
+            {
+                IsEscape = FALSE;
+                *Arg++ = *String;
+            }
+            else if (*String == '\\')
+            {
+                IsEscape = TRUE;
+            }
+            else if (IsSingleQuote)
+            {
+                if (*String == '\'')
+                {
+                    IsSingleQuote = FALSE;
+                    *Arg++ = '\0';
+                }
+                else
+                {
+                    *Arg++ = *String;
+                }
+            }
+            else if (IsDoubleQuote)
+            {
+                if (*String == '"')
+                {
+                    IsDoubleQuote = FALSE;
+                    *Arg = '\0';
+                }
+                else
+                {
+                    *Arg++ = *String;
+                }
+            }
+            else
+            {
+                if (*String == '\'')
+                {
+                    IsSingleQuote = TRUE;
+                }
+                else if (*String == '"')
+                {
+                    IsDoubleQuote = TRUE;
+                }
+                else
+                {
+                    *Arg++ = *String;
+                }
+            }
+            String++;
+        }
+        if (Argv && Argc < MaxArgc)
+        {
+            Argv[Argc] = CopyBuffer;
+        }
+        Argc++;
+        CopyBuffer = Arg;
+    }
+    if (Argv && Argc < MaxArgc)
+    {
+        Argv[Argc] = NULL;
+    }
+
+    *ArgcPtr = Argc;
+    *ArgvPtr = Argv;
+
+    return ((MaxArgc < Argc) ? AE_NO_MEMORY : AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiEfiConvertArgcv
+ *
+ * PARAMETERS:  LoadOptions         - Pointer to the EFI options buffer, which
+ *                                    is NULL terminated
+ *              LoadOptionsSize     - Size of the EFI options buffer
+ *              ArgcPtr             - Return number of the arguments
+ *              ArgvPtr             - Return vector of the arguments
+ *              BufferPtr           - Buffer to contain the argument strings
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Convert EFI arguments into C arguments.
+ *
+ *****************************************************************************/
+
+static ACPI_STATUS
+AcpiEfiConvertArgcv (
+    CHAR16                  *LoadOptions,
+    UINT32                  LoadOptionsSize,
+    int                     *ArgcPtr,
+    char                    ***ArgvPtr,
+    char                    **BufferPtr)
+{
+    ACPI_STATUS             Status = AE_OK;
+    UINT32                  Count = LoadOptionsSize / sizeof (CHAR16);
+    UINT32                  i;
+    CHAR16                  *From;
+    char                    *To;
+    int                     Argc = 0;
+    char                    **Argv = NULL;
+    char                    *Buffer;
+
+
+    /* Prepare a buffer to contain the argument strings */
+
+    Buffer = ACPI_ALLOCATE_ZEROED (Count);
+    if (!Buffer)
+    {
+        Status = AE_NO_MEMORY;
+        goto ErrorExit;
+    }
+
+TryAgain:
+
+    /* Extend the argument vector */
+
+    if (Argv)
+    {
+        ACPI_FREE (Argv);
+        Argv = NULL;
+    }
+    if (Argc > 0)
+    {
+        Argv = ACPI_ALLOCATE_ZEROED (sizeof (char *) * (Argc + 1));
+        if (!Argv)
+        {
+            Status = AE_NO_MEMORY;
+            goto ErrorExit;
+        }
+    }
+
+    /*
+     * Note: As AcpiEfiArgify() will modify the content of the buffer, so
+     *       we need to restore it each time before invoking
+     *       AcpiEfiArgify().
+     */
+    From = LoadOptions;
+    To = ACPI_CAST_PTR (char, Buffer);
+    for (i = 0; i < Count; i++)
+    {
+        *To++ = (char) *From++;
+    }
+
+    /*
+     * The "Buffer" will contain NULL terminated strings after invoking
+     * AcpiEfiArgify(). The number of the strings are saved in Argc and the
+     * pointers of the strings are saved in Argv.
+     */
+    Status = AcpiEfiArgify (Buffer, &Argc, &Argv);
+    if (ACPI_FAILURE (Status))
+    {
+        if (Status == AE_NO_MEMORY)
+        {
+            goto TryAgain;
+        }
+    }
+
+ErrorExit:
+
+    if (ACPI_FAILURE (Status))
+    {
+        ACPI_FREE (Buffer);
+        ACPI_FREE (Argv);
+    }
+    else
+    {
+        *ArgcPtr = Argc;
+        *ArgvPtr = Argv;
+        *BufferPtr = Buffer;
+    }
+    return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION:    efi_main
+ *
+ * PARAMETERS:  Image               - EFI image handle
+ *              SystemTab           - EFI system table
+ *
+ * RETURN:      EFI Status
+ *
+ * DESCRIPTION: Entry point of EFI executable
+ *
+ *****************************************************************************/
+
+EFI_STATUS
+efi_main (
+    EFI_HANDLE              Image,
+    EFI_SYSTEM_TABLE        *SystemTab)
+{
+    EFI_LOADED_IMAGE        *Info;
+    EFI_STATUS              EfiStatus = EFI_SUCCESS;
+    ACPI_STATUS             Status;
+    int                     argc;
+    char                    **argv = NULL;
+    char                    *OptBuffer = NULL;
+    EFI_FILE_IO_INTERFACE   *Volume = NULL;
+
+
+    /* Initialize EFI library */
+
+    InitializeLib (Image, SystemTab);
+
+    /* Retrieve image information */
+
+    EfiStatus = uefi_call_wrapper (BS->HandleProtocol, 3,
+        Image, &LoadedImageProtocol, ACPI_CAST_PTR (VOID, &Info));
+    if (EFI_ERROR (EfiStatus))
+    {
+        AcpiLogError ("EFI_BOOT_SERVICES->HandleProtocol(LoadedImageProtocol) failure.\n");
+        return (EfiStatus);
+    }
+    AcpiGbl_EfiPoolAllocation = Info->ImageDataType;
+    EfiStatus = uefi_call_wrapper (BS->HandleProtocol, 3,
+        Info->DeviceHandle, &FileSystemProtocol, (void **) &Volume);
+    if (EFI_ERROR (EfiStatus))
+    {
+        AcpiLogError ("EFI_BOOT_SERVICES->HandleProtocol(FileSystemProtocol) failure.\n");
+        return (EfiStatus);
+    }
+    EfiStatus = uefi_call_wrapper (Volume->OpenVolume, 2,
+        Volume, &AcpiGbl_EfiCurrentVolume);
+    if (EFI_ERROR (EfiStatus))
+    {
+        AcpiLogError ("EFI_FILE_IO_INTERFACE->OpenVolume() failure.\n");
+        return (EfiStatus);
+    }
+    Status = AcpiEfiInitializeMemoryMap ();
+    if (ACPI_FAILURE (Status))
+    {
+        EfiStatus = EFI_DEVICE_ERROR;
+        goto ErrorAlloc;
+    }
+
+    Status = AcpiEfiConvertArgcv (Info->LoadOptions,
+        Info->LoadOptionsSize, &argc, &argv, &OptBuffer);
+    if (ACPI_FAILURE (Status))
+    {
+        EfiStatus = EFI_DEVICE_ERROR;
+        goto ErrorAlloc;
+    }
+
+    acpi_main (argc, argv);
+
+ErrorAlloc:
+
+    if (argv)
+    {
+        ACPI_FREE (argv);
+    }
+    if (OptBuffer)
+    {
+        ACPI_FREE (OptBuffer);
+    }
+    AcpiEfiTerminateMemoryMap ();
+
+    return (EfiStatus);
+}
diff --git a/sys/contrib/dev/acpica/source/os_specific/service_layers/oslibcfs.c b/sys/contrib/dev/acpica/source/os_specific/service_layers/oslibcfs.c
new file mode 100644
index 0000000..3bb55bb
--- /dev/null
+++ b/sys/contrib/dev/acpica/source/os_specific/service_layers/oslibcfs.c
@@ -0,0 +1,251 @@
+/******************************************************************************
+ *
+ * Module Name: oslibcfs - C library OSL for file IO
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2014, 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 <stdio.h>
+#include <stdarg.h>
+
+#define _COMPONENT          ACPI_OS_SERVICES
+        ACPI_MODULE_NAME    ("oslibcfs")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsOpenFile
+ *
+ * PARAMETERS:  Path                - File path
+ *              Modes               - File operation type
+ *
+ * RETURN:      File descriptor.
+ *
+ * DESCRIPTION: Open a file for reading (ACPI_FILE_READING) or/and writing
+ *              (ACPI_FILE_WRITING).
+ *
+ ******************************************************************************/
+
+ACPI_FILE
+AcpiOsOpenFile (
+    const char              *Path,
+    UINT8                   Modes)
+{
+    ACPI_FILE               File;
+    char                    ModesStr[4];
+    UINT32                  i = 0;
+
+    if (Modes & ACPI_FILE_READING)
+    {
+        ModesStr[i++] = 'r';
+    }
+    if (Modes & ACPI_FILE_WRITING)
+    {
+        ModesStr[i++] = 'w';
+    }
+    if (Modes & ACPI_FILE_BINARY)
+    {
+        ModesStr[i++] = 'b';
+    }
+    ModesStr[i++] = '\0';
+
+    File = fopen (Path, ModesStr);
+    if (!File)
+    {
+        perror ("Could not open file");
+    }
+
+    return (File);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsCloseFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *
+ * RETURN:      None.
+ *
+ * DESCRIPTION: Close a file.
+ *
+ ******************************************************************************/
+
+void
+AcpiOsCloseFile (
+    ACPI_FILE               File)
+{
+    fclose (File);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsReadFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Buffer              - Data buffer
+ *              Size                - Data block size
+ *              Count               - Number of data blocks
+ *
+ * RETURN:      Size of successfully read buffer.
+ *
+ * DESCRIPTION: Read a file.
+ *
+ ******************************************************************************/
+
+int
+AcpiOsReadFile (
+    ACPI_FILE               File,
+    void                    *Buffer,
+    ACPI_SIZE               Size,
+    ACPI_SIZE               Count)
+{
+    int                     Length;
+
+    Length = fread (Buffer, Size, Count, File);
+    if (Length < 0)
+    {
+        perror ("Error reading file");
+    }
+
+    return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsWriteFile
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Buffer              - Data buffer
+ *              Size                - Data block size
+ *              Count               - Number of data blocks
+ *
+ * RETURN:      Size of successfully written buffer.
+ *
+ * DESCRIPTION: Write a file.
+ *
+ ******************************************************************************/
+
+int
+AcpiOsWriteFile (
+    ACPI_FILE               File,
+    void                    *Buffer,
+    ACPI_SIZE               Size,
+    ACPI_SIZE               Count)
+{
+    int                     Length;
+
+    Length = fwrite (Buffer, Size, Count, File);
+    if (Length < 0)
+    {
+        perror ("Error writing file");
+    }
+
+    return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsGetFileOffset
+ *
+ * PARAMETERS:  File                - File descriptor
+ *
+ * RETURN:      Size of current position.
+ *
+ * DESCRIPTION: Get current file offset.
+ *
+ ******************************************************************************/
+
+long
+AcpiOsGetFileOffset (
+    ACPI_FILE               File)
+{
+    long                    Offset;
+
+    Offset = ftell (File);
+
+    return (Offset);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    AcpiOsSetFileOffset
+ *
+ * PARAMETERS:  File                - File descriptor
+ *              Offset              - File offset
+ *              From                - From begin/end of file
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Set current file offset.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiOsSetFileOffset (
+    ACPI_FILE               File,
+    long                    Offset,
+    UINT8                   From)
+{
+    int                     Ret = 0;
+
+
+    if (From == ACPI_FILE_BEGIN)
+    {
+        Ret = fseek (File, Offset, SEEK_SET);
+    }
+    if (From == ACPI_FILE_END)
+    {
+        Ret = fseek (File, Offset, SEEK_END);
+    }
+
+    if (Ret < 0)
+    {
+        return (AE_ERROR);
+    }
+    else
+    {
+        return (AE_OK);
+    }
+}
diff --git a/sys/contrib/dev/acpica/source/os_specific/service_layers/oslinuxtbl.c b/sys/contrib/dev/acpica/source/os_specific/service_layers/oslinuxtbl.c
index aee929e..aae9332 100644
--- a/sys/contrib/dev/acpica/source/os_specific/service_layers/oslinuxtbl.c
+++ b/sys/contrib/dev/acpica/source/os_specific/service_layers/oslinuxtbl.c
@@ -98,6 +98,11 @@ OslUnmapTable (
     ACPI_TABLE_HEADER       *Table);
 
 static ACPI_PHYSICAL_ADDRESS
+OslFindRsdpViaEfiByKeyword (
+    FILE                    *File,
+    const char              *Keyword);
+
+static ACPI_PHYSICAL_ADDRESS
 OslFindRsdpViaEfi (
     void);
 
@@ -490,6 +495,44 @@ AcpiOsGetTableByIndex (
 
 /******************************************************************************
  *
+ * FUNCTION:    OslFindRsdpViaEfiByKeyword
+ *
+ * PARAMETERS:  Keyword         - Character string indicating ACPI GUID version
+ *                                in the EFI table
+ *
+ * RETURN:      RSDP address if found
+ *
+ * DESCRIPTION: Find RSDP address via EFI using keyword indicating the ACPI
+ *              GUID version.
+ *
+ *****************************************************************************/
+
+static ACPI_PHYSICAL_ADDRESS
+OslFindRsdpViaEfiByKeyword (
+    FILE                    *File,
+    const char              *Keyword)
+{
+    char                    Buffer[80];
+    unsigned long long      Address = 0;
+    char                    Format[32];
+
+
+    snprintf (Format, 32, "%s=%s", Keyword, "%llx");
+    fseek (File, 0, SEEK_SET);
+    while (fgets (Buffer, 80, File))
+    {
+        if (sscanf (Buffer, Format, &Address) == 1)
+        {
+            break;
+        }
+    }
+
+    return ((ACPI_PHYSICAL_ADDRESS) (Address));
+}
+
+
+/******************************************************************************
+ *
  * FUNCTION:    OslFindRsdpViaEfi
  *
  * PARAMETERS:  None
@@ -505,24 +548,21 @@ OslFindRsdpViaEfi (
     void)
 {
     FILE                    *File;
-    char                    Buffer[80];
-    unsigned long           Address = 0;
+    ACPI_PHYSICAL_ADDRESS   Address = 0;
 
 
     File = fopen (EFI_SYSTAB, "r");
     if (File)
     {
-        while (fgets (Buffer, 80, File))
+        Address = OslFindRsdpViaEfiByKeyword (File, "ACPI20");
+        if (!Address)
         {
-            if (sscanf (Buffer, "ACPI20=0x%lx", &Address) == 1)
-            {
-                break;
-            }
+            Address = OslFindRsdpViaEfiByKeyword (File, "ACPI");
         }
         fclose (File);
     }
 
-    return ((ACPI_PHYSICAL_ADDRESS) (Address));
+    return (Address);
 }
 
 
@@ -907,6 +947,11 @@ OslGetBiosTable (
         ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) ||
         ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS))
     {
+        if (Instance > 0)
+        {
+            return (AE_LIMIT);
+        }
+
         /*
          * Get the appropriate address, either 32-bit or 64-bit. Be very
          * careful about the FADT length and validate table addresses.
diff --git a/sys/contrib/dev/acpica/source/os_specific/service_layers/osunixxf.c b/sys/contrib/dev/acpica/source/os_specific/service_layers/osunixxf.c
index dd151ee..eb088b9 100644
--- a/sys/contrib/dev/acpica/source/os_specific/service_layers/osunixxf.c
+++ b/sys/contrib/dev/acpica/source/os_specific/service_layers/osunixxf.c
@@ -65,16 +65,11 @@
         ACPI_MODULE_NAME    ("osunixxf")
 
 
-FILE                           *AcpiGbl_OutputFile;
 BOOLEAN                        AcpiGbl_DebugTimeout = FALSE;
 
 
 /* Upcalls to AcpiExec */
 
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void);
-
 void
 AeTableOverride (
     ACPI_TABLE_HEADER       *ExistingTable,
@@ -214,10 +209,19 @@ ACPI_STATUS
 AcpiOsInitialize (
     void)
 {
+    ACPI_STATUS            Status;
+
 
     AcpiGbl_OutputFile = stdout;
 
     OsEnterLineEditMode ();
+
+    Status = AcpiOsCreateLock (&AcpiGbl_PrintLock);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
     return (AE_OK);
 }
 
@@ -231,6 +235,7 @@ AcpiOsTerminate (
 }
 
 
+#ifndef ACPI_USE_NATIVE_RSDP_POINTER
 /******************************************************************************
  *
  * FUNCTION:    AcpiOsGetRootPointer
@@ -248,8 +253,9 @@ AcpiOsGetRootPointer (
     void)
 {
 
-    return (AeLocalGetRootPointer ());
+    return (0);
 }
+#endif
 
 
 /******************************************************************************
@@ -548,6 +554,7 @@ AcpiOsGetLine (
 #endif
 
 
+#ifndef ACPI_USE_NATIVE_MEMORY_MAPPING
 /******************************************************************************
  *
  * FUNCTION:    AcpiOsMapMemory
@@ -593,6 +600,7 @@ AcpiOsUnmapMemory (
 
     return;
 }
+#endif
 
 
 /******************************************************************************
@@ -619,6 +627,32 @@ AcpiOsAllocate (
 }
 
 
+#ifdef USE_NATIVE_ALLOCATE_ZEROED
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsAllocateZeroed
+ *
+ * PARAMETERS:  Size                - Amount to allocate, in bytes
+ *
+ * RETURN:      Pointer to the new allocation. Null on error.
+ *
+ * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS.
+ *
+ *****************************************************************************/
+
+void *
+AcpiOsAllocateZeroed (
+    ACPI_SIZE               size)
+{
+    void                    *Mem;
+
+
+    Mem = (void *) calloc (1, (size_t) size);
+    return (Mem);
+}
+#endif
+
+
 /******************************************************************************
  *
  * FUNCTION:    AcpiOsFree
@@ -1454,6 +1488,26 @@ AcpiOsExecute (
     return (0);
 }
 
+#else /* ACPI_SINGLE_THREADED */
+ACPI_THREAD_ID
+AcpiOsGetThreadId (
+    void)
+{
+    return (1);
+}
+
+ACPI_STATUS
+AcpiOsExecute (
+    ACPI_EXECUTE_TYPE       Type,
+    ACPI_OSD_EXEC_CALLBACK  Function,
+    void                    *Context)
+{
+
+    Function (Context);
+
+    return (AE_OK);
+}
+
 #endif /* ACPI_SINGLE_THREADED */
 
 
diff --git a/sys/contrib/dev/acpica/source/os_specific/service_layers/oswinxf.c b/sys/contrib/dev/acpica/source/os_specific/service_layers/oswinxf.c
index 667a9f9..140bfdb 100644
--- a/sys/contrib/dev/acpica/source/os_specific/service_layers/oswinxf.c
+++ b/sys/contrib/dev/acpica/source/os_specific/service_layers/oswinxf.c
@@ -64,7 +64,6 @@
         ACPI_MODULE_NAME    ("oswinxf")
 
 
-FILE                        *AcpiGbl_OutputFile;
 UINT64                      TimerFrequency;
 char                        TableName[ACPI_NAME_SIZE + 1];
 
@@ -73,10 +72,6 @@ char                        TableName[ACPI_NAME_SIZE + 1];
 
 /* Upcalls to AcpiExec application */
 
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void);
-
 void
 AeTableOverride (
     ACPI_TABLE_HEADER       *ExistingTable,
@@ -143,6 +138,7 @@ ACPI_STATUS
 AcpiOsInitialize (
     void)
 {
+    ACPI_STATUS             Status;
     LARGE_INTEGER           LocalTimerFrequency;
 
 
@@ -164,10 +160,17 @@ AcpiOsInitialize (
         TimerFrequency = LocalTimerFrequency.QuadPart;
     }
 
+    Status = AcpiOsCreateLock (&AcpiGbl_PrintLock);
+    if (ACPI_FAILURE (Status))
+    {
+        return (Status);
+    }
+
     return (AE_OK);
 }
 
 
+#ifndef ACPI_USE_NATIVE_RSDP_POINTER
 /******************************************************************************
  *
  * FUNCTION:    AcpiOsGetRootPointer
@@ -185,8 +188,9 @@ AcpiOsGetRootPointer (
     void)
 {
 
-    return (AeLocalGetRootPointer ());
+    return (0);
 }
+#endif
 
 
 /******************************************************************************
@@ -554,6 +558,7 @@ AcpiOsGetLine (
 }
 
 
+#ifndef ACPI_USE_NATIVE_MEMORY_MAPPING
 /******************************************************************************
  *
  * FUNCTION:    AcpiOsMapMemory
@@ -599,6 +604,7 @@ AcpiOsUnmapMemory (
 
     return;
 }
+#endif
 
 
 /******************************************************************************
@@ -626,6 +632,33 @@ AcpiOsAllocate (
 }
 
 
+#ifdef USE_NATIVE_ALLOCATE_ZEROED
+/******************************************************************************
+ *
+ * FUNCTION:    AcpiOsAllocateZeroed
+ *
+ * PARAMETERS:  Size                - Amount to allocate, in bytes
+ *
+ * RETURN:      Pointer to the new allocation. Null on error.
+ *
+ * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS.
+ *
+ *****************************************************************************/
+
+void *
+AcpiOsAllocateZeroed (
+    ACPI_SIZE               Size)
+{
+    void                    *Mem;
+
+
+    Mem = (void *) calloc (1, (size_t) Size);
+
+    return (Mem);
+}
+#endif
+
+
 /******************************************************************************
  *
  * FUNCTION:    AcpiOsFree
@@ -1486,6 +1519,26 @@ AcpiOsExecute (
     return (0);
 }
 
+#else /* ACPI_SINGLE_THREADED */
+ACPI_THREAD_ID
+AcpiOsGetThreadId (
+    void)
+{
+    return (1);
+}
+
+ACPI_STATUS
+AcpiOsExecute (
+    ACPI_EXECUTE_TYPE       Type,
+    ACPI_OSD_EXEC_CALLBACK  Function,
+    void                    *Context)
+{
+
+    Function (Context);
+
+    return (AE_OK);
+}
+
 #endif /* ACPI_SINGLE_THREADED */
 
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpibin/abcompare.c b/sys/contrib/dev/acpica/source/tools/acpibin/abcompare.c
index d843400..84eb3c2 100644
--- a/sys/contrib/dev/acpica/source/tools/acpibin/abcompare.c
+++ b/sys/contrib/dev/acpica/source/tools/acpibin/abcompare.c
@@ -77,10 +77,6 @@ AbPrintHeadersInfo (
     ACPI_TABLE_HEADER       *Header,
     ACPI_TABLE_HEADER       *Header2);
 
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void);
-
 
 /******************************************************************************
  *
@@ -628,26 +624,3 @@ Exit1:
  * DESCRIPTION: For linkage
  *
  ******************************************************************************/
-
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void)
-{
-    return (AE_OK);
-}
-
-ACPI_THREAD_ID
-AcpiOsGetThreadId (
-    void)
-{
-    return (0xFFFF);
-}
-
-ACPI_STATUS
-AcpiOsExecute (
-    ACPI_EXECUTE_TYPE       Type,
-    ACPI_OSD_EXEC_CALLBACK  Function,
-    void                    *Context)
-{
-    return (AE_SUPPORT);
-}
diff --git a/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c b/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c
index d8c740c..d6b1acd 100644
--- a/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpibin/abmain.c
@@ -119,7 +119,7 @@ main (
 
     /* Command line options */
 
-    while ((j = AcpiGetopt (argc, argv, AB_SUPPORTED_OPTIONS)) != EOF) switch(j)
+    while ((j = AcpiGetopt (argc, argv, AB_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch(j)
     {
     case 'c':   /* Compare Files */
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpidump/acpidump.h b/sys/contrib/dev/acpica/source/tools/acpidump/acpidump.h
index 1064eb4..f5c021a 100644
--- a/sys/contrib/dev/acpica/source/tools/acpidump/acpidump.h
+++ b/sys/contrib/dev/acpica/source/tools/acpidump/acpidump.h
@@ -48,7 +48,6 @@
 #ifdef _DECLARE_GLOBALS
 #define EXTERN
 #define INIT_GLOBAL(a,b)        a=b
-#define DEFINE_ACPI_GLOBALS     1
 #else
 #define EXTERN                  extern
 #define INIT_GLOBAL(a,b)        a
@@ -71,7 +70,7 @@ EXTERN BOOLEAN              INIT_GLOBAL (Gbl_VerboseMode, FALSE);
 EXTERN BOOLEAN              INIT_GLOBAL (Gbl_BinaryMode, FALSE);
 EXTERN BOOLEAN              INIT_GLOBAL (Gbl_DumpCustomizedTables, FALSE);
 EXTERN BOOLEAN              INIT_GLOBAL (Gbl_DoNotDumpXsdt, FALSE);
-EXTERN FILE                 INIT_GLOBAL (*Gbl_OutputFile, NULL);
+EXTERN ACPI_FILE            INIT_GLOBAL (Gbl_OutputFile, NULL);
 EXTERN char                 INIT_GLOBAL (*Gbl_OutputFilename, NULL);
 EXTERN UINT64               INIT_GLOBAL (Gbl_RsdpBase, 0);
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpidump/apdump.c b/sys/contrib/dev/acpica/source/tools/acpidump/apdump.c
index 0bd0294..ab5c32c 100644
--- a/sys/contrib/dev/acpica/source/tools/acpidump/apdump.c
+++ b/sys/contrib/dev/acpica/source/tools/acpidump/apdump.c
@@ -76,7 +76,7 @@ ApIsValidHeader (
 
         if (!AcpiUtValidAcpiName (Table->Signature))
         {
-            fprintf (stderr, "Table signature (0x%8.8X) is invalid\n",
+            AcpiLogError ("Table signature (0x%8.8X) is invalid\n",
                 *(UINT32 *) Table->Signature);
             return (FALSE);
         }
@@ -85,7 +85,7 @@ ApIsValidHeader (
 
         if (Table->Length < sizeof (ACPI_TABLE_HEADER))
         {
-            fprintf (stderr, "Table length (0x%8.8X) is invalid\n",
+            AcpiLogError ("Table length (0x%8.8X) is invalid\n",
                 Table->Length);
             return (FALSE);
         }
@@ -131,7 +131,7 @@ ApIsValidChecksum (
 
     if (ACPI_FAILURE (Status))
     {
-        fprintf (stderr, "%4.4s: Warning: wrong checksum in table\n",
+        AcpiLogError ("%4.4s: Warning: wrong checksum in table\n",
             Table->Signature);
     }
 
@@ -223,12 +223,13 @@ ApDumpTableBuffer (
      * 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));
+    AcpiUtFilePrintf (Gbl_OutputFile, "%4.4s @ 0x%8.8X%8.8X\n",
+        Table->Signature, ACPI_FORMAT_UINT64 (Address));
 
-    AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table), TableLength,
+    AcpiUtDumpBufferToFile (Gbl_OutputFile,
+        ACPI_CAST_PTR (UINT8, Table), TableLength,
         DB_BYTE_DISPLAY, 0);
-    printf ("\n");
+    AcpiUtFilePrintf (Gbl_OutputFile, "\n");
     return (0);
 }
 
@@ -273,20 +274,20 @@ ApDumpAllTables (
             }
             else if (i == 0)
             {
-                fprintf (stderr, "Could not get ACPI tables, %s\n",
+                AcpiLogError ("Could not get ACPI tables, %s\n",
                     AcpiFormatException (Status));
                 return (-1);
             }
             else
             {
-                fprintf (stderr, "Could not get ACPI table at index %u, %s\n",
+                AcpiLogError ("Could not get ACPI table at index %u, %s\n",
                     i, AcpiFormatException (Status));
                 continue;
             }
         }
 
         TableStatus = ApDumpTableBuffer (Table, Instance, Address);
-        free (Table);
+        ACPI_FREE (Table);
 
         if (TableStatus)
         {
@@ -328,7 +329,7 @@ ApDumpTableByAddress (
     Status = AcpiUtStrtoul64 (AsciiAddress, 0, &LongAddress);
     if (ACPI_FAILURE (Status))
     {
-        fprintf (stderr, "%s: Could not convert to a physical address\n",
+        AcpiLogError ("%s: Could not convert to a physical address\n",
             AsciiAddress);
         return (-1);
     }
@@ -337,14 +338,14 @@ ApDumpTableByAddress (
     Status = AcpiOsGetTableByAddress (Address, &Table);
     if (ACPI_FAILURE (Status))
     {
-        fprintf (stderr, "Could not get table at 0x%8.8X%8.8X, %s\n",
+        AcpiLogError ("Could not get table at 0x%8.8X%8.8X, %s\n",
             ACPI_FORMAT_UINT64 (Address),
             AcpiFormatException (Status));
         return (-1);
     }
 
     TableStatus = ApDumpTableBuffer (Table, 0, Address);
-    free (Table);
+    ACPI_FREE (Table);
     return (TableStatus);
 }
 
@@ -374,9 +375,9 @@ ApDumpTableByName (
     int                     TableStatus;
 
 
-    if (strlen (Signature) != ACPI_NAME_SIZE)
+    if (ACPI_STRLEN (Signature) != ACPI_NAME_SIZE)
     {
-        fprintf (stderr,
+        AcpiLogError (
             "Invalid table signature [%s]: must be exactly 4 characters\n",
             Signature);
         return (-1);
@@ -384,18 +385,18 @@ ApDumpTableByName (
 
     /* Table signatures are expected to be uppercase */
 
-    strcpy (LocalSignature, Signature);
+    ACPI_STRCPY (LocalSignature, Signature);
     AcpiUtStrupr (LocalSignature);
 
     /* To be friendly, handle tables whose signatures do not match the name */
 
     if (ACPI_COMPARE_NAME (LocalSignature, "FADT"))
     {
-        strcpy (LocalSignature, ACPI_SIG_FADT);
+        ACPI_STRCPY (LocalSignature, ACPI_SIG_FADT);
     }
     else if (ACPI_COMPARE_NAME (LocalSignature, "MADT"))
     {
-        strcpy (LocalSignature, ACPI_SIG_MADT);
+        ACPI_STRCPY (LocalSignature, ACPI_SIG_MADT);
     }
 
     /* Dump all instances of this signature (to handle multiple SSDTs) */
@@ -413,14 +414,14 @@ ApDumpTableByName (
                 return (0);
             }
 
-            fprintf (stderr,
+            AcpiLogError (
                 "Could not get ACPI table with signature [%s], %s\n",
                 LocalSignature, AcpiFormatException (Status));
             return (-1);
         }
 
         TableStatus = ApDumpTableBuffer (Table, Instance, Address);
-        free (Table);
+        ACPI_FREE (Table);
 
         if (TableStatus)
         {
@@ -467,7 +468,7 @@ ApDumpTableFromFile (
 
     if (Table->Length > FileSize)
     {
-        fprintf (stderr,
+        AcpiLogError (
             "Table length (0x%X) is too large for input file (0x%X) %s\n",
             Table->Length, FileSize, Pathname);
         goto Exit;
@@ -475,7 +476,7 @@ ApDumpTableFromFile (
 
     if (Gbl_VerboseMode)
     {
-        fprintf (stderr,
+        AcpiLogError (
             "Input file:  %s contains table [%4.4s], 0x%X (%u) bytes\n",
             Pathname, Table->Signature, FileSize, FileSize);
     }
@@ -483,35 +484,6 @@ ApDumpTableFromFile (
     TableStatus = ApDumpTableBuffer (Table, 0, 0);
 
 Exit:
-    free (Table);
+    ACPI_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/sys/contrib/dev/acpica/source/tools/acpidump/apfiles.c b/sys/contrib/dev/acpica/source/tools/acpidump/apfiles.c
index 1588f2e..6633ce9 100644
--- a/sys/contrib/dev/acpica/source/tools/acpidump/apfiles.c
+++ b/sys/contrib/dev/acpica/source/tools/acpidump/apfiles.c
@@ -45,6 +45,36 @@
 #include "acapps.h"
 
 
+/* Local prototypes */
+
+static int
+ApIsExistingFile (
+    char                    *Pathname);
+
+
+static int
+ApIsExistingFile (
+    char                    *Pathname)
+{
+#ifndef _GNU_EFI
+    struct stat             StatInfo;
+
+
+    if (!stat (Pathname, &StatInfo))
+    {
+        AcpiLogError ("Target path already exists, overwrite? [y|n] ");
+
+        if (getchar () != 'y')
+        {
+            return (-1);
+        }
+    }
+#endif
+
+    return 0;
+}
+
+
 /******************************************************************************
  *
  * FUNCTION:    ApOpenOutputFile
@@ -62,28 +92,22 @@ int
 ApOpenOutputFile (
     char                    *Pathname)
 {
-    struct stat             StatInfo;
-    FILE                    *File;
+    ACPI_FILE               File;
 
 
     /* If file exists, prompt for overwrite */
 
-    if (!stat (Pathname, &StatInfo))
+    if (ApIsExistingFile (Pathname) != 0)
     {
-        fprintf (stderr, "Target path already exists, overwrite? [y|n] ");
-
-        if (getchar () != 'y')
-        {
-            return (-1);
-        }
+        return (-1);
     }
 
     /* Point stdout to the file */
 
-    File = freopen (Pathname, "w", stdout);
+    File = AcpiOsOpenFile (Pathname, ACPI_FILE_WRITING);
     if (!File)
     {
-        perror ("Could not open output file");
+        AcpiLogError ("Could not open output file: %s\n", Pathname);
         return (-1);
     }
 
@@ -116,7 +140,7 @@ ApWriteToBinaryFile (
 {
     char                    Filename[ACPI_NAME_SIZE + 16];
     char                    InstanceStr [16];
-    FILE                    *File;
+    ACPI_FILE               File;
     size_t                  Actual;
     UINT32                  TableLength;
 
@@ -145,37 +169,38 @@ ApWriteToBinaryFile (
 
     if (Instance > 0)
     {
-        sprintf (InstanceStr, "%u", Instance);
-        strcat (Filename, InstanceStr);
+        AcpiUtSnprintf (InstanceStr, sizeof (InstanceStr), "%u", Instance);
+        ACPI_STRCAT (Filename, InstanceStr);
     }
 
-    strcat (Filename, ACPI_TABLE_FILE_SUFFIX);
+    ACPI_STRCAT (Filename, ACPI_TABLE_FILE_SUFFIX);
 
     if (Gbl_VerboseMode)
     {
-        fprintf (stderr,
+        AcpiLogError (
             "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");
+    File = AcpiOsOpenFile (Filename,
+        ACPI_FILE_WRITING | ACPI_FILE_BINARY);
     if (!File)
     {
-        perror ("Could not open output file");
+        AcpiLogError ("Could not open output file: %s\n", Filename);
         return (-1);
     }
 
-    Actual = fwrite (Table, 1, TableLength, File);
+    Actual = AcpiOsWriteFile (File, Table, 1, TableLength);
     if (Actual != TableLength)
     {
-        perror ("Error writing binary output file");
-        fclose (File);
+        AcpiLogError ("Error writing binary output file: %s\n", Filename);
+        AcpiOsCloseFile (File);
         return (-1);
     }
 
-    fclose (File);
+    AcpiOsCloseFile (File);
     return (0);
 }
 
@@ -199,17 +224,17 @@ ApGetTableFromFile (
     UINT32                  *OutFileSize)
 {
     ACPI_TABLE_HEADER       *Buffer = NULL;
-    FILE                    *File;
+    ACPI_FILE               File;
     UINT32                  FileSize;
     size_t                  Actual;
 
 
     /* Must use binary mode */
 
-    File = fopen (Pathname, "rb");
+    File = AcpiOsOpenFile (Pathname, ACPI_FILE_READING | ACPI_FILE_BINARY);
     if (!File)
     {
-        perror ("Could not open input file");
+        AcpiLogError ("Could not open input file: %s\n", Pathname);
         return (NULL);
     }
 
@@ -218,29 +243,29 @@ ApGetTableFromFile (
     FileSize = CmGetFileSize (File);
     if (FileSize == ACPI_UINT32_MAX)
     {
-        fprintf (stderr,
+        AcpiLogError (
             "Could not get input file size: %s\n", Pathname);
         goto Cleanup;
     }
 
     /* Allocate a buffer for the entire file */
 
-    Buffer = calloc (1, FileSize);
+    Buffer = ACPI_ALLOCATE_ZEROED (FileSize);
     if (!Buffer)
     {
-        fprintf (stderr,
+        AcpiLogError (
             "Could not allocate file buffer of size: %u\n", FileSize);
         goto Cleanup;
     }
 
     /* Read the entire file */
 
-    Actual = fread (Buffer, 1, FileSize, File);
+    Actual = AcpiOsReadFile (File, Buffer, 1, FileSize);
     if (Actual != FileSize)
     {
-        fprintf (stderr,
+        AcpiLogError (
             "Could not read input file: %s\n", Pathname);
-        free (Buffer);
+        ACPI_FREE (Buffer);
         Buffer = NULL;
         goto Cleanup;
     }
@@ -248,6 +273,6 @@ ApGetTableFromFile (
     *OutFileSize = FileSize;
 
 Cleanup:
-    fclose (File);
+    AcpiOsCloseFile (File);
     return (Buffer);
 }
diff --git a/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c b/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c
index 8929b0f..ffd1a2a 100644
--- a/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpidump/apmain.c
@@ -79,7 +79,7 @@ ApDoOptions (
     int                     argc,
     char                    **argv);
 
-static void
+static int
 ApInsertAction (
     char                    *Argument,
     UINT32                  ToBeDone);
@@ -119,7 +119,7 @@ ApDisplayUsage (
     ACPI_OPTION ("-v",                      "Display version information");
     ACPI_OPTION ("-z",                      "Verbose mode");
 
-    printf ("\nTable Options:\n");
+    ACPI_USAGE_TEXT ("\nTable Options:\n");
 
     ACPI_OPTION ("-a <Address>",            "Get table via a physical address");
     ACPI_OPTION ("-f <BinaryFile>",         "Get table via a binary file");
@@ -127,7 +127,7 @@ ApDisplayUsage (
     ACPI_OPTION ("-x",                      "Do not use but dump XSDT");
     ACPI_OPTION ("-x -x",                   "Do not use or dump XSDT");
 
-    printf (
+    ACPI_USAGE_TEXT (
         "\n"
         "Invocation without parameters dumps all available tables\n"
         "Multiple mixed instances of -a, -f, and -n are supported\n\n");
@@ -141,13 +141,13 @@ ApDisplayUsage (
  * 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.
+ * RETURN:      Status
  *
  * DESCRIPTION: Add an action item to the action table
  *
  ******************************************************************************/
 
-static void
+static int
 ApInsertAction (
     char                    *Argument,
     UINT32                  ToBeDone)
@@ -161,9 +161,11 @@ ApInsertAction (
     CurrentAction++;
     if (CurrentAction > AP_MAX_ACTIONS)
     {
-        fprintf (stderr, "Too many table options (max %u)\n", AP_MAX_ACTIONS);
-        exit (-1);
+        AcpiLogError ("Too many table options (max %u)\n", AP_MAX_ACTIONS);
+        return (-1);
     }
+
+    return (0);
 }
 
 
@@ -191,7 +193,7 @@ ApDoOptions (
 
     /* Command line options */
 
-    while ((j = AcpiGetopt (argc, argv, AP_SUPPORTED_OPTIONS)) != EOF) switch (j)
+    while ((j = AcpiGetopt (argc, argv, AP_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
     {
     /*
      * Global options
@@ -210,13 +212,13 @@ ApDoOptions (
     case '?':
 
         ApDisplayUsage ();
-        exit (0);
+        return (1);
 
     case 'o':   /* Redirect output to a single file */
 
         if (ApOpenOutputFile (AcpiGbl_Optarg))
         {
-            exit (-1);
+            return (-1);
         }
         continue;
 
@@ -225,9 +227,9 @@ ApDoOptions (
         Status = AcpiUtStrtoul64 (AcpiGbl_Optarg, 0, &Gbl_RsdpBase);
         if (ACPI_FAILURE (Status))
         {
-            fprintf (stderr, "%s: Could not convert to a physical address\n",
+            AcpiLogError ("%s: Could not convert to a physical address\n",
                 AcpiGbl_Optarg);
-            exit (-1);
+            return (-1);
         }
         continue;
 
@@ -250,13 +252,13 @@ ApDoOptions (
 
     case 'v':   /* Revision/version */
 
-        printf (ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
-        exit (0);
+        AcpiOsPrintf (ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
+        return (1);
 
     case 'z':   /* Verbose mode */
 
         Gbl_VerboseMode = TRUE;
-        fprintf (stderr, ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
+        AcpiLogError (ACPI_COMMON_SIGNON (AP_UTILITY_NAME));
         continue;
 
     /*
@@ -264,30 +266,42 @@ ApDoOptions (
      */
     case 'a':   /* Get table by physical address */
 
-        ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_ADDRESS);
+        if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_ADDRESS))
+        {
+            return (-1);
+        }
         break;
 
     case 'f':   /* Get table from a file */
 
-        ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_FILE);
+        if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_FILE))
+        {
+            return (-1);
+        }
         break;
 
     case 'n':   /* Get table by input name (signature) */
 
-        ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_NAME);
+        if (ApInsertAction (AcpiGbl_Optarg, AP_DUMP_TABLE_BY_NAME))
+        {
+            return (-1);
+        }
         break;
 
     default:
 
         ApDisplayUsage ();
-        exit (-1);
+        return (-1);
     }
 
     /* If there are no actions, this means "get/dump all tables" */
 
     if (CurrentAction == 0)
     {
-        ApInsertAction (NULL, AP_DUMP_ALL_TABLES);
+        if (ApInsertAction (NULL, AP_DUMP_ALL_TABLES))
+        {
+            return (-1);
+        }
     }
 
     return (0);
@@ -306,10 +320,17 @@ ApDoOptions (
  *
  ******************************************************************************/
 
+#ifndef _GNU_EFI
 int ACPI_SYSTEM_XFACE
 main (
     int                     argc,
     char                    *argv[])
+#else
+int ACPI_SYSTEM_XFACE
+acpi_main (
+    int                     argc,
+    char                    *argv[])
+#endif
 {
     int                     Status = 0;
     AP_DUMP_ACTION          *Action;
@@ -318,12 +339,19 @@ main (
 
 
     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
+    AcpiOsInitialize ();
+    Gbl_OutputFile = ACPI_FILE_OUT;
 
     /* Process command line options */
 
-    if (ApDoOptions (argc, argv))
+    Status = ApDoOptions (argc, argv);
+    if (Status > 0)
     {
-        return (-1);
+        return (0);
+    }
+    if (Status < 0)
+    {
+        return (Status);
     }
 
     /* Get/dump ACPI table(s) as requested */
@@ -355,7 +383,7 @@ main (
 
         default:
 
-            fprintf (stderr, "Internal error, invalid action: 0x%X\n",
+            AcpiLogError ("Internal error, invalid action: 0x%X\n",
                 Action->ToBeDone);
             return (-1);
         }
@@ -366,18 +394,18 @@ main (
         }
     }
 
-    if (Gbl_OutputFile)
+    if (Gbl_OutputFilename)
     {
         if (Gbl_VerboseMode)
         {
             /* Summary for the output file */
 
             FileSize = CmGetFileSize (Gbl_OutputFile);
-            fprintf (stderr, "Output file %s contains 0x%X (%u) bytes\n\n",
+            AcpiLogError ("Output file %s contains 0x%X (%u) bytes\n\n",
                 Gbl_OutputFilename, FileSize, FileSize);
         }
 
-        fclose (Gbl_OutputFile);
+        AcpiOsCloseFile (Gbl_OutputFile);
     }
 
     return (Status);
diff --git a/sys/contrib/dev/acpica/source/tools/acpiexec/aehandlers.c b/sys/contrib/dev/acpica/source/tools/acpiexec/aehandlers.c
index 5ad24e9..1280ff6 100644
--- a/sys/contrib/dev/acpica/source/tools/acpiexec/aehandlers.c
+++ b/sys/contrib/dev/acpica/source/tools/acpiexec/aehandlers.c
@@ -1055,11 +1055,21 @@ AeInstallEarlyHandlers (
         Status = AcpiDetachData (Handle, AeAttachedDataHandler);
         AE_CHECK_OK (AcpiDetachData, Status);
 
-        Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
+        /* Test attach data at the root object */
+
+        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler,
+            AcpiGbl_RootNode);
+        AE_CHECK_OK (AcpiAttachData, Status);
+
+        Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler2,
+            AcpiGbl_RootNode);
         AE_CHECK_OK (AcpiAttachData, Status);
 
         /* Test support for multiple attaches */
 
+        Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
+        AE_CHECK_OK (AcpiAttachData, Status);
+
         Status = AcpiAttachData (Handle, AeAttachedDataHandler2, Handle);
         AE_CHECK_OK (AcpiAttachData, Status);
     }
@@ -1305,6 +1315,10 @@ AeRegionHandler (
             switch (Function >> 16)
             {
             case AML_FIELD_ATTRIB_QUICK:
+
+                Length = 0;
+                break;
+
             case AML_FIELD_ATTRIB_SEND_RCV:
             case AML_FIELD_ATTRIB_BYTE:
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c b/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c
index 3aa9343..99dd1a2 100644
--- a/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpiexec/aemain.c
@@ -166,7 +166,7 @@ AeDoOptions (
     int                     j;
 
 
-    while ((j = AcpiGetopt (argc, argv, AE_SUPPORTED_OPTIONS)) != EOF) switch (j)
+    while ((j = AcpiGetopt (argc, argv, AE_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
     {
     case 'b':
 
@@ -375,22 +375,14 @@ main (
 
 
     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
-
-    printf (ACPI_COMMON_SIGNON (ACPIEXEC_NAME));
-    if (argc < 2)
-    {
-        usage ();
-        return (0);
-    }
-
     signal (SIGINT, AeCtrlCHandler);
 
-    /* Init globals */
+    /* Init debug globals */
 
     AcpiDbgLevel = ACPI_NORMAL_DEFAULT;
     AcpiDbgLayer = 0xFFFFFFFF;
 
-    /* Init ACPI and start debugger thread */
+    /* Init ACPICA and start debugger thread */
 
     Status = AcpiInitializeSubsystem ();
     AE_CHECK_OK (AcpiInitializeSubsystem, Status);
@@ -399,6 +391,13 @@ main (
         goto ErrorExit;
     }
 
+    printf (ACPI_COMMON_SIGNON (ACPIEXEC_NAME));
+    if (argc < 2)
+    {
+        usage ();
+        return (0);
+    }
+
     /* Get the command line options */
 
     if (AeDoOptions (argc, argv))
@@ -422,7 +421,7 @@ main (
     {
         /* Get one entire table */
 
-        Status = AcpiDbReadTableFromFile (argv[AcpiGbl_Optind], &Table);
+        Status = AcpiUtReadTableFromFile (argv[AcpiGbl_Optind], &Table);
         if (ACPI_FAILURE (Status))
         {
             printf ("**** Could not get table from file %s, %s\n",
diff --git a/sys/contrib/dev/acpica/source/tools/acpiexec/aetables.c b/sys/contrib/dev/acpica/source/tools/acpiexec/aetables.c
index e873b48..a9becc2 100644
--- a/sys/contrib/dev/acpica/source/tools/acpiexec/aetables.c
+++ b/sys/contrib/dev/acpica/source/tools/acpiexec/aetables.c
@@ -60,10 +60,6 @@ AeTableOverride (
     ACPI_TABLE_HEADER       *ExistingTable,
     ACPI_TABLE_HEADER       **NewTable);
 
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void);
-
 /* User table (DSDT) */
 
 static ACPI_TABLE_HEADER        *DsdtToInstallOverride;
@@ -545,7 +541,7 @@ AeInstallTables (
 
 /******************************************************************************
  *
- * FUNCTION:    AeLocalGetRootPointer
+ * FUNCTION:    AcpiOsGetRootPointer
  *
  * PARAMETERS:  Flags       - not used
  *              Address     - Where the root pointer is returned
@@ -558,7 +554,7 @@ AeInstallTables (
  *****************************************************************************/
 
 ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
+AcpiOsGetRootPointer (
     void)
 {
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c b/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c
index a340598..9be1f3b 100644
--- a/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpihelp/ahmain.c
@@ -71,26 +71,26 @@ AhDisplayUsage (
     ACPI_OPTION ("-h",                      "Display help");
     ACPI_OPTION ("-v",                      "Display version information");
 
-    printf ("\nAML (ACPI Machine Language) Names and Encodings:\n");
+    ACPI_USAGE_TEXT ("\nAML (ACPI Machine Language) Names and Encodings:\n");
     ACPI_OPTION ("-a [Name/Prefix]",        "Find/Display both ASL operator and AML opcode name(s)");
     ACPI_OPTION ("-m [Name/Prefix]",        "Find/Display AML opcode name(s)");
 
-    printf ("\nASL (ACPI Source Language) Names and Symbols:\n");
+    ACPI_USAGE_TEXT ("\nASL (ACPI Source Language) Names and Symbols:\n");
     ACPI_OPTION ("-k [Name/Prefix]",        "Find/Display ASL non-operator keyword(s)");
     ACPI_OPTION ("-p [Name/Prefix]",        "Find/Display ASL predefined method name(s)");
     ACPI_OPTION ("-s [Name/Prefix]",        "Find/Display ASL operator name(s)");
 
-    printf ("\nOther ACPI Names:\n");
+    ACPI_USAGE_TEXT ("\nOther ACPI Names:\n");
     ACPI_OPTION ("-i [Name/Prefix]",        "Find/Display ACPI/PNP Hardware ID(s)");
 
-    printf ("\nACPI Values:\n");
+    ACPI_USAGE_TEXT ("\nACPI Values:\n");
     ACPI_OPTION ("-e [HexValue]",           "Decode ACPICA exception code");
     ACPI_OPTION ("-o [HexValue]",           "Decode hex AML opcode");
 
-    printf ("\nName/Prefix or HexValue not specified means \"Display All\"\n");
-    printf ("\nDefault search with valid Name/Prefix and no options:\n");
-    printf ("    Find ASL/AML operator names - if NamePrefix does not start with underscore\n");
-    printf ("    Find ASL predefined method names - if NamePrefix starts with underscore\n");
+    ACPI_USAGE_TEXT ("\nName/Prefix or HexValue not specified means \"Display All\"\n");
+    ACPI_USAGE_TEXT ("\nDefault search with valid Name/Prefix and no options:\n");
+    ACPI_USAGE_TEXT ("    Find ASL/AML operator names - if NamePrefix does not start with underscore\n");
+    ACPI_USAGE_TEXT ("    Find ASL predefined method names - if NamePrefix starts with underscore\n");
 }
 
 
@@ -112,6 +112,7 @@ main (
     int                     j;
 
 
+    AcpiOsInitialize ();
     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
     printf (ACPI_COMMON_SIGNON (AH_UTILITY_NAME));
     DecodeType = AH_DECODE_DEFAULT;
@@ -124,7 +125,7 @@ main (
 
     /* Command line options */
 
-    while ((j = AcpiGetopt (argc, argv, AH_SUPPORTED_OPTIONS)) != EOF) switch (j)
+    while ((j = AcpiGetopt (argc, argv, AH_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
     {
     case 'a':
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c b/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c
index e65e6e9..a7ea9a9 100644
--- a/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpinames/anmain.c
@@ -105,7 +105,7 @@ NsDumpEntireNamespace (
 
     /* Open the binary AML file and read the entire table */
 
-    Status = AcpiDbReadTableFromFile (AmlFilename, &Table);
+    Status = AcpiUtReadTableFromFile (AmlFilename, &Table);
     if (ACPI_FAILURE (Status))
     {
         printf ("**** Could not get input table %s, %s\n", AmlFilename,
@@ -241,25 +241,29 @@ main (
 
 
     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
-    printf (ACPI_COMMON_SIGNON (AN_UTILITY_NAME));
 
-    if (argc < 2)
-    {
-        usage ();
-        return (0);
-    }
-
-    /* Init globals and ACPICA */
+    /* Init debug globals and ACPICA */
 
-    AcpiDbgLevel = ACPI_NORMAL_DEFAULT | ACPI_LV_TABLES;
+    AcpiDbgLevel = ACPI_LV_TABLES;
     AcpiDbgLayer = 0xFFFFFFFF;
 
     Status = AcpiInitializeSubsystem ();
     AE_CHECK_OK (AcpiInitializeSubsystem, Status);
+    if (ACPI_FAILURE (Status))
+    {
+        return (-1);
+    }
+
+    printf (ACPI_COMMON_SIGNON (AN_UTILITY_NAME));
+    if (argc < 2)
+    {
+        usage ();
+        return (0);
+    }
 
     /* Get the command line options */
 
-    while ((j = AcpiGetopt (argc, argv, AN_SUPPORTED_OPTIONS)) != EOF) switch(j)
+    while ((j = AcpiGetopt (argc, argv, AN_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch(j)
     {
     case 'v': /* -v: (Version): signon already emitted, just exit */
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpinames/anstubs.c b/sys/contrib/dev/acpica/source/tools/acpinames/anstubs.c
index dedc40f..5933be3 100644
--- a/sys/contrib/dev/acpica/source/tools/acpinames/anstubs.c
+++ b/sys/contrib/dev/acpica/source/tools/acpinames/anstubs.c
@@ -60,71 +60,6 @@
 
 /* Utilities */
 
-void
-AcpiUtSubsystemShutdown (
-    void)
-{
-}
-
-ACPI_STATUS
-AcpiUtExecute_STA (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    UINT32                  *StatusFlags)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_HID (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID      **ReturnId)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_CID (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID_LIST **ReturnCidList)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_UID (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID      **ReturnId)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_SUB (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID      **ReturnId)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecutePowerMethods (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    const char              **MethodNames,
-    UINT8                   MethodCount,
-    UINT8                   *OutValues)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtEvaluateNumericObject (
-    char                    *ObjectName,
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    UINT64                  *Value)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
 ACPI_STATUS
 AcpiUtCopyIobjectToEobject (
     ACPI_OPERAND_OBJECT     *Obj,
@@ -151,33 +86,9 @@ AcpiUtCopyIobjectToIobject (
 }
 
 
-/* Hardware manager */
-
-UINT32
-AcpiHwGetMode (
-    void)
-{
-    return (0);
-}
-
-
 /* Event manager */
 
 ACPI_STATUS
-AcpiEvInstallXruptHandlers (
-    void)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEvInitializeEvents (
-    void)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
 AcpiEvInstallRegionHandlers (
     void)
 {
@@ -199,37 +110,9 @@ AcpiEvInitializeRegion (
     return (AE_OK);
 }
 
-#if (!ACPI_REDUCED_HARDWARE)
-ACPI_STATUS
-AcpiEvDeleteGpeBlock (
-    ACPI_GPE_BLOCK_INFO     *GpeBlock)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEnable (
-    void)
-{
-    return (AE_OK);
-}
-#endif /* !ACPI_REDUCED_HARDWARE */
-
 
 /* AML Interpreter */
 
-void
-AcpiExUnlinkMutex (
-    ACPI_OPERAND_OBJECT     *ObjDesc)
-{
-}
-
-void
-AcpiExReleaseAllMutexes (
-    ACPI_THREAD_STATE       *Thread)
-{
-}
-
 ACPI_STATUS
 AcpiExReadDataFromField (
     ACPI_WALK_STATE         *WalkState,
@@ -256,22 +139,6 @@ AcpiExPrepFieldValue (
 }
 
 ACPI_STATUS
-AcpiExAcquireMutexObject (
-    UINT16                  Timeout,
-    ACPI_OPERAND_OBJECT     *ObjDesc,
-    ACPI_THREAD_ID          ThreadId)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiExReleaseMutexObject (
-    ACPI_OPERAND_OBJECT     *ObjDesc)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
 AcpiExStoreObjectToNode (
     ACPI_OPERAND_OBJECT     *SourceDesc,
     ACPI_NAMESPACE_NODE     *Node,
@@ -406,44 +273,3 @@ AcpiDsExecEndOp (
 {
     return (AE_NOT_IMPLEMENTED);
 }
-
-
-/* AML Debugger */
-
-void
-AcpiDbDisplayArgumentObject (
-    ACPI_OPERAND_OBJECT     *ObjDesc,
-    ACPI_WALK_STATE         *WalkState)
-{
-}
-
-ACPI_STATUS
-AcpiDbInitialize (
-    void)
-{
-    return (AE_OK);
-}
-
-void
-AcpiDbTerminate (
-    void)
-{
-}
-
-/* OSL interfaces */
-
-ACPI_THREAD_ID
-AcpiOsGetThreadId (
-    void)
-{
-    return (0xFFFF);
-}
-
-ACPI_STATUS
-AcpiOsExecute (
-    ACPI_EXECUTE_TYPE       Type,
-    ACPI_OSD_EXEC_CALLBACK  Function,
-    void                    *Context)
-{
-    return (AE_SUPPORT);
-}
diff --git a/sys/contrib/dev/acpica/source/tools/acpinames/antables.c b/sys/contrib/dev/acpica/source/tools/acpinames/antables.c
index 8ad3c5c..b91b425 100644
--- a/sys/contrib/dev/acpica/source/tools/acpinames/antables.c
+++ b/sys/contrib/dev/acpica/source/tools/acpinames/antables.c
@@ -48,10 +48,6 @@
 
 /* Local prototypes */
 
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void);
-
 /* Non-AML tables that are constructed locally and installed */
 
 static ACPI_TABLE_RSDP          LocalRSDP;
@@ -284,7 +280,7 @@ AeBuildLocalTables (
 
 /******************************************************************************
  *
- * FUNCTION:    AeLocalGetRootPointer
+ * FUNCTION:    AcpiOsGetRootPointer
  *
  * PARAMETERS:  None
  *
@@ -296,7 +292,7 @@ AeBuildLocalTables (
  *****************************************************************************/
 
 ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
+AcpiOsGetRootPointer (
     void)
 {
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c b/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c
index 8c75769..8b26ebc 100644
--- a/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpisrc/asmain.c
@@ -297,7 +297,7 @@ AsDisplayUsage (
     ACPI_OPTION ("-l",          "Generate Linux version of the source");
     ACPI_OPTION ("-u",          "Generate Custom source translation");
 
-    printf ("\n");
+    ACPI_USAGE_TEXT ("\n");
     ACPI_OPTION ("-d",          "Leave debug statements in code");
     ACPI_OPTION ("-s",          "Generate source statistics only");
     ACPI_OPTION ("-v",          "Display version information");
@@ -327,6 +327,7 @@ main (
 
 
     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
+    AcpiOsInitialize ();
     printf (ACPI_COMMON_SIGNON (AS_UTILITY_NAME));
 
     if (argc < 2)
@@ -337,7 +338,7 @@ main (
 
     /* Command line options */
 
-    while ((j = AcpiGetopt (argc, argv, AS_SUPPORTED_OPTIONS)) != EOF) switch(j)
+    while ((j = AcpiGetopt (argc, argv, AS_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch(j)
     {
     case 'l':
 
diff --git a/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c b/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c
index 9e127a4..7f25988 100644
--- a/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c
+++ b/sys/contrib/dev/acpica/source/tools/acpisrc/astable.c
@@ -253,6 +253,9 @@ ACPI_TYPED_IDENTIFIER_TABLE           AcpiIdentifiers[] = {
     {"ACPI_INTERPRETER_MODE",               SRC_TYPE_SIMPLE},
     {"ACPI_IO_ADDRESS",                     SRC_TYPE_SIMPLE},
     {"ACPI_IO_ATTRIBUTE",                   SRC_TYPE_STRUCT},
+    {"ACPI_LPIT_HEADER",                    SRC_TYPE_STRUCT},
+    {"ACPI_LPIT_IO",                        SRC_TYPE_STRUCT},
+    {"ACPI_LPIT_NATIVE",                    SRC_TYPE_STRUCT},
     {"ACPI_MEM_SPACE_CONTEXT",              SRC_TYPE_STRUCT},
     {"ACPI_MEMORY_ATTRIBUTE",               SRC_TYPE_STRUCT},
     {"ACPI_MEMORY_LIST",                    SRC_TYPE_STRUCT},
@@ -400,6 +403,7 @@ ACPI_TYPED_IDENTIFIER_TABLE           AcpiIdentifiers[] = {
     {"ACPI_TABLE_HEADER",                   SRC_TYPE_STRUCT},
     {"ACPI_TABLE_INFO",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_LIST",                     SRC_TYPE_STRUCT},
+    {"ACPI_TABLE_LPIT",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_MTMR",                     SRC_TYPE_STRUCT},
     {"ACPI_TABLE_SUPPORT",                  SRC_TYPE_STRUCT},
     {"ACPI_TABLE_TYPE",                     SRC_TYPE_SIMPLE},
@@ -720,8 +724,10 @@ ACPI_STRING_TABLE           LinuxSpecialStrings[] = {
     {"\"actbl3.h\"",            "<acpi/actbl3.h>",              REPLACE_WHOLE_WORD},
     {"\"actypes.h\"",           "<acpi/actypes.h>",             REPLACE_WHOLE_WORD},
     {"\"platform/acenv.h\"",    "<acpi/platform/acenv.h>",      REPLACE_WHOLE_WORD},
+    {"\"platform/acenvex.h\"",  "<acpi/platform/acenvex.h>",    REPLACE_WHOLE_WORD},
     {"\"acgcc.h\"",             "<acpi/platform/acgcc.h>",      REPLACE_WHOLE_WORD},
     {"\"aclinux.h\"",           "<acpi/platform/aclinux.h>",    REPLACE_WHOLE_WORD},
+    {"\"aclinuxex.h\"",         "<acpi/platform/aclinuxex.h>",  REPLACE_WHOLE_WORD},
 
     {NULL,                      NULL,               0}
 };
diff --git a/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c b/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c
index b1bdb8b..ec0bd61 100644
--- a/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c
+++ b/sys/contrib/dev/acpica/source/tools/acpixtract/axmain.c
@@ -98,8 +98,8 @@ DisplayUsage (
     ACPI_OPTION ("-s <signature>",      "Extract all tables with <signature>");
     ACPI_OPTION ("-v",                  "Display version information");
 
-    printf ("\nExtract binary ACPI tables from text acpidump output\n");
-    printf ("Default invocation extracts the DSDT and all SSDTs\n");
+    ACPI_USAGE_TEXT ("\nExtract binary ACPI tables from text acpidump output\n");
+    ACPI_USAGE_TEXT ("Default invocation extracts the DSDT and all SSDTs\n");
 }
 
 
@@ -122,6 +122,7 @@ main (
 
 
     ACPI_DEBUG_INITIALIZE (); /* For debug version only */
+    AcpiOsInitialize ();
     printf (ACPI_COMMON_SIGNON (AX_UTILITY_NAME));
 
     if (argc < 2)
@@ -132,7 +133,7 @@ main (
 
     /* Command line options */
 
-    while ((j = AcpiGetopt (argc, argv, AX_SUPPORTED_OPTIONS)) != EOF) switch (j)
+    while ((j = AcpiGetopt (argc, argv, AX_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
     {
     case 'a':
 
diff --git a/sys/contrib/dev/acpica/source/tools/examples/examples.c b/sys/contrib/dev/acpica/source/tools/examples/examples.c
index 8de3a05..762118a 100644
--- a/sys/contrib/dev/acpica/source/tools/examples/examples.c
+++ b/sys/contrib/dev/acpica/source/tools/examples/examples.c
@@ -86,6 +86,22 @@ NotifyHandler (
     UINT32                  Value,
     void                    *Context);
 
+static ACPI_STATUS
+RegionHandler (
+    UINT32                  Function,
+    ACPI_PHYSICAL_ADDRESS   Address,
+    UINT32                  BitWidth,
+    UINT64                  *Value,
+    void                    *HandlerContext,
+    void                    *RegionContext);
+
+static ACPI_STATUS
+RegionInit (
+    ACPI_HANDLE             RegionHandle,
+    UINT32                  Function,
+    void                    *HandlerContext,
+    void                    **RegionContext);
+
 static void
 ExecuteMAIN (void);
 
@@ -336,6 +352,43 @@ NotifyHandler (
 
 
 static ACPI_STATUS
+RegionInit (
+    ACPI_HANDLE                 RegionHandle,
+    UINT32                      Function,
+    void                        *HandlerContext,
+    void                        **RegionContext)
+{
+
+    if (Function == ACPI_REGION_DEACTIVATE)
+    {
+        *RegionContext = NULL;
+    }
+    else
+    {
+        *RegionContext = RegionHandle;
+    }
+
+    return (AE_OK);
+}
+
+
+static ACPI_STATUS
+RegionHandler (
+    UINT32                      Function,
+    ACPI_PHYSICAL_ADDRESS       Address,
+    UINT32                      BitWidth,
+    UINT64                      *Value,
+    void                        *HandlerContext,
+    void                        *RegionContext)
+{
+
+    ACPI_INFO ((AE_INFO, "Received a region access"));
+
+    return (AE_OK);
+}
+
+
+static ACPI_STATUS
 InstallHandlers (void)
 {
     ACPI_STATUS             Status;
@@ -351,6 +404,14 @@ InstallHandlers (void)
         return (Status);
     }
 
+    Status = AcpiInstallAddressSpaceHandler (ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_SYSTEM_MEMORY,
+        RegionHandler, RegionInit, NULL);
+    if (ACPI_FAILURE (Status))
+    {
+        ACPI_EXCEPTION ((AE_INFO, Status, "While installing an OpRegion handler"));
+        return (Status);
+    }
+
     return (AE_OK);
 }
 
diff --git a/sys/contrib/dev/acpica/source/tools/examples/exstubs.c b/sys/contrib/dev/acpica/source/tools/examples/exstubs.c
index df2ca25..9d5b25b 100644
--- a/sys/contrib/dev/acpica/source/tools/examples/exstubs.c
+++ b/sys/contrib/dev/acpica/source/tools/examples/exstubs.c
@@ -58,91 +58,8 @@
  *****************************************************************************/
 
 
-/* Utilities */
-
-void
-AcpiUtSubsystemShutdown (
-    void)
-{
-}
-
-ACPI_STATUS
-AcpiUtExecute_STA (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    UINT32                  *StatusFlags)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_HID (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID      **ReturnId)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_CID (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID_LIST **ReturnCidList)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_UID (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID      **ReturnId)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecute_SUB (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    ACPI_PNP_DEVICE_ID      **ReturnId)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtExecutePowerMethods (
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    const char              **MethodNames,
-    UINT8                   MethodCount,
-    UINT8                   *OutValues)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtEvaluateNumericObject (
-    char                    *ObjectName,
-    ACPI_NAMESPACE_NODE     *DeviceNode,
-    UINT64                  *Value)
-{
-    return (AE_NOT_IMPLEMENTED);
-}
-
-ACPI_STATUS
-AcpiUtGetResourceEndTag (
-    ACPI_OPERAND_OBJECT     *ObjDesc,
-    UINT8                   **EndTag)
-{
-    return (AE_OK);
-}
-
-
 /* Hardware manager */
 
-UINT32
-AcpiHwGetMode (
-    void)
-{
-    return (0);
-}
-
 ACPI_STATUS
 AcpiHwReadPort (
     ACPI_IO_ADDRESS         Address,
@@ -165,175 +82,8 @@ AcpiHwWritePort (
 /* Event manager */
 
 ACPI_STATUS
-AcpiInstallNotifyHandler (
-    ACPI_HANDLE             Device,
-    UINT32                  HandlerType,
-    ACPI_NOTIFY_HANDLER     Handler,
-    void                    *Context)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEvInstallXruptHandlers (
-    void)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
 AcpiEvInitializeEvents (
     void)
 {
     return (AE_OK);
 }
-
-ACPI_STATUS
-AcpiEvInstallRegionHandlers (
-    void)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEvInitializeOpRegions (
-    void)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEvInitializeRegion (
-    ACPI_OPERAND_OBJECT     *RegionObj,
-    BOOLEAN                 AcpiNsLocked)
-{
-    return (AE_OK);
-}
-
-#if (!ACPI_REDUCED_HARDWARE)
-ACPI_STATUS
-AcpiEvDeleteGpeBlock (
-    ACPI_GPE_BLOCK_INFO     *GpeBlock)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEnable (
-    void)
-{
-    return (AE_OK);
-}
-#endif /* !ACPI_REDUCED_HARDWARE */
-
-void
-AcpiEvUpdateGpes (
-    ACPI_OWNER_ID           TableOwnerId)
-{
-}
-
-ACPI_STATUS
-AcpiEvAddressSpaceDispatch (
-    ACPI_OPERAND_OBJECT     *RegionObj,
-    ACPI_OPERAND_OBJECT     *FieldObj,
-    UINT32                  Function,
-    UINT32                  RegionOffset,
-    UINT32                  BitWidth,
-    UINT64                  *Value)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEvAcquireGlobalLock (
-    UINT16                  Timeout)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEvReleaseGlobalLock (
-    void)
-{
-    return (AE_OK);
-}
-
-ACPI_STATUS
-AcpiEvQueueNotifyRequest (
-    ACPI_NAMESPACE_NODE     *Node,
-    UINT32                  NotifyValue)
-{
-    return (AE_OK);
-}
-
-BOOLEAN
-AcpiEvIsNotifyObject (
-    ACPI_NAMESPACE_NODE     *Node)
-{
-    return (TRUE);
-}
-
-
-/* Namespace manager */
-
-ACPI_STATUS
-AcpiNsCheckReturnValue (
-    ACPI_NAMESPACE_NODE         *Node,
-    ACPI_EVALUATE_INFO          *Info,
-    UINT32                      UserParamCount,
-    ACPI_STATUS                 ReturnStatus,
-    ACPI_OPERAND_OBJECT         **ReturnObjectPtr)
-{
-    return (AE_OK);
-}
-
-void
-AcpiNsCheckArgumentTypes (
-    ACPI_EVALUATE_INFO          *Info)
-{
-    return;
-}
-
-void
-AcpiNsCheckArgumentCount (
-    char                        *Pathname,
-    ACPI_NAMESPACE_NODE         *Node,
-    UINT32                      UserParamCount,
-    const ACPI_PREDEFINED_INFO  *Predefined)
-{
-    return;
-}
-
-void
-AcpiNsCheckAcpiCompliance (
-    char                        *Pathname,
-    ACPI_NAMESPACE_NODE         *Node,
-    const ACPI_PREDEFINED_INFO  *Predefined)
-{
-    return;
-}
-
-const ACPI_PREDEFINED_INFO *
-AcpiUtMatchPredefinedMethod (
-    char                        *Name)
-{
-    return (NULL);
-}
-
-/* OSL interfaces */
-
-ACPI_THREAD_ID
-AcpiOsGetThreadId (
-    void)
-{
-    return (1);
-}
-
-ACPI_STATUS
-AcpiOsExecute (
-    ACPI_EXECUTE_TYPE       Type,
-    ACPI_OSD_EXEC_CALLBACK  Function,
-    void                    *Context)
-{
-    return (AE_SUPPORT);
-}
diff --git a/sys/contrib/dev/acpica/source/tools/examples/extables.c b/sys/contrib/dev/acpica/source/tools/examples/extables.c
index c33be95..aa5fc1f 100644
--- a/sys/contrib/dev/acpica/source/tools/examples/extables.c
+++ b/sys/contrib/dev/acpica/source/tools/examples/extables.c
@@ -49,10 +49,6 @@
 #define _COMPONENT          ACPI_EXAMPLE
         ACPI_MODULE_NAME    ("extables")
 
-ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
-    void);
-
 
 /******************************************************************************
  *
@@ -148,19 +144,24 @@ static unsigned char FacsCode[] =
 
 static unsigned char DsdtCode[] =
 {
-    0x44,0x53,0x44,0x54,0x67,0x00,0x00,0x00,  /* 00000000    "DSDTg..." */
-    0x02,0x97,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    "..Intel." */
+    0x44,0x53,0x44,0x54,0x8C,0x00,0x00,0x00,  /* 00000000    "DSDT...." */
+    0x02,0x76,0x49,0x6E,0x74,0x65,0x6C,0x00,  /* 00000008    ".vIntel." */
     0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65,  /* 00000010    "Template" */
     0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C,  /* 00000018    "....INTL" */
-    0x15,0x11,0x13,0x20,0x14,0x42,0x04,0x4D,  /* 00000020    "... .B.M" */
-    0x41,0x49,0x4E,0x01,0x70,0x73,0x0D,0x4D,  /* 00000028    "AIN.ps.M" */
-    0x61,0x69,0x6E,0x2F,0x41,0x72,0x67,0x30,  /* 00000030    "ain/Arg0" */
-    0x3A,0x20,0x00,0x68,0x00,0x5B,0x31,0xA4,  /* 00000038    ": .h.[1." */
-    0x0D,0x4D,0x61,0x69,0x6E,0x20,0x73,0x75,  /* 00000040    ".Main su" */
-    0x63,0x63,0x65,0x73,0x73,0x66,0x75,0x6C,  /* 00000048    "ccessful" */
-    0x6C,0x79,0x20,0x63,0x6F,0x6D,0x70,0x6C,  /* 00000050    "ly compl" */
-    0x65,0x74,0x65,0x64,0x20,0x65,0x78,0x65,  /* 00000058    "eted exe" */
-    0x63,0x75,0x74,0x69,0x6F,0x6E,0x00        /* 00000060    "cution."  */
+    0x24,0x04,0x14,0x20,0x5B,0x80,0x47,0x4E,  /* 00000020    "$.. [.GN" */
+    0x56,0x53,0x00,0x0C,0x98,0xEE,0xBB,0xDF,  /* 00000028    "VS......" */
+    0x0A,0x13,0x5B,0x81,0x0B,0x47,0x4E,0x56,  /* 00000030    "..[..GNV" */
+    0x53,0x00,0x46,0x4C,0x44,0x31,0x08,0x14,  /* 00000038    "S.FLD1.." */
+    0x4C,0x04,0x4D,0x41,0x49,0x4E,0x01,0x70,  /* 00000040    "L.MAIN.p" */
+    0x73,0x0D,0x4D,0x61,0x69,0x6E,0x2F,0x41,  /* 00000048    "s.Main/A" */
+    0x72,0x67,0x30,0x3A,0x20,0x00,0x68,0x00,  /* 00000050    "rg0: .h." */
+    0x5B,0x31,0x70,0x00,0x46,0x4C,0x44,0x31,  /* 00000058    "[1p.FLD1" */
+    0x86,0x5C,0x00,0x00,0xA4,0x0D,0x4D,0x61,  /* 00000060    ".\....Ma" */
+    0x69,0x6E,0x20,0x73,0x75,0x63,0x63,0x65,  /* 00000068    "in succe" */
+    0x73,0x73,0x66,0x75,0x6C,0x6C,0x79,0x20,  /* 00000070    "ssfully " */
+    0x63,0x6F,0x6D,0x70,0x6C,0x65,0x74,0x65,  /* 00000078    "complete" */
+    0x64,0x20,0x65,0x78,0x65,0x63,0x75,0x74,  /* 00000080    "d execut" */
+    0x69,0x6F,0x6E,0x00                       /* 00000088    "ion."     */
 };
 
 
@@ -232,7 +233,7 @@ ExInitializeAcpiTables (
  *****************************************************************************/
 
 ACPI_PHYSICAL_ADDRESS
-AeLocalGetRootPointer (
+AcpiOsGetRootPointer (
     void)
 {
 
@@ -475,9 +476,17 @@ AeLocalGetRootPointer (
 
 DefinitionBlock ("dsdt.aml", "DSDT", 2, "Intel", "Template", 0x00000001)
 {
+    OperationRegion (GNVS, SystemMemory, 0xDFBBEE98, 0x00000013)
+    Field (GNVS, AnyAcc, NoLock, Preserve)
+    {
+        FLD1,   8,
+    }
+
     Method (MAIN, 1, NotSerialized)
     {
         Store (Concatenate ("Main/Arg0: ", Arg0), Debug)
+        Store (Zero, FLD1)
+        Notify (\, Zero)
         Return ("Main successfully completed execution")
     }
 }
diff --git a/usr.sbin/acpi/acpibin/Makefile b/usr.sbin/acpi/acpibin/Makefile
index 45bafcb..ff609cd 100644
--- a/usr.sbin/acpi/acpibin/Makefile
+++ b/usr.sbin/acpi/acpibin/Makefile
@@ -19,6 +19,7 @@ SRCS+=	\
 	utalloc.c \
 	utbuffer.c \
 	utcache.c \
+	utdebug.c \
 	utdecode.c \
 	utexcep.c \
 	utglobal.c \
@@ -26,9 +27,11 @@ SRCS+=	\
 	utmath.c \
 	utmisc.c \
 	utmutex.c \
+	utprint.c \
 	utstate.c \
 	utstring.c \
 	utxferror.c \
+	oslibcfs.c \
 	osunixxf.c
 
 CFLAGS+= \
diff --git a/usr.sbin/acpi/acpidump/Makefile b/usr.sbin/acpi/acpidump/Makefile
index edd3dd0..f1a75f4 100644
--- a/usr.sbin/acpi/acpidump/Makefile
+++ b/usr.sbin/acpi/acpidump/Makefile
@@ -17,13 +17,18 @@ SRCS=	\
 SRCS+=	\
 	cmfsize.c \
 	getopt.c \
+	oslibcfs.c \
 	osunixdir.c \
 	osunixmap.c \
+	osunixxf.c \
 	tbprint.c \
 	tbxfroot.c \
 	utbuffer.c \
+	utdebug.c \
 	utexcep.c \
+	utglobal.c \
 	utmath.c \
+	utprint.c \
 	utstring.c \
 	utxferror.c
 
diff --git a/usr.sbin/acpi/acpiexec/Makefile b/usr.sbin/acpi/acpiexec/Makefile
index 95df0d3..04babaa 100644
--- a/usr.sbin/acpi/acpiexec/Makefile
+++ b/usr.sbin/acpi/acpiexec/Makefile
@@ -130,6 +130,7 @@ SRCS+=	\
 	nsxfeval.c \
 	nsxfname.c \
 	nsxfobj.c \
+	oslibcfs.c \
 	osunixxf.c \
 	psargs.c \
 	psloop.c \
@@ -176,6 +177,7 @@ SRCS+=	\
 	uterror.c \
 	uteval.c \
 	utexcep.c \
+	utfileio.o \
 	utglobal.c \
 	utids.c \
 	utinit.c \
@@ -187,6 +189,7 @@ SRCS+=	\
 	utosi.c \
 	utownerid.c \
 	utpredef.c \
+	utprint.c \
 	utresrc.c \
 	utstate.c \
 	utstring.c \
diff --git a/usr.sbin/acpi/acpihelp/Makefile b/usr.sbin/acpi/acpihelp/Makefile
index 176a6d5..2a82866 100644
--- a/usr.sbin/acpi/acpihelp/Makefile
+++ b/usr.sbin/acpi/acpihelp/Makefile
@@ -21,8 +21,14 @@ SRCS=	\
 
 SRCS+=	\
 	getopt.c \
+	oslibcfs.c \
+	osunixxf.c \
+	utdebug.c \
 	utexcep.c \
-	utpredef.c
+	utglobal.c \
+	utmath.c \
+	utpredef.c \
+	utprint.c
 
 CFLAGS+= \
 	-DACPI_HELP_APP \
diff --git a/usr.sbin/acpi/acpinames/Makefile b/usr.sbin/acpi/acpinames/Makefile
index c576765..bebc743 100644
--- a/usr.sbin/acpi/acpinames/Makefile
+++ b/usr.sbin/acpi/acpinames/Makefile
@@ -18,7 +18,6 @@ SRCS=	\
 
 SRCS+=	\
 	cmfsize.c \
-	dbfileio.c \
 	dsfield.c \
 	dsmthdat.c \
 	dsobject.c \
@@ -28,9 +27,12 @@ SRCS+=	\
 	dswscope.c \
 	dswstate.c \
 	excreate.c \
+	exdump.c \
+	exmutex.c \
 	exnames.c \
 	exresnte.c \
 	exresolv.c \
+	exsystem.c \
 	exutils.c \
 	getopt.c \
 	nsaccess.c \
@@ -47,6 +49,7 @@ SRCS+=	\
 	nsxfeval.c \
 	nsxfname.c \
 	nsxfobj.c \
+	oslibcfs.c \
 	osunixxf.c \
 	psargs.c \
 	psloop.c \
@@ -70,13 +73,18 @@ SRCS+=	\
 	tbxfroot.c \
 	utaddress.c \
 	utalloc.c \
+	utbuffer.c \
 	utcache.c \
 	utdebug.c \
 	utdecode.c \
 	utdelete.c \
 	uterror.c \
+	uteval.c \
 	utexcep.c \
+	utfileio.c \
 	utglobal.c \
+	utids.c \
+	utinit.c \
 	utlock.c \
 	utmath.c \
 	utmisc.c \
@@ -84,6 +92,7 @@ SRCS+=	\
 	utobject.c \
 	utosi.c \
 	utownerid.c \
+	utprint.c \
 	utstate.c \
 	utstring.c \
 	utxface.c \
diff --git a/usr.sbin/acpi/acpixtract/Makefile b/usr.sbin/acpi/acpixtract/Makefile
index 59cb563..f61df0a 100644
--- a/usr.sbin/acpi/acpixtract/Makefile
+++ b/usr.sbin/acpi/acpixtract/Makefile
@@ -14,7 +14,15 @@ SRCS=	\
 	axmain.c
 
 SRCS+=	\
-	getopt.c
+	getopt.c \
+	oslibcfs.c \
+	osunixxf.c \
+	utdebug.c \
+	utexcep.c \
+	utglobal.c \
+	utmath.c \
+	utprint.c \
+	utxferror.c
 
 CFLAGS+= \
 	-DACPI_XTRACT_APP \
diff --git a/usr.sbin/acpi/iasl/Makefile b/usr.sbin/acpi/iasl/Makefile
index 4ad781a..c1db27c 100644
--- a/usr.sbin/acpi/iasl/Makefile
+++ b/usr.sbin/acpi/iasl/Makefile
@@ -136,6 +136,7 @@ SRCS=	\
 	nswalk.c \
 	nsxfobj.c \
 	osunixxf.c \
+	oslibcfs.c \
 	prexpress.c \
 	prmacros.c \
 	prscan.c \
@@ -166,6 +167,7 @@ SRCS=	\
 	utdelete.c \
 	uterror.c \
 	utexcep.c \
+	utfileio.c \
 	utglobal.c \
 	utinit.c \
 	utlock.c \
@@ -175,6 +177,7 @@ SRCS=	\
 	utobject.c \
 	utownerid.c \
 	utpredef.c \
+	utprint.c \
 	utresrc.c \
 	utstate.c \
 	utstring.c \
-- 
1.9.3

