[packages/acpica] - updated to 20181031 - updated big_endian,unaligned,int-format,ppc64le patches from Debian - remove
qboosh
qboosh at pld-linux.org
Tue Nov 20 17:47:46 CET 2018
commit 25d7dd996e3bcf7ba3c53ad19d2c1c1fc7c26c87
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date: Tue Nov 20 17:51:57 2018 +0100
- updated to 20181031
- updated big_endian,unaligned,int-format,ppc64le patches from Debian
- removed obsolete OPT_LDFLAGS,x32 patches (merged upstream)
- removed name-miscompare,asllookup-miscompare,re-enable-big-endian,asllookup-ppc64,update-big-endian patches (merged into debian-big_endian patch)
- merged big-endian-v2,be-tpm2,mips-be-fix,cve-2017-1369{3,4,5},str-trunc-warn,ptr-cast,aslcodegen patches from Debian
OPT_LDFLAGS.patch | 35 -
acpica-x32.patch | 11 -
acpica.spec | 38 +-
aslcodegen.patch | 29 +
asllookup-miscompare.patch | 33 -
asllookup-ppc64.patch | 23 -
be-tpm2.patch | 41 +
big-endian-v2.patch | 19 +
cve-2017-13693.patch | 99 +
cve-2017-13694.patch | 216 +++
cve-2017-13695.patch | 90 +
debian-big_endian.patch | 4547 +++++++++++++++++++++++++++++++++++++++++++-
debian-unaligned.patch | 83 +-
int-format.patch | 192 +-
mips-be-fix.patch | 37 +
name-miscompare.patch | 34 -
ppc64le.patch | 11 +-
ptr-cast.patch | 50 +
re-enable-big-endian.patch | 32 -
str-trunc-warn.patch | 112 ++
update-big-endian.patch | 3949 --------------------------------------
21 files changed, 5243 insertions(+), 4438 deletions(-)
---
diff --git a/acpica.spec b/acpica.spec
index 5169620..135c05b 100644
--- a/acpica.spec
+++ b/acpica.spec
@@ -5,14 +5,14 @@
Summary: ACPI Component Architecture - an assembler and disassembler for DSDT tables
Summary(pl.UTF-8): ACPI CA - asembler i disasembler dla tablic DSDT
Name: acpica
-Version: 20170303
+Version: 20181031
Release: 1
License: GPL v2
Group: Development/Tools
Source0: https://acpica.org/sites/acpica/files/%{name}-unix-%{version}.tar.gz
-# Source0-md5: 704c7d0ba7ee826ea489995c4837ebd2
+# Source0-md5: cea3f668b536ec56ae878a3239035f26
Source1: https://acpica.org/sites/acpica/files/acpitests-unix-%{version}.tar.gz
-# Source1-md5: 2dc88f6782bb3be3c66bd1a052ee7972
+# Source1-md5: 745791d46298c30cc7ee851ae045dbb0
Source2: iasl.1
Source3: acpibin.1
Source4: acpidump.1
@@ -23,18 +23,20 @@ Source8: acpisrc.1
Source9: acpixtract.1
Patch0: debian-big_endian.patch
Patch1: debian-unaligned.patch
-Patch2: name-miscompare.patch
-Patch3: asllookup-miscompare.patch
-Patch4: re-enable-big-endian.patch
-Patch5: OPT_LDFLAGS.patch
Patch6: int-format.patch
-Patch7: %{name}-x32.patch
-Patch8: asllookup-ppc64.patch
Patch9: template.patch
Patch10: free.patch
-Patch11: update-big-endian.patch
Patch12: ppc64le.patch
Patch13: arm7hl.patch
+Patch14: big-endian-v2.patch
+Patch15: be-tpm2.patch
+Patch16: mips-be-fix.patch
+Patch17: cve-2017-13693.patch
+Patch18: cve-2017-13694.patch
+Patch19: cve-2017-13695.patch
+Patch20: str-trunc-warn.patch
+Patch21: ptr-cast.patch
+Patch22: aslcodegen.patch
URL: https://acpica.org/
BuildRequires: bison
BuildRequires: flex
@@ -56,18 +58,20 @@ tablic DSDT.
tar -x --strip-components=1 -f %{SOURCE1}
%patch0 -p1
%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%patch5 -p1
%patch6 -p1
-%patch7 -p1
-%patch8 -p1
%patch9 -p1
%patch10 -p1
-%patch11 -p1
%patch12 -p1
%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+%patch22 -p1
%build
%define makeopts \\\
diff --git a/OPT_LDFLAGS.patch b/OPT_LDFLAGS.patch
deleted file mode 100644
index 8a05c85..0000000
--- a/OPT_LDFLAGS.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-Index: acpica-unix2-20170303/generate/unix/Makefile.config
-===================================================================
---- acpica-unix2-20170303.orig/generate/unix/Makefile.config
-+++ acpica-unix2-20170303/generate/unix/Makefile.config
-@@ -23,6 +23,9 @@
- # OPT_CFLAGS can be overridden on the make command line by
- # adding OPT_CFLAGS="..." to the invocation.
- #
-+# OPT_LDFLAGS can be overridden on the make command line by
-+# adding OPT_LDFLAGS="..." to the invocation.
-+#
- # Notes:
- # gcc should be version 4 or greater, otherwise some of the options
- # used will not be recognized.
-@@ -43,7 +46,7 @@ CC = gcc
- OBJDIR = obj
- BINDIR = bin
- COMPILEOBJ = $(CC) -c $(CFLAGS) $(OPT_CFLAGS) -o $@ $<
--LINKPROG = $(CC) $(OBJECTS) -o $(PROG) $(LDFLAGS)
-+LINKPROG = $(CC) $(OBJECTS) -o $(PROG) $(LDFLAGS) $(OPT_LDFLAGS)
- PREFIX ?= /usr
- INSTALLDIR = $(PREFIX)/bin
- UNAME_S := $(shell uname -s)
-@@ -157,6 +160,11 @@ LDFLAGS +=-m32
- endif
-
- #
-+# Common linker flags
-+#
-+OPT_LDFLAGS ?=
-+
-+#
- # Optionally disable optimizations. Optimization causes problems on
- # some compilers such as gcc 4.4
- #
diff --git a/acpica-x32.patch b/acpica-x32.patch
deleted file mode 100644
index 1600fb9..0000000
--- a/acpica-x32.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- acpica-unix-20170303/source/include/platform/aclinux.h.orig 2017-06-12 22:05:52.100041265 +0200
-+++ acpica-unix-20170303/source/include/platform/aclinux.h 2017-06-12 22:06:02.790569724 +0200
-@@ -310,7 +310,7 @@
- #define ACPI_FLUSH_CPU_CACHE()
- #define ACPI_CAST_PTHREAD_T(Pthread) ((ACPI_THREAD_ID) (Pthread))
-
--#if defined(__ia64__) || defined(__x86_64__) ||\
-+#if defined(__ia64__) || (defined(__x86_64__) && !defined(__ILP32__)) ||\
- defined(__aarch64__) || defined(__PPC64__) ||\
- defined(__s390x__)
- #define ACPI_MACHINE_WIDTH 64
diff --git a/aslcodegen.patch b/aslcodegen.patch
new file mode 100644
index 0000000..57b8819
--- /dev/null
+++ b/aslcodegen.patch
@@ -0,0 +1,29 @@
+Changes in the handling of comments caused some length fields to be used
+in new ways. The new way broke the existing adaptation for big endian
+support; this patch repairs that adaptation.
+
+Signed-off-by: Al Stone <ahs3 at redhat.com>
+
+Index: acpica-unix2-20181003/source/compiler/aslcodegen.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/compiler/aslcodegen.c
++++ acpica-unix2-20181003/source/compiler/aslcodegen.c
+@@ -494,8 +494,7 @@ CgWriteTableHeader (
+
+ /* Table length. Checksum zero for now, will rewrite later */
+
+- DWord = sizeof (ACPI_TABLE_HEADER) + Op->Asl.AmlSubtreeLength;
+- ACPI_MOVE_32_TO_32(&AslGbl_TableHeader.Length, &DWord);
++ AslGbl_TableHeader.Length = sizeof (ACPI_TABLE_HEADER) + Op->Asl.AmlSubtreeLength;
+
+ /* Calculate the comment lengths for this definition block parseOp */
+
+@@ -541,6 +540,8 @@ CgWriteTableHeader (
+ CvDbgPrint (" Length: %u\n", CommentLength);
+ }
+ }
++ DWord = AslGbl_TableHeader.Length;
++ ACPI_MOVE_32_TO_32(&AslGbl_TableHeader.Length, &DWord);
+
+ AslGbl_TableHeader.Checksum = 0;
+ Op->Asl.FinalAmlOffset = ftell (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle);
diff --git a/asllookup-miscompare.patch b/asllookup-miscompare.patch
deleted file mode 100644
index 9b2305c..0000000
--- a/asllookup-miscompare.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-Make AslLookup endian independent
-
-From: Al Stone <ahs3 at redhat.com>
-
-
----
- source/compiler/asllookup.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-Index: acpica-unix2-20161222/source/compiler/asllookup.c
-===================================================================
---- acpica-unix2-20161222.orig/source/compiler/asllookup.c
-+++ acpica-unix2-20161222/source/compiler/asllookup.c
-@@ -119,6 +119,7 @@ LkIsObjectUsed (
- {
- ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
- ACPI_NAMESPACE_NODE *Next;
-+ ACPI_NAME_UNION tmp, tmp2;
- ASL_METHOD_LOCAL *MethodLocals;
- ASL_METHOD_LOCAL *MethodArgs;
- UINT32 i;
-@@ -228,8 +229,10 @@ LkIsObjectUsed (
- * Issue a remark even if it is a reserved name (starts
- * with an underscore).
- */
-+ ACPI_MOVE_32_TO_32(&tmp.Ascii, Node->Name.Ascii);
-+ ACPI_MOVE_32_TO_32(&tmp2.Ascii, Next->Name.Ascii);
- sprintf (MsgBuffer, "Name [%4.4s] is within a method [%4.4s]",
-- Node->Name.Ascii, Next->Name.Ascii);
-+ tmp.Ascii, tmp2.Ascii);
- AslError (ASL_REMARK, ASL_MSG_NOT_REFERENCED,
- LkGetNameOp (Node->Op), MsgBuffer);
- return (AE_OK);
diff --git a/asllookup-ppc64.patch b/asllookup-ppc64.patch
deleted file mode 100644
index cef59c4..0000000
--- a/asllookup-ppc64.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-Make sure AslLookup operates correctly on ppc64, too
-
-From: Al Stone <ahs3 at redhat.com>
-
-
----
- source/compiler/asllookup.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-Index: acpica-unix2-20161222/source/compiler/asllookup.c
-===================================================================
---- acpica-unix2-20161222.orig/source/compiler/asllookup.c
-+++ acpica-unix2-20161222/source/compiler/asllookup.c
-@@ -176,7 +176,8 @@ LkIsObjectUsed (
- * We ignore the predefined methods since often, not
- * all arguments are needed or used.
- */
-- if ((Node->Name.Ascii[0] != '_') &&
-+ ACPI_MOVE_32_TO_32(&tmp.Ascii, Node->Name.Ascii);
-+ if ((tmp.Ascii[0] != '_') &&
- (!(MethodArgs[i].Flags & ASL_ARG_REFERENCED)))
- {
- sprintf (MsgBuffer, "Arg%u", i);
diff --git a/be-tpm2.patch b/be-tpm2.patch
new file mode 100644
index 0000000..f807bf5
--- /dev/null
+++ b/be-tpm2.patch
@@ -0,0 +1,41 @@
+Index: acpica-unix-20180508/source/compiler/dttable2.c
+===================================================================
+--- acpica-unix-20181031/source/compiler/dttable2.c.orig 2018-11-18 21:47:12.950401024 +0100
++++ acpica-unix-20181031/source/compiler/dttable2.c 2018-11-20 05:42:52.529088619 +0100
+@@ -1962,6 +1962,7 @@ DtCompileTpm2 (
+ DT_SUBTABLE *ParentTable;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_TABLE_HEADER *Header;
++ UINT32 Tmp32;
+
+
+ ParentTable = DtPeekSubtable ();
+@@ -2005,7 +2006,8 @@ DtCompileTpm2 (
+
+ /* Subtable type depends on the StartMethod */
+
+- switch (Tpm2Header->StartMethod)
++ ACPI_MOVE_32_TO_32(&Tmp32, &Tpm2Header->StartMethod);
++ switch (Tmp32)
+ {
+ case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
+
+@@ -2035,16 +2037,14 @@ DtCompileTpm2 (
+ case ACPI_TPM2_RESERVED9:
+ case ACPI_TPM2_RESERVED10:
+
+- AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n",
+- Tpm2Header->StartMethod);
++ AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n", Tmp32);
+ Status = AE_ERROR;
+ break;
+
+ case ACPI_TPM2_NOT_ALLOWED:
+ default:
+
+- AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n",
+- Tpm2Header->StartMethod);
++ AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n", Tmp32);
+ Status = AE_ERROR;
+ break;
+ }
diff --git a/big-endian-v2.patch b/big-endian-v2.patch
new file mode 100644
index 0000000..600a43d
--- /dev/null
+++ b/big-endian-v2.patch
@@ -0,0 +1,19 @@
+Updated versions of upstream often contain fixes that were not seen
+in the original big-endian patch; we try to capture those here.
+
+Signed-off-by: Al Stone <ahs3 at redhat.com>
+
+Index: acpica-unix-20180508/source/compiler/asllookup.c
+===================================================================
+--- acpica-unix-20180508.orig/source/compiler/asllookup.c
++++ acpica-unix-20180508/source/compiler/asllookup.c
+@@ -249,7 +249,8 @@ LkIsObjectUsed (
+ * ACPI names and are typically not referenced since they are meant
+ * to be called by the host OS.
+ */
+- if (Node->Name.Ascii[0] == '_')
++ ACPI_MOVE_32_TO_32(&tmp.Ascii, Node->Name.Ascii);
++ if (tmp.Ascii[0] == '_')
+ {
+ return (AE_OK);
+ }
diff --git a/cve-2017-13693.patch b/cve-2017-13693.patch
new file mode 100644
index 0000000..eb88be8
--- /dev/null
+++ b/cve-2017-13693.patch
@@ -0,0 +1,99 @@
+From 987a3b5cf7175916e2a4b6ea5b8e70f830dfe732 Mon Sep 17 00:00:00 2001
+From: Seunghun Han <kkamagui at gmail.com>
+Date: Wed, 19 Jul 2017 16:47:53 +0900
+Subject: [PATCH] acpi: acpica: fix acpi operand cache leak in dswstate.c
+
+I found an ACPI cache leak in ACPI early termination and boot continuing case.
+
+When early termination occurs due to malicious ACPI table, Linux kernel
+terminates ACPI function and continues to boot process. While kernel terminates
+ACPI function, kmem_cache_destroy() reports Acpi-Operand cache leak.
+
+Boot log of ACPI operand cache leak is as follows:
+>[ 0.585957] ACPI: Added _OSI(Module Device)
+>[ 0.587218] ACPI: Added _OSI(Processor Device)
+>[ 0.588530] ACPI: Added _OSI(3.0 _SCP Extensions)
+>[ 0.589790] ACPI: Added _OSI(Processor Aggregator Device)
+>[ 0.591534] ACPI Error: Illegal I/O port address/length above 64K: C806E00000004002/0x2 (20170303/hwvalid-155)
+>[ 0.594351] ACPI Exception: AE_LIMIT, Unable to initialize fixed events (20170303/evevent-88)
+>[ 0.597858] ACPI: Unable to start the ACPI Interpreter
+>[ 0.599162] ACPI Error: Could not remove SCI handler (20170303/evmisc-281)
+>[ 0.601836] kmem_cache_destroy Acpi-Operand: Slab cache still has objects
+>[ 0.603556] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.12.0-rc5 #26
+>[ 0.605159] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
+>[ 0.609177] Call Trace:
+>[ 0.610063] ? dump_stack+0x5c/0x81
+>[ 0.611118] ? kmem_cache_destroy+0x1aa/0x1c0
+>[ 0.612632] ? acpi_sleep_proc_init+0x27/0x27
+>[ 0.613906] ? acpi_os_delete_cache+0xa/0x10
+>[ 0.617986] ? acpi_ut_delete_caches+0x3f/0x7b
+>[ 0.619293] ? acpi_terminate+0xa/0x14
+>[ 0.620394] ? acpi_init+0x2af/0x34f
+>[ 0.621616] ? __class_create+0x4c/0x80
+>[ 0.623412] ? video_setup+0x7f/0x7f
+>[ 0.624585] ? acpi_sleep_proc_init+0x27/0x27
+>[ 0.625861] ? do_one_initcall+0x4e/0x1a0
+>[ 0.627513] ? kernel_init_freeable+0x19e/0x21f
+>[ 0.628972] ? rest_init+0x80/0x80
+>[ 0.630043] ? kernel_init+0xa/0x100
+>[ 0.631084] ? ret_from_fork+0x25/0x30
+>[ 0.633343] vgaarb: loaded
+>[ 0.635036] EDAC MC: Ver: 3.0.0
+>[ 0.638601] PCI: Probing PCI hardware
+>[ 0.639833] PCI host bridge to bus 0000:00
+>[ 0.641031] pci_bus 0000:00: root bus resource [io 0x0000-0xffff]
+> ... Continue to boot and log is omitted ...
+
+I analyzed this memory leak in detail and found acpi_ds_obj_stack_pop_and_
+delete() function miscalculated the top of the stack. acpi_ds_obj_stack_push()
+function uses walk_state->operand_index for start position of the top, but
+acpi_ds_obj_stack_pop_and_delete() function considers index 0 for it.
+Therefore, this causes acpi operand memory leak.
+
+This cache leak causes a security threat because an old kernel (<= 4.9) shows
+memory locations of kernel functions in stack dump. Some malicious users
+could use this information to neutralize kernel ASLR.
+
+I made a patch to fix ACPI operand cache leak.
+
+Signed-off-by: Seunghun Han <kkamagui at gmail.com>
+
+Github-Location: https://github.com/acpica/acpica/pull/295/commits/987a3b5cf7175916e2a4b6ea5b8e70f830dfe732
+---
+ source/components/dispatcher/dsutils.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+Index: acpica-unix-20180508/source/components/dispatcher/dsutils.c
+===================================================================
+--- acpica-unix-20180508.orig/source/components/dispatcher/dsutils.c
++++ acpica-unix-20180508/source/components/dispatcher/dsutils.c
+@@ -761,6 +761,8 @@ AcpiDsCreateOperands (
+ ACPI_PARSE_OBJECT *Arguments[ACPI_OBJ_NUM_OPERANDS];
+ UINT32 ArgCount = 0;
+ UINT32 Index = WalkState->NumOperands;
++ UINT32 PrevNumOperands = WalkState->NumOperands;
++ UINT32 NewNumOperands;
+ UINT32 i;
+
+
+@@ -793,6 +795,7 @@ AcpiDsCreateOperands (
+
+ /* Create the interpreter arguments, in reverse order */
+
++ NewNumOperands = Index;
+ Index--;
+ for (i = 0; i < ArgCount; i++)
+ {
+@@ -820,7 +823,11 @@ Cleanup:
+ * pop everything off of the operand stack and delete those
+ * objects
+ */
+- AcpiDsObjStackPopAndDelete (ArgCount, WalkState);
++ WalkState->NumOperands = i;
++ AcpiDsObjStackPopAndDelete (NewNumOperands, WalkState);
++
++ /* Restore operand count */
++ WalkState->NumOperands = PrevNumOperands;
+
+ ACPI_EXCEPTION ((AE_INFO, Status, "While creating Arg %u", Index));
+ return_ACPI_STATUS (Status);
diff --git a/cve-2017-13694.patch b/cve-2017-13694.patch
new file mode 100644
index 0000000..5b42ce0
--- /dev/null
+++ b/cve-2017-13694.patch
@@ -0,0 +1,216 @@
+From 4a0243ecb4c94e2d73510d096c5ea4d0711fc6c0 Mon Sep 17 00:00:00 2001
+From: Seunghun Han <kkamagui at gmail.com>
+Date: Fri, 23 Jun 2017 14:19:48 +0900
+Subject: [PATCH] acpi: acpica: fix acpi parse and parseext cache leaks
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+I'm Seunghun Han, and I work for National Security Research Institute of
+South Korea.
+
+I have been doing a research on ACPI and found an ACPI cache leak in ACPI
+early abort cases.
+
+Boot log of ACPI cache leak is as follows:
+[ 0.352414] ACPI: Added _OSI(Module Device)
+[ 0.353182] ACPI: Added _OSI(Processor Device)
+[ 0.353182] ACPI: Added _OSI(3.0 _SCP Extensions)
+[ 0.353182] ACPI: Added _OSI(Processor Aggregator Device)
+[ 0.356028] ACPI: Unable to start the ACPI Interpreter
+[ 0.356799] ACPI Error: Could not remove SCI handler (20170303/evmisc-281)
+[ 0.360215] kmem_cache_destroy Acpi-State: Slab cache still has objects
+[ 0.360648] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G W
+4.12.0-rc4-next-20170608+ #10
+[ 0.361273] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS
+VirtualBox 12/01/2006
+[ 0.361873] Call Trace:
+[ 0.362243] ? dump_stack+0x5c/0x81
+[ 0.362591] ? kmem_cache_destroy+0x1aa/0x1c0
+[ 0.362944] ? acpi_sleep_proc_init+0x27/0x27
+[ 0.363296] ? acpi_os_delete_cache+0xa/0x10
+[ 0.363646] ? acpi_ut_delete_caches+0x6d/0x7b
+[ 0.364000] ? acpi_terminate+0xa/0x14
+[ 0.364000] ? acpi_init+0x2af/0x34f
+[ 0.364000] ? __class_create+0x4c/0x80
+[ 0.364000] ? video_setup+0x7f/0x7f
+[ 0.364000] ? acpi_sleep_proc_init+0x27/0x27
+[ 0.364000] ? do_one_initcall+0x4e/0x1a0
+[ 0.364000] ? kernel_init_freeable+0x189/0x20a
+[ 0.364000] ? rest_init+0xc0/0xc0
+[ 0.364000] ? kernel_init+0xa/0x100
+[ 0.364000] ? ret_from_fork+0x25/0x30
+
+I analyzed this memory leak in detail. I found that “Acpi-State” cache and
+“Acpi-Parse” cache were merged because the size of cache objects was same
+slab cache size.
+
+I finally found “Acpi-Parse” cache and “Acpi-ParseExt” cache were leaked
+using SLAB_NEVER_MERGE flag in kmem_cache_create() function.
+
+Real ACPI cache leak point is as follows:
+[ 0.360101] ACPI: Added _OSI(Module Device)
+[ 0.360101] ACPI: Added _OSI(Processor Device)
+[ 0.360101] ACPI: Added _OSI(3.0 _SCP Extensions)
+[ 0.361043] ACPI: Added _OSI(Processor Aggregator Device)
+[ 0.364016] ACPI: Unable to start the ACPI Interpreter
+[ 0.365061] ACPI Error: Could not remove SCI handler (20170303/evmisc-281)
+[ 0.368174] kmem_cache_destroy Acpi-Parse: Slab cache still has objects
+[ 0.369332] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G W
+4.12.0-rc4-next-20170608+ #8
+[ 0.371256] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS
+VirtualBox 12/01/2006
+[ 0.372000] Call Trace:
+[ 0.372000] ? dump_stack+0x5c/0x81
+[ 0.372000] ? kmem_cache_destroy+0x1aa/0x1c0
+[ 0.372000] ? acpi_sleep_proc_init+0x27/0x27
+[ 0.372000] ? acpi_os_delete_cache+0xa/0x10
+[ 0.372000] ? acpi_ut_delete_caches+0x56/0x7b
+[ 0.372000] ? acpi_terminate+0xa/0x14
+[ 0.372000] ? acpi_init+0x2af/0x34f
+[ 0.372000] ? __class_create+0x4c/0x80
+[ 0.372000] ? video_setup+0x7f/0x7f
+[ 0.372000] ? acpi_sleep_proc_init+0x27/0x27
+[ 0.372000] ? do_one_initcall+0x4e/0x1a0
+[ 0.372000] ? kernel_init_freeable+0x189/0x20a
+[ 0.372000] ? rest_init+0xc0/0xc0
+[ 0.372000] ? kernel_init+0xa/0x100
+[ 0.372000] ? ret_from_fork+0x25/0x30
+[ 0.388039] kmem_cache_destroy Acpi-ParseExt: Slab cache still has objects
+[ 0.389063] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G W
+4.12.0-rc4-next-20170608+ #8
+[ 0.390557] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS
+VirtualBox 12/01/2006
+[ 0.392000] Call Trace:
+[ 0.392000] ? dump_stack+0x5c/0x81
+[ 0.392000] ? kmem_cache_destroy+0x1aa/0x1c0
+[ 0.392000] ? acpi_sleep_proc_init+0x27/0x27
+[ 0.392000] ? acpi_os_delete_cache+0xa/0x10
+[ 0.392000] ? acpi_ut_delete_caches+0x6d/0x7b
+[ 0.392000] ? acpi_terminate+0xa/0x14
+[ 0.392000] ? acpi_init+0x2af/0x34f
+[ 0.392000] ? __class_create+0x4c/0x80
+[ 0.392000] ? video_setup+0x7f/0x7f
+[ 0.392000] ? acpi_sleep_proc_init+0x27/0x27
+[ 0.392000] ? do_one_initcall+0x4e/0x1a0
+[ 0.392000] ? kernel_init_freeable+0x189/0x20a
+[ 0.392000] ? rest_init+0xc0/0xc0
+[ 0.392000] ? kernel_init+0xa/0x100
+[ 0.392000] ? ret_from_fork+0x25/0x30
+
+When early abort is occurred due to invalid ACPI information, Linux kernel
+terminates ACPI by calling acpi_terminate() function. The function calls
+acpi_ut_delete_caches() function to delete local caches (acpi_gbl_namespace_
+cache, state_cache, operand_cache, ps_node_cache, ps_node_ext_cache).
+
+But the deletion codes in acpi_ut_delete_caches() function only delete
+slab caches using kmem_cache_destroy() function, therefore the cache
+objects should be flushed before acpi_ut_delete_caches() function.
+
+“Acpi-Parse” cache and “Acpi-ParseExt” cache are used in an AML parse
+function, acpi_ps_parse_loop(). The function should have flush codes to
+handle an error state due to invalid AML codes.
+
+This cache leak has a security threat because an old kernel (<= 4.9) shows
+memory locations of kernel functions in stack dump. Some malicious users
+could use this information to neutralize kernel ASLR.
+
+To fix ACPI cache leak for enhancing security, I made a patch which has
+flush codes in acpi_ps_parse_loop() function.
+
+I hope that this patch improves the security of Linux kernel.
+
+Thank you.
+
+Signed-off-by: Seunghun Han <kkamagui at gmail.com>
+
+Github-Location: https://github.com/acpica/acpica/pull/278/commits/4a0243ecb4c94e2d73510d096c5ea4d0711fc6c0
+
+---
+ source/components/parser/psobject.c | 44 ++++++++++++++-----------------------
+ 1 file changed, 16 insertions(+), 28 deletions(-)
+
+Index: acpica-unix-20180508/source/components/parser/psobject.c
+===================================================================
+--- acpica-unix-20180508.orig/source/components/parser/psobject.c
++++ acpica-unix-20180508/source/components/parser/psobject.c
+@@ -709,7 +709,8 @@ AcpiPsCompleteFinalOp (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_STATUS Status)
+ {
+- ACPI_STATUS Status2;
++ ACPI_STATUS ReturnStatus = AE_OK;
++ BOOLEAN Ascending = TRUE;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState);
+@@ -726,7 +727,7 @@ AcpiPsCompleteFinalOp (
+ {
+ if (Op)
+ {
+- if (WalkState->AscendingCallback != NULL)
++ if (Ascending && WalkState->AscendingCallback != NULL)
+ {
+ WalkState->Op = Op;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+@@ -745,41 +746,28 @@ AcpiPsCompleteFinalOp (
+
+ if (Status == AE_CTRL_TERMINATE)
+ {
+- Status = AE_OK;
+-
+- /* Clean up */
+- do
+- {
+- if (Op)
+- {
+- Status2 = AcpiPsCompleteThisOp (WalkState, Op);
+- if (ACPI_FAILURE (Status2))
+- {
+- return_ACPI_STATUS (Status2);
+- }
+- }
+-
+- AcpiPsPopScope (&(WalkState->ParserState), &Op,
+- &WalkState->ArgTypes, &WalkState->ArgCount);
+-
+- } while (Op);
+-
+- return_ACPI_STATUS (Status);
++ Ascending = FALSE;
++ ReturnStatus = AE_CTRL_TERMINATE;
+ }
+
+ else if (ACPI_FAILURE (Status))
+ {
+ /* First error is most important */
+
+- (void) AcpiPsCompleteThisOp (WalkState, Op);
+- return_ACPI_STATUS (Status);
++ Ascending = FALSE;
++ ReturnStatus = Status;
+ }
+ }
+
+- Status2 = AcpiPsCompleteThisOp (WalkState, Op);
+- if (ACPI_FAILURE (Status2))
++ Status = AcpiPsCompleteThisOp (WalkState, Op);
++ if (ACPI_FAILURE (Status))
+ {
+- return_ACPI_STATUS (Status2);
++ Ascending = FALSE;
++ if (ACPI_SUCCESS (ReturnStatus) ||
++ ReturnStatus == AE_CTRL_TERMINATE)
++ {
++ ReturnStatus = Status;
++ }
+ }
+ }
+
+@@ -788,5 +776,5 @@ AcpiPsCompleteFinalOp (
+
+ } while (Op);
+
+- return_ACPI_STATUS (Status);
++ return_ACPI_STATUS (ReturnStatus);
+ }
diff --git a/cve-2017-13695.patch b/cve-2017-13695.patch
new file mode 100644
index 0000000..499946b
--- /dev/null
+++ b/cve-2017-13695.patch
@@ -0,0 +1,90 @@
+From 37f2c716f2c6ab14c3ba557a539c3ee3224931b5 Mon Sep 17 00:00:00 2001
+From: Seunghun Han <kkamagui at gmail.com>
+Date: Wed, 19 Jul 2017 17:04:44 +0900
+Subject: [PATCH] acpi: acpica: fix acpi operand cache leak in nseval.c
+
+I found an ACPI cache leak in ACPI early termination and boot continuing case.
+
+When early termination occurs due to malicious ACPI table, Linux kernel
+terminates ACPI function and continues to boot process. While kernel terminates
+ACPI function, kmem_cache_destroy() reports Acpi-Operand cache leak.
+
+Boot log of ACPI operand cache leak is as follows:
+>[ 0.464168] ACPI: Added _OSI(Module Device)
+>[ 0.467022] ACPI: Added _OSI(Processor Device)
+>[ 0.469376] ACPI: Added _OSI(3.0 _SCP Extensions)
+>[ 0.471647] ACPI: Added _OSI(Processor Aggregator Device)
+>[ 0.477997] ACPI Error: Null stack entry at ffff880215c0aad8 (20170303/exresop-174)
+>[ 0.482706] ACPI Exception: AE_AML_INTERNAL, While resolving operands for [OpcodeName unavailable] (20170303/dswexec-461)
+>[ 0.487503] ACPI Error: Method parse/execution failed [\DBG] (Node ffff88021710ab40), AE_AML_INTERNAL (20170303/psparse-543)
+>[ 0.492136] ACPI Error: Method parse/execution failed [\_SB._INI] (Node ffff88021710a618), AE_AML_INTERNAL (20170303/psparse-543)
+>[ 0.497683] ACPI: Interpreter enabled
+>[ 0.499385] ACPI: (supports S0)
+>[ 0.501151] ACPI: Using IOAPIC for interrupt routing
+>[ 0.503342] ACPI Error: Null stack entry at ffff880215c0aad8 (20170303/exresop-174)
+>[ 0.506522] ACPI Exception: AE_AML_INTERNAL, While resolving operands for [OpcodeName unavailable] (20170303/dswexec-461)
+>[ 0.510463] ACPI Error: Method parse/execution failed [\DBG] (Node ffff88021710ab40), AE_AML_INTERNAL (20170303/psparse-543)
+>[ 0.514477] ACPI Error: Method parse/execution failed [\_PIC] (Node ffff88021710ab18), AE_AML_INTERNAL (20170303/psparse-543)
+>[ 0.518867] ACPI Exception: AE_AML_INTERNAL, Evaluating _PIC (20170303/bus-991)
+>[ 0.522384] kmem_cache_destroy Acpi-Operand: Slab cache still has objects
+>[ 0.524597] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.12.0-rc5 #26
+>[ 0.526795] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
+>[ 0.529668] Call Trace:
+>[ 0.530811] ? dump_stack+0x5c/0x81
+>[ 0.532240] ? kmem_cache_destroy+0x1aa/0x1c0
+>[ 0.533905] ? acpi_os_delete_cache+0xa/0x10
+>[ 0.535497] ? acpi_ut_delete_caches+0x3f/0x7b
+>[ 0.537237] ? acpi_terminate+0xa/0x14
+>[ 0.538701] ? acpi_init+0x2af/0x34f
+>[ 0.540008] ? acpi_sleep_proc_init+0x27/0x27
+>[ 0.541593] ? do_one_initcall+0x4e/0x1a0
+>[ 0.543008] ? kernel_init_freeable+0x19e/0x21f
+>[ 0.546202] ? rest_init+0x80/0x80
+>[ 0.547513] ? kernel_init+0xa/0x100
+>[ 0.548817] ? ret_from_fork+0x25/0x30
+>[ 0.550587] vgaarb: loaded
+>[ 0.551716] EDAC MC: Ver: 3.0.0
+>[ 0.553744] PCI: Probing PCI hardware
+>[ 0.555038] PCI host bridge to bus 0000:00
+> ... Continue to boot and log is omitted ...
+
+I analyzed this memory leak in detail and found AcpiNsEvaluate() function
+only removes Info->ReturnObject in AE_CTRL_RETURN_VALUE case. But, when errors
+occur, the status value is not AE_CTRL_RETURN_VALUE, and Info->ReturnObject is
+also not null. Therefore, this causes acpi operand memory leak.
+
+This cache leak causes a security threat because an old kernel (<= 4.9) shows
+memory locations of kernel functions in stack dump. Some malicious users
+could use this information to neutralize kernel ASLR.
+
+I made a patch to fix ACPI operand cache leak.
+
+Signed-off-by: Seunghun Han <kkamagui at gmail.com>
+
+Github-Location: https://github.com/acpica/acpica/pull/296/commits/37f2c716f2c6ab14c3ba557a539c3ee3224931b5
+
+---
+ source/components/namespace/nseval.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+Index: acpica-unix-20180508/source/components/namespace/nseval.c
+===================================================================
+--- acpica-unix-20180508.orig/source/components/namespace/nseval.c
++++ acpica-unix-20180508/source/components/namespace/nseval.c
+@@ -330,6 +330,16 @@ AcpiNsEvaluate (
+ Info->ReturnObject = NULL;
+ }
+ }
++ else if (ACPI_FAILURE(Status))
++ {
++ /* If ReturnObject exists, delete it */
++
++ if (Info->ReturnObject)
++ {
++ AcpiUtRemoveReference (Info->ReturnObject);
++ Info->ReturnObject = NULL;
++ }
++ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "*** Completed evaluation of object %s ***\n",
diff --git a/debian-big_endian.patch b/debian-big_endian.patch
index 19ac6cc..adb6717 100644
--- a/debian-big_endian.patch
+++ b/debian-big_endian.patch
@@ -1,8 +1,13 @@
-Re-use a patch originally created for Debian to enable big-endian
+Big-endian support
-From: Al Stone <ahs3 at redhat.com>
+This is a combined patch that folds all of the past and present changes
+for big-endian support into a single patch, hopefully eliminating any sort
+of redundancy but also capturing all such changes in a single location.
+
+To date, this has been critical for the s390x architecture only.
+
+Signed-off-by: Al Stone <ahs3 at redhat.com>
-support
---
source/compiler/aslcodegen.c | 109 ++++++++++++++++++------------
source/compiler/aslopcodes.c | 4 +
@@ -18,11 +23,11 @@ support
source/include/platform/aclinux.h | 8 ++
12 files changed, 487 insertions(+), 283 deletions(-)
-Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
+Index: acpica-unix2-20181003/source/compiler/aslcodegen.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslcodegen.c
-+++ acpica-unix2-20170224/source/compiler/aslcodegen.c
-@@ -238,16 +238,12 @@ CgWriteAmlOpcode (
+--- acpica-unix2-20181003.orig/source/compiler/aslcodegen.c
++++ acpica-unix2-20181003/source/compiler/aslcodegen.c
+@@ -240,16 +240,12 @@ CgWriteAmlOpcode (
ACPI_PARSE_OBJECT *Op)
{
UINT8 PkgLenFirstByte;
@@ -45,7 +50,7 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
/* We expect some DEFAULT_ARGs, just ignore them */
-@@ -280,51 +276,52 @@ CgWriteAmlOpcode (
+@@ -282,51 +278,52 @@ CgWriteAmlOpcode (
/* Special opcodes for within a field definition */
@@ -109,7 +114,7 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
break;
}
-@@ -335,8 +332,8 @@ CgWriteAmlOpcode (
+@@ -337,8 +334,8 @@ CgWriteAmlOpcode (
if (Op->Asl.AmlPkgLenBytes == 1)
{
/* Simplest case -- no bytes to follow, just write the count */
@@ -120,7 +125,7 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
}
else if (Op->Asl.AmlPkgLenBytes != 0)
{
-@@ -346,7 +343,7 @@ CgWriteAmlOpcode (
+@@ -348,7 +345,7 @@ CgWriteAmlOpcode (
*/
PkgLenFirstByte = (UINT8)
(((UINT32) (Op->Asl.AmlPkgLenBytes - 1) << 6) |
@@ -129,7 +134,7 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
CgLocalWriteAmlData (Op, &PkgLenFirstByte, 1);
-@@ -354,39 +351,47 @@ CgWriteAmlOpcode (
+@@ -356,39 +353,47 @@ CgWriteAmlOpcode (
* Shift the length over by the 4 bits we just stuffed
* in the first byte
*/
@@ -189,7 +194,7 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
break;
case AML_STRING_OP:
-@@ -420,6 +425,7 @@ CgWriteTableHeader (
+@@ -422,6 +427,7 @@ CgWriteTableHeader (
ACPI_PARSE_OBJECT *Op)
{
ACPI_PARSE_OBJECT *Child;
@@ -197,33 +202,33 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
UINT32 CommentLength;
ACPI_COMMENT_NODE *Current;
-@@ -473,7 +479,7 @@ CgWriteTableHeader (
+@@ -475,7 +481,7 @@ CgWriteTableHeader (
/* OEM Revision */
Child = Child->Asl.Next;
-- TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer;
-+ ACPI_MOVE_64_TO_32(&TableHeader.OemRevision, &Child->Asl.Value.Integer);
+- AslGbl_TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer;
++ ACPI_MOVE_64_TO_32(&AslGbl_TableHeader.OemRevision, &Child->Asl.Value.Integer);
/* Compiler ID */
-@@ -481,12 +487,13 @@ CgWriteTableHeader (
+@@ -483,12 +489,13 @@ CgWriteTableHeader (
/* Compiler version */
-- TableHeader.AslCompilerRevision = ACPI_CA_VERSION;
+- AslGbl_TableHeader.AslCompilerRevision = ACPI_CA_VERSION;
+ DWord = ACPI_CA_VERSION;
-+ ACPI_MOVE_32_TO_32(&TableHeader.AslCompilerRevision, &DWord);
++ ACPI_MOVE_32_TO_32(&AslGbl_TableHeader.AslCompilerRevision, &DWord);
/* Table length. Checksum zero for now, will rewrite later */
-- TableHeader.Length = sizeof (ACPI_TABLE_HEADER) +
+- AslGbl_TableHeader.Length = sizeof (ACPI_TABLE_HEADER) +
- Op->Asl.AmlSubtreeLength;
+ DWord = sizeof (ACPI_TABLE_HEADER) + Op->Asl.AmlSubtreeLength;
-+ ACPI_MOVE_32_TO_32(&TableHeader.Length, &DWord);
++ ACPI_MOVE_32_TO_32(&AslGbl_TableHeader.Length, &DWord);
/* Calculate the comment lengths for this definition block parseOp */
-@@ -643,7 +650,10 @@ CgWriteNode (
+@@ -646,7 +653,10 @@ CgWriteNode (
ACPI_PARSE_OBJECT *Op)
{
ASL_RESOURCE_NODE *Rnode;
@@ -234,8 +239,8 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
+ UINT64 QWord;
/* Write all comments here. */
- if (Gbl_CaptureComments)
-@@ -672,13 +682,24 @@ CgWriteNode (
+
+@@ -676,13 +686,24 @@ CgWriteNode (
switch (Op->Asl.AmlOpcode)
{
case AML_RAW_DATA_BYTE:
@@ -263,10 +268,10 @@ Index: acpica-unix2-20170224/source/compiler/aslcodegen.c
case AML_RAW_DATA_BUFFER:
-Index: acpica-unix2-20170224/source/compiler/aslopcodes.c
+Index: acpica-unix2-20181003/source/compiler/aslopcodes.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslopcodes.c
-+++ acpica-unix2-20170224/source/compiler/aslopcodes.c
+--- acpica-unix2-20181003.orig/source/compiler/aslopcodes.c
++++ acpica-unix2-20181003/source/compiler/aslopcodes.c
@@ -485,6 +485,7 @@ OpcDoUnicode (
UINT32 i;
UINT8 *AsciiString;
@@ -285,10 +290,10 @@ Index: acpica-unix2-20170224/source/compiler/aslopcodes.c
}
/*
-Index: acpica-unix2-20170224/source/compiler/aslrestype1.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype1.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype1.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype1.c
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype1.c
++++ acpica-unix2-20181003/source/compiler/aslrestype1.c
@@ -142,6 +142,11 @@ RsDoMemory24Descriptor (
ACPI_PARSE_OBJECT *LengthOp = NULL;
ASL_RESOURCE_NODE *Rnode;
@@ -485,10 +490,10 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype1.c
RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength));
break;
-Index: acpica-unix2-20170224/source/compiler/aslrestype1i.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype1i.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype1i.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype1i.c
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype1i.c
++++ acpica-unix2-20181003/source/compiler/aslrestype1i.c
@@ -198,6 +198,8 @@ RsDoFixedDmaDescriptor (
ACPI_PARSE_OBJECT *InitializerOp;
ASL_RESOURCE_NODE *Rnode;
@@ -625,10 +630,10 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype1i.c
+ ACPI_MOVE_16_TO_16(&Descriptor->Irq.IrqMask, &IrqMask);
return (Rnode);
}
-Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype2.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype2.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype2.c
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype2.c
++++ acpica-unix2-20181003/source/compiler/aslrestype2.c
@@ -76,6 +76,7 @@ RsDoGeneralRegisterDescriptor (
ACPI_PARSE_OBJECT *InitializerOp;
ASL_RESOURCE_NODE *Rnode;
@@ -648,7 +653,40 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
/* Process all child initialization nodes */
-@@ -116,7 +119,8 @@ RsDoGeneralRegisterDescriptor (
+@@ -95,35 +98,52 @@ RsDoGeneralRegisterDescriptor (
+ {
+ case 0: /* Address space */
+
++ /*
+ Descriptor->GenericReg.AddressSpaceId = (UINT8) InitializerOp->Asl.Value.Integer;
++ */
++ ACPI_MOVE_64_TO_8(&Descriptor->GenericReg.AddressSpaceId,
++ &InitializerOp->Asl.Value.Integer);
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESSSPACE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AddressSpaceId));
+ break;
+
+ case 1: /* Register Bit Width */
+
++ /*
+ Descriptor->GenericReg.BitWidth = (UINT8) InitializerOp->Asl.Value.Integer;
++ */
++ ACPI_MOVE_64_TO_8(&Descriptor->GenericReg.BitWidth,
++ &InitializerOp->Asl.Value.Integer);
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITWIDTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitWidth));
+ break;
+
+ case 2: /* Register Bit Offset */
+
++ /*
+ Descriptor->GenericReg.BitOffset = (UINT8) InitializerOp->Asl.Value.Integer;
++ */
++ ACPI_MOVE_64_TO_8(&Descriptor->GenericReg.BitOffset,
++ &InitializerOp->Asl.Value.Integer);
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITOFFSET,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitOffset));
+ break;
case 3: /* Register Address */
@@ -658,7 +696,18 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
RsCreateQwordField (InitializerOp, ACPI_RESTAG_ADDRESS,
CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.Address));
break;
-@@ -177,6 +181,7 @@ RsDoInterruptDescriptor (
+
+ case 4: /* Access Size (ACPI 3.0) */
+
++ /*
+ Descriptor->GenericReg.AccessSize = (UINT8) InitializerOp->Asl.Value.Integer;
++ */
++ ACPI_MOVE_64_TO_8(&Descriptor->GenericReg.AccessSize,
++ &InitializerOp->Asl.Value.Integer);
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ACCESSSIZE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AccessSize));
+
+@@ -177,6 +197,7 @@ RsDoInterruptDescriptor (
AML_RESOURCE *Rover = NULL;
ACPI_PARSE_OBJECT *InitializerOp;
ASL_RESOURCE_NODE *Rnode;
@@ -666,7 +715,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
UINT16 StringLength = 0;
UINT32 OptionIndex = 0;
UINT32 CurrentByteOffset;
-@@ -225,7 +230,7 @@ RsDoInterruptDescriptor (
+@@ -225,7 +246,7 @@ RsDoInterruptDescriptor (
* Initial descriptor length -- may be enlarged if there are
* optional fields present
*/
@@ -675,7 +724,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
Descriptor->ExtendedIrq.InterruptCount = 0;
Rover = ACPI_CAST_PTR (AML_RESOURCE,
-@@ -333,10 +338,11 @@ RsDoInterruptDescriptor (
+@@ -333,10 +354,11 @@ RsDoInterruptDescriptor (
/* Save the integer and move pointer to the next one */
@@ -689,7 +738,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
/* Case 7: First interrupt number in list */
-@@ -372,7 +378,7 @@ RsDoInterruptDescriptor (
+@@ -372,7 +394,7 @@ RsDoInterruptDescriptor (
{
Rover->ByteItem = ResSourceIndex;
Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->ByteItem), 1);
@@ -698,7 +747,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
}
/* Add optional ResSource string if present */
-@@ -384,14 +390,15 @@ RsDoInterruptDescriptor (
+@@ -384,14 +406,15 @@ RsDoInterruptDescriptor (
Rover = ACPI_ADD_PTR (
AML_RESOURCE, &(Rover->ByteItem), StringLength);
@@ -716,7 +765,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
return (Rnode);
}
-@@ -439,7 +446,7 @@ RsDoVendorLargeDescriptor (
+@@ -439,7 +462,7 @@ RsDoVendorLargeDescriptor (
Descriptor = Rnode->Buffer;
Descriptor->VendorLarge.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_LARGE;
@@ -725,10 +774,10 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2.c
/* Point to end-of-descriptor for vendor data */
-Index: acpica-unix2-20170224/source/compiler/aslrestype2d.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype2d.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype2d.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype2d.c
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype2d.c
++++ acpica-unix2-20181003/source/compiler/aslrestype2d.c
@@ -79,7 +79,13 @@ RsDoDwordIoDescriptor (
ACPI_PARSE_OBJECT *GranOp = NULL;
ASL_RESOURCE_NODE *Rnode;
@@ -1084,10 +1133,10 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2d.c
Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
OptionIndex + StringLength;
return (Rnode);
-Index: acpica-unix2-20170224/source/compiler/aslrestype2e.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype2e.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype2e.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype2e.c
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype2e.c
++++ acpica-unix2-20181003/source/compiler/aslrestype2e.c
@@ -78,6 +78,13 @@ RsDoExtendedIoDescriptor (
ACPI_PARSE_OBJECT *GranOp = NULL;
ASL_RESOURCE_NODE *Rnode;
@@ -1193,10 +1242,10 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2e.c
Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) +
StringLength;
return (Rnode);
-Index: acpica-unix2-20170224/source/compiler/aslrestype2q.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype2q.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype2q.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype2q.c
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype2q.c
++++ acpica-unix2-20181003/source/compiler/aslrestype2q.c
@@ -80,7 +80,13 @@ RsDoQwordIoDescriptor (
ASL_RESOURCE_NODE *Rnode;
UINT8 *OptionalFields;
@@ -1535,11 +1584,11 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2q.c
Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
OptionIndex + StringLength;
return (Rnode);
-Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype2s.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype2s.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype2s.c
-@@ -290,6 +290,9 @@ RsDoGpioIntDescriptor (
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype2s.c
++++ acpica-unix2-20181003/source/compiler/aslrestype2s.c
+@@ -340,9 +340,14 @@ RsDoGpioIntDescriptor (
UINT16 VendorLength;
UINT16 InterruptLength;
UINT16 DescriptorSize;
@@ -1549,7 +1598,37 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
UINT32 CurrentByteOffset;
UINT32 PinCount = 0;
UINT32 i;
-@@ -346,21 +349,21 @@ RsDoGpioIntDescriptor (
++ UINT16 Tmp16;
++ UINT16 Val16;
+
+
+ InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+@@ -367,7 +372,7 @@ RsDoGpioIntDescriptor (
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ Descriptor = Rnode->Buffer;
+- Descriptor->Gpio.ResourceLength = DescriptorSize;
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.ResourceLength, &DescriptorSize);
+ Descriptor->Gpio.DescriptorType = ACPI_RESOURCE_NAME_GPIO;
+ Descriptor->Gpio.RevisionId = AML_RESOURCE_GPIO_REVISION;
+ Descriptor->Gpio.ConnectionType = AML_RESOURCE_GPIO_TYPE_INT;
+@@ -382,11 +387,11 @@ RsDoGpioIntDescriptor (
+
+ /* Setup offsets within the descriptor */
+
+- Descriptor->Gpio.PinTableOffset = (UINT16)
+- ACPI_PTR_DIFF (InterruptList, Descriptor);
++ Tmp16 = (UINT16) ACPI_PTR_DIFF (InterruptList, Descriptor);
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.PinTableOffset, &Tmp16);
+
+- Descriptor->Gpio.ResSourceOffset = (UINT16)
+- ACPI_PTR_DIFF (ResourceSource, Descriptor);
++ Tmp16 = (UINT16) ACPI_PTR_DIFF (ResourceSource, Descriptor);
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.ResSourceOffset, &Tmp16);
+
+ /* Process all child initialization nodes */
+
+@@ -396,21 +401,21 @@ RsDoGpioIntDescriptor (
{
case 0: /* Interrupt Mode - edge/level [Flag] (_MOD) */
@@ -1574,7 +1653,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3, 2);
break;
-@@ -374,7 +377,7 @@ RsDoGpioIntDescriptor (
+@@ -424,7 +429,7 @@ RsDoGpioIntDescriptor (
case 4: /* Debounce Timeout [WORD] (_DBT) */
@@ -1583,7 +1662,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateWordField (InitializerOp, ACPI_RESTAG_DEBOUNCETIME,
CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DebounceTimeout));
break;
-@@ -401,7 +404,7 @@ RsDoGpioIntDescriptor (
+@@ -451,7 +456,7 @@ RsDoGpioIntDescriptor (
case 7: /* Resource Usage (consumer/producer) */
@@ -1592,7 +1671,50 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
break;
case 8: /* Resource Tag (Descriptor Name) */
-@@ -466,6 +469,10 @@ RsDoGpioIntDescriptor (
+@@ -466,13 +471,14 @@ RsDoGpioIntDescriptor (
+ * This field is required in order to calculate the length
+ * of the ResourceSource at runtime.
+ */
+- Descriptor->Gpio.VendorOffset = (UINT16)
+- ACPI_PTR_DIFF (VendorData, Descriptor);
++ Tmp16 = (UINT16) ACPI_PTR_DIFF (VendorData, Descriptor);
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.VendorOffset, &Tmp16);
+
+ if (RsGetVendorData (InitializerOp, VendorData,
+- (CurrentByteOffset + Descriptor->Gpio.VendorOffset)))
++ (CurrentByteOffset + Tmp16)))
+ {
+- Descriptor->Gpio.VendorLength = VendorLength;
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.VendorLength,
++ &VendorLength);
+ }
+ break;
+
+@@ -485,7 +491,9 @@ RsDoGpioIntDescriptor (
+ * (implies resource source must immediately follow the pin list.)
+ * Name: _PIN
+ */
+- *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer;
++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer;
++ ACPI_MOVE_16_TO_16(&Val16, &Tmp16);
++ *InterruptList = Val16;
+ InterruptList++;
+ PinCount++;
+
+@@ -507,8 +515,10 @@ RsDoGpioIntDescriptor (
+
+ /* Create a named field at the start of the list */
+
+- RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN,
+- CurrentByteOffset + Descriptor->Gpio.PinTableOffset);
++ ACPI_MOVE_16_TO_16(&Tmp16, &Descriptor->Gpio.PinTableOffset);
++ Tmp16 += CurrentByteOffset;
++ ACPI_MOVE_16_TO_16(&Val16, &Tmp16);
++ RsCreateWordField (InitializerOp, ACPI_RESTAG_PIN, Val16);
+ }
+ break;
+ }
+@@ -516,6 +526,10 @@ RsDoGpioIntDescriptor (
InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
}
@@ -1603,7 +1725,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
MpSaveGpioInfo (Info->MappingOp, Descriptor,
PinCount, PinList, ResourceSource);
return (Rnode);
-@@ -499,6 +506,10 @@ RsDoGpioIoDescriptor (
+@@ -549,9 +563,15 @@ RsDoGpioIoDescriptor (
UINT16 VendorLength;
UINT16 InterruptLength;
UINT16 DescriptorSize;
@@ -1614,7 +1736,37 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
UINT32 CurrentByteOffset;
UINT32 PinCount = 0;
UINT32 i;
-@@ -555,7 +566,7 @@ RsDoGpioIoDescriptor (
++ UINT16 Tmp16;
++ UINT16 Val16;
+
+
+ InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+@@ -577,7 +597,7 @@ RsDoGpioIoDescriptor (
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ Descriptor = Rnode->Buffer;
+- Descriptor->Gpio.ResourceLength = DescriptorSize;
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.ResourceLength, &DescriptorSize);
+ Descriptor->Gpio.DescriptorType = ACPI_RESOURCE_NAME_GPIO;
+ Descriptor->Gpio.RevisionId = AML_RESOURCE_GPIO_REVISION;
+ Descriptor->Gpio.ConnectionType = AML_RESOURCE_GPIO_TYPE_IO;
+@@ -591,11 +611,11 @@ RsDoGpioIoDescriptor (
+
+ /* Setup offsets within the descriptor */
+
+- Descriptor->Gpio.PinTableOffset = (UINT16)
+- ACPI_PTR_DIFF (InterruptList, Descriptor);
++ Tmp16 = (UINT16) ACPI_PTR_DIFF (InterruptList, Descriptor);
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.PinTableOffset, &Tmp16);
+
+- Descriptor->Gpio.ResSourceOffset = (UINT16)
+- ACPI_PTR_DIFF (ResourceSource, Descriptor);
++ Tmp16 = (UINT16) ACPI_PTR_DIFF (ResourceSource, Descriptor);
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.ResSourceOffset, &Tmp16);
+
+ /* Process all child initialization nodes */
+
+@@ -605,7 +625,7 @@ RsDoGpioIoDescriptor (
{
case 0: /* Share Type [Flags] (_SHR) */
@@ -1623,7 +1775,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3);
break;
-@@ -569,21 +580,21 @@ RsDoGpioIoDescriptor (
+@@ -619,21 +639,21 @@ RsDoGpioIoDescriptor (
case 2: /* Debounce Timeout [WORD] (_DBT) */
@@ -1648,7 +1800,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_IORESTRICTION,
CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 0, 2);
break;
-@@ -609,7 +620,7 @@ RsDoGpioIoDescriptor (
+@@ -659,7 +679,7 @@ RsDoGpioIoDescriptor (
case 7: /* Resource Usage (consumer/producer) */
@@ -1657,7 +1809,36 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
break;
case 8: /* Resource Tag (Descriptor Name) */
-@@ -673,6 +684,11 @@ RsDoGpioIoDescriptor (
+@@ -673,13 +693,14 @@ RsDoGpioIoDescriptor (
+ * This field is required in order to calculate the length
+ * of the ResourceSource at runtime.
+ */
+- Descriptor->Gpio.VendorOffset = (UINT16)
+- ACPI_PTR_DIFF (VendorData, Descriptor);
++ Tmp16 = (UINT16) ACPI_PTR_DIFF (VendorData, Descriptor);
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.VendorOffset, &Tmp16);
+
+ if (RsGetVendorData (InitializerOp, VendorData,
+ (CurrentByteOffset + Descriptor->Gpio.VendorOffset)))
+ {
+- Descriptor->Gpio.VendorLength = VendorLength;
++ ACPI_MOVE_16_TO_16(&Descriptor->Gpio.VendorLength,
++ &VendorLength);
+ }
+ break;
+
+@@ -692,7 +713,9 @@ RsDoGpioIoDescriptor (
+ * (implies resource source must immediately follow the pin list.)
+ * Name: _PIN
+ */
+- *InterruptList = (UINT16) InitializerOp->Asl.Value.Integer;
++ Tmp16 = (UINT16) InitializerOp->Asl.Value.Integer;
++ ACPI_MOVE_16_TO_16(&Val16, &Tmp16);
++ *InterruptList = Val16;
+ InterruptList++;
+ PinCount++;
+
+@@ -723,6 +746,11 @@ RsDoGpioIoDescriptor (
InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
}
@@ -1669,7 +1850,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
MpSaveGpioInfo (Info->MappingOp, Descriptor,
PinCount, PinList, ResourceSource);
return (Rnode);
-@@ -703,6 +719,9 @@ RsDoI2cSerialBusDescriptor (
+@@ -753,8 +781,12 @@ RsDoI2cSerialBusDescriptor (
UINT16 ResSourceLength;
UINT16 VendorLength;
UINT16 DescriptorSize;
@@ -1678,8 +1859,28 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
+ UINT16 TypeSpecificFlags = 0;
UINT32 CurrentByteOffset;
UINT32 i;
++ UINT16 Tmp16;
+
-@@ -752,7 +771,7 @@ RsDoI2cSerialBusDescriptor (
+ InitializerOp = Info->DescriptorTypeOp->Asl.Child;
+@@ -777,12 +809,14 @@ RsDoI2cSerialBusDescriptor (
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ Descriptor = Rnode->Buffer;
+- Descriptor->I2cSerialBus.ResourceLength = DescriptorSize;
++ ACPI_MOVE_16_TO_16(&Descriptor->I2cSerialBus.ResourceLength,
++ &DescriptorSize);
+ Descriptor->I2cSerialBus.DescriptorType = ACPI_RESOURCE_NAME_SERIAL_BUS;
+ Descriptor->I2cSerialBus.RevisionId = AML_RESOURCE_I2C_REVISION;
+ Descriptor->I2cSerialBus.TypeRevisionId = AML_RESOURCE_I2C_TYPE_REVISION;
+ Descriptor->I2cSerialBus.Type = AML_RESOURCE_I2C_SERIALBUSTYPE;
+- Descriptor->I2cSerialBus.TypeDataLength = AML_RESOURCE_I2C_MIN_DATA_LEN + VendorLength;
++ Tmp16 = AML_RESOURCE_I2C_MIN_DATA_LEN + VendorLength;
++ ACPI_MOVE_16_TO_16(&Descriptor->I2cSerialBus.TypeDataLength, &Tmp16);
+
+ if (Info->DescriptorTypeOp->Asl.ParseOpcode == PARSEOP_I2C_SERIALBUS_V2)
+ {
+@@ -802,7 +836,7 @@ RsDoI2cSerialBusDescriptor (
{
case 0: /* Slave Address [WORD] (_ADR) */
@@ -1688,7 +1889,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS,
CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.SlaveAddress));
break;
-@@ -766,14 +785,14 @@ RsDoI2cSerialBusDescriptor (
+@@ -816,14 +850,14 @@ RsDoI2cSerialBusDescriptor (
case 2: /* Connection Speed [DWORD] (_SPE) */
@@ -1705,7 +1906,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.TypeSpecificFlags), 0);
break;
-@@ -833,6 +852,9 @@ RsDoI2cSerialBusDescriptor (
+@@ -883,6 +917,9 @@ RsDoI2cSerialBusDescriptor (
InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
}
@@ -1715,7 +1916,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
return (Rnode);
}
-@@ -862,6 +884,9 @@ RsDoSpiSerialBusDescriptor (
+@@ -912,6 +949,9 @@ RsDoSpiSerialBusDescriptor (
UINT16 ResSourceLength;
UINT16 VendorLength;
UINT16 DescriptorSize;
@@ -1725,7 +1926,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
UINT32 CurrentByteOffset;
UINT32 i;
-@@ -912,21 +937,21 @@ RsDoSpiSerialBusDescriptor (
+@@ -962,21 +1002,21 @@ RsDoSpiSerialBusDescriptor (
{
case 0: /* Device Selection [WORD] (_ADR) */
@@ -1750,7 +1951,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 0);
break;
-@@ -947,7 +972,7 @@ RsDoSpiSerialBusDescriptor (
+@@ -997,7 +1037,7 @@ RsDoSpiSerialBusDescriptor (
case 5: /* Connection Speed [DWORD] (_SPE) */
@@ -1759,7 +1960,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED,
CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ConnectionSpeed));
break;
-@@ -1021,6 +1046,10 @@ RsDoSpiSerialBusDescriptor (
+@@ -1071,6 +1111,10 @@ RsDoSpiSerialBusDescriptor (
InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
}
@@ -1770,7 +1971,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
return (Rnode);
}
-@@ -1050,6 +1079,10 @@ RsDoUartSerialBusDescriptor (
+@@ -1100,6 +1144,10 @@ RsDoUartSerialBusDescriptor (
UINT16 ResSourceLength;
UINT16 VendorLength;
UINT16 DescriptorSize;
@@ -1781,7 +1982,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
UINT32 CurrentByteOffset;
UINT32 i;
-@@ -1099,21 +1132,21 @@ RsDoUartSerialBusDescriptor (
+@@ -1149,21 +1197,21 @@ RsDoUartSerialBusDescriptor (
{
case 0: /* Connection Speed (Baud Rate) [DWORD] (_SPE) */
@@ -1806,7 +2007,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_STOPBITS,
CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 2, 2);
break;
-@@ -1127,7 +1160,7 @@ RsDoUartSerialBusDescriptor (
+@@ -1177,7 +1225,7 @@ RsDoUartSerialBusDescriptor (
case 4: /* Endianness [Flag] (_END) */
@@ -1815,7 +2016,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateBitField (InitializerOp, ACPI_RESTAG_ENDIANNESS,
CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 7);
break;
-@@ -1141,21 +1174,21 @@ RsDoUartSerialBusDescriptor (
+@@ -1191,21 +1239,21 @@ RsDoUartSerialBusDescriptor (
case 6: /* Flow Control [Flags] (_FLC) */
@@ -1840,7 +2041,7 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_TX,
CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TxFifoSize));
break;
-@@ -1225,6 +1258,11 @@ RsDoUartSerialBusDescriptor (
+@@ -1275,6 +1323,11 @@ RsDoUartSerialBusDescriptor (
InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
}
@@ -1852,10 +2053,10 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2s.c
MpSaveSerialInfo (Info->MappingOp, Descriptor, ResourceSource);
return (Rnode);
}
-Index: acpica-unix2-20170224/source/compiler/aslrestype2w.c
+Index: acpica-unix2-20181003/source/compiler/aslrestype2w.c
===================================================================
---- acpica-unix2-20170224.orig/source/compiler/aslrestype2w.c
-+++ acpica-unix2-20170224/source/compiler/aslrestype2w.c
+--- acpica-unix2-20181003.orig/source/compiler/aslrestype2w.c
++++ acpica-unix2-20181003/source/compiler/aslrestype2w.c
@@ -81,6 +81,12 @@ RsDoWordIoDescriptor (
UINT8 *OptionalFields;
UINT16 StringLength = 0;
@@ -2199,29 +2400,39 @@ Index: acpica-unix2-20170224/source/compiler/aslrestype2w.c
Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
OptionIndex + StringLength;
return (Rnode);
-Index: acpica-unix2-20170224/source/include/acmacros.h
+Index: acpica-unix2-20181003/source/include/acmacros.h
===================================================================
---- acpica-unix2-20170224.orig/source/include/acmacros.h
-+++ acpica-unix2-20170224/source/include/acmacros.h
-@@ -100,7 +100,8 @@
+--- acpica-unix2-20181003.orig/source/include/acmacros.h
++++ acpica-unix2-20181003/source/include/acmacros.h
+@@ -98,9 +98,12 @@
+ ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
+ ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
- /* 32-bit source, 16/32/64 destination */
+-/* 32-bit source, 16/32/64 destination */
++/* 32-bit source, 8/16/32/64 destination */
-#define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */
++#define ACPI_MOVE_32_TO_8(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];}
++
+#define ACPI_MOVE_32_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];}
#define ACPI_MOVE_32_TO_32(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\
(( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];\
-@@ -115,9 +116,13 @@
+@@ -113,11 +116,17 @@
+ ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
+ ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
- /* 64-bit source, 16/32/64 destination */
+-/* 64-bit source, 16/32/64 destination */
++/* 64-bit source, 8/16/32/64 destination */
-#define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */
-+#define ACPI_MOVE_64_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
-+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];}
++#define ACPI_MOVE_64_TO_8(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];}
-#define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */
++#define ACPI_MOVE_64_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
++ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];}
++
+#define ACPI_MOVE_64_TO_32(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\
+ (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[5];\
@@ -2229,22 +2440,53 @@ Index: acpica-unix2-20170224/source/include/acmacros.h
#define ACPI_MOVE_64_TO_64(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
(( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\
-@@ -144,7 +149,9 @@
+@@ -136,20 +145,26 @@
- /* 32-bit source, 16/32/64 destination */
+ /* The hardware supports unaligned transfers, just do the little-endian move */
--#define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */
+-/* 16-bit source, 16/32/64 destination */
++/* 16-bit source, 8/16/32/64 destination */
+
++#define ACPI_MOVE_16_TO_8(d, s) *(UINT8 *)(void *)(d) = *(UINT16 *)(void *)(s)
+ #define ACPI_MOVE_16_TO_16(d, s) *(UINT16 *)(void *)(d) = *(UINT16 *)(void *)(s)
+ #define ACPI_MOVE_16_TO_32(d, s) *(UINT32 *)(void *)(d) = *(UINT16 *)(void *)(s)
+ #define ACPI_MOVE_16_TO_64(d, s) *(UINT64 *)(void *)(d) = *(UINT16 *)(void *)(s)
+
+-/* 32-bit source, 16/32/64 destination */
++/* 32-bit source, 8/16/32/64 destination */
++
++#define ACPI_MOVE_32_TO_8(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];}
++
+#define ACPI_MOVE_32_TO_16(d, s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];}
-+
+
+-#define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */
#define ACPI_MOVE_32_TO_32(d, s) *(UINT32 *)(void *)(d) = *(UINT32 *)(void *)(s)
#define ACPI_MOVE_32_TO_64(d, s) *(UINT64 *)(void *)(d) = *(UINT32 *)(void *)(s)
-Index: acpica-unix2-20170224/source/include/platform/aclinux.h
+-/* 64-bit source, 16/32/64 destination */
++/* 64-bit source, 8/16/32/64 destination */
+
++#define ACPI_MOVE_64_TO_8(d, s) ACPI_MOVE_16_TO_8(d, s) /* Truncate to 8 */
+ #define ACPI_MOVE_64_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */
+ #define ACPI_MOVE_64_TO_32(d, s) ACPI_MOVE_32_TO_32(d, s) /* Truncate to 32 */
+ #define ACPI_MOVE_64_TO_64(d, s) *(UINT64 *)(void *)(d) = *(UINT64 *)(void *)(s)
+@@ -169,7 +184,9 @@
+ #define ACPI_MOVE_16_TO_32(d, s) {(*(UINT32 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);}
+ #define ACPI_MOVE_16_TO_64(d, s) {(*(UINT64 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d, s);}
+
+-/* 32-bit source, 16/32/64 destination */
++/* 32-bit source, 8/16/32/64 destination */
++
++#define ACPI_MOVE_32_TO_8(d, s) ACPI_MOVE_16_TO_8(d, s) /* Truncate to 8 */
+
+ #define ACPI_MOVE_32_TO_16(d, s) ACPI_MOVE_16_TO_16(d, s) /* Truncate to 16 */
+
+Index: acpica-unix2-20181003/source/include/platform/aclinux.h
===================================================================
---- acpica-unix2-20170224.orig/source/include/platform/aclinux.h
-+++ acpica-unix2-20170224/source/include/platform/aclinux.h
-@@ -185,6 +185,7 @@
+--- acpica-unix2-20181003.orig/source/include/platform/aclinux.h
++++ acpica-unix2-20181003/source/include/platform/aclinux.h
+@@ -193,6 +193,7 @@
#ifdef ACPI_USE_STANDARD_HEADERS
#include <unistd.h>
@@ -2252,3 +2494,4114 @@ Index: acpica-unix2-20170224/source/include/platform/aclinux.h
#endif
/* Define/disable kernel-specific declarators */
+@@ -227,6 +228,10 @@
+ #define __cdecl
+ #endif
+
++#if defined(__PPC64__) || defined(__s390x__)
++#define ACPI_BIG_ENDIAN
++#endif
++
+ #endif /* __KERNEL__ */
+
+ #endif /* __ACLINUX_H__ */
+Index: acpica-unix2-20181003/source/compiler/aslanalyze.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/compiler/aslanalyze.c
++++ acpica-unix2-20181003/source/compiler/aslanalyze.c
+@@ -461,7 +461,7 @@ ApCheckForGpeNameConflict (
+
+ /* Need a null-terminated string version of NameSeg */
+
+- ACPI_MOVE_32_TO_32 (Name, &Op->Asl.NameSeg);
++ ACPI_MOVE_NAME (Name, &Op->Asl.NameSeg);
+ Name[ACPI_NAME_SIZE] = 0;
+
+ /*
+@@ -488,7 +488,7 @@ ApCheckForGpeNameConflict (
+ * We are now sure we have an _Lxx or _Exx.
+ * Create the target name that would cause collision (Flip E/L)
+ */
+- ACPI_MOVE_32_TO_32 (Target, Name);
++ ACPI_MOVE_NAME (Target, Name);
+
+ /* Inject opposite letter ("L" versus "E") */
+
+Index: acpica-unix2-20181003/source/compiler/asllookup.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/compiler/asllookup.c
++++ acpica-unix2-20181003/source/compiler/asllookup.c
+@@ -119,6 +119,7 @@ LkIsObjectUsed (
+ {
+ ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
+ ACPI_NAMESPACE_NODE *Next;
++ ACPI_NAME_UNION tmp, tmp2;
+ ASL_METHOD_LOCAL *MethodLocals;
+ ASL_METHOD_LOCAL *MethodArgs;
+ UINT32 i;
+@@ -175,7 +176,8 @@ LkIsObjectUsed (
+ * We ignore the predefined methods since often, not
+ * all arguments are needed or used.
+ */
+- if ((Node->Name.Ascii[0] != '_') &&
++ ACPI_MOVE_32_TO_32(&tmp.Ascii, Node->Name.Ascii);
++ if ((tmp.Ascii[0] != '_') &&
+ (!(MethodArgs[i].Flags & ASL_ARG_REFERENCED)))
+ {
+ sprintf (AslGbl_MsgBuffer, "Arg%u", i);
+@@ -228,8 +230,10 @@ LkIsObjectUsed (
+ * Issue a remark even if it is a reserved name (starts
+ * with an underscore).
+ */
++ ACPI_MOVE_32_TO_32(&tmp.Ascii, Node->Name.Ascii);
++ ACPI_MOVE_32_TO_32(&tmp2.Ascii, Next->Name.Ascii);
+ sprintf (AslGbl_MsgBuffer, "Name [%4.4s] is within a method [%4.4s]",
+- Node->Name.Ascii, Next->Name.Ascii);
++ tmp.Ascii, tmp2.Ascii);
+ AslError (ASL_REMARK, ASL_MSG_NOT_REFERENCED,
+ LkGetNameOp (Node->Op), AslGbl_MsgBuffer);
+ return (AE_OK);
+Index: acpica-unix2-20181003/source/compiler/aslmain.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/compiler/aslmain.c
++++ acpica-unix2-20181003/source/compiler/aslmain.c
+@@ -101,18 +101,6 @@ main (
+
+ signal (SIGINT, AslSignalHandler);
+
+- /*
+- * Big-endian machines are not currently supported. ACPI tables must
+- * be little-endian, and support for big-endian machines needs to
+- * be implemented.
+- */
+- if (UtIsBigEndianMachine ())
+- {
+- fprintf (stderr,
+- "iASL is not currently supported on big-endian machines.\n");
+- return (-1);
+- }
+-
+ AcpiOsInitialize ();
+ ACPI_DEBUG_INITIALIZE (); /* For debug version only */
+
+Index: acpica-unix2-20181003/source/common/acfileio.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/common/acfileio.c
++++ acpica-unix2-20181003/source/common/acfileio.c
+@@ -280,6 +280,7 @@ AcGetOneTableFromFile (
+ ACPI_TABLE_HEADER *Table;
+ INT32 Count;
+ long TableOffset;
++ UINT32 TableLen;
+
+
+ *ReturnTable = NULL;
+@@ -319,7 +320,8 @@ AcGetOneTableFromFile (
+
+ /* Allocate a buffer for the entire table */
+
+- Table = AcpiOsAllocate ((ACPI_SIZE) TableHeader.Length);
++ ACPI_MOVE_32_TO_32(&TableLen, &TableHeader.Length);
++ Table = AcpiOsAllocate ((ACPI_SIZE) TableLen);
+ if (!Table)
+ {
+ return (AE_NO_MEMORY);
+@@ -329,13 +331,13 @@ AcGetOneTableFromFile (
+
+ fseek (File, TableOffset, SEEK_SET);
+
+- Count = fread (Table, 1, TableHeader.Length, File);
++ Count = fread (Table, 1, TableLen, File);
+
+ /*
+ * Checks for data table headers happen later in the execution. Only verify
+ * for Aml tables at this point in the code.
+ */
+- if (GetOnlyAmlTables && Count != (INT32) TableHeader.Length)
++ if (GetOnlyAmlTables && Count != TableLen)
+ {
+ Status = AE_ERROR;
+ goto ErrorExit;
+@@ -343,7 +345,7 @@ AcGetOneTableFromFile (
+
+ /* Validate the checksum (just issue a warning) */
+
+- Status = AcpiTbVerifyChecksum (Table, TableHeader.Length);
++ Status = AcpiTbVerifyChecksum (Table, TableLen);
+ if (ACPI_FAILURE (Status))
+ {
+ Status = AcCheckTextModeCorruption (Table);
+@@ -435,6 +437,7 @@ AcValidateTableHeader (
+ ACPI_SIZE Actual;
+ long OriginalOffset;
+ UINT32 FileSize;
++ UINT32 TableLength;
+ UINT32 i;
+
+
+@@ -464,11 +467,12 @@ AcValidateTableHeader (
+ /* Validate table length against bytes remaining in the file */
+
+ FileSize = CmGetFileSize (File);
+- if (TableHeader.Length > (UINT32) (FileSize - TableOffset))
++ ACPI_MOVE_32_TO_32(&TableLength, &TableHeader.Length);
++ if (TableLength > (UINT32) (FileSize - TableOffset))
+ {
+ fprintf (stderr, "Table [%4.4s] is too long for file - "
+ "needs: 0x%.2X, remaining in file: 0x%.2X\n",
+- TableHeader.Signature, TableHeader.Length,
++ TableHeader.Signature, TableLength,
+ (UINT32) (FileSize - TableOffset));
+ return (AE_BAD_HEADER);
+ }
+Index: acpica-unix2-20181003/source/common/dmtable.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/common/dmtable.c
++++ acpica-unix2-20181003/source/common/dmtable.c
+@@ -550,7 +550,7 @@ AcpiDmDumpDataTable (
+ */
+ if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
+ {
+- Length = Table->Length;
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -564,13 +564,14 @@ AcpiDmDumpDataTable (
+ else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT))
+ {
+ Length = AcpiDmDumpS3pt (Table);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ }
+ else
+ {
+ /*
+ * All other tables must use the common ACPI table header, dump it now
+ */
+- Length = Table->Length;
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -781,6 +782,7 @@ AcpiDmDumpTable (
+ BOOLEAN LastOutputBlankLine = FALSE;
+ ACPI_STATUS Status;
+ char RepairedName[8];
++ UINT16 Val16;
+
+
+ if (!Info)
+@@ -1177,8 +1179,9 @@ AcpiDmDumpTable (
+ /* Checksum, display and validate */
+
+ AcpiOsPrintf ("%2.2X", *Target);
+- Temp8 = AcpiDmGenerateChecksum (Table,
+- ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
++ ACPI_MOVE_32_TO_32(&Temp32,
++ &ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length);
++ Temp8 = AcpiDmGenerateChecksum (Table, Temp32,
+ ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
+
+ if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
+@@ -1243,14 +1246,14 @@ AcpiDmDumpTable (
+
+ /* DMAR subtable types */
+
+- Temp16 = ACPI_GET16 (Target);
++ Val16 = ACPI_GET16 (Target);
++ ACPI_MOVE_16_TO_16(&Temp16, &Val16);
+ if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
+ {
+ Temp16 = ACPI_DMAR_TYPE_RESERVED;
+ }
+
+- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
+- AcpiDmDmarSubnames[Temp16]);
++ AcpiOsPrintf (UINT16_FORMAT, Temp16, AcpiDmDmarSubnames[Temp16]);
+ break;
+
+ case ACPI_DMT_DMAR_SCOPE:
+@@ -1341,14 +1344,14 @@ AcpiDmDumpTable (
+
+ /* HEST subtable types */
+
+- Temp16 = ACPI_GET16 (Target);
++ Val16 = ACPI_GET16 (Target);
++ ACPI_MOVE_16_TO_16(&Temp16, &Val16);
+ if (Temp16 > ACPI_HEST_TYPE_RESERVED)
+ {
+ Temp16 = ACPI_HEST_TYPE_RESERVED;
+ }
+
+- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
+- AcpiDmHestSubnames[Temp16]);
++ AcpiOsPrintf (UINT16_FORMAT, Temp16, AcpiDmHestSubnames[Temp16]);
+ break;
+
+ case ACPI_DMT_HESTNTFY:
+@@ -1428,13 +1431,14 @@ AcpiDmDumpTable (
+
+ /* NFIT subtable types */
+
+- Temp16 = ACPI_GET16 (Target);
++ Val16 = ACPI_GET16 (Target);
++ ACPI_MOVE_16_TO_16(&Temp16, &Val16);
+ if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
+ {
+ Temp16 = ACPI_NFIT_TYPE_RESERVED;
+ }
+
+- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
++ AcpiOsPrintf (UINT16_FORMAT, Temp16,
+ AcpiDmNfitSubnames[Temp16]);
+ break;
+
+Index: acpica-unix2-20181003/source/common/dmtables.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/common/dmtables.c
++++ acpica-unix2-20181003/source/common/dmtables.c
+@@ -142,7 +142,9 @@ AdCreateTableHeader (
+ ACPI_TABLE_HEADER *Table)
+ {
+ UINT8 Checksum;
+-
++ UINT32 TableLen;
++ UINT32 OemRev;
++ UINT32 CompilerRev;
+
+ /* Reset globals for External statements */
+
+@@ -154,9 +156,10 @@ AdCreateTableHeader (
+ */
+ AdDisassemblerHeader (Filename, ACPI_IS_AML_TABLE);
+
++ ACPI_MOVE_32_TO_32(&TableLen, &Table->Length);
+ AcpiOsPrintf (" * Original Table Header:\n");
+ AcpiOsPrintf (" * Signature \"%4.4s\"\n", Table->Signature);
+- AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", Table->Length, Table->Length);
++ AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", TableLen, TableLen);
+
+ /* Print and validate the revision */
+
+@@ -188,7 +191,7 @@ AdCreateTableHeader (
+
+ AcpiOsPrintf ("\n * Checksum 0x%2.2X", Table->Checksum);
+
+- Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length);
++ Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), TableLen);
+ if (Checksum)
+ {
+ AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X",
+@@ -198,9 +201,11 @@ AdCreateTableHeader (
+ AcpiOsPrintf ("\n");
+ AcpiOsPrintf (" * OEM ID \"%.6s\"\n", Table->OemId);
+ AcpiOsPrintf (" * OEM Table ID \"%.8s\"\n", Table->OemTableId);
+- AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision);
++ ACPI_MOVE_32_TO_32(&OemRev, &Table->OemRevision);
++ AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", OemRev, OemRev);
+ AcpiOsPrintf (" * Compiler ID \"%.4s\"\n", Table->AslCompilerId);
+- AcpiOsPrintf (" * Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision);
++ ACPI_MOVE_32_TO_32(&CompilerRev, &Table->AslCompilerRevision);
++ AcpiOsPrintf (" * Compiler Version 0x%8.8X (%u)\n", CompilerRev, CompilerRev);
+ AcpiOsPrintf (" */\n");
+
+ /*
+@@ -221,7 +226,7 @@ AdCreateTableHeader (
+ AcpiOsPrintf (
+ "DefinitionBlock (\"\", \"%4.4s\", %hu, \"%.6s\", \"%.8s\", 0x%8.8X)\n",
+ Table->Signature, Table->Revision,
+- Table->OemId, Table->OemTableId, Table->OemRevision);
++ Table->OemId, Table->OemTableId, OemRev);
+ }
+
+
+@@ -396,7 +401,8 @@ AdParseTable (
+
+ fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature);
+
+- AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
++ ACPI_MOVE_32_TO_32(&AmlLength, &Table->Length);
++ AmlLength -= sizeof (ACPI_TABLE_HEADER);
+ AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
+ ASL_CV_INIT_FILETREE(Table, AmlStart, AmlLength);
+
+Index: acpica-unix2-20181003/source/common/dmtbdump.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/common/dmtbdump.c
++++ acpica-unix2-20181003/source/common/dmtbdump.c
+@@ -277,6 +277,8 @@ AcpiDmDumpRsdt (
+ UINT32 Entries;
+ UINT32 Offset;
+ UINT32 i;
++ UINT32 Length;
++ UINT32 Address;
+
+
+ /* Point to start of table pointer array */
+@@ -286,12 +288,14 @@ AcpiDmDumpRsdt (
+
+ /* RSDT uses 32-bit pointers */
+
+- Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Entries = (Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
+
+ for (i = 0; i < Entries; i++)
+ {
+ AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
+- AcpiOsPrintf ("%8.8X\n", Array[i]);
++ ACPI_MOVE_32_TO_32(&Address, &Array[i]);
++ AcpiOsPrintf ("%8.8X\n", Address);
+ Offset += sizeof (UINT32);
+ }
+ }
+@@ -317,6 +321,8 @@ AcpiDmDumpXsdt (
+ UINT32 Entries;
+ UINT32 Offset;
+ UINT32 i;
++ UINT32 Length;
++ UINT64 Address;
+
+
+ /* Point to start of table pointer array */
+@@ -326,12 +332,14 @@ AcpiDmDumpXsdt (
+
+ /* XSDT uses 64-bit pointers */
+
+- Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Entries = (Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
+
+ for (i = 0; i < Entries; i++)
+ {
+ AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
+- AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
++ ACPI_MOVE_64_TO_64(&Address, &Array[i]);
++ AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Address));
+ Offset += sizeof (UINT64);
+ }
+ }
+@@ -358,12 +366,12 @@ AcpiDmDumpFadt (
+ ACPI_TABLE_HEADER *Table)
+ {
+ ACPI_STATUS Status;
+-
++ UINT32 Length;
+
+ /* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
+- AcpiDmTableInfoFadt1);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFadt1);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -371,11 +379,9 @@ AcpiDmDumpFadt (
+
+ /* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
+
+- if ((Table->Length > ACPI_FADT_V1_SIZE) &&
+- (Table->Length <= ACPI_FADT_V2_SIZE))
++ if ((Length > ACPI_FADT_V1_SIZE) && (Length <= ACPI_FADT_V2_SIZE))
+ {
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
+- AcpiDmTableInfoFadt2);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFadt2);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -384,10 +390,9 @@ AcpiDmDumpFadt (
+
+ /* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
+
+- else if (Table->Length > ACPI_FADT_V2_SIZE)
++ else if (Length > ACPI_FADT_V2_SIZE)
+ {
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
+- AcpiDmTableInfoFadt3);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFadt3);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -395,9 +400,9 @@ AcpiDmDumpFadt (
+
+ /* Check for FADT revision 5 fields and up (ACPI 5.0+) */
+
+- if (Table->Length > ACPI_FADT_V3_SIZE)
++ if (Length > ACPI_FADT_V3_SIZE)
+ {
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
++ Status = AcpiDmDumpTable (Length, 0, Table, 0,
+ AcpiDmTableInfoFadt5);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -407,9 +412,9 @@ AcpiDmDumpFadt (
+
+ /* Check for FADT revision 6 fields and up (ACPI 6.0+) */
+
+- if (Table->Length > ACPI_FADT_V3_SIZE)
++ if (Length > ACPI_FADT_V3_SIZE)
+ {
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
++ Status = AcpiDmDumpTable (Length, 0, Table, 0,
+ AcpiDmTableInfoFadt6);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -420,11 +425,11 @@ AcpiDmDumpFadt (
+
+ /* Validate various fields in the FADT, including length */
+
+- AcpiTbCreateLocalFadt (Table, Table->Length);
++ AcpiTbCreateLocalFadt (Table, Length);
+
+ /* Validate FADT length against the revision */
+
+- AcpiDmValidateFadtLength (Table->Revision, Table->Length);
++ AcpiDmValidateFadtLength (Table->Revision, Length);
+ }
+
+
+@@ -450,6 +455,7 @@ AcpiDmValidateFadtLength (
+ UINT32 Length)
+ {
+ UINT32 ExpectedLength;
++ UINT32 Tmp32;
+
+
+ switch (Revision)
+@@ -485,7 +491,8 @@ AcpiDmValidateFadtLength (
+ return;
+ }
+
+- if (Length == ExpectedLength)
++ ACPI_MOVE_32_TO_32(&Tmp32, &Length);
++ if (Tmp32 == ExpectedLength)
+ {
+ return;
+ }
+@@ -493,5 +500,5 @@ AcpiDmValidateFadtLength (
+ AcpiOsPrintf (
+ "\n// ACPI Warning: FADT revision %X does not match length: "
+ "found %X expected %X\n",
+- Revision, Length, ExpectedLength);
++ Revision, Tmp32, ExpectedLength);
+ }
+Index: acpica-unix2-20181003/source/common/dmtbdump1.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/common/dmtbdump1.c
++++ acpica-unix2-20181003/source/common/dmtbdump1.c
+@@ -79,17 +79,21 @@ AcpiDmDumpAsf (
+ UINT32 DataOffset = 0;
+ UINT32 i;
+ UINT8 Type;
++ UINT32 Len;
++ UINT16 SubLen;
+
+
+ /* No main table, only subtables */
+
++ ACPI_MOVE_32_TO_32(&Len, &Table->Length);
+ Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Len)
+ {
+ /* Common subtable header */
+
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Subtable->Header.Length, AcpiDmTableInfoAsfHdr);
++ ACPI_MOVE_16_TO_16(&SubLen, &Subtable->Header.Length);
++ Status = AcpiDmDumpTable (Len, Offset, Subtable,
++ SubLen, AcpiDmTableInfoAsfHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -146,8 +150,7 @@ AcpiDmDumpAsf (
+ return;
+ }
+
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Subtable->Header.Length, InfoTable);
++ Status = AcpiDmDumpTable (Len, Offset, Subtable, SubLen, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -163,7 +166,7 @@ AcpiDmDumpAsf (
+ for (i = 0; i < DataCount; i++)
+ {
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, DataOffset,
++ Status = AcpiDmDumpTable (Len, DataOffset,
+ DataTable, DataLength, DataInfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -209,15 +212,14 @@ AcpiDmDumpAsf (
+
+ /* Point to next subtable */
+
+- if (!Subtable->Header.Length)
++ if (!SubLen)
+ {
+ AcpiOsPrintf ("Invalid zero subtable header length\n");
+ return;
+ }
+
+- Offset += Subtable->Header.Length;
+- Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable,
+- Subtable->Header.Length);
++ Offset += SubLen;
++ Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable, SubLen);
+ }
+ }
+
+@@ -241,12 +243,13 @@ AcpiDmDumpCpep (
+ {
+ ACPI_STATUS Status;
+ ACPI_CPEP_POLLING *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_CPEP);
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -256,7 +259,7 @@ AcpiDmDumpCpep (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ AcpiOsPrintf ("\n");
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+@@ -296,7 +299,10 @@ AcpiDmDumpCsrt (
+ ACPI_CSRT_GROUP *Subtable;
+ ACPI_CSRT_SHARED_INFO *SharedInfoTable;
+ ACPI_CSRT_DESCRIPTOR *SubSubtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
++ UINT32 SubLength;
++ UINT32 SubSubLength;
++ UINT32 SharedInfoLength;
+ UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
+ UINT32 SubOffset;
+ UINT32 SubSubOffset;
+@@ -307,14 +313,16 @@ AcpiDmDumpCsrt (
+
+ /* Subtables (Resource Groups) */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Resource group subtable */
+
+ AcpiOsPrintf ("\n");
++ ACPI_MOVE_32_TO_32(&SubLength, &Subtable->Length);
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+- Subtable->Length, AcpiDmTableInfoCsrt0);
++ SubLength, AcpiDmTableInfoCsrt0);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -334,19 +342,20 @@ AcpiDmDumpCsrt (
+ return;
+ }
+
+- SubOffset += Subtable->SharedInfoLength;
++ ACPI_MOVE_32_TO_32(&SharedInfoLength, &Subtable->SharedInfoLength);
++ SubOffset += SharedInfoLength;
+
+ /* Sub-Subtables (Resource Descriptors) */
+
+ SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
+ Offset + SubOffset);
+
+- while ((SubOffset < Subtable->Length) &&
+- ((Offset + SubOffset) < Table->Length))
++ while ((SubOffset < SubLength) && ((Offset + SubOffset) < Length))
+ {
+ AcpiOsPrintf ("\n");
++ ACPI_MOVE_32_TO_32(&SubSubLength, &SubSubtable->Length);
+ Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
+- SubSubtable->Length, AcpiDmTableInfoCsrt2);
++ SubSubLength, AcpiDmTableInfoCsrt2);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -356,7 +365,7 @@ AcpiDmDumpCsrt (
+
+ /* Resource-specific info buffer */
+
+- InfoLength = SubSubtable->Length - SubSubOffset;
++ InfoLength = SubSubLength - SubSubOffset;
+ if (InfoLength)
+ {
+ Status = AcpiDmDumpTable (Length,
+@@ -371,16 +380,15 @@ AcpiDmDumpCsrt (
+
+ /* Point to next sub-subtable */
+
+- SubOffset += SubSubtable->Length;
++ SubOffset += SubSubLength;
+ SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
+- SubSubtable->Length);
++ SubSubLength);
+ }
+
+ /* Point to next subtable */
+
+- Offset += Subtable->Length;
+- Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
+- Subtable->Length);
++ Offset += SubLength;
++ Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, SubLength);
+ }
+ }
+
+@@ -404,16 +412,20 @@ AcpiDmDumpDbg2 (
+ {
+ ACPI_STATUS Status;
+ ACPI_DBG2_DEVICE *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
++ UINT16 SubLength;
+ UINT32 Offset = sizeof (ACPI_TABLE_DBG2);
+ UINT32 i;
+ UINT32 ArrayOffset;
+ UINT32 AbsoluteOffset;
+ UINT8 *Array;
++ UINT16 Tmp16;
++ UINT16 AlsoTmp16;
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDbg2);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -423,11 +435,12 @@ AcpiDmDumpDbg2 (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ AcpiOsPrintf ("\n");
++ ACPI_MOVE_16_TO_16(&SubLength, &Subtable->Length);
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+- Subtable->Length, AcpiDmTableInfoDbg2Device);
++ SubLength, AcpiDmTableInfoDbg2Device);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -437,13 +450,13 @@ AcpiDmDumpDbg2 (
+
+ for (i = 0; i < Subtable->RegisterCount; i++)
+ {
+- ArrayOffset = Subtable->BaseAddressOffset +
+- (sizeof (ACPI_GENERIC_ADDRESS) * i);
++ ACPI_MOVE_16_TO_16(&Tmp16, &Subtable->BaseAddressOffset);
++ ArrayOffset = Tmp16 + (sizeof (ACPI_GENERIC_ADDRESS) * i);
+ AbsoluteOffset = Offset + ArrayOffset;
+ Array = (UINT8 *) Subtable + ArrayOffset;
+
+ Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
+- Subtable->Length, AcpiDmTableInfoDbg2Addr);
++ SubLength, AcpiDmTableInfoDbg2Addr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -454,13 +467,13 @@ AcpiDmDumpDbg2 (
+
+ for (i = 0; i < Subtable->RegisterCount; i++)
+ {
+- ArrayOffset = Subtable->AddressSizeOffset +
+- (sizeof (UINT32) * i);
++ ACPI_MOVE_16_TO_16(&Tmp16, &Subtable->AddressSizeOffset);
++ ArrayOffset = Tmp16 + (sizeof (UINT32) * i);
+ AbsoluteOffset = Offset + ArrayOffset;
+ Array = (UINT8 *) Subtable + ArrayOffset;
+
+ Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
+- Subtable->Length, AcpiDmTableInfoDbg2Size);
++ SubLength, AcpiDmTableInfoDbg2Size);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -470,12 +483,13 @@ AcpiDmDumpDbg2 (
+ /* Dump the Namestring (required) */
+
+ AcpiOsPrintf ("\n");
+- ArrayOffset = Subtable->NamepathOffset;
++ ACPI_MOVE_16_TO_16(&Tmp16, &Subtable->NamepathOffset);
++ ArrayOffset = Tmp16;
+ AbsoluteOffset = Offset + ArrayOffset;
+ Array = (UINT8 *) Subtable + ArrayOffset;
+
+ Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
+- Subtable->Length, AcpiDmTableInfoDbg2Name);
++ SubLength, AcpiDmTableInfoDbg2Name);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -485,9 +499,10 @@ AcpiDmDumpDbg2 (
+
+ if (Subtable->OemDataOffset)
+ {
+- Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
+- Table, Subtable->OemDataLength,
+- AcpiDmTableInfoDbg2OemData);
++ ACPI_MOVE_16_TO_16(&Tmp16, &Subtable->OemDataOffset);
++ ACPI_MOVE_16_TO_16(&AlsoTmp16, &Subtable->OemDataLength);
++ Status = AcpiDmDumpTable (Length, Offset + Tmp16,
++ Table, AlsoTmp16, AcpiDmTableInfoDbg2OemData);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -496,9 +511,9 @@ AcpiDmDumpDbg2 (
+
+ /* Point to next subtable */
+
+- Offset += Subtable->Length;
++ Offset += SubLength;
+ Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
+- Subtable->Length);
++ SubLength);
+ }
+ }
+
+@@ -522,17 +537,20 @@ AcpiDmDumpDmar (
+ {
+ ACPI_STATUS Status;
+ ACPI_DMAR_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
++ UINT16 SubLength;
+ UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
+ ACPI_DMTABLE_INFO *InfoTable;
+ ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
+ UINT32 ScopeOffset;
+ UINT8 *PciPath;
+ UINT32 PathOffset;
++ UINT16 SubType;
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -542,13 +560,14 @@ AcpiDmDumpDmar (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
++ ACPI_MOVE_16_TO_16(&SubLength, &Subtable->Length);
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+- Subtable->Length, AcpiDmTableInfoDmarHdr);
++ SubLength, AcpiDmTableInfoDmarHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -556,7 +575,8 @@ AcpiDmDumpDmar (
+
+ AcpiOsPrintf ("\n");
+
+- switch (Subtable->Type)
++ ACPI_MOVE_16_TO_16(&SubType, &Subtable->Type);
++ switch (SubType)
+ {
+ case ACPI_DMAR_TYPE_HARDWARE_UNIT:
+
+@@ -591,12 +611,12 @@ AcpiDmDumpDmar (
+ default:
+
+ AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n",
+- Subtable->Type);
++ SubType);
+ return;
+ }
+
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+- Subtable->Length, InfoTable);
++ SubLength, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -605,8 +625,8 @@ AcpiDmDumpDmar (
+ /*
+ * Dump the optional device scope entries
+ */
+- if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
+- (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE))
++ if ((SubType == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
++ (SubType == ACPI_DMAR_TYPE_NAMESPACE))
+ {
+ /* These types do not support device scopes */
+
+@@ -614,7 +634,7 @@ AcpiDmDumpDmar (
+ }
+
+ ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset);
+- while (ScopeOffset < Subtable->Length)
++ while (ScopeOffset < SubLength)
+ {
+ AcpiOsPrintf ("\n");
+ Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
+@@ -655,9 +675,8 @@ AcpiDmDumpDmar (
+ NextSubtable:
+ /* Point to next subtable */
+
+- Offset += Subtable->Length;
+- Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable,
+- Subtable->Length);
++ Offset += SubLength;
++ Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable, SubLength);
+ }
+ }
+
+@@ -684,12 +703,15 @@ AcpiDmDumpDrtm (
+ ACPI_DRTM_RESOURCE_LIST *DrtmRl;
+ ACPI_DRTM_DPS_ID *DrtmDps;
+ UINT32 Count;
++ UINT32 ValidatedCount;
++ UINT32 ResourceCount;
++ UINT32 Length;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
+- AcpiDmTableInfoDrtm);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDrtm);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -703,7 +725,7 @@ AcpiDmDumpDrtm (
+
+ DrtmVtl = ACPI_ADD_PTR (ACPI_DRTM_VTABLE_LIST, Table, Offset);
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset,
++ Status = AcpiDmDumpTable (Length, Offset,
+ DrtmVtl, ACPI_OFFSET (ACPI_DRTM_VTABLE_LIST, ValidatedTables),
+ AcpiDmTableInfoDrtm0);
+ if (ACPI_FAILURE (Status))
+@@ -716,10 +738,11 @@ AcpiDmDumpDrtm (
+ /* Dump Validated table addresses */
+
+ Count = 0;
+- while ((Offset < Table->Length) &&
+- (DrtmVtl->ValidatedTableCount > Count))
++ ACPI_MOVE_32_TO_32(&ValidatedCount, &DrtmVtl->ValidatedTableCount);
++ while ((Offset < Length) &&
++ (ValidatedCount > Count))
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset,
++ Status = AcpiDmDumpTable (Length, Offset,
+ ACPI_ADD_PTR (void, Table, Offset), sizeof (UINT64),
+ AcpiDmTableInfoDrtm0a);
+ if (ACPI_FAILURE (Status))
+@@ -735,7 +758,7 @@ AcpiDmDumpDrtm (
+
+ DrtmRl = ACPI_ADD_PTR (ACPI_DRTM_RESOURCE_LIST, Table, Offset);
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset,
++ Status = AcpiDmDumpTable (Length, Offset,
+ DrtmRl, ACPI_OFFSET (ACPI_DRTM_RESOURCE_LIST, Resources),
+ AcpiDmTableInfoDrtm1);
+ if (ACPI_FAILURE (Status))
+@@ -748,10 +771,11 @@ AcpiDmDumpDrtm (
+ /* Dump the Resource List */
+
+ Count = 0;
+- while ((Offset < Table->Length) &&
+- (DrtmRl->ResourceCount > Count))
++ ACPI_MOVE_32_TO_32(&ResourceCount, &DrtmRl->ResourceCount);
++ while ((Offset < Length) &&
++ (ResourceCount > Count))
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset,
++ Status = AcpiDmDumpTable (Length, Offset,
+ ACPI_ADD_PTR (void, Table, Offset),
+ sizeof (ACPI_DRTM_RESOURCE), AcpiDmTableInfoDrtm1a);
+ if (ACPI_FAILURE (Status))
+@@ -767,7 +791,7 @@ AcpiDmDumpDrtm (
+
+ DrtmDps = ACPI_ADD_PTR (ACPI_DRTM_DPS_ID, Table, Offset);
+ AcpiOsPrintf ("\n");
+- (void) AcpiDmDumpTable (Table->Length, Offset,
++ (void) AcpiDmDumpTable (Length, Offset,
+ DrtmDps, sizeof (ACPI_DRTM_DPS_ID), AcpiDmTableInfoDrtm2);
+ }
+
+@@ -791,12 +815,13 @@ AcpiDmDumpEinj (
+ {
+ ACPI_STATUS Status;
+ ACPI_WHEA_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_EINJ);
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoEinj);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -806,7 +831,7 @@ AcpiDmDumpEinj (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ AcpiOsPrintf ("\n");
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+@@ -844,12 +869,13 @@ AcpiDmDumpErst (
+ {
+ ACPI_STATUS Status;
+ ACPI_WHEA_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_ERST);
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoErst);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -859,7 +885,7 @@ AcpiDmDumpErst (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ AcpiOsPrintf ("\n");
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+@@ -897,17 +923,19 @@ AcpiDmDumpFpdt (
+ {
+ ACPI_STATUS Status;
+ ACPI_FPDT_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_FPDT);
+ ACPI_DMTABLE_INFO *InfoTable;
++ UINT16 Type;
+
+
+ /* There is no main table (other than the standard ACPI header) */
+
+ /* Subtables */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+@@ -919,7 +947,8 @@ AcpiDmDumpFpdt (
+ return;
+ }
+
+- switch (Subtable->Type)
++ ACPI_MOVE_16_TO_16(&Type, &Subtable->Type);
++ switch (Type)
+ {
+ case ACPI_FPDT_TYPE_BOOT:
+
+@@ -933,8 +962,7 @@ AcpiDmDumpFpdt (
+
+ default:
+
+- AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n",
+- Subtable->Type);
++ AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", Type);
+
+ /* Attempt to continue */
+
+@@ -982,16 +1010,19 @@ AcpiDmDumpGtdt (
+ {
+ ACPI_STATUS Status;
+ ACPI_GTDT_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
++ UINT16 SubLength;
+ UINT32 Offset = sizeof (ACPI_TABLE_GTDT);
+ ACPI_DMTABLE_INFO *InfoTable;
+ UINT32 SubtableLength;
+ UINT32 GtCount;
++ UINT32 Tmp32;
+ ACPI_GTDT_TIMER_ENTRY *GtxTable;
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoGtdt);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -1001,7 +1032,7 @@ AcpiDmDumpGtdt (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+@@ -1019,8 +1050,9 @@ AcpiDmDumpGtdt (
+ case ACPI_GTDT_TYPE_TIMER_BLOCK:
+
+ SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK);
+- GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
++ Tmp32 = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
+ Subtable))->TimerCount;
++ ACPI_MOVE_32_TO_32(&GtCount, &Tmp32);
+
+ InfoTable = AcpiDmTableInfoGtdt0;
+ break;
+@@ -1041,8 +1073,9 @@ AcpiDmDumpGtdt (
+ return;
+ }
+
++ ACPI_MOVE_16_TO_16(&SubLength, &Subtable->Length);
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+- Subtable->Length, InfoTable);
++ SubLength, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1101,16 +1134,18 @@ AcpiDmDumpHest (
+ {
+ ACPI_STATUS Status;
+ ACPI_HEST_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_HEST);
+ ACPI_DMTABLE_INFO *InfoTable;
+ UINT32 SubtableLength;
+ UINT32 BankCount;
+ ACPI_HEST_IA_ERROR_BANK *BankTable;
++ UINT16 SubType;
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHest);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -1120,10 +1155,11 @@ AcpiDmDumpHest (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ BankCount = 0;
+- switch (Subtable->Type)
++ ACPI_MOVE_16_TO_16(&SubType, &Subtable->Type);
++ switch (SubType)
+ {
+ case ACPI_HEST_TYPE_IA32_CHECK:
+
+Index: acpica-unix2-20181003/source/common/dmtbdump2.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/common/dmtbdump2.c
++++ acpica-unix2-20181003/source/common/dmtbdump2.c
+@@ -75,15 +75,21 @@ AcpiDmDumpIort (
+ ACPI_IORT_SMMU *IortSmmu = NULL;
+ UINT32 Offset;
+ UINT32 NodeOffset;
++ UINT16 NodeLength;
+ UINT32 Length;
+ ACPI_DMTABLE_INFO *InfoTable;
+ char *String;
+ UINT32 i;
+-
++ UINT32 TableLen;
++ UINT32 ItsCount;
++ UINT32 MappingCount;
++ UINT32 CtxIntCount;
++ UINT32 PmuIntCount;
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
++ ACPI_MOVE_32_TO_32(&TableLen, &Table->Length);
++ Status = AcpiDmDumpTable (TableLen, 0, Table, 0, AcpiDmTableInfoIort);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -94,18 +100,19 @@ AcpiDmDumpIort (
+
+ /* Dump the OptionalPadding (optional) */
+
+- if (Iort->NodeOffset > Offset)
++ ACPI_MOVE_32_TO_32(&NodeOffset, &Iort->NodeOffset);
++ if (NodeOffset > Offset)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset, Table,
+- Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
++ Status = AcpiDmDumpTable (TableLen, Offset, Table,
++ NodeOffset - Offset, AcpiDmTableInfoIortPad);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ }
+
+- Offset = Iort->NodeOffset;
+- while (Offset < Table->Length)
++ ACPI_MOVE_32_TO_32(&Offset, &Iort->NodeOffset);
++ while (Offset < TableLen)
+ {
+ /* Common subtable header */
+
+@@ -141,7 +148,8 @@ AcpiDmDumpIort (
+ case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
+
+ InfoTable = AcpiDmTableInfoIort2;
+- Length = IortNode->Length - NodeOffset;
++ ACPI_MOVE_16_TO_16(&NodeLength, &IortNode->Length);
++ Length = NodeLength - NodeOffset;
+ break;
+
+ case ACPI_IORT_NODE_SMMU:
+@@ -154,7 +162,8 @@ AcpiDmDumpIort (
+ case ACPI_IORT_NODE_SMMU_V3:
+
+ InfoTable = AcpiDmTableInfoIort4;
+- Length = IortNode->Length - NodeOffset;
++ ACPI_MOVE_16_TO_16(&NodeLength, &IortNode->Length);
++ Length = NodeLength - NodeOffset;
+ break;
+
+ case ACPI_IORT_NODE_PMCG:
+@@ -170,7 +179,8 @@ AcpiDmDumpIort (
+
+ /* Attempt to continue */
+
+- if (!IortNode->Length)
++ ACPI_MOVE_16_TO_16(&NodeLength, &IortNode->Length);
++ if (!NodeLength)
+ {
+ AcpiOsPrintf ("Invalid zero length IORT node\n");
+ return;
+@@ -181,7 +191,7 @@ AcpiDmDumpIort (
+ /* Dump the node subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
++ Status = AcpiDmDumpTable (TableLen, Offset + NodeOffset,
+ ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
+ Length, InfoTable);
+ if (ACPI_FAILURE (Status))
+@@ -201,9 +211,10 @@ AcpiDmDumpIort (
+
+ if (IortItsGroup)
+ {
+- for (i = 0; i < IortItsGroup->ItsCount; i++)
++ ACPI_MOVE_32_TO_32(&ItsCount, &IortItsGroup->ItsCount);
++ for (i = 0; i < ItsCount; i++)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
++ Status = AcpiDmDumpTable (TableLen, Offset + NodeOffset,
+ ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
+ 4, AcpiDmTableInfoIort0a);
+ NodeOffset += 4;
+@@ -215,11 +226,11 @@ AcpiDmDumpIort (
+
+ /* Dump the Padding (optional) */
+
+- if (IortNode->Length > NodeOffset)
++ ACPI_MOVE_16_TO_16(&NodeLength, &IortNode->Length);
++ if (NodeLength > NodeOffset)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
+- Table, IortNode->Length - NodeOffset,
+- AcpiDmTableInfoIort1a);
++ Status = AcpiDmDumpTable (TableLen, Offset + NodeOffset,
++ Table, NodeLength - NodeOffset, AcpiDmTableInfoIort1a);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -236,8 +247,8 @@ AcpiDmDumpIort (
+ if (IortSmmu)
+ {
+ Length = 2 * sizeof (UINT64);
+- NodeOffset = IortSmmu->GlobalInterruptOffset;
+- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
++ ACPI_MOVE_32_TO_32(&NodeOffset, &IortSmmu->GlobalInterruptOffset);
++ Status = AcpiDmDumpTable (TableLen, Offset + NodeOffset,
+ ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
+ Length, AcpiDmTableInfoIort3a);
+ if (ACPI_FAILURE (Status))
+@@ -245,10 +256,11 @@ AcpiDmDumpIort (
+ return;
+ }
+
+- NodeOffset = IortSmmu->ContextInterruptOffset;
+- for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
++ ACPI_MOVE_32_TO_32(&NodeOffset, &IortSmmu->ContextInterruptOffset);
++ ACPI_MOVE_32_TO_32(&CtxIntCount, &IortSmmu->ContextInterruptCount);
++ for (i = 0; i < CtxIntCount; i++)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
++ Status = AcpiDmDumpTable (TableLen, Offset + NodeOffset,
+ ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
+ 8, AcpiDmTableInfoIort3b);
+ if (ACPI_FAILURE (Status))
+@@ -259,10 +271,11 @@ AcpiDmDumpIort (
+ NodeOffset += 8;
+ }
+
+- NodeOffset = IortSmmu->PmuInterruptOffset;
+- for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
++ ACPI_MOVE_32_TO_32(&NodeOffset, &IortSmmu->PmuInterruptOffset);
++ ACPI_MOVE_32_TO_32(&PmuIntCount, &IortSmmu->PmuInterruptCount);
++ for (i = 0; i < PmuIntCount; i++)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
++ Status = AcpiDmDumpTable (TableLen, Offset + NodeOffset,
+ ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
+ 8, AcpiDmTableInfoIort3c);
+ if (ACPI_FAILURE (Status))
+@@ -282,12 +295,13 @@ AcpiDmDumpIort (
+
+ /* Dump the ID mappings */
+
+- NodeOffset = IortNode->MappingOffset;
+- for (i = 0; i < IortNode->MappingCount; i++)
++ ACPI_MOVE_32_TO_32(&NodeOffset, &IortNode->MappingOffset);
++ ACPI_MOVE_32_TO_32(&MappingCount, &IortNode->MappingCount);
++ for (i = 0; i < MappingCount; i++)
+ {
+ AcpiOsPrintf ("\n");
+ Length = sizeof (ACPI_IORT_ID_MAPPING);
+- Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
++ Status = AcpiDmDumpTable (TableLen, Offset + NodeOffset,
+ ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
+ Length, AcpiDmTableInfoIortMap);
+ if (ACPI_FAILURE (Status))
+@@ -301,8 +315,9 @@ AcpiDmDumpIort (
+ NextSubtable:
+ /* Point to next node subtable */
+
+- Offset += IortNode->Length;
+- IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, IortNode->Length);
++ ACPI_MOVE_16_TO_16(&NodeLength, &IortNode->Length);
++ Offset += NodeLength;
++ IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeLength);
+ }
+ }
+
+@@ -333,11 +348,14 @@ AcpiDmDumpIvrs (
+ ACPI_IVRS_DE_HEADER *DeviceEntry;
+ ACPI_IVRS_HEADER *Subtable;
+ ACPI_DMTABLE_INFO *InfoTable;
++ UINT32 Length;
++ UINT16 SubLength;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIvrs);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoIvrs);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -346,13 +364,14 @@ AcpiDmDumpIvrs (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Subtable->Length, AcpiDmTableInfoIvrsHdr);
++ ACPI_MOVE_16_TO_16(&SubLength, &Subtable->Length);
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
++ SubLength, AcpiDmTableInfoIvrsHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -379,7 +398,7 @@ AcpiDmDumpIvrs (
+
+ /* Attempt to continue */
+
+- if (!Subtable->Length)
++ if (!SubLength)
+ {
+ AcpiOsPrintf ("Invalid zero length subtable\n");
+ return;
+@@ -390,8 +409,8 @@ AcpiDmDumpIvrs (
+ /* Dump the subtable */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Subtable->Length, InfoTable);
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
++ SubLength, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -405,7 +424,7 @@ AcpiDmDumpIvrs (
+ DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable,
+ sizeof (ACPI_IVRS_HARDWARE));
+
+- while (EntryOffset < (Offset + Subtable->Length))
++ while (EntryOffset < (Offset + SubLength))
+ {
+ AcpiOsPrintf ("\n");
+ /*
+@@ -467,7 +486,7 @@ AcpiDmDumpIvrs (
+
+ /* Dump the Device Entry */
+
+- Status = AcpiDmDumpTable (Table->Length, EntryOffset,
++ Status = AcpiDmDumpTable (Length, EntryOffset,
+ DeviceEntry, EntryLength, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -483,8 +502,8 @@ AcpiDmDumpIvrs (
+ NextSubtable:
+ /* Point to next subtable */
+
+- Offset += Subtable->Length;
+- Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length);
++ Offset += SubLength;
++ Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, SubLength);
+ }
+ }
+
+@@ -510,7 +529,7 @@ AcpiDmDumpLpit (
+ {
+ ACPI_STATUS Status;
+ ACPI_LPIT_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_LPIT);
+ ACPI_DMTABLE_INFO *InfoTable;
+ UINT32 SubtableLength;
+@@ -518,8 +537,9 @@ AcpiDmDumpLpit (
+
+ /* Subtables */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+@@ -583,13 +603,14 @@ AcpiDmDumpMadt (
+ {
+ ACPI_STATUS Status;
+ ACPI_SUBTABLE_HEADER *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_MADT);
+ ACPI_DMTABLE_INFO *InfoTable;
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -599,7 +620,7 @@ AcpiDmDumpMadt (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+@@ -745,11 +766,13 @@ AcpiDmDumpMcfg (
+ ACPI_STATUS Status;
+ UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
+ ACPI_MCFG_ALLOCATION *Subtable;
++ UINT32 Len;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
++ ACPI_MOVE_32_TO_32(&Len, &Table->Length);
++ Status = AcpiDmDumpTable (Len, 0, Table, 0, AcpiDmTableInfoMcfg);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -758,17 +781,17 @@ AcpiDmDumpMcfg (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Len)
+ {
+- if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
++ if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Len)
+ {
+ AcpiOsPrintf ("Warning: there are %u invalid trailing bytes\n",
+- sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
++ sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Len));
+ return;
+ }
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Len, Offset, Subtable,
+ sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -802,6 +825,7 @@ AcpiDmDumpMpst (
+ {
+ ACPI_STATUS Status;
+ UINT32 Offset = sizeof (ACPI_TABLE_MPST);
++ ACPI_TABLE_MPST *Mpst;
+ ACPI_MPST_POWER_NODE *Subtable0;
+ ACPI_MPST_POWER_STATE *Subtable0A;
+ ACPI_MPST_COMPONENT *Subtable0B;
+@@ -810,11 +834,13 @@ AcpiDmDumpMpst (
+ UINT16 SubtableCount;
+ UINT32 PowerStateCount;
+ UINT32 ComponentCount;
++ UINT32 Length;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMpst);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMpst);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -822,13 +848,14 @@ AcpiDmDumpMpst (
+
+ /* Subtable: Memory Power Node(s) */
+
+- SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount;
++ Mpst = ACPI_CAST_PTR (ACPI_TABLE_MPST, Table);
++ ACPI_MOVE_16_TO_16(&SubtableCount, &Mpst->PowerNodeCount);
+ Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset);
+
+- while ((Offset < Table->Length) && SubtableCount)
++ while ((Offset < Length) && SubtableCount)
+ {
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable0,
+ sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -837,8 +864,8 @@ AcpiDmDumpMpst (
+
+ /* Extract the sub-subtable counts */
+
+- PowerStateCount = Subtable0->NumPowerStates;
+- ComponentCount = Subtable0->NumPhysicalComponents;
++ ACPI_MOVE_32_TO_32(&PowerStateCount, &Subtable0->NumPowerStates);
++ ACPI_MOVE_32_TO_32(&ComponentCount, &Subtable0->NumPhysicalComponents);
+ Offset += sizeof (ACPI_MPST_POWER_NODE);
+
+ /* Sub-subtables - Memory Power State Structure(s) */
+@@ -849,7 +876,7 @@ AcpiDmDumpMpst (
+ while (PowerStateCount)
+ {
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable0A,
+ sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -859,7 +886,7 @@ AcpiDmDumpMpst (
+ Subtable0A++;
+ PowerStateCount--;
+ Offset += sizeof (ACPI_MPST_POWER_STATE);
+- }
++ }
+
+ /* Sub-subtables - Physical Component ID Structure(s) */
+
+@@ -872,7 +899,7 @@ AcpiDmDumpMpst (
+
+ while (ComponentCount)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable0B,
+ sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -887,17 +914,19 @@ AcpiDmDumpMpst (
+ /* Point to next Memory Power Node subtable */
+
+ SubtableCount--;
++ ACPI_MOVE_32_TO_32(&PowerStateCount, &Subtable0->NumPowerStates);
++ ACPI_MOVE_32_TO_32(&ComponentCount, &Subtable0->NumPhysicalComponents);
+ Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Subtable0,
+ sizeof (ACPI_MPST_POWER_NODE) +
+- (sizeof (ACPI_MPST_POWER_STATE) * Subtable0->NumPowerStates) +
+- (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents));
++ (sizeof (ACPI_MPST_POWER_STATE) * PowerStateCount) +
++ (sizeof (ACPI_MPST_COMPONENT) * ComponentCount));
+ }
+
+ /* Subtable: Count of Memory Power State Characteristic structures */
+
+ AcpiOsPrintf ("\n");
+ Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0);
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable1,
+ sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -912,10 +941,10 @@ AcpiDmDumpMpst (
+ Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1,
+ sizeof (ACPI_MPST_DATA_HDR));
+
+- while ((Offset < Table->Length) && SubtableCount)
++ while ((Offset < Length) && SubtableCount)
+ {
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable2,
+ sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -948,11 +977,13 @@ AcpiDmDumpMsct (
+ ACPI_STATUS Status;
+ UINT32 Offset = sizeof (ACPI_TABLE_MSCT);
+ ACPI_MSCT_PROXIMITY *Subtable;
++ UINT32 Length;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMsct);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMsct);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -961,12 +992,12 @@ AcpiDmDumpMsct (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -1001,11 +1032,13 @@ AcpiDmDumpMtmr (
+ ACPI_STATUS Status;
+ UINT32 Offset = sizeof (ACPI_TABLE_MTMR);
+ ACPI_MTMR_ENTRY *Subtable;
++ UINT32 Length;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMtmr);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMtmr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1014,12 +1047,12 @@ AcpiDmDumpMtmr (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -1061,11 +1094,17 @@ AcpiDmDumpNfit (
+ ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;
+ ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
+ UINT32 i;
++ UINT32 TableLength;
++ UINT16 SubLength;
++ UINT16 SubType;
++ UINT32 Count;
++ UINT16 Count16;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
++ ACPI_MOVE_32_TO_32(&TableLength, &Table->Length);
++ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNfit);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1074,19 +1113,21 @@ AcpiDmDumpNfit (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < TableLength)
+ {
+ /* NFIT subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Subtable->Length, AcpiDmTableInfoNfitHdr);
++ ACPI_MOVE_16_TO_16(&SubLength, &Subtable->Length);
++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
++ SubLength, AcpiDmTableInfoNfitHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+- switch (Subtable->Type)
++ ACPI_MOVE_16_TO_16(&SubType, &Subtable->Type);
++ switch (SubType)
+ {
+ case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
+
+@@ -1143,7 +1184,7 @@ AcpiDmDumpNfit (
+
+ /* Attempt to continue */
+
+- if (!Subtable->Length)
++ if (!SubLength)
+ {
+ AcpiOsPrintf ("Invalid zero length subtable\n");
+ return;
+@@ -1152,8 +1193,8 @@ AcpiDmDumpNfit (
+ }
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Subtable->Length, InfoTable);
++ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
++ SubLength, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1161,13 +1202,14 @@ AcpiDmDumpNfit (
+
+ /* Per-subtable variable-length fields */
+
+- switch (Subtable->Type)
++ switch (SubType)
+ {
+ case ACPI_NFIT_TYPE_INTERLEAVE:
+
+- for (i = 0; i < Interleave->LineCount; i++)
++ ACPI_MOVE_32_TO_32(&Count, &Interleave->LineCount);
++ for (i = 0; i < Count; i++)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
++ Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
+ &Interleave->LineOffset[i],
+ sizeof (UINT32), AcpiDmTableInfoNfit2a);
+ if (ACPI_FAILURE (Status))
+@@ -1181,12 +1223,11 @@ AcpiDmDumpNfit (
+
+ case ACPI_NFIT_TYPE_SMBIOS:
+
+- Length = Subtable->Length -
+- sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
++ Length = SubLength - sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
+
+ if (Length)
+ {
+- Status = AcpiDmDumpTable (Table->Length,
++ Status = AcpiDmDumpTable (TableLength,
+ sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
+ SmbiosInfo,
+ Length, AcpiDmTableInfoNfit3a);
+@@ -1200,9 +1241,10 @@ AcpiDmDumpNfit (
+
+ case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
+
+- for (i = 0; i < Hint->HintCount; i++)
++ ACPI_MOVE_16_TO_16(&Count16, &Hint->HintCount);
++ for (i = 0; i < Count16; i++)
+ {
+- Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
++ Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
+ &Hint->HintAddress[i],
+ sizeof (UINT64), AcpiDmTableInfoNfit6a);
+ if (ACPI_FAILURE (Status))
+@@ -1221,8 +1263,8 @@ AcpiDmDumpNfit (
+ NextSubtable:
+ /* Point to next subtable */
+
+- Offset += Subtable->Length;
+- Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
++ Offset += SubLength;
++ Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, SubLength);
+ }
+ }
+
+@@ -1247,12 +1289,13 @@ AcpiDmDumpPcct (
+ ACPI_STATUS Status;
+ ACPI_PCCT_SUBSPACE *Subtable;
+ ACPI_DMTABLE_INFO *InfoTable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_PCCT);
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPcct);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -1262,7 +1305,7 @@ AcpiDmDumpPcct (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+@@ -1402,16 +1445,21 @@ AcpiDmDumpPmtt (
+ ACPI_PMTT_HEADER *MemSubtable;
+ ACPI_PMTT_HEADER *DimmSubtable;
+ ACPI_PMTT_DOMAIN *DomainArray;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_PMTT);
+ UINT32 MemOffset;
+ UINT32 DimmOffset;
+ UINT32 DomainOffset;
+- UINT32 DomainCount;
++ UINT16 DomainCount;
++ UINT16 SubLength;
++ UINT16 Tmp16;
++ UINT16 MemLength;
++ UINT16 DimmLength;
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPmtt);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -1421,13 +1469,14 @@ AcpiDmDumpPmtt (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
++ ACPI_MOVE_16_TO_16(&SubLength, &Subtable->Length);
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+- Subtable->Length, AcpiDmTableInfoPmttHdr);
++ SubLength, AcpiDmTableInfoPmttHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1446,7 +1495,7 @@ AcpiDmDumpPmtt (
+ /* Dump the fixed-length portion of the subtable */
+
+ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+- Subtable->Length, AcpiDmTableInfoPmtt0);
++ SubLength, AcpiDmTableInfoPmtt0);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1458,15 +1507,16 @@ AcpiDmDumpPmtt (
+ MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable,
+ sizeof (ACPI_PMTT_SOCKET));
+
+- while (((Offset + MemOffset) < Table->Length) &&
+- (MemOffset < Subtable->Length))
++ while (((Offset + MemOffset) < Length) &&
++ (MemOffset < SubLength))
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
++ ACPI_MOVE_16_TO_16(&MemLength, &MemSubtable->Length);
+ Status = AcpiDmDumpTable (Length,
+ Offset + MemOffset, MemSubtable,
+- MemSubtable->Length, AcpiDmTableInfoPmttHdr);
++ MemLength, AcpiDmTableInfoPmttHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1486,7 +1536,7 @@ AcpiDmDumpPmtt (
+
+ Status = AcpiDmDumpTable (Length,
+ Offset + MemOffset, MemSubtable,
+- MemSubtable->Length, AcpiDmTableInfoPmtt1);
++ MemLength, AcpiDmTableInfoPmtt1);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1494,13 +1544,14 @@ AcpiDmDumpPmtt (
+
+ /* Walk the variable count of proximity domains */
+
+- DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
++ Tmp16 = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount;
++ ACPI_MOVE_16_TO_16(&DomainCount, &Tmp16);
+ DomainOffset = sizeof (ACPI_PMTT_CONTROLLER);
+ DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable,
+ sizeof (ACPI_PMTT_CONTROLLER));
+
+- while (((Offset + MemOffset + DomainOffset) < Table->Length) &&
+- ((MemOffset + DomainOffset) < Subtable->Length) &&
++ while (((Offset + MemOffset + DomainOffset) < Length) &&
++ ((MemOffset + DomainOffset) < SubLength) &&
+ DomainCount)
+ {
+ Status = AcpiDmDumpTable (Length,
+@@ -1528,15 +1579,16 @@ AcpiDmDumpPmtt (
+ DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable,
+ DomainOffset);
+
+- while (((Offset + MemOffset + DimmOffset) < Table->Length) &&
+- (DimmOffset < MemSubtable->Length))
++ while (((Offset + MemOffset + DimmOffset) < Length) &&
++ (DimmOffset < MemLength))
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
++ ACPI_MOVE_16_TO_16(&DimmLength, &DimmSubtable->Length);
+ Status = AcpiDmDumpTable (Length,
+ Offset + MemOffset + DimmOffset, DimmSubtable,
+- DimmSubtable->Length, AcpiDmTableInfoPmttHdr);
++ DimmLength, AcpiDmTableInfoPmttHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1556,7 +1608,7 @@ AcpiDmDumpPmtt (
+
+ Status = AcpiDmDumpTable (Length,
+ Offset + MemOffset + DimmOffset, DimmSubtable,
+- DimmSubtable->Length, AcpiDmTableInfoPmtt2);
++ DimmLength, AcpiDmTableInfoPmtt2);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -1564,23 +1616,22 @@ AcpiDmDumpPmtt (
+
+ /* Point to next DIMM subtable */
+
+- DimmOffset += DimmSubtable->Length;
++ DimmOffset += DimmLength;
+ DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
+- DimmSubtable, DimmSubtable->Length);
++ DimmSubtable, DimmLength);
+ }
+
+ /* Point to next Controller subtable */
+
+- MemOffset += MemSubtable->Length;
++ MemOffset += MemLength;
+ MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
+- MemSubtable, MemSubtable->Length);
++ MemSubtable, MemLength);
+ }
+
+ /* Point to next Socket subtable */
+
+- Offset += Subtable->Length;
+- Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER,
+- Subtable, Subtable->Length);
++ Offset += SubLength;
++ Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable, SubLength);
+ }
+ }
+
+@@ -1736,6 +1787,8 @@ AcpiDmDumpS3pt (
+ ACPI_FPDT_HEADER *Subtable;
+ ACPI_DMTABLE_INFO *InfoTable;
+ ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables);
++ UINT32 Length;
++ UINT16 SubType;
+
+
+ /* Main table */
+@@ -1746,20 +1799,22 @@ AcpiDmDumpS3pt (
+ return 0;
+ }
+
++ ACPI_MOVE_32_TO_32(&Length, &S3ptTable->Length);
+ Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset);
+- while (Offset < S3ptTable->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ Subtable->Length, AcpiDmTableInfoS3ptHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return 0;
+ }
+
+- switch (Subtable->Type)
++ ACPI_MOVE_16_TO_16(&SubType, &Subtable->Type);
++ switch (SubType)
+ {
+ case ACPI_S3PT_TYPE_RESUME:
+
+@@ -1774,7 +1829,7 @@ AcpiDmDumpS3pt (
+ default:
+
+ AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n",
+- Subtable->Type);
++ SubType);
+
+ /* Attempt to continue */
+
+@@ -1787,7 +1842,7 @@ AcpiDmDumpS3pt (
+ }
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ Subtable->Length, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+Index: acpica-unix2-20181003/source/common/dmtbdump3.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/common/dmtbdump3.c
++++ acpica-unix2-20181003/source/common/dmtbdump3.c
+@@ -68,9 +68,11 @@ void
+ AcpiDmDumpSlic (
+ ACPI_TABLE_HEADER *Table)
+ {
++ UINT32 Length;
+
+- (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
+- Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ (void) AcpiDmDumpTable (Length, sizeof (ACPI_TABLE_HEADER), Table,
++ Length - sizeof (*Table), AcpiDmTableInfoSlic);
+ }
+
+
+@@ -93,14 +95,17 @@ AcpiDmDumpSlit (
+ ACPI_STATUS Status;
+ UINT32 Offset;
+ UINT8 *Row;
+- UINT32 Localities;
++ UINT64 Localities;
+ UINT32 i;
+ UINT32 j;
++ UINT32 Length;
++ UINT64 Tmp64;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSlit);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -108,7 +113,8 @@ AcpiDmDumpSlit (
+
+ /* Display the Locality NxN Matrix */
+
+- Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
++ Tmp64 = (UINT64) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
++ ACPI_MOVE_64_TO_64(&Localities, &Tmp64);
+ Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
+ Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
+
+@@ -121,7 +127,7 @@ AcpiDmDumpSlit (
+ {
+ /* Check for beyond EOT */
+
+- if (Offset >= Table->Length)
++ if (Offset >= Length)
+ {
+ AcpiOsPrintf (
+ "\n**** Not enough room in table for all localities\n");
+@@ -173,11 +179,13 @@ AcpiDmDumpSrat (
+ UINT32 Offset = sizeof (ACPI_TABLE_SRAT);
+ ACPI_SUBTABLE_HEADER *Subtable;
+ ACPI_DMTABLE_INFO *InfoTable;
++ UINT32 Length;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSrat);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -186,12 +194,12 @@ AcpiDmDumpSrat (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ Subtable->Length, AcpiDmTableInfoSratHdr);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -240,7 +248,7 @@ AcpiDmDumpSrat (
+ }
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ Subtable->Length, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -277,13 +285,14 @@ AcpiDmDumpStao (
+ {
+ ACPI_STATUS Status;
+ char *Namepath;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT32 StringLength;
+ UINT32 Offset = sizeof (ACPI_TABLE_STAO);
+
+
+ /* Main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -292,7 +301,7 @@ AcpiDmDumpStao (
+
+ /* The rest of the table consists of Namepath strings */
+
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ Namepath = ACPI_ADD_PTR (char, Table, Offset);
+ StringLength = strlen (Namepath) + 1;
+@@ -334,11 +343,14 @@ AcpiDmDumpTcpa (
+ ACPI_TABLE_TCPA_HDR *Subtable = ACPI_ADD_PTR (
+ ACPI_TABLE_TCPA_HDR, Table, Offset);
+ ACPI_STATUS Status;
++ UINT32 Length;
++ UINT16 PlatformClass;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table,
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table,
+ 0, AcpiDmTableInfoTcpaHdr);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -349,18 +361,19 @@ AcpiDmDumpTcpa (
+ * Examine the PlatformClass field to determine the table type.
+ * Either a client or server table. Only one.
+ */
+- switch (CommonHeader->PlatformClass)
++ ACPI_MOVE_16_TO_16(&PlatformClass, &CommonHeader->PlatformClass);
++ switch (PlatformClass)
+ {
+ case ACPI_TCPA_CLIENT_TABLE:
+
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Table->Length - Offset, AcpiDmTableInfoTcpaClient);
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
++ Length - Offset, AcpiDmTableInfoTcpaClient);
+ break;
+
+ case ACPI_TCPA_SERVER_TABLE:
+
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+- Table->Length - Offset, AcpiDmTableInfoTcpaServer);
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
++ Length - Offset, AcpiDmTableInfoTcpaServer);
+ break;
+
+ default:
+@@ -455,11 +468,13 @@ AcpiDmDumpVrtc (
+ ACPI_STATUS Status;
+ UINT32 Offset = sizeof (ACPI_TABLE_VRTC);
+ ACPI_VRTC_ENTRY *Subtable;
++ UINT32 Length;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoVrtc);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -468,12 +483,12 @@ AcpiDmDumpVrtc (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -508,11 +523,13 @@ AcpiDmDumpWdat (
+ ACPI_STATUS Status;
+ UINT32 Offset = sizeof (ACPI_TABLE_WDAT);
+ ACPI_WDAT_ENTRY *Subtable;
++ UINT32 Length;
+
+
+ /* Main table */
+
+- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
++ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWdat);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+@@ -521,12 +538,12 @@ AcpiDmDumpWdat (
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
+- while (Offset < Table->Length)
++ while (Offset < Length)
+ {
+ /* Common subtable header */
+
+ AcpiOsPrintf ("\n");
+- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
++ Status = AcpiDmDumpTable (Length, Offset, Subtable,
+ sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -561,12 +578,13 @@ AcpiDmDumpWpbt (
+ {
+ ACPI_STATUS Status;
+ ACPI_TABLE_WPBT *Subtable;
+- UINT32 Length = Table->Length;
++ UINT32 Length;
+ UINT16 ArgumentsLength;
+
+
+ /* Dump the main table */
+
++ ACPI_MOVE_32_TO_32(&Length, &Table->Length);
+ Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
+ if (ACPI_FAILURE (Status))
+ {
+@@ -576,10 +594,10 @@ AcpiDmDumpWpbt (
+ /* Extract the arguments buffer length from the main table */
+
+ Subtable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
+- ArgumentsLength = Subtable->ArgumentsLength;
++ ACPI_MOVE_16_TO_16(&ArgumentsLength, &Subtable->ArgumentsLength);
+
+ /* Dump the arguments buffer */
+
+- (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
++ (void) AcpiDmDumpTable (Length, 0, Table, ArgumentsLength,
+ AcpiDmTableInfoWpbt0);
+ }
+Index: acpica-unix2-20181003/source/compiler/dtfield.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/compiler/dtfield.c
++++ acpica-unix2-20181003/source/compiler/dtfield.c
+@@ -359,7 +359,27 @@ DtCompileInteger (
+ DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, AslGbl_MsgBuffer);
+ }
+
+- memcpy (Buffer, &Value, ByteLength);
++ switch (ByteLength) {
++ case 1:
++ ACPI_MOVE_64_TO_8(Buffer, &Value);
++ break;
++
++ case 2:
++ ACPI_MOVE_64_TO_16(Buffer, &Value);
++ break;
++
++ case 4:
++ ACPI_MOVE_64_TO_32(Buffer, &Value);
++ break;
++
++ case 8:
++ ACPI_MOVE_64_TO_64(Buffer, &Value);
++ break;
++
++ default:
++ memcpy (Buffer, &Value, ByteLength);
++ break;
++ }
+ return;
+ }
+
+Index: acpica-unix2-20181003/source/compiler/dtsubtable.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/compiler/dtsubtable.c
++++ acpica-unix2-20181003/source/compiler/dtsubtable.c
+@@ -378,6 +378,21 @@ DtSetSubtableLength (
+ return;
+ }
+
+- memcpy (Subtable->LengthField, &Subtable->TotalLength,
+- Subtable->SizeOfLengthField);
++ switch(Subtable->SizeOfLengthField) {
++ case 1:
++ ACPI_MOVE_32_TO_8(Subtable->LengthField, &Subtable->TotalLength);
++ break;
++
++ case 2:
++ ACPI_MOVE_32_TO_16(Subtable->LengthField, &Subtable->TotalLength);
++ break;
++
++ case 4:
++ ACPI_MOVE_32_TO_32(Subtable->LengthField, &Subtable->TotalLength);
++ break;
++
++ default:
++ memcpy (Subtable->LengthField, &Subtable->TotalLength,
++ Subtable->SizeOfLengthField);
++ }
+ }
+Index: acpica-unix2-20181003/source/compiler/dttable1.c
+===================================================================
+--- acpica-unix2-20181003.orig/source/compiler/dttable1.c
++++ acpica-unix2-20181003/source/compiler/dttable1.c
+@@ -281,6 +281,8 @@ DtCompileCsrt (
+ DT_FIELD **PFieldList = (DT_FIELD **) List;
+ UINT32 DescriptorCount;
+ UINT32 GroupLength;
++ ACPI_CSRT_GROUP *Pgrp;
++ UINT32 Tmp32;
+
+
+ /* Subtables (Resource Groups) */
+@@ -299,12 +301,20 @@ DtCompileCsrt (
+
+ /* Compute the number of resource descriptors */
+
++ /*
+ GroupLength =
+ (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
+ Subtable->Buffer))->Length -
+ (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
+ Subtable->Buffer))->SharedInfoLength -
+ sizeof (ACPI_CSRT_GROUP);
++ */
++ Pgrp = ACPI_CAST_PTR(ACPI_CSRT_GROUP, Subtable->Buffer);
++ ACPI_MOVE_32_TO_32(&Tmp32, &Pgrp->Length);
++ GroupLength = Tmp32;
++ ACPI_MOVE_32_TO_32(&Tmp32, &Pgrp->SharedInfoLength);
++ GroupLength -= Tmp32;
++ GroupLength -= sizeof (ACPI_CSRT_GROUP);
+
+ DescriptorCount = (GroupLength /
+ sizeof (ACPI_CSRT_DESCRIPTOR));
+@@ -392,6 +402,8 @@ DtCompileDbg2 (
+ ACPI_DBG2_DEVICE *DeviceInfo;
+ UINT16 CurrentOffset;
+ UINT32 i;
++ UINT16 Tmp16;
++ UINT32 Tmp32;
+
+
+ /* Main table */
+@@ -408,10 +420,11 @@ DtCompileDbg2 (
+ /* Main table fields */
+
+ Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
+- Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
++ Tmp32 = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
+ ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
++ ACPI_MOVE_32_TO_32(&Dbg2Header->InfoOffset, &Tmp32);
+
+- SubtableCount = Dbg2Header->InfoCount;
<Skipped 6453 lines>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/acpica.git/commitdiff/25d7dd996e3bcf7ba3c53ad19d2c1c1fc7c26c87
More information about the pld-cvs-commit
mailing list