diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2017-09-29 17:08:30 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2017-09-29 17:08:30 +0000 |
commit | 2c673001fb88105f2d160032c4d4b76cb518e37f (patch) | |
tree | 3fc3b6aef8822267bd455907a6fce55c3f98b2ed | |
parent | 0810e26699e1b40b9384eca2137be6155de0a5ba (diff) | |
download | src-test2-2c673001fb88105f2d160032c4d4b76cb518e37f.tar.gz src-test2-2c673001fb88105f2d160032c4d4b76cb518e37f.zip |
Notes
83 files changed, 3632 insertions, 1648 deletions
diff --git a/changes.txt b/changes.txt index db25f7e5fb91..b40fa3209912 100644 --- a/changes.txt +++ b/changes.txt @@ -1,4 +1,104 @@ ---------------------------------------- +29 September 2017. Summary of changes for version 20170929: + + +1) ACPICA kernel-resident subsystem: + +Redesigned and implemented an improved ASL While() loop timeout +mechanism. This mechanism is used to prevent infinite loops in the kernel +AML interpreter caused by either non-responsive hardware or incorrect AML +code. The new implementation uses AcpiOsGetTimer instead of a simple +maximum loop count, and is thus more accurate and constant across +different machines. The default timeout is currently 30 seconds, but this +may be adjusted later. + +Renamed the ACPI_AML_INFINITE_LOOP exception to AE_AML_LOOP_TIMEOUT to +better reflect the new implementation of the loop timeout mechanism. + +Updated the AcpiGetTimerDuration interface to cleanup the 64-bit support +and to fix an off-by-one error. Jung-uk Kim. + +Fixed an EFI build problem by updating the makefiles to for a new file +that was added, utstrsuppt.c + + +2) iASL Compiler/Disassembler and Tools: + +Implemented full support for the PDTT, SDEV, and TPM2 ACPI tables. This +includes support in the table disassembler, compiler, and template +generator. + +iASL: Added an exception for an illegal type of recursive method +invocation. If a method creates named objects, the first recursive call +will fail at runtime. This change adds an error detection at compile time +to catch the problem up front. Note: Marking such a method as +"serialized" will not help with this problem, because the same thread can +acquire the method mutex more than once. Example compiler and runtime +output: + + Method (MTH1) + { + Name (INT1, 1) + MTH1 () + } + + dsdt.asl 22: MTH1 () + Error 6152 - ^ Illegal recursive call to method + that creates named objects (MTH1) + +Previous runtime exception: + ACPI Error: [INT1] Namespace lookup failure, + AE_ALREADY_EXISTS (20170831/dswload2-465) + +iASL: Updated support for External() opcodes to improve namespace +management and error detection. These changes are related to issues seen +with multiple-segment namespace pathnames within External declarations, +such as below: + + External(\_SB.PCI0.GFX0, DeviceObj) + External(\_SB.PCI0.GFX0.ALSI) + +iASL: Implemented support for multi-line error/warning messages. This +enables more detailed and helpful error messages as below, from the +initial deployment for the duplicate names error: + + DSDT.iiii 1692: Device(PEG2) { + Error 6074 - ^ Name already exists in scope +(PEG2) + + Original name creation/declaration below: + DSDT.iiii 93: External(\_SB.PCI0.PEG2, DeviceObj) + +AcpiXtract: Added additional flexibility to support differing input hex +dump formats. Specifically, hex dumps that contain partial disassembly +and/or comments within the ACPI table data definition. There exist some +dump utilities seen in the field that create this type of hex dump (such +as Simics). For example: + + DSDT @ 0xdfffd0c0 (10999 bytes) + Signature DSDT + Length 10999 + Revision 1 + Checksum 0xf3 (Ok) + OEM_ID BXPC + OEM_table_id BXDSDT + OEM_revision 1 + Creator_id 1280593481 + Creator_revision 537399345 + 0000: 44 53 44 54 f7 2a 00 00 01 f3 42 58 50 43 00 00 + ... + 2af0: 5f 4c 30 46 00 a4 01 + +Test suite: Miscellaneous changes/fixes: + More cleanup and simplification of makefiles + Continue compilation of test cases after a compile failure + Do not perform binary compare unless both files actually exist + +iASL: Performed some code/module restructuring. Moved all memory +allocation functions to new modules. Two new files, aslallocate.c and +aslcache.c + +---------------------------------------- 31 August 2017. Summary of changes for version 20170831: diff --git a/generate/unix/acpiexec/Makefile b/generate/unix/acpiexec/Makefile index 681442c375e7..fc45da8dc877 100644 --- a/generate/unix/acpiexec/Makefile +++ b/generate/unix/acpiexec/Makefile @@ -140,6 +140,7 @@ OBJECTS = \ $(OBJDIR)/hwpci.o\ $(OBJDIR)/hwregs.o\ $(OBJDIR)/hwsleep.o\ + $(OBJDIR)/hwtimer.o\ $(OBJDIR)/hwvalid.o\ $(OBJDIR)/hwxface.o\ $(OBJDIR)/hwxfsleep.o\ diff --git a/generate/unix/iasl/Makefile b/generate/unix/iasl/Makefile index 02390ea1c943..27f5d8d276c9 100644 --- a/generate/unix/iasl/Makefile +++ b/generate/unix/iasl/Makefile @@ -51,9 +51,11 @@ OBJECTS = \ $(OBJDIR)/ahpredef.o\ $(OBJDIR)/ahtable.o\ $(OBJDIR)/ahuuids.o\ + $(OBJDIR)/aslallocate.o\ $(OBJDIR)/aslanalyze.o\ $(OBJDIR)/aslascii.o\ $(OBJDIR)/aslbtypes.o\ + $(OBJDIR)/aslcache.o\ $(OBJDIR)/aslcodegen.o\ $(OBJDIR)/aslcompile.o\ $(OBJDIR)/asldebug.o\ diff --git a/source/common/adfile.c b/source/common/adfile.c index ac96156db245..80462f1779a8 100644 --- a/source/common/adfile.c +++ b/source/common/adfile.c @@ -314,7 +314,7 @@ FlGenerateFilename ( * Copy the original filename to a new buffer. Leave room for the worst * case where we append the suffix, an added dot and the null terminator. */ - NewFilename = UtStringCacheCalloc ((ACPI_SIZE) + NewFilename = UtLocalCacheCalloc ((ACPI_SIZE) strlen (InputFilename) + strlen (Suffix) + 2); strcpy (NewFilename, InputFilename); @@ -358,7 +358,7 @@ FlStrdup ( char *NewString; - NewString = UtStringCacheCalloc ((ACPI_SIZE) strlen (String) + 1); + NewString = UtLocalCacheCalloc ((ACPI_SIZE) strlen (String) + 1); strcpy (NewString, String); return (NewString); } diff --git a/source/common/ahtable.c b/source/common/ahtable.c index 7aee3c669be8..be68ed480ca9 100644 --- a/source/common/ahtable.c +++ b/source/common/ahtable.c @@ -232,6 +232,7 @@ const AH_TABLE Gbl_AcpiSupportedTables[] = {ACPI_SIG_MTMR, "MID Timer Table"}, {ACPI_SIG_NFIT, "NVDIMM Firmware Interface Table"}, {ACPI_SIG_PCCT, "Platform Communications Channel Table"}, + {ACPI_SIG_PDTT, "Platform Debug Trigger Table"}, {ACPI_SIG_PMTT, "Platform Memory Topology Table"}, {ACPI_SIG_PPTT, "Processor Properties Topology Table"}, {ACPI_SIG_RASF, "RAS Features Table"}, @@ -240,6 +241,7 @@ const AH_TABLE Gbl_AcpiSupportedTables[] = {ACPI_SIG_S3PT, "S3 Performance Table"}, {ACPI_SIG_SBST, "Smart Battery Specification Table"}, {ACPI_SIG_SDEI, "Software Delegated Exception Interface Table"}, + {ACPI_SIG_SDEV, "Secure Devices table"}, {ACPI_SIG_SLIC, "Software Licensing Description Table"}, {ACPI_SIG_SLIT, "System Locality Information Table"}, {ACPI_SIG_SPCR, "Serial Port Console Redirection table"}, diff --git a/source/common/dmtable.c b/source/common/dmtable.c index 38248c2c4536..07d27faf78b0 100644 --- a/source/common/dmtable.c +++ b/source/common/dmtable.c @@ -154,7 +154,6 @@ #include "acdisasm.h" #include "actables.h" #include "aslcompiler.h" -#include "dtcompiler.h" /* This module used for application-level code only */ @@ -290,9 +289,9 @@ static const char *AcpiDmHestSubnames[] = "IA-32 Machine Check Exception", "IA-32 Corrected Machine Check", "IA-32 Non-Maskable Interrupt", - "Unknown SubTable Type", /* 3 - Reserved */ - "Unknown SubTable Type", /* 4 - Reserved */ - "Unknown SubTable Type", /* 5 - Reserved */ + "Unknown Subtable Type", /* 3 - Reserved */ + "Unknown Subtable Type", /* 4 - Reserved */ + "Unknown Subtable Type", /* 5 - Reserved */ "PCI Express Root Port AER", "PCI Express AER (AER Endpoint)", "PCI Express/PCI-X Bridge AER", @@ -374,7 +373,7 @@ static const char *AcpiDmPmttSubnames[] = { "Socket", /* ACPI_PMTT_TYPE_SOCKET */ "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */ - "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */ + "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */ "Unknown Subtable Type" /* Reserved */ }; @@ -382,7 +381,14 @@ static const char *AcpiDmPpttSubnames[] = { "Processor Hierarchy Node", /* ACPI_PPTT_TYPE_PROCESSOR */ "Cache Type", /* ACPI_PPTT_TYPE_CACHE */ - "ID", /* ACPI_PMTT_TYPE_ID */ + "ID", /* ACPI_PPTT_TYPE_ID */ + "Unknown Subtable Type" /* Reserved */ +}; + +static const char *AcpiDmSdevSubnames[] = +{ + "Namespace Device", /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */ + "PCIe Endpoint Device", /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */ "Unknown Subtable Type" /* Reserved */ }; @@ -396,6 +402,23 @@ static const char *AcpiDmSratSubnames[] = "Unknown Subtable Type" /* Reserved */ }; +static const char *AcpiDmTpm2Subnames[] = +{ + "Illegal Start Method value", + "Reserved", + "ACPI Start Method", + "Reserved", + "Reserved", + "Reserved", + "Memory Mapped I/O", + "Command Response Buffer", + "Command Response Buffer with ACPI Start Method", + "Reserved", + "Reserved", + "Command Response Buffer with ARM SMC", + "Unknown Subtable Type" /* Reserved */ +}; + static const char *AcpiDmIvrsSubnames[] = { "Hardware Definition Block", @@ -487,6 +510,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = {ACPI_SIG_MTMR, NULL, AcpiDmDumpMtmr, DtCompileMtmr, TemplateMtmr}, {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit}, {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct}, + {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt}, {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt}, {ACPI_SIG_PPTT, NULL, AcpiDmDumpPptt, DtCompilePptt, TemplatePptt}, {ACPI_SIG_RASF, AcpiDmTableInfoRasf, NULL, NULL, TemplateRasf}, @@ -494,6 +518,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt}, {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst}, {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei}, + {ACPI_SIG_SDEV, AcpiDmTableInfoSdev, AcpiDmDumpSdev, DtCompileSdev, TemplateSdev}, {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic}, {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit}, {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr}, @@ -501,7 +526,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat}, {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao}, {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa}, - {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, NULL, NULL, TemplateTpm2}, + {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2}, {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi}, {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc, AcpiDmDumpVrtc, DtCompileVrtc, TemplateVrtc}, {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet}, @@ -917,6 +942,7 @@ AcpiDmDumpTable ( case ACPI_DMT_PCCT: case ACPI_DMT_PMTT: case ACPI_DMT_PPTT: + case ACPI_DMT_SDEV: case ACPI_DMT_SRAT: case ACPI_DMT_ASF: case ACPI_DMT_HESTNTYP: @@ -948,6 +974,7 @@ AcpiDmDumpTable ( case ACPI_DMT_NAME4: case ACPI_DMT_SIG: case ACPI_DMT_LPIT: + case ACPI_DMT_TPM2: ByteLength = 4; break; @@ -1583,6 +1610,20 @@ AcpiDmDumpTable ( CurrentOffset, NULL); break; + case ACPI_DMT_SDEV: + + /* SDEV subtable types */ + + Temp8 = *Target; + if (Temp8 > ACPI_SDEV_TYPE_RESERVED) + { + Temp8 = ACPI_SDEV_TYPE_RESERVED; + } + + AcpiOsPrintf (UINT8_FORMAT, *Target, + AcpiDmSdevSubnames[Temp8]); + break; + case ACPI_DMT_SRAT: /* SRAT subtable types */ @@ -1597,6 +1638,22 @@ AcpiDmDumpTable ( AcpiDmSratSubnames[Temp8]); break; + case ACPI_DMT_TPM2: + + /* TPM2 Start Method types */ + + Temp8 = *Target; + if (Temp8 > ACPI_TPM2_RESERVED) + { + Temp8 = ACPI_TPM2_RESERVED; + } + + AcpiOsPrintf (UINT8_FORMAT, *Target, + AcpiDmTpm2Subnames[Temp8]); + break; + + + case ACPI_DMT_FADTPM: /* FADT Preferred PM Profile names */ diff --git a/source/common/dmtbdump.c b/source/common/dmtbdump.c index 9441ca494ffc..0f0697e3d781 100644 --- a/source/common/dmtbdump.c +++ b/source/common/dmtbdump.c @@ -623,7 +623,7 @@ AcpiDmDumpAsf ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_HEADER); - ACPI_ASF_INFO *SubTable; + ACPI_ASF_INFO *Subtable; ACPI_DMTABLE_INFO *InfoTable; ACPI_DMTABLE_INFO *DataInfoTable = NULL; UINT8 *DataTable = NULL; @@ -636,13 +636,13 @@ AcpiDmDumpAsf ( /* No main table, only subtables */ - SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Header.Length, AcpiDmTableInfoAsfHdr); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Header.Length, AcpiDmTableInfoAsfHdr); if (ACPI_FAILURE (Status)) { return; @@ -650,7 +650,7 @@ AcpiDmDumpAsf ( /* The actual type is the lower 7 bits of Type */ - Type = (UINT8) (SubTable->Header.Type & 0x7F); + Type = (UINT8) (Subtable->Header.Type & 0x7F); switch (Type) { @@ -663,9 +663,9 @@ AcpiDmDumpAsf ( InfoTable = AcpiDmTableInfoAsf1; DataInfoTable = AcpiDmTableInfoAsf1a; - DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT)); - DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->Alerts; - DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, SubTable)->DataLength; + DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ALERT)); + DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->Alerts; + DataLength = ACPI_CAST_PTR (ACPI_ASF_ALERT, Subtable)->DataLength; DataOffset = Offset + sizeof (ACPI_ASF_ALERT); break; @@ -673,9 +673,9 @@ AcpiDmDumpAsf ( InfoTable = AcpiDmTableInfoAsf2; DataInfoTable = AcpiDmTableInfoAsf2a; - DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE)); - DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->Controls; - DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, SubTable)->DataLength; + DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_REMOTE)); + DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->Controls; + DataLength = ACPI_CAST_PTR (ACPI_ASF_REMOTE, Subtable)->DataLength; DataOffset = Offset + sizeof (ACPI_ASF_REMOTE); break; @@ -687,20 +687,20 @@ AcpiDmDumpAsf ( case ACPI_ASF_TYPE_ADDRESS: InfoTable = AcpiDmTableInfoAsf4; - DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS)); - DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, SubTable)->Devices; + DataTable = ACPI_ADD_PTR (UINT8, Subtable, sizeof (ACPI_ASF_ADDRESS)); + DataLength = ACPI_CAST_PTR (ACPI_ASF_ADDRESS, Subtable)->Devices; DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS); break; default: AcpiOsPrintf ("\n**** Unknown ASF subtable type 0x%X\n", - SubTable->Header.Type); + Subtable->Header.Type); return; } - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Header.Length, InfoTable); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Header.Length, InfoTable); if (ACPI_FAILURE (Status)) { return; @@ -762,15 +762,15 @@ AcpiDmDumpAsf ( /* Point to next subtable */ - if (!SubTable->Header.Length) + if (!Subtable->Header.Length) { AcpiOsPrintf ("Invalid zero subtable header length\n"); return; } - Offset += SubTable->Header.Length; - SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, - SubTable->Header.Length); + Offset += Subtable->Header.Length; + Subtable = ACPI_ADD_PTR (ACPI_ASF_INFO, Subtable, + Subtable->Header.Length); } } @@ -793,7 +793,7 @@ AcpiDmDumpCpep ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_CPEP_POLLING *SubTable; + ACPI_CPEP_POLLING *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_CPEP); @@ -808,12 +808,12 @@ AcpiDmDumpCpep ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset); while (Offset < Table->Length) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Header.Length, AcpiDmTableInfoCpep0); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Header.Length, AcpiDmTableInfoCpep0); if (ACPI_FAILURE (Status)) { return; @@ -821,9 +821,9 @@ AcpiDmDumpCpep ( /* Point to next subtable */ - Offset += SubTable->Header.Length; - SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable, - SubTable->Header.Length); + Offset += Subtable->Header.Length; + Subtable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Subtable, + Subtable->Header.Length); } } @@ -846,9 +846,9 @@ AcpiDmDumpCsrt ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_CSRT_GROUP *SubTable; + ACPI_CSRT_GROUP *Subtable; ACPI_CSRT_SHARED_INFO *SharedInfoTable; - ACPI_CSRT_DESCRIPTOR *SubSubTable; + ACPI_CSRT_DESCRIPTOR *SubSubtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_CSRT); UINT32 SubOffset; @@ -860,14 +860,14 @@ AcpiDmDumpCsrt ( /* Subtables (Resource Groups) */ - SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); while (Offset < Table->Length) { /* Resource group subtable */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoCsrt0); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoCsrt0); if (ACPI_FAILURE (Status)) { return; @@ -887,19 +887,19 @@ AcpiDmDumpCsrt ( return; } - SubOffset += SubTable->SharedInfoLength; + SubOffset += Subtable->SharedInfoLength; /* Sub-Subtables (Resource Descriptors) */ - SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, + SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table, Offset + SubOffset); - while ((SubOffset < SubTable->Length) && + while ((SubOffset < Subtable->Length) && ((Offset + SubOffset) < Table->Length)) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubTable, - SubSubTable->Length, AcpiDmTableInfoCsrt2); + Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable, + SubSubtable->Length, AcpiDmTableInfoCsrt2); if (ACPI_FAILURE (Status)) { return; @@ -909,7 +909,7 @@ AcpiDmDumpCsrt ( /* Resource-specific info buffer */ - InfoLength = SubSubTable->Length - SubSubOffset; + InfoLength = SubSubtable->Length - SubSubOffset; if (InfoLength) { Status = AcpiDmDumpTable (Length, @@ -924,16 +924,16 @@ AcpiDmDumpCsrt ( /* Point to next sub-subtable */ - SubOffset += SubSubTable->Length; - SubSubTable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubTable, - SubSubTable->Length); + SubOffset += SubSubtable->Length; + SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable, + SubSubtable->Length); } /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, SubTable, - SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, + Subtable->Length); } } @@ -956,7 +956,7 @@ AcpiDmDumpDbg2 ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_DBG2_DEVICE *SubTable; + ACPI_DBG2_DEVICE *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_DBG2); UINT32 i; @@ -975,12 +975,12 @@ AcpiDmDumpDbg2 ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); while (Offset < Table->Length) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoDbg2Device); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoDbg2Device); if (ACPI_FAILURE (Status)) { return; @@ -988,15 +988,15 @@ AcpiDmDumpDbg2 ( /* Dump the BaseAddress array */ - for (i = 0; i < SubTable->RegisterCount; i++) + for (i = 0; i < Subtable->RegisterCount; i++) { - ArrayOffset = SubTable->BaseAddressOffset + + ArrayOffset = Subtable->BaseAddressOffset + (sizeof (ACPI_GENERIC_ADDRESS) * i); AbsoluteOffset = Offset + ArrayOffset; - Array = (UINT8 *) SubTable + ArrayOffset; + Array = (UINT8 *) Subtable + ArrayOffset; Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, - SubTable->Length, AcpiDmTableInfoDbg2Addr); + Subtable->Length, AcpiDmTableInfoDbg2Addr); if (ACPI_FAILURE (Status)) { return; @@ -1005,15 +1005,15 @@ AcpiDmDumpDbg2 ( /* Dump the AddressSize array */ - for (i = 0; i < SubTable->RegisterCount; i++) + for (i = 0; i < Subtable->RegisterCount; i++) { - ArrayOffset = SubTable->AddressSizeOffset + + ArrayOffset = Subtable->AddressSizeOffset + (sizeof (UINT32) * i); AbsoluteOffset = Offset + ArrayOffset; - Array = (UINT8 *) SubTable + ArrayOffset; + Array = (UINT8 *) Subtable + ArrayOffset; Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, - SubTable->Length, AcpiDmTableInfoDbg2Size); + Subtable->Length, AcpiDmTableInfoDbg2Size); if (ACPI_FAILURE (Status)) { return; @@ -1023,12 +1023,12 @@ AcpiDmDumpDbg2 ( /* Dump the Namestring (required) */ AcpiOsPrintf ("\n"); - ArrayOffset = SubTable->NamepathOffset; + ArrayOffset = Subtable->NamepathOffset; AbsoluteOffset = Offset + ArrayOffset; - Array = (UINT8 *) SubTable + ArrayOffset; + Array = (UINT8 *) Subtable + ArrayOffset; Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, - SubTable->Length, AcpiDmTableInfoDbg2Name); + Subtable->Length, AcpiDmTableInfoDbg2Name); if (ACPI_FAILURE (Status)) { return; @@ -1036,10 +1036,10 @@ AcpiDmDumpDbg2 ( /* Dump the OemData (optional) */ - if (SubTable->OemDataOffset) + if (Subtable->OemDataOffset) { - Status = AcpiDmDumpTable (Length, Offset + SubTable->OemDataOffset, - Table, SubTable->OemDataLength, + Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset, + Table, Subtable->OemDataLength, AcpiDmTableInfoDbg2OemData); if (ACPI_FAILURE (Status)) { @@ -1049,9 +1049,9 @@ AcpiDmDumpDbg2 ( /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, SubTable, - SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable, + Subtable->Length); } } @@ -1074,7 +1074,7 @@ AcpiDmDumpDmar ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_DMAR_HEADER *SubTable; + ACPI_DMAR_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_DMAR); ACPI_DMTABLE_INFO *InfoTable; @@ -1094,14 +1094,14 @@ AcpiDmDumpDmar ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoDmarHdr); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoDmarHdr); if (ACPI_FAILURE (Status)) { return; @@ -1109,7 +1109,7 @@ AcpiDmDumpDmar ( AcpiOsPrintf ("\n"); - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_DMAR_TYPE_HARDWARE_UNIT: @@ -1144,12 +1144,12 @@ AcpiDmDumpDmar ( default: AcpiOsPrintf ("\n**** Unknown DMAR subtable type 0x%X\n\n", - SubTable->Type); + Subtable->Type); return; } - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; @@ -1158,16 +1158,16 @@ AcpiDmDumpDmar ( /* * Dump the optional device scope entries */ - if ((SubTable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || - (SubTable->Type == ACPI_DMAR_TYPE_NAMESPACE)) + if ((Subtable->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) || + (Subtable->Type == ACPI_DMAR_TYPE_NAMESPACE)) { /* These types do not support device scopes */ goto NextSubtable; } - ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset); - while (ScopeOffset < SubTable->Length) + ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable, ScopeOffset); + while (ScopeOffset < Subtable->Length) { AcpiOsPrintf ("\n"); Status = AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable, @@ -1208,9 +1208,9 @@ AcpiDmDumpDmar ( NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, - SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Subtable, + Subtable->Length); } } @@ -1343,7 +1343,7 @@ AcpiDmDumpEinj ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_WHEA_HEADER *SubTable; + ACPI_WHEA_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_EINJ); @@ -1358,11 +1358,11 @@ AcpiDmDumpEinj ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); while (Offset < Table->Length) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, + Status = AcpiDmDumpTable (Length, Offset, Subtable, sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoEinj0); if (ACPI_FAILURE (Status)) { @@ -1372,7 +1372,7 @@ AcpiDmDumpEinj ( /* Point to next subtable (each subtable is of fixed length) */ Offset += sizeof (ACPI_WHEA_HEADER); - SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, + Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable, sizeof (ACPI_WHEA_HEADER)); } } @@ -1396,7 +1396,7 @@ AcpiDmDumpErst ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_WHEA_HEADER *SubTable; + ACPI_WHEA_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_ERST); @@ -1411,11 +1411,11 @@ AcpiDmDumpErst ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Table, Offset); while (Offset < Table->Length) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, + Status = AcpiDmDumpTable (Length, Offset, Subtable, sizeof (ACPI_WHEA_HEADER), AcpiDmTableInfoErst0); if (ACPI_FAILURE (Status)) { @@ -1425,7 +1425,7 @@ AcpiDmDumpErst ( /* Point to next subtable (each subtable is of fixed length) */ Offset += sizeof (ACPI_WHEA_HEADER); - SubTable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, SubTable, + Subtable = ACPI_ADD_PTR (ACPI_WHEA_HEADER, Subtable, sizeof (ACPI_WHEA_HEADER)); } } @@ -1449,7 +1449,7 @@ AcpiDmDumpFpdt ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_FPDT_HEADER *SubTable; + ACPI_FPDT_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_FPDT); ACPI_DMTABLE_INFO *InfoTable; @@ -1459,20 +1459,20 @@ AcpiDmDumpFpdt ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoFpdtHdr); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoFpdtHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_FPDT_TYPE_BOOT: @@ -1487,31 +1487,31 @@ AcpiDmDumpFpdt ( default: AcpiOsPrintf ("\n**** Unknown FPDT subtable type 0x%X\n\n", - SubTable->Type); + Subtable->Type); /* Attempt to continue */ - if (!SubTable->Length) + if (!Subtable->Length) { AcpiOsPrintf ("Invalid zero length subtable\n"); return; } - goto NextSubTable; + goto NextSubtable; } - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; } -NextSubTable: +NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, - SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, + Subtable->Length); } } @@ -1534,11 +1534,11 @@ AcpiDmDumpGtdt ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_GTDT_HEADER *SubTable; + ACPI_GTDT_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_GTDT); ACPI_DMTABLE_INFO *InfoTable; - UINT32 SubTableLength; + UINT32 SubtableLength; UINT32 GtCount; ACPI_GTDT_TIMER_ENTRY *GtxTable; @@ -1553,34 +1553,34 @@ AcpiDmDumpGtdt ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoGtdtHdr); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoGtdtHdr); if (ACPI_FAILURE (Status)) { return; } GtCount = 0; - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_GTDT_TYPE_TIMER_BLOCK: - SubTableLength = sizeof (ACPI_GTDT_TIMER_BLOCK); + SubtableLength = sizeof (ACPI_GTDT_TIMER_BLOCK); GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK, - SubTable))->TimerCount; + Subtable))->TimerCount; InfoTable = AcpiDmTableInfoGtdt0; break; case ACPI_GTDT_TYPE_WATCHDOG: - SubTableLength = sizeof (ACPI_GTDT_WATCHDOG); + SubtableLength = sizeof (ACPI_GTDT_WATCHDOG); InfoTable = AcpiDmTableInfoGtdt1; break; @@ -1590,12 +1590,12 @@ AcpiDmDumpGtdt ( /* Cannot continue on unknown type - no length */ AcpiOsPrintf ("\n**** Unknown GTDT subtable type 0x%X\n", - SubTable->Type); + Subtable->Type); return; } - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; @@ -1603,15 +1603,15 @@ AcpiDmDumpGtdt ( /* Point to end of current subtable (each subtable above is of fixed length) */ - Offset += SubTableLength; + Offset += SubtableLength; /* If there are any Gt Timer Blocks from above, dump them now */ if (GtCount) { GtxTable = ACPI_ADD_PTR ( - ACPI_GTDT_TIMER_ENTRY, SubTable, SubTableLength); - SubTableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY); + ACPI_GTDT_TIMER_ENTRY, Subtable, SubtableLength); + SubtableLength += GtCount * sizeof (ACPI_GTDT_TIMER_ENTRY); while (GtCount) { @@ -1630,7 +1630,7 @@ AcpiDmDumpGtdt ( /* Point to next subtable */ - SubTable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, SubTable, SubTableLength); + Subtable = ACPI_ADD_PTR (ACPI_GTDT_HEADER, Subtable, SubtableLength); } } @@ -1653,11 +1653,11 @@ AcpiDmDumpHest ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_HEST_HEADER *SubTable; + ACPI_HEST_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_HEST); ACPI_DMTABLE_INFO *InfoTable; - UINT32 SubTableLength; + UINT32 SubtableLength; UINT32 BankCount; ACPI_HEST_IA_ERROR_BANK *BankTable; @@ -1672,70 +1672,70 @@ AcpiDmDumpHest ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Table, Offset); while (Offset < Table->Length) { BankCount = 0; - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_HEST_TYPE_IA32_CHECK: InfoTable = AcpiDmTableInfoHest0; - SubTableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); + SubtableLength = sizeof (ACPI_HEST_IA_MACHINE_CHECK); BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK, - SubTable))->NumHardwareBanks; + Subtable))->NumHardwareBanks; break; case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK: InfoTable = AcpiDmTableInfoHest1; - SubTableLength = sizeof (ACPI_HEST_IA_CORRECTED); + SubtableLength = sizeof (ACPI_HEST_IA_CORRECTED); BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED, - SubTable))->NumHardwareBanks; + Subtable))->NumHardwareBanks; break; case ACPI_HEST_TYPE_IA32_NMI: InfoTable = AcpiDmTableInfoHest2; - SubTableLength = sizeof (ACPI_HEST_IA_NMI); + SubtableLength = sizeof (ACPI_HEST_IA_NMI); break; case ACPI_HEST_TYPE_AER_ROOT_PORT: InfoTable = AcpiDmTableInfoHest6; - SubTableLength = sizeof (ACPI_HEST_AER_ROOT); + SubtableLength = sizeof (ACPI_HEST_AER_ROOT); break; case ACPI_HEST_TYPE_AER_ENDPOINT: InfoTable = AcpiDmTableInfoHest7; - SubTableLength = sizeof (ACPI_HEST_AER); + SubtableLength = sizeof (ACPI_HEST_AER); break; case ACPI_HEST_TYPE_AER_BRIDGE: InfoTable = AcpiDmTableInfoHest8; - SubTableLength = sizeof (ACPI_HEST_AER_BRIDGE); + SubtableLength = sizeof (ACPI_HEST_AER_BRIDGE); break; case ACPI_HEST_TYPE_GENERIC_ERROR: InfoTable = AcpiDmTableInfoHest9; - SubTableLength = sizeof (ACPI_HEST_GENERIC); + SubtableLength = sizeof (ACPI_HEST_GENERIC); break; case ACPI_HEST_TYPE_GENERIC_ERROR_V2: InfoTable = AcpiDmTableInfoHest10; - SubTableLength = sizeof (ACPI_HEST_GENERIC_V2); + SubtableLength = sizeof (ACPI_HEST_GENERIC_V2); break; case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK: InfoTable = AcpiDmTableInfoHest11; - SubTableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK); + SubtableLength = sizeof (ACPI_HEST_IA_DEFERRED_CHECK); BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK, - SubTable))->NumHardwareBanks; + Subtable))->NumHardwareBanks; break; default: @@ -1743,13 +1743,13 @@ AcpiDmDumpHest ( /* Cannot continue on unknown type - no length */ AcpiOsPrintf ("\n**** Unknown HEST subtable type 0x%X\n", - SubTable->Type); + Subtable->Type); return; } AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTableLength, InfoTable); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + SubtableLength, InfoTable); if (ACPI_FAILURE (Status)) { return; @@ -1757,15 +1757,15 @@ AcpiDmDumpHest ( /* Point to end of current subtable (each subtable above is of fixed length) */ - Offset += SubTableLength; + Offset += SubtableLength; /* If there are any (fixed-length) Error Banks from above, dump them now */ if (BankCount) { - BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, SubTable, - SubTableLength); - SubTableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); + BankTable = ACPI_ADD_PTR (ACPI_HEST_IA_ERROR_BANK, Subtable, + SubtableLength); + SubtableLength += BankCount * sizeof (ACPI_HEST_IA_ERROR_BANK); while (BankCount) { @@ -1785,7 +1785,7 @@ AcpiDmDumpHest ( /* Point to next subtable */ - SubTable = ACPI_ADD_PTR (ACPI_HEST_HEADER, SubTable, SubTableLength); + Subtable = ACPI_ADD_PTR (ACPI_HEST_HEADER, Subtable, SubtableLength); } } @@ -1811,7 +1811,7 @@ AcpiDmDumpHmat ( ACPI_HMAT_LOCALITY *HmatLocality; ACPI_HMAT_CACHE *HmatCache; UINT32 Offset; - UINT32 SubTableOffset; + UINT32 SubtableOffset; UINT32 Length; ACPI_DMTABLE_INFO *InfoTable; UINT32 i, j; @@ -1829,7 +1829,7 @@ AcpiDmDumpHmat ( while (Offset < Table->Length) { AcpiOsPrintf ("\n"); - SubTableOffset = 0; + SubtableOffset = 0; /* Dump HMAT structure header */ @@ -1873,7 +1873,7 @@ AcpiDmDumpHmat ( /* Attempt to continue */ - goto NextSubTable; + goto NextSubtable; } /* Dump HMAT structure body */ @@ -1897,11 +1897,11 @@ AcpiDmDumpHmat ( case ACPI_HMAT_TYPE_LOCALITY: HmatLocality = ACPI_CAST_PTR (ACPI_HMAT_LOCALITY, HmatStruct); - SubTableOffset = sizeof (ACPI_HMAT_LOCALITY); + SubtableOffset = sizeof (ACPI_HMAT_LOCALITY); /* Dump initiator proximity domains */ - if ((UINT32)(HmatStruct->Length - SubTableOffset) < + if ((UINT32)(HmatStruct->Length - SubtableOffset) < (UINT32)(HmatLocality->NumberOfInitiatorPDs * 4)) { AcpiOsPrintf ("Invalid initiator proximity domain number\n"); @@ -1909,15 +1909,15 @@ AcpiDmDumpHmat ( } for (i = 0; i < HmatLocality->NumberOfInitiatorPDs; i++) { - Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset, - ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset), + Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 4, AcpiDmTableInfoHmat1a); - SubTableOffset += 4; + SubtableOffset += 4; } /* Dump target proximity domains */ - if ((UINT32)(HmatStruct->Length - SubTableOffset) < + if ((UINT32)(HmatStruct->Length - SubtableOffset) < (UINT32)(HmatLocality->NumberOfTargetPDs * 4)) { AcpiOsPrintf ("Invalid target proximity domain number\n"); @@ -1925,15 +1925,15 @@ AcpiDmDumpHmat ( } for (i = 0; i < HmatLocality->NumberOfTargetPDs; i++) { - Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset, - ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset), + Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 4, AcpiDmTableInfoHmat1b); - SubTableOffset += 4; + SubtableOffset += 4; } /* Dump latency/bandwidth entris */ - if ((UINT32)(HmatStruct->Length - SubTableOffset) < + if ((UINT32)(HmatStruct->Length - SubtableOffset) < (UINT32)(HmatLocality->NumberOfInitiatorPDs * HmatLocality->NumberOfTargetPDs * 2)) { @@ -1944,10 +1944,10 @@ AcpiDmDumpHmat ( { for (j = 0; j < HmatLocality->NumberOfTargetPDs; j++) { - Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset, - ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset), + Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 2, AcpiDmTableInfoHmat1c); - SubTableOffset += 2; + SubtableOffset += 2; } } break; @@ -1955,11 +1955,11 @@ AcpiDmDumpHmat ( case ACPI_HMAT_TYPE_CACHE: HmatCache = ACPI_CAST_PTR (ACPI_HMAT_CACHE, HmatStruct); - SubTableOffset = sizeof (ACPI_HMAT_CACHE); + SubtableOffset = sizeof (ACPI_HMAT_CACHE); /* Dump SMBIOS handles */ - if ((UINT32)(HmatStruct->Length - SubTableOffset) < + if ((UINT32)(HmatStruct->Length - SubtableOffset) < (UINT32)(HmatCache->NumberOfSMBIOSHandles * 2)) { AcpiOsPrintf ("Invalid SMBIOS handle number\n"); @@ -1967,10 +1967,10 @@ AcpiDmDumpHmat ( } for (i = 0; i < HmatCache->NumberOfSMBIOSHandles; i++) { - Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset, - ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubTableOffset), + Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_HMAT_STRUCTURE, HmatStruct, SubtableOffset), 2, AcpiDmTableInfoHmat2a); - SubTableOffset += 2; + SubtableOffset += 2; } break; @@ -1979,7 +1979,7 @@ AcpiDmDumpHmat ( break; } -NextSubTable: +NextSubtable: /* Point to next HMAT structure subtable */ Offset += (HmatStruct->Length); @@ -2104,7 +2104,7 @@ AcpiDmDumpIort ( AcpiOsPrintf ("Invalid zero length IORT node\n"); return; } - goto NextSubTable; + goto NextSubtable; } /* Dump the node subtable header */ @@ -2227,7 +2227,7 @@ AcpiDmDumpIort ( NodeOffset += Length; } -NextSubTable: +NextSubtable: /* Point to next node subtable */ Offset += IortNode->Length; @@ -2260,7 +2260,7 @@ AcpiDmDumpIvrs ( UINT32 EntryLength; UINT32 EntryType; ACPI_IVRS_DE_HEADER *DeviceEntry; - ACPI_IVRS_HEADER *SubTable; + ACPI_IVRS_HEADER *Subtable; ACPI_DMTABLE_INFO *InfoTable; @@ -2274,20 +2274,20 @@ AcpiDmDumpIvrs ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoIvrsHdr); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoIvrsHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_IVRS_TYPE_HARDWARE: @@ -2304,23 +2304,23 @@ AcpiDmDumpIvrs ( default: AcpiOsPrintf ("\n**** Unknown IVRS subtable type 0x%X\n", - SubTable->Type); + Subtable->Type); /* Attempt to continue */ - if (!SubTable->Length) + if (!Subtable->Length) { AcpiOsPrintf ("Invalid zero length subtable\n"); return; } - goto NextSubTable; + goto NextSubtable; } /* Dump the subtable */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; @@ -2328,13 +2328,13 @@ AcpiDmDumpIvrs ( /* The hardware subtable can contain multiple device entries */ - if (SubTable->Type == ACPI_IVRS_TYPE_HARDWARE) + if (Subtable->Type == ACPI_IVRS_TYPE_HARDWARE) { EntryOffset = Offset + sizeof (ACPI_IVRS_HARDWARE); - DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, SubTable, + DeviceEntry = ACPI_ADD_PTR (ACPI_IVRS_DE_HEADER, Subtable, sizeof (ACPI_IVRS_HARDWARE)); - while (EntryOffset < (Offset + SubTable->Length)) + while (EntryOffset < (Offset + Subtable->Length)) { AcpiOsPrintf ("\n"); /* @@ -2409,11 +2409,11 @@ AcpiDmDumpIvrs ( } } -NextSubTable: +NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, SubTable, SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_IVRS_HEADER, Subtable, Subtable->Length); } } @@ -2438,33 +2438,33 @@ AcpiDmDumpLpit ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_LPIT_HEADER *SubTable; + ACPI_LPIT_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_LPIT); ACPI_DMTABLE_INFO *InfoTable; - UINT32 SubTableLength; + UINT32 SubtableLength; /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ - Status = AcpiDmDumpTable (Length, Offset, SubTable, + Status = AcpiDmDumpTable (Length, Offset, Subtable, sizeof (ACPI_LPIT_HEADER), AcpiDmTableInfoLpitHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_LPIT_TYPE_NATIVE_CSTATE: InfoTable = AcpiDmTableInfoLpit0; - SubTableLength = sizeof (ACPI_LPIT_NATIVE); + SubtableLength = sizeof (ACPI_LPIT_NATIVE); break; default: @@ -2472,12 +2472,12 @@ AcpiDmDumpLpit ( /* Cannot continue on unknown type - no length */ AcpiOsPrintf ("\n**** Unknown LPIT subtable type 0x%X\n", - SubTable->Type); + Subtable->Type); return; } - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTableLength, InfoTable); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + SubtableLength, InfoTable); if (ACPI_FAILURE (Status)) { return; @@ -2487,8 +2487,8 @@ AcpiDmDumpLpit ( /* Point to next subtable */ - Offset += SubTableLength; - SubTable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, SubTable, SubTableLength); + Offset += SubtableLength; + Subtable = ACPI_ADD_PTR (ACPI_LPIT_HEADER, Subtable, SubtableLength); } } @@ -2511,7 +2511,7 @@ AcpiDmDumpMadt ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_SUBTABLE_HEADER *SubTable; + ACPI_SUBTABLE_HEADER *Subtable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_MADT); ACPI_DMTABLE_INFO *InfoTable; @@ -2527,20 +2527,20 @@ AcpiDmDumpMadt ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoMadtHdr); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoMadtHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_MADT_TYPE_LOCAL_APIC: @@ -2625,32 +2625,32 @@ AcpiDmDumpMadt ( default: AcpiOsPrintf ("\n**** Unknown MADT subtable type 0x%X\n\n", - SubTable->Type); + Subtable->Type); /* Attempt to continue */ - if (!SubTable->Length) + if (!Subtable->Length) { AcpiOsPrintf ("Invalid zero length subtable\n"); return; } - goto NextSubTable; + goto NextSubtable; } - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; } -NextSubTable: +NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, - SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, + Subtable->Length); } } @@ -2673,7 +2673,7 @@ AcpiDmDumpMcfg ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_MCFG); - ACPI_MCFG_ALLOCATION *SubTable; + ACPI_MCFG_ALLOCATION *Subtable; /* Main table */ @@ -2686,7 +2686,7 @@ AcpiDmDumpMcfg ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset); while (Offset < Table->Length) { if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length) @@ -2697,7 +2697,7 @@ AcpiDmDumpMcfg ( } AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, sizeof (ACPI_MCFG_ALLOCATION), AcpiDmTableInfoMcfg0); if (ACPI_FAILURE (Status)) { @@ -2707,7 +2707,7 @@ AcpiDmDumpMcfg ( /* Point to next subtable (each subtable is of fixed length) */ Offset += sizeof (ACPI_MCFG_ALLOCATION); - SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable, + Subtable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Subtable, sizeof (ACPI_MCFG_ALLOCATION)); } } @@ -2731,11 +2731,11 @@ AcpiDmDumpMpst ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_MPST); - ACPI_MPST_POWER_NODE *SubTable0; - ACPI_MPST_POWER_STATE *SubTable0A; - ACPI_MPST_COMPONENT *SubTable0B; - ACPI_MPST_DATA_HDR *SubTable1; - ACPI_MPST_POWER_DATA *SubTable2; + ACPI_MPST_POWER_NODE *Subtable0; + ACPI_MPST_POWER_STATE *Subtable0A; + ACPI_MPST_COMPONENT *Subtable0B; + ACPI_MPST_DATA_HDR *Subtable1; + ACPI_MPST_POWER_DATA *Subtable2; UINT16 SubtableCount; UINT32 PowerStateCount; UINT32 ComponentCount; @@ -2752,12 +2752,12 @@ AcpiDmDumpMpst ( /* Subtable: Memory Power Node(s) */ SubtableCount = (ACPI_CAST_PTR (ACPI_TABLE_MPST, Table))->PowerNodeCount; - SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); + Subtable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, Table, Offset); while ((Offset < Table->Length) && SubtableCount) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0, sizeof (ACPI_MPST_POWER_NODE), AcpiDmTableInfoMpst0); if (ACPI_FAILURE (Status)) { @@ -2766,33 +2766,33 @@ AcpiDmDumpMpst ( /* Extract the sub-subtable counts */ - PowerStateCount = SubTable0->NumPowerStates; - ComponentCount = SubTable0->NumPhysicalComponents; + PowerStateCount = Subtable0->NumPowerStates; + ComponentCount = Subtable0->NumPhysicalComponents; Offset += sizeof (ACPI_MPST_POWER_NODE); /* Sub-subtables - Memory Power State Structure(s) */ - SubTable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, SubTable0, + Subtable0A = ACPI_ADD_PTR (ACPI_MPST_POWER_STATE, Subtable0, sizeof (ACPI_MPST_POWER_NODE)); while (PowerStateCount) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0A, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0A, sizeof (ACPI_MPST_POWER_STATE), AcpiDmTableInfoMpst0A); if (ACPI_FAILURE (Status)) { return; } - SubTable0A++; + Subtable0A++; PowerStateCount--; Offset += sizeof (ACPI_MPST_POWER_STATE); } /* Sub-subtables - Physical Component ID Structure(s) */ - SubTable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, SubTable0A); + Subtable0B = ACPI_CAST_PTR (ACPI_MPST_COMPONENT, Subtable0A); if (ComponentCount) { @@ -2801,14 +2801,14 @@ AcpiDmDumpMpst ( while (ComponentCount) { - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable0B, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable0B, sizeof (ACPI_MPST_COMPONENT), AcpiDmTableInfoMpst0B); if (ACPI_FAILURE (Status)) { return; } - SubTable0B++; + Subtable0B++; ComponentCount--; Offset += sizeof (ACPI_MPST_COMPONENT); } @@ -2816,42 +2816,42 @@ AcpiDmDumpMpst ( /* Point to next Memory Power Node subtable */ SubtableCount--; - SubTable0 = ACPI_ADD_PTR (ACPI_MPST_POWER_NODE, SubTable0, + 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) * Subtable0->NumPowerStates) + + (sizeof (ACPI_MPST_COMPONENT) * Subtable0->NumPhysicalComponents)); } /* 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, + Subtable1 = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable0); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable1, sizeof (ACPI_MPST_DATA_HDR), AcpiDmTableInfoMpst1); if (ACPI_FAILURE (Status)) { return; } - SubtableCount = SubTable1->CharacteristicsCount; + SubtableCount = Subtable1->CharacteristicsCount; Offset += sizeof (ACPI_MPST_DATA_HDR); /* Subtable: Memory Power State Characteristics structure(s) */ - SubTable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, SubTable1, + Subtable2 = ACPI_ADD_PTR (ACPI_MPST_POWER_DATA, Subtable1, sizeof (ACPI_MPST_DATA_HDR)); while ((Offset < Table->Length) && SubtableCount) { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable2, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable2, sizeof (ACPI_MPST_POWER_DATA), AcpiDmTableInfoMpst2); if (ACPI_FAILURE (Status)) { return; } - SubTable2++; + Subtable2++; SubtableCount--; Offset += sizeof (ACPI_MPST_POWER_DATA); } @@ -2876,7 +2876,7 @@ AcpiDmDumpMsct ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_MSCT); - ACPI_MSCT_PROXIMITY *SubTable; + ACPI_MSCT_PROXIMITY *Subtable; /* Main table */ @@ -2889,13 +2889,13 @@ AcpiDmDumpMsct ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, sizeof (ACPI_MSCT_PROXIMITY), AcpiDmTableInfoMsct0); if (ACPI_FAILURE (Status)) { @@ -2905,7 +2905,7 @@ AcpiDmDumpMsct ( /* Point to next subtable */ Offset += sizeof (ACPI_MSCT_PROXIMITY); - SubTable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, SubTable, + Subtable = ACPI_ADD_PTR (ACPI_MSCT_PROXIMITY, Subtable, sizeof (ACPI_MSCT_PROXIMITY)); } } @@ -2929,7 +2929,7 @@ AcpiDmDumpMtmr ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_MTMR); - ACPI_MTMR_ENTRY *SubTable; + ACPI_MTMR_ENTRY *Subtable; /* Main table */ @@ -2942,13 +2942,13 @@ AcpiDmDumpMtmr ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, sizeof (ACPI_MTMR_ENTRY), AcpiDmTableInfoMtmr0); if (ACPI_FAILURE (Status)) { @@ -2958,7 +2958,7 @@ AcpiDmDumpMtmr ( /* Point to next subtable */ Offset += sizeof (ACPI_MTMR_ENTRY); - SubTable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, SubTable, + Subtable = ACPI_ADD_PTR (ACPI_MTMR_ENTRY, Subtable, sizeof (ACPI_MTMR_ENTRY)); } } @@ -2984,7 +2984,7 @@ AcpiDmDumpNfit ( UINT32 Offset = sizeof (ACPI_TABLE_NFIT); UINT32 FieldOffset = 0; UINT32 Length; - ACPI_NFIT_HEADER *SubTable; + ACPI_NFIT_HEADER *Subtable; ACPI_DMTABLE_INFO *InfoTable; ACPI_NFIT_INTERLEAVE *Interleave = NULL; ACPI_NFIT_SMBIOS *SmbiosInfo = NULL; @@ -3002,20 +3002,20 @@ AcpiDmDumpNfit ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset); while (Offset < Table->Length) { /* NFIT subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoNfitHdr); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoNfitHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_NFIT_TYPE_SYSTEM_ADDRESS: @@ -3032,13 +3032,13 @@ AcpiDmDumpNfit ( /* Has a variable number of 32-bit values at the end */ InfoTable = AcpiDmTableInfoNfit2; - Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, SubTable); + Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable); FieldOffset = sizeof (ACPI_NFIT_INTERLEAVE); break; case ACPI_NFIT_TYPE_SMBIOS: - SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, SubTable); + SmbiosInfo = ACPI_CAST_PTR (ACPI_NFIT_SMBIOS, Subtable); InfoTable = AcpiDmTableInfoNfit3; break; @@ -3057,27 +3057,27 @@ AcpiDmDumpNfit ( /* Has a variable number of 64-bit addresses at the end */ InfoTable = AcpiDmTableInfoNfit6; - Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, SubTable); + Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable); FieldOffset = sizeof (ACPI_NFIT_FLUSH_ADDRESS) - sizeof (UINT64); break; default: AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n", - SubTable->Type); + Subtable->Type); /* Attempt to continue */ - if (!SubTable->Length) + if (!Subtable->Length) { AcpiOsPrintf ("Invalid zero length subtable\n"); return; } - goto NextSubTable; + goto NextSubtable; } AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; @@ -3085,7 +3085,7 @@ AcpiDmDumpNfit ( /* Per-subtable variable-length fields */ - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_NFIT_TYPE_INTERLEAVE: @@ -3105,7 +3105,7 @@ AcpiDmDumpNfit ( case ACPI_NFIT_TYPE_SMBIOS: - Length = SubTable->Length - + Length = Subtable->Length - sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8); if (Length) @@ -3142,11 +3142,11 @@ AcpiDmDumpNfit ( break; } -NextSubTable: +NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, SubTable, SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length); } } @@ -3169,7 +3169,7 @@ AcpiDmDumpPcct ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_PCCT_SUBSPACE *SubTable; + ACPI_PCCT_SUBSPACE *Subtable; ACPI_DMTABLE_INFO *InfoTable; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_PCCT); @@ -3185,20 +3185,20 @@ AcpiDmDumpPcct ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Header.Length, AcpiDmTableInfoPcctHdr); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Header.Length, AcpiDmTableInfoPcctHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Header.Type) + switch (Subtable->Header.Type) { case ACPI_PCCT_TYPE_GENERIC_SUBSPACE: @@ -3229,13 +3229,67 @@ AcpiDmDumpPcct ( AcpiOsPrintf ( "\n**** Unexpected or unknown PCCT subtable type 0x%X\n\n", - SubTable->Header.Type); + Subtable->Header.Type); + return; + } + + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Header.Length, InfoTable); + if (ACPI_FAILURE (Status)) + { return; } + /* Point to next subtable */ + + Offset += Subtable->Header.Length; + Subtable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, Subtable, + Subtable->Header.Length); + } +} + + +/******************************************************************************* + * + * FUNCTION: AcpiDmDumpPdtt + * + * PARAMETERS: Table - A PDTT table + * + * RETURN: None + * + * DESCRIPTION: Format the contents of a Pdtt. This is a variable-length + * table that contains an open-ended number of IDs + * at the end of the table. + * + ******************************************************************************/ + +void +AcpiDmDumpPdtt ( + ACPI_TABLE_HEADER *Table) +{ + ACPI_STATUS Status; + ACPI_PDTT_CHANNEL *Subtable; + UINT32 Length = Table->Length; + UINT32 Offset = sizeof (ACPI_TABLE_PDTT); + + + /* Main table */ + + Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoPdtt); + if (ACPI_FAILURE (Status)) + { + return; + } + + /* Subtables. Currently there is only one type, but can be multiples */ + + Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Table, Offset); + while (Offset < Table->Length) + { AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Header.Length, InfoTable); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + sizeof (ACPI_PDTT_CHANNEL), AcpiDmTableInfoPdtt0); if (ACPI_FAILURE (Status)) { return; @@ -3243,9 +3297,9 @@ AcpiDmDumpPcct ( /* Point to next subtable */ - Offset += SubTable->Header.Length; - SubTable = ACPI_ADD_PTR (ACPI_PCCT_SUBSPACE, SubTable, - SubTable->Header.Length); + Offset += sizeof (ACPI_PDTT_CHANNEL); + Subtable = ACPI_ADD_PTR (ACPI_PDTT_CHANNEL, Subtable, + sizeof (ACPI_PDTT_CHANNEL)); } } @@ -3268,9 +3322,9 @@ AcpiDmDumpPmtt ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_PMTT_HEADER *SubTable; - ACPI_PMTT_HEADER *MemSubTable; - ACPI_PMTT_HEADER *DimmSubTable; + ACPI_PMTT_HEADER *Subtable; + ACPI_PMTT_HEADER *MemSubtable; + ACPI_PMTT_HEADER *DimmSubtable; ACPI_PMTT_DOMAIN *DomainArray; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_PMTT); @@ -3290,14 +3344,14 @@ AcpiDmDumpPmtt ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoPmttHdr); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoPmttHdr); if (ACPI_FAILURE (Status)) { return; @@ -3305,18 +3359,18 @@ AcpiDmDumpPmtt ( /* Only Socket subtables are expected at this level */ - if (SubTable->Type != ACPI_PMTT_TYPE_SOCKET) + if (Subtable->Type != ACPI_PMTT_TYPE_SOCKET) { AcpiOsPrintf ( "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", - SubTable->Type); + Subtable->Type); return; } /* Dump the fixed-length portion of the subtable */ - Status = AcpiDmDumpTable (Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoPmtt0); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoPmtt0); if (ACPI_FAILURE (Status)) { return; @@ -3325,18 +3379,18 @@ AcpiDmDumpPmtt ( /* Walk the memory controller subtables */ MemOffset = sizeof (ACPI_PMTT_SOCKET); - MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, SubTable, + MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, Subtable, sizeof (ACPI_PMTT_SOCKET)); while (((Offset + MemOffset) < Table->Length) && - (MemOffset < SubTable->Length)) + (MemOffset < Subtable->Length)) { /* Common subtable header */ AcpiOsPrintf ("\n"); Status = AcpiDmDumpTable (Length, - Offset + MemOffset, MemSubTable, - MemSubTable->Length, AcpiDmTableInfoPmttHdr); + Offset + MemOffset, MemSubtable, + MemSubtable->Length, AcpiDmTableInfoPmttHdr); if (ACPI_FAILURE (Status)) { return; @@ -3344,19 +3398,19 @@ AcpiDmDumpPmtt ( /* Only memory controller subtables are expected at this level */ - if (MemSubTable->Type != ACPI_PMTT_TYPE_CONTROLLER) + if (MemSubtable->Type != ACPI_PMTT_TYPE_CONTROLLER) { AcpiOsPrintf ( "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", - MemSubTable->Type); + MemSubtable->Type); return; } /* Dump the fixed-length portion of the controller subtable */ Status = AcpiDmDumpTable (Length, - Offset + MemOffset, MemSubTable, - MemSubTable->Length, AcpiDmTableInfoPmtt1); + Offset + MemOffset, MemSubtable, + MemSubtable->Length, AcpiDmTableInfoPmtt1); if (ACPI_FAILURE (Status)) { return; @@ -3364,13 +3418,13 @@ AcpiDmDumpPmtt ( /* Walk the variable count of proximity domains */ - DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubTable)->DomainCount; + DomainCount = ((ACPI_PMTT_CONTROLLER *) MemSubtable)->DomainCount; DomainOffset = sizeof (ACPI_PMTT_CONTROLLER); - DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubTable, + DomainArray = ACPI_ADD_PTR (ACPI_PMTT_DOMAIN, MemSubtable, sizeof (ACPI_PMTT_CONTROLLER)); while (((Offset + MemOffset + DomainOffset) < Table->Length) && - ((MemOffset + DomainOffset) < SubTable->Length) && + ((MemOffset + DomainOffset) < Subtable->Length) && DomainCount) { Status = AcpiDmDumpTable (Length, @@ -3395,18 +3449,18 @@ AcpiDmDumpPmtt ( /* Walk the physical component (DIMM) subtables */ DimmOffset = DomainOffset; - DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubTable, + DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, MemSubtable, DomainOffset); while (((Offset + MemOffset + DimmOffset) < Table->Length) && - (DimmOffset < MemSubTable->Length)) + (DimmOffset < MemSubtable->Length)) { /* Common subtable header */ AcpiOsPrintf ("\n"); Status = AcpiDmDumpTable (Length, - Offset + MemOffset + DimmOffset, DimmSubTable, - DimmSubTable->Length, AcpiDmTableInfoPmttHdr); + Offset + MemOffset + DimmOffset, DimmSubtable, + DimmSubtable->Length, AcpiDmTableInfoPmttHdr); if (ACPI_FAILURE (Status)) { return; @@ -3414,19 +3468,19 @@ AcpiDmDumpPmtt ( /* Only DIMM subtables are expected at this level */ - if (DimmSubTable->Type != ACPI_PMTT_TYPE_DIMM) + if (DimmSubtable->Type != ACPI_PMTT_TYPE_DIMM) { AcpiOsPrintf ( "\n**** Unexpected or unknown PMTT subtable type 0x%X\n\n", - DimmSubTable->Type); + DimmSubtable->Type); return; } /* Dump the fixed-length DIMM subtable */ Status = AcpiDmDumpTable (Length, - Offset + MemOffset + DimmOffset, DimmSubTable, - DimmSubTable->Length, AcpiDmTableInfoPmtt2); + Offset + MemOffset + DimmOffset, DimmSubtable, + DimmSubtable->Length, AcpiDmTableInfoPmtt2); if (ACPI_FAILURE (Status)) { return; @@ -3434,23 +3488,23 @@ AcpiDmDumpPmtt ( /* Point to next DIMM subtable */ - DimmOffset += DimmSubTable->Length; - DimmSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, - DimmSubTable, DimmSubTable->Length); + DimmOffset += DimmSubtable->Length; + DimmSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, + DimmSubtable, DimmSubtable->Length); } /* Point to next Controller subtable */ - MemOffset += MemSubTable->Length; - MemSubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, - MemSubTable, MemSubTable->Length); + MemOffset += MemSubtable->Length; + MemSubtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, + MemSubtable, MemSubtable->Length); } /* Point to next Socket subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, - SubTable, SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_PMTT_HEADER, + Subtable, Subtable->Length); } } @@ -3473,10 +3527,10 @@ AcpiDmDumpPptt ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_SUBTABLE_HEADER *SubTable; + ACPI_SUBTABLE_HEADER *Subtable; ACPI_PPTT_PROCESSOR *PpttProcessor; UINT8 Length; - UINT8 SubTableOffset; + UINT8 SubtableOffset; UINT32 Offset = sizeof (ACPI_TABLE_FPDT); ACPI_DMTABLE_INFO *InfoTable; UINT32 i; @@ -3493,20 +3547,20 @@ AcpiDmDumpPptt ( /* Common subtable header */ - SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); - if (SubTable->Length < sizeof (ACPI_SUBTABLE_HEADER)) + Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); + if (Subtable->Length < sizeof (ACPI_SUBTABLE_HEADER)) { AcpiOsPrintf ("Invalid subtable length\n"); return; } - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoPpttHdr); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoPpttHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_PPTT_TYPE_PROCESSOR: @@ -3529,35 +3583,35 @@ AcpiDmDumpPptt ( default: AcpiOsPrintf ("\n**** Unknown PPTT subtable type 0x%X\n\n", - SubTable->Type); + Subtable->Type); /* Attempt to continue */ - goto NextSubTable; + goto NextSubtable; } - if (SubTable->Length < Length) + if (Subtable->Length < Length) { AcpiOsPrintf ("Invalid subtable length\n"); return; } - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; } - SubTableOffset = Length; + SubtableOffset = Length; - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_PPTT_TYPE_PROCESSOR: - PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, SubTable); + PpttProcessor = ACPI_CAST_PTR (ACPI_PPTT_PROCESSOR, Subtable); /* Dump SMBIOS handles */ - if ((UINT8)(SubTable->Length - SubTableOffset) < + if ((UINT8)(Subtable->Length - SubtableOffset) < (UINT8)(PpttProcessor->NumberOfPrivResources * 4)) { AcpiOsPrintf ("Invalid private resource number\n"); @@ -3565,10 +3619,10 @@ AcpiDmDumpPptt ( } for (i = 0; i < PpttProcessor->NumberOfPrivResources; i++) { - Status = AcpiDmDumpTable (Table->Length, Offset + SubTableOffset, - ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTableOffset), + Status = AcpiDmDumpTable (Table->Length, Offset + SubtableOffset, + ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, SubtableOffset), 4, AcpiDmTableInfoPptt0a); - SubTableOffset += 4; + SubtableOffset += 4; } break; @@ -3577,10 +3631,10 @@ AcpiDmDumpPptt ( break; } -NextSubTable: +NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; + Offset += Subtable->Length; } } @@ -3603,7 +3657,7 @@ AcpiDmDumpS3pt ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_S3PT); - ACPI_FPDT_HEADER *SubTable; + ACPI_FPDT_HEADER *Subtable; ACPI_DMTABLE_INFO *InfoTable; ACPI_TABLE_S3PT *S3ptTable = ACPI_CAST_PTR (ACPI_TABLE_S3PT, Tables); @@ -3616,20 +3670,20 @@ AcpiDmDumpS3pt ( return 0; } - SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset); + Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, S3ptTable, Offset); while (Offset < S3ptTable->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoS3ptHdr); + Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoS3ptHdr); if (ACPI_FAILURE (Status)) { return 0; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_S3PT_TYPE_RESUME: @@ -3644,37 +3698,205 @@ AcpiDmDumpS3pt ( default: AcpiOsPrintf ("\n**** Unknown S3PT subtable type 0x%X\n", - SubTable->Type); + Subtable->Type); /* Attempt to continue */ - if (!SubTable->Length) + if (!Subtable->Length) { AcpiOsPrintf ("Invalid zero length subtable\n"); return 0; } - goto NextSubTable; + goto NextSubtable; } AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (S3ptTable->Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (S3ptTable->Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return 0; } -NextSubTable: +NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, SubTable, SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_FPDT_HEADER, Subtable, Subtable->Length); } return (S3ptTable->Length); } + +/******************************************************************************* + * + * FUNCTION: AcpiDmDumpSdev + * + * PARAMETERS: Table - A SDEV table + * + * RETURN: None + * + * DESCRIPTION: Format the contents of a SDEV. This is a variable-length + * table that contains variable strings and vendor data. + * + ******************************************************************************/ + +void +AcpiDmDumpSdev ( + ACPI_TABLE_HEADER *Table) +{ + ACPI_STATUS Status; + ACPI_SDEV_HEADER *Subtable; + ACPI_SDEV_PCIE *Pcie; + ACPI_SDEV_NAMESPACE *Namesp; + ACPI_DMTABLE_INFO *InfoTable; + UINT32 Length = Table->Length; + UINT32 Offset = sizeof (ACPI_TABLE_SDEV); + UINT16 PathOffset; + UINT16 PathLength; + UINT16 VendorDataOffset; + UINT16 VendorDataLength; + + + /* Main table */ + + Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev); + if (ACPI_FAILURE (Status)) + { + return; + } + + /* Subtables */ + + Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset); + while (Offset < Table->Length) + { + /* Common subtable header */ + + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoSdevHdr); + if (ACPI_FAILURE (Status)) + { + return; + } + + switch (Subtable->Type) + { + case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: + + InfoTable = AcpiDmTableInfoSdev0; + break; + + case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: + + InfoTable = AcpiDmTableInfoSdev1; + break; + + default: + goto NextSubtable; + } + + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; + } + + switch (Subtable->Type) + { + case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: + + /* Dump the PCIe device ID(s) */ + + Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable); + PathOffset = Namesp->DeviceIdOffset; + PathLength = Namesp->DeviceIdLength; + + if (PathLength) + { + Status = AcpiDmDumpTable (Table->Length, 0, + ACPI_ADD_PTR (UINT8, Namesp, PathOffset), + PathLength, AcpiDmTableInfoSdev0a); + if (ACPI_FAILURE (Status)) + { + return; + } + } + + /* Dump the vendor-specific data */ + + VendorDataLength = + Namesp->VendorDataLength; + VendorDataOffset = + Namesp->DeviceIdOffset + Namesp->DeviceIdLength; + + if (VendorDataLength) + { + Status = AcpiDmDumpTable (Table->Length, 0, + ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset), + VendorDataLength, AcpiDmTableInfoSdev1b); + if (ACPI_FAILURE (Status)) + { + return; + } + } + break; + + case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: + + /* PCI path substructures */ + + Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable); + PathOffset = Pcie->PathOffset; + PathLength = Pcie->PathLength; + + while (PathLength) + { + Status = AcpiDmDumpTable (Table->Length, + PathOffset + Offset, + ACPI_ADD_PTR (UINT8, Pcie, PathOffset), + sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a); + if (ACPI_FAILURE (Status)) + { + return; + } + + PathOffset += sizeof (ACPI_SDEV_PCIE_PATH); + PathLength -= sizeof (ACPI_SDEV_PCIE_PATH); + } + + /* VendorData */ + + VendorDataLength = Pcie->VendorDataLength; + VendorDataOffset = Pcie->PathOffset + Pcie->PathLength; + + if (VendorDataLength) + { + Status = AcpiDmDumpTable (Table->Length, 0, + ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset), + VendorDataLength, AcpiDmTableInfoSdev1b); + } + break; + + default: + goto NextSubtable; + } + +NextSubtable: + /* Point to next subtable */ + + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable, + Subtable->Length); + } +} + + /******************************************************************************* * * FUNCTION: AcpiDmDumpSlic @@ -3794,7 +4016,7 @@ AcpiDmDumpSrat ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_SRAT); - ACPI_SUBTABLE_HEADER *SubTable; + ACPI_SUBTABLE_HEADER *Subtable; ACPI_DMTABLE_INFO *InfoTable; @@ -3808,20 +4030,20 @@ AcpiDmDumpSrat ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, AcpiDmTableInfoSratHdr); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, AcpiDmTableInfoSratHdr); if (ACPI_FAILURE (Status)) { return; } - switch (SubTable->Type) + switch (Subtable->Type) { case ACPI_SRAT_TYPE_CPU_AFFINITY: @@ -3850,32 +4072,32 @@ AcpiDmDumpSrat ( default: AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n", - SubTable->Type); + Subtable->Type); /* Attempt to continue */ - if (!SubTable->Length) + if (!Subtable->Length) { AcpiOsPrintf ("Invalid zero length subtable\n"); return; } - goto NextSubTable; + goto NextSubtable; } AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, - SubTable->Length, InfoTable); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Subtable->Length, InfoTable); if (ACPI_FAILURE (Status)) { return; } -NextSubTable: +NextSubtable: /* Point to next subtable */ - Offset += SubTable->Length; - SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, - SubTable->Length); + Offset += Subtable->Length; + Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable, + Subtable->Length); } } @@ -3954,7 +4176,7 @@ AcpiDmDumpTcpa ( UINT32 Offset = sizeof (ACPI_TABLE_TCPA_HDR); ACPI_TABLE_TCPA_HDR *CommonHeader = ACPI_CAST_PTR ( ACPI_TABLE_TCPA_HDR, Table); - ACPI_TABLE_TCPA_HDR *SubTable = ACPI_ADD_PTR ( + ACPI_TABLE_TCPA_HDR *Subtable = ACPI_ADD_PTR ( ACPI_TABLE_TCPA_HDR, Table, Offset); ACPI_STATUS Status; @@ -3976,13 +4198,13 @@ AcpiDmDumpTcpa ( { case ACPI_TCPA_CLIENT_TABLE: - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Table->Length - Offset, AcpiDmTableInfoTcpaClient); break; case ACPI_TCPA_SERVER_TABLE: - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, Table->Length - Offset, AcpiDmTableInfoTcpaServer); break; @@ -4003,6 +4225,64 @@ AcpiDmDumpTcpa ( /******************************************************************************* * + * FUNCTION: AcpiDmDumpTpm2 + * + * PARAMETERS: Table - A TPM2 table + * + * RETURN: None + * + * DESCRIPTION: Format the contents of a TPM2. + * + ******************************************************************************/ + +void +AcpiDmDumpTpm2 ( + ACPI_TABLE_HEADER *Table) +{ + UINT32 Offset = sizeof (ACPI_TABLE_TPM2); + ACPI_TABLE_TPM2 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM2, Table); + ACPI_TPM2_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM2_TRAILER, Table, Offset); + ACPI_TPM2_ARM_SMC *ArmSubtable; + ACPI_STATUS Status; + + + /* Main table */ + + Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2); + if (ACPI_FAILURE (Status)) + { + return; + } + + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, + Table->Length - Offset, AcpiDmTableInfoTpm2a); + if (ACPI_FAILURE (Status)) + { + return; + } + + switch (CommonHeader->StartMethod) + { + case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC: + + ArmSubtable = ACPI_ADD_PTR (ACPI_TPM2_ARM_SMC, Subtable, + sizeof (ACPI_TPM2_TRAILER)); + Offset += sizeof (ACPI_TPM2_TRAILER); + + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Table->Length, Offset, ArmSubtable, + Table->Length - Offset, AcpiDmTableInfoTpm211); + break; + + default: + break; + } +} + + +/******************************************************************************* + * * FUNCTION: AcpiDmDumpVrtc * * PARAMETERS: Table - A VRTC table @@ -4019,7 +4299,7 @@ AcpiDmDumpVrtc ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_VRTC); - ACPI_VRTC_ENTRY *SubTable; + ACPI_VRTC_ENTRY *Subtable; /* Main table */ @@ -4032,13 +4312,13 @@ AcpiDmDumpVrtc ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0); if (ACPI_FAILURE (Status)) { @@ -4048,7 +4328,7 @@ AcpiDmDumpVrtc ( /* Point to next subtable */ Offset += sizeof (ACPI_VRTC_ENTRY); - SubTable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, SubTable, + Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Subtable, sizeof (ACPI_VRTC_ENTRY)); } } @@ -4072,7 +4352,7 @@ AcpiDmDumpWdat ( { ACPI_STATUS Status; UINT32 Offset = sizeof (ACPI_TABLE_WDAT); - ACPI_WDAT_ENTRY *SubTable; + ACPI_WDAT_ENTRY *Subtable; /* Main table */ @@ -4085,13 +4365,13 @@ AcpiDmDumpWdat ( /* Subtables */ - SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); + Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset); while (Offset < Table->Length) { /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset, SubTable, + Status = AcpiDmDumpTable (Table->Length, Offset, Subtable, sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0); if (ACPI_FAILURE (Status)) { @@ -4101,7 +4381,7 @@ AcpiDmDumpWdat ( /* Point to next subtable */ Offset += sizeof (ACPI_WDAT_ENTRY); - SubTable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, SubTable, + Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Subtable, sizeof (ACPI_WDAT_ENTRY)); } } @@ -4125,7 +4405,7 @@ AcpiDmDumpWpbt ( ACPI_TABLE_HEADER *Table) { ACPI_STATUS Status; - ACPI_TABLE_WPBT *SubTable; + ACPI_TABLE_WPBT *Subtable; UINT32 Length = Table->Length; UINT16 ArgumentsLength; @@ -4140,8 +4420,8 @@ AcpiDmDumpWpbt ( /* Extract the arguments buffer length from the main table */ - SubTable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table); - ArgumentsLength = SubTable->ArgumentsLength; + Subtable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table); + ArgumentsLength = Subtable->ArgumentsLength; /* Dump the arguments buffer */ diff --git a/source/common/dmtbinfo.c b/source/common/dmtbinfo.c index 5180b4db0741..ad546e8afa7e 100644 --- a/source/common/dmtbinfo.c +++ b/source/common/dmtbinfo.c @@ -214,11 +214,13 @@ #define ACPI_MSCT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_MSCT,f) #define ACPI_NFIT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_NFIT,f) #define ACPI_PCCT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_PCCT,f) +#define ACPI_PDTT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_PDTT,f) #define ACPI_PMTT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_PMTT,f) #define ACPI_RASF_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_RASF,f) #define ACPI_S3PT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_S3PT,f) #define ACPI_SBST_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SBST,f) #define ACPI_SDEI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEI,f) +#define ACPI_SDEV_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SDEV,f) #define ACPI_SLIT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIT,f) #define ACPI_SPCR_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SPCR,f) #define ACPI_SPMI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SPMI,f) @@ -339,6 +341,7 @@ #define ACPI_PCCT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f) #define ACPI_PCCT3_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f) #define ACPI_PCCT4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f) +#define ACPI_PDTT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PDTT_CHANNEL,f) #define ACPI_PMTT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PMTT_SOCKET,f) #define ACPI_PMTT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PMTT_CONTROLLER,f) #define ACPI_PMTT1A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_PMTT_DOMAIN,f) @@ -351,6 +354,10 @@ #define ACPI_S3PTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_FPDT_HEADER,f) #define ACPI_S3PT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f) #define ACPI_S3PT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f) +#define ACPI_SDEVH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SDEV_HEADER,f) +#define ACPI_SDEV0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SDEV_NAMESPACE,f) +#define ACPI_SDEV1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE,f) +#define ACPI_SDEV1A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SDEV_PCIE_PATH,f) #define ACPI_SLIC_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIC,f) #define ACPI_SRATH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f) #define ACPI_SRAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SRAT_CPU_AFFINITY,f) @@ -360,6 +367,8 @@ #define ACPI_SRAT4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SRAT_GIC_ITS_AFFINITY,f) #define ACPI_TCPA_CLIENT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_CLIENT,f) #define ACPI_TCPA_SERVER_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_SERVER,f) +#define ACPI_TPM2A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f) +#define ACPI_TPM211_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_ARM_SMC,f) #define ACPI_VRTC0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_VRTC_ENTRY,f) #define ACPI_WDAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_WDAT_ENTRY,f) @@ -415,7 +424,9 @@ #define ACPI_PCCT2_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_PCCT_HW_REDUCED_TYPE2,f,o) #define ACPI_PCCT3_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_PCCT_EXT_PCC_MASTER,f,o) #define ACPI_PCCT4_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_PCCT_EXT_PCC_SLAVE,f,o) +#define ACPI_PDTT0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_PDTT_CHANNEL,f,o) #define ACPI_PMTTH_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_PMTT_HEADER,f,o) +#define ACPI_SDEVH_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_SDEV_HEADER,f,o) #define ACPI_WDDT_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_WDDT,f,o) #define ACPI_WSMT_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_WSMT,f,o) #define ACPI_EINJ0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_WHEA_HEADER,f,o) @@ -896,7 +907,6 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoCsrt1[] = ACPI_DMT_TERMINATOR }; - /* Resource Descriptor subtable */ ACPI_DMTABLE_INFO AcpiDmTableInfoCsrt2[] = @@ -1260,6 +1270,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoFpdt1[] = {ACPI_DMT_UINT64, ACPI_FPDT0_OFFSET (ExitServicesExit), "Exit Services Exit", 0}, #endif + /******************************************************************************* * * GTDT - Generic Timer Description Table @@ -1853,6 +1864,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoIort4[] = ACPI_DMT_TERMINATOR }; + /******************************************************************************* * * IVRS - I/O Virtualization Reporting Structure @@ -2219,6 +2231,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoMadt15[] = ACPI_DMT_TERMINATOR }; + /******************************************************************************* * * MCFG - PCI Memory Mapped Configuration table and Subtable @@ -2696,6 +2709,31 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPcct4[] = ACPI_DMT_TERMINATOR }; + +/******************************************************************************* + * + * PDTT - Platform Debug Trigger Table (ACPI 6.2) + * + ******************************************************************************/ + +ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt[] = +{ + {ACPI_DMT_UINT8, ACPI_PDTT_OFFSET (TriggerCount), "Trigger Count", 0}, + {ACPI_DMT_UINT24, ACPI_PDTT_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT32, ACPI_PDTT_OFFSET (ArrayOffset), "Array Offset", 0}, + ACPI_DMT_TERMINATOR +}; + +ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt0[] = +{ + {ACPI_DMT_UINT8, ACPI_PDTT0_OFFSET (SubchannelId), "Subchannel Id", 0}, + {ACPI_DMT_UINT8, ACPI_PDTT0_OFFSET (Flags), "Flags (Decoded Below)", DT_FLAG}, + {ACPI_DMT_FLAG0, ACPI_PDTT0_FLAG_OFFSET (Flags,0), "Runtime Trigger", 0}, + {ACPI_DMT_FLAG1, ACPI_PDTT0_FLAG_OFFSET (Flags,0), "Wait for Completion", 0}, + ACPI_DMT_TERMINATOR +}; + + /******************************************************************************* * * PMTT - Platform Memory Topology Table @@ -2768,16 +2806,6 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPmtt2[] = ACPI_DMT_TERMINATOR }; -/******************************************************************************* - * - * SDEI - Software Delegated Execption Interface Descriptor Table - * - ******************************************************************************/ - -ACPI_DMTABLE_INFO AcpiDmTableInfoSdei[] = -{ - ACPI_DMT_TERMINATOR -}; /******************************************************************************* * @@ -2801,7 +2829,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPpttHdr[] = ACPI_DMTABLE_INFO AcpiDmTableInfoPptt0[] = { {ACPI_DMT_UINT16, ACPI_PPTT0_OFFSET (Reserved), "Reserved", 0}, - {ACPI_DMT_UINT32, ACPI_PPTT0_OFFSET (Flags), "Flags", 0}, + {ACPI_DMT_UINT32, ACPI_PPTT0_OFFSET (Flags), "Flags (decoded below)", 0}, {ACPI_DMT_FLAG0, ACPI_PPTT0_FLAG_OFFSET (Flags,0), "Physical package", 0}, {ACPI_DMT_FLAG1, ACPI_PPTT0_FLAG_OFFSET (Flags,0), "ACPI Processor ID valid", 0}, {ACPI_DMT_UINT32, ACPI_PPTT0_OFFSET (Parent), "Parent", 0}, @@ -2821,7 +2849,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPptt0a[] = ACPI_DMTABLE_INFO AcpiDmTableInfoPptt1[] = { {ACPI_DMT_UINT16, ACPI_PPTT1_OFFSET (Reserved), "Reserved", 0}, - {ACPI_DMT_UINT32, ACPI_PPTT1_OFFSET (Flags), "Flags", 0}, + {ACPI_DMT_UINT32, ACPI_PPTT1_OFFSET (Flags), "Flags (decoded below)", 0}, {ACPI_DMT_FLAG0, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Size valid", 0}, {ACPI_DMT_FLAG1, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Number of Sets valid", 0}, {ACPI_DMT_FLAG2, ACPI_PPTT1_FLAG_OFFSET (Flags,0), "Associativity valid", 0}, @@ -2855,6 +2883,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPptt2[] = ACPI_DMT_TERMINATOR }; + /******************************************************************************* * * RASF - RAS Feature table @@ -2867,6 +2896,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoRasf[] = ACPI_DMT_TERMINATOR }; + /******************************************************************************* * * S3PT - S3 Performance Table @@ -2927,6 +2957,86 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[] = /******************************************************************************* * + * SDEI - Software Delegated Execption Interface Descriptor Table + * + ******************************************************************************/ + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdei[] = +{ + ACPI_DMT_TERMINATOR +}; + + +/******************************************************************************* + * + * SDEV - Secure Devices Table (ACPI 6.2) + * + ******************************************************************************/ + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdev[] = +{ + ACPI_DMT_TERMINATOR +}; + +/* Common Subtable header (one per Subtable) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdevHdr[] = +{ + {ACPI_DMT_SDEV, ACPI_SDEVH_OFFSET (Type), "Subtable Type", 0}, + {ACPI_DMT_UINT8, ACPI_SDEVH_OFFSET (Flags), "Flags (decoded below)", 0}, + {ACPI_DMT_FLAG0, ACPI_SDEVH_FLAG_OFFSET (Flags,0), "Allow handoff to unsecure OS", 0}, + {ACPI_DMT_UINT16, ACPI_SDEVH_OFFSET (Length), "Length", 0}, + ACPI_DMT_TERMINATOR +}; + +/* SDEV Subtables */ + +/* 0: Namespace Device Based Secure Device Structure */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdev0[] = +{ + {ACPI_DMT_UINT16, ACPI_SDEV0_OFFSET (DeviceIdOffset), "Device ID Offset", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV0_OFFSET (DeviceIdLength), "Device ID Length", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV0_OFFSET (VendorDataOffset), "Vendor Data Offset", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV0_OFFSET (VendorDataLength), "Vendor Data Length", 0}, + ACPI_DMT_TERMINATOR +}; + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdev0a[] = +{ + {ACPI_DMT_STRING, 0, "Namepath", 0}, + ACPI_DMT_TERMINATOR +}; + +/* 1: PCIe Endpoint Device Based Device Structure */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdev1[] = +{ + {ACPI_DMT_UINT16, ACPI_SDEV1_OFFSET (Segment), "Segment", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV1_OFFSET (StartBus), "Start Bus", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV1_OFFSET (PathOffset), "Path Offset", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV1_OFFSET (PathLength), "Path Length", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV1_OFFSET (VendorDataOffset), "Vendor Data Offset", 0}, + {ACPI_DMT_UINT16, ACPI_SDEV1_OFFSET (VendorDataLength), "Vendor Data Length", 0}, + ACPI_DMT_TERMINATOR +}; + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdev1a[] = +{ + {ACPI_DMT_UINT8, ACPI_SDEV1A_OFFSET (Device), "Device", 0}, + {ACPI_DMT_UINT8, ACPI_SDEV1A_OFFSET (Function), "Function", 0}, + ACPI_DMT_TERMINATOR +}; + +ACPI_DMTABLE_INFO AcpiDmTableInfoSdev1b[] = +{ + {ACPI_DMT_RAW_BUFFER, 0, "Vendor Data", 0}, /*, DT_OPTIONAL}, */ + ACPI_DMT_TERMINATOR +}; + + +/******************************************************************************* + * * SLIC - Software Licensing Description Table. This table contains the standard * ACPI header followed by proprietary data structures * @@ -3186,7 +3296,29 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[] = {ACPI_DMT_UINT16, ACPI_TPM2_OFFSET (PlatformClass), "Platform Class", 0}, {ACPI_DMT_UINT16, ACPI_TPM2_OFFSET (Reserved), "Reserved", 0}, {ACPI_DMT_UINT64, ACPI_TPM2_OFFSET (ControlAddress), "Control Address", 0}, - {ACPI_DMT_UINT32, ACPI_TPM2_OFFSET (StartMethod), "Start Method", 0}, + {ACPI_DMT_TPM2, ACPI_TPM2_OFFSET (StartMethod), "Start Method", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Optional trailer. LogLength and LogAddress are additionally optional */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[] = +{ + {ACPI_DMT_BUF12, ACPI_TPM2A_OFFSET (MethodParameters), "Method Parameters", DT_OPTIONAL}, + {ACPI_DMT_UINT32, ACPI_TPM2A_OFFSET (MinimumLogLength), "Minimum Log Length", DT_OPTIONAL}, + {ACPI_DMT_UINT64, ACPI_TPM2A_OFFSET (LogAddress), "Log Address", DT_OPTIONAL}, + ACPI_DMT_TERMINATOR +}; + +/* 11: Start Method for ARM SMC */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[] = +{ + {ACPI_DMT_UINT32, ACPI_TPM211_OFFSET (GlobalInterrupt), "Global Interrupt", 0}, + {ACPI_DMT_UINT8, ACPI_TPM211_OFFSET (InterruptFlags), "Interrupt Flags", 0}, + {ACPI_DMT_UINT8, ACPI_TPM211_OFFSET (OperationFlags), "Operation Flags", 0}, + {ACPI_DMT_UINT16, ACPI_TPM211_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT32, ACPI_TPM211_OFFSET (FunctionId), "Function ID", 0}, ACPI_DMT_TERMINATOR }; diff --git a/source/compiler/aslallocate.c b/source/compiler/aslallocate.c new file mode 100644 index 000000000000..e9898dffd30e --- /dev/null +++ b/source/compiler/aslallocate.c @@ -0,0 +1,303 @@ +/****************************************************************************** + * + * Module Name: aslallocate -- Local memory allocation + * + *****************************************************************************/ + +/****************************************************************************** + * + * 1. Copyright Notice + * + * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. + * All rights reserved. + * + * 2. License + * + * 2.1. This is your license from Intel Corp. under its intellectual property + * rights. You may have additional license terms from the party that provided + * you this software, covering your right to use that party's intellectual + * property rights. + * + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a + * copy of the source code appearing in this file ("Covered Code") an + * irrevocable, perpetual, worldwide license under Intel's copyrights in the + * base code distributed originally by Intel ("Original Intel Code") to copy, + * make derivatives, distribute, use and display any portion of the Covered + * Code in any form, with the right to sublicense such rights; and + * + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent + * license (with the right to sublicense), under only those claims of Intel + * patents that are infringed by the Original Intel Code, to make, use, sell, + * offer to sell, and import the Covered Code and derivative works thereof + * solely to the minimum extent necessary to exercise the above copyright + * license, and in no event shall the patent license extend to any additions + * to or modifications of the Original Intel Code. No other license or right + * is granted directly or by implication, estoppel or otherwise; + * + * The above copyright and patent license is granted only if the following + * conditions are met: + * + * 3. Conditions + * + * 3.1. Redistribution of Source with Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification with rights to further distribute source must include + * the above Copyright Notice, the above License, this list of Conditions, + * and the following Disclaimer and Export Compliance provision. In addition, + * Licensee must cause all Covered Code to which Licensee contributes to + * contain a file documenting the changes Licensee made to create that Covered + * Code and the date of any change. Licensee must include in that file the + * documentation of any changes made by any predecessor Licensee. Licensee + * must include a prominent statement that the modification is derived, + * directly or indirectly, from Original Intel Code. + * + * 3.2. Redistribution of Source with no Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification without rights to further distribute source must + * include the following Disclaimer and Export Compliance provision in the + * documentation and/or other materials provided with distribution. In + * addition, Licensee may not authorize further sublicense of source of any + * portion of the Covered Code, and must include terms to the effect that the + * license from Licensee to its licensee is limited to the intellectual + * property embodied in the software Licensee provides to its licensee, and + * not to intellectual property embodied in modifications its licensee may + * make. + * + * 3.3. Redistribution of Executable. Redistribution in executable form of any + * substantial portion of the Covered Code or modification must reproduce the + * above Copyright Notice, and the following Disclaimer and Export Compliance + * provision in the documentation and/or other materials provided with the + * distribution. + * + * 3.4. Intel retains all right, title, and interest in and to the Original + * Intel Code. + * + * 3.5. Neither the name Intel nor any other trademark owned or controlled by + * Intel shall be used in advertising or otherwise to promote the sale, use or + * other dealings in products derived from or relating to the Covered Code + * without prior written authorization from Intel. + * + * 4. Disclaimer and Export Compliance + * + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY + * LIMITED REMEDY. + * + * 4.3. Licensee shall not export, either directly or indirectly, any of this + * software or system incorporating such software without first obtaining any + * required license or other approval from the U. S. Department of Commerce or + * any other agency or department of the United States Government. In the + * event Licensee exports any such software from the United States or + * re-exports any such software from a foreign destination, Licensee shall + * ensure that the distribution and export/re-export of the software is in + * compliance with all laws, regulations, orders, or other restrictions of the + * U.S. Export Administration Regulations. Licensee agrees that neither it nor + * any of its subsidiaries will export/re-export any technical data, process, + * software, or service, directly or indirectly, to any country for which the + * United States government or any agency thereof requires an export license, + * other governmental approval, or letter of assurance, without first obtaining + * such license, approval or letter. + * + ***************************************************************************** + * + * Alternatively, you may choose to be licensed under the terms of the + * following license: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, you may choose to be licensed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + *****************************************************************************/ + +#include "aslcompiler.h" + +/* + * Local heap allocation wrappers. See aslcache.c for allocation from local + * cache alloctions + */ + + +/******************************************************************************* + * + * FUNCTION: UtLocalCalloc + * + * PARAMETERS: Size - Bytes to be allocated + * + * RETURN: Pointer to the allocated memory. If this function returns + * (the compiler is not aborted), the pointer is guaranteed to + * be valid. + * + * DESCRIPTION: Allocate zero-initialized memory. The point of this function + * is to abort the compile on an allocation failure, on the + * assumption that nothing more can be accomplished. + * + * NOTE: For allocation from the local caches, see aslcache.c + * + ******************************************************************************/ + +void * +UtLocalCalloc ( + UINT32 Size) +{ + void *Allocated; + + + Allocated = ACPI_ALLOCATE_ZEROED (Size); + if (!Allocated) + { + AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, + Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, + Gbl_InputByteCount, Gbl_CurrentColumn, + Gbl_Files[ASL_FILE_INPUT].Filename, NULL); + + CmCleanupAndExit (); + exit (1); + } + + TotalAllocations++; + TotalAllocated += Size; + return (Allocated); +} + + +/****************************************************************************** + * + * FUNCTION: UtExpandLineBuffers + * + * PARAMETERS: None. Updates global line buffer pointers. + * + * RETURN: None. Reallocates the global line buffers + * + * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates + * all global line buffers and updates Gbl_LineBufferSize. NOTE: + * Also used for the initial allocation of the buffers, when + * all of the buffer pointers are NULL. Initial allocations are + * of size ASL_DEFAULT_LINE_BUFFER_SIZE + * + *****************************************************************************/ + +void +UtExpandLineBuffers ( + void) +{ + UINT32 NewSize; + + + /* Attempt to double the size of all line buffers */ + + NewSize = Gbl_LineBufferSize * 2; + if (Gbl_CurrentLineBuffer) + { + DbgPrint (ASL_DEBUG_OUTPUT, + "Increasing line buffer size from %u to %u\n", + Gbl_LineBufferSize, NewSize); + } + + UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize); + UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize); + UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize); + UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize); + + Gbl_LineBufPtr = Gbl_CurrentLineBuffer; + Gbl_LineBufferSize = NewSize; +} + + +/****************************************************************************** + * + * FUNCTION: UtReallocLineBuffers + * + * PARAMETERS: Buffer - Buffer to realloc + * OldSize - Old size of Buffer + * NewSize - New size of Buffer + * + * RETURN: none + * + * DESCRIPTION: Reallocate and initialize Buffer + * + *****************************************************************************/ + +void +UtReallocLineBuffers ( + char **Buffer, + UINT32 OldSize, + UINT32 NewSize) +{ + + *Buffer = realloc (*Buffer, NewSize); + if (*Buffer) + { + memset (*Buffer + OldSize, 0, NewSize - OldSize); + return; + } + + printf ("Could not increase line buffer size from %u to %u\n", + OldSize, NewSize); + + AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL); + AslAbort (); +} + + +/****************************************************************************** + * + * FUNCTION: UtFreeLineBuffers + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Free all line buffers + * + *****************************************************************************/ + +void +UtFreeLineBuffers ( + void) +{ + + free (Gbl_CurrentLineBuffer); + free (Gbl_MainTokenBuffer); + free (Gbl_MacroTokenBuffer); + free (Gbl_ExpressionTokenBuffer); +} diff --git a/source/compiler/aslcache.c b/source/compiler/aslcache.c new file mode 100644 index 000000000000..4154395030df --- /dev/null +++ b/source/compiler/aslcache.c @@ -0,0 +1,481 @@ +/****************************************************************************** + * + * Module Name: aslcache -- Local cache support for iASL + * + *****************************************************************************/ + +/****************************************************************************** + * + * 1. Copyright Notice + * + * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. + * All rights reserved. + * + * 2. License + * + * 2.1. This is your license from Intel Corp. under its intellectual property + * rights. You may have additional license terms from the party that provided + * you this software, covering your right to use that party's intellectual + * property rights. + * + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a + * copy of the source code appearing in this file ("Covered Code") an + * irrevocable, perpetual, worldwide license under Intel's copyrights in the + * base code distributed originally by Intel ("Original Intel Code") to copy, + * make derivatives, distribute, use and display any portion of the Covered + * Code in any form, with the right to sublicense such rights; and + * + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent + * license (with the right to sublicense), under only those claims of Intel + * patents that are infringed by the Original Intel Code, to make, use, sell, + * offer to sell, and import the Covered Code and derivative works thereof + * solely to the minimum extent necessary to exercise the above copyright + * license, and in no event shall the patent license extend to any additions + * to or modifications of the Original Intel Code. No other license or right + * is granted directly or by implication, estoppel or otherwise; + * + * The above copyright and patent license is granted only if the following + * conditions are met: + * + * 3. Conditions + * + * 3.1. Redistribution of Source with Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification with rights to further distribute source must include + * the above Copyright Notice, the above License, this list of Conditions, + * and the following Disclaimer and Export Compliance provision. In addition, + * Licensee must cause all Covered Code to which Licensee contributes to + * contain a file documenting the changes Licensee made to create that Covered + * Code and the date of any change. Licensee must include in that file the + * documentation of any changes made by any predecessor Licensee. Licensee + * must include a prominent statement that the modification is derived, + * directly or indirectly, from Original Intel Code. + * + * 3.2. Redistribution of Source with no Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification without rights to further distribute source must + * include the following Disclaimer and Export Compliance provision in the + * documentation and/or other materials provided with distribution. In + * addition, Licensee may not authorize further sublicense of source of any + * portion of the Covered Code, and must include terms to the effect that the + * license from Licensee to its licensee is limited to the intellectual + * property embodied in the software Licensee provides to its licensee, and + * not to intellectual property embodied in modifications its licensee may + * make. + * + * 3.3. Redistribution of Executable. Redistribution in executable form of any + * substantial portion of the Covered Code or modification must reproduce the + * above Copyright Notice, and the following Disclaimer and Export Compliance + * provision in the documentation and/or other materials provided with the + * distribution. + * + * 3.4. Intel retains all right, title, and interest in and to the Original + * Intel Code. + * + * 3.5. Neither the name Intel nor any other trademark owned or controlled by + * Intel shall be used in advertising or otherwise to promote the sale, use or + * other dealings in products derived from or relating to the Covered Code + * without prior written authorization from Intel. + * + * 4. Disclaimer and Export Compliance + * + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY + * LIMITED REMEDY. + * + * 4.3. Licensee shall not export, either directly or indirectly, any of this + * software or system incorporating such software without first obtaining any + * required license or other approval from the U. S. Department of Commerce or + * any other agency or department of the United States Government. In the + * event Licensee exports any such software from the United States or + * re-exports any such software from a foreign destination, Licensee shall + * ensure that the distribution and export/re-export of the software is in + * compliance with all laws, regulations, orders, or other restrictions of the + * U.S. Export Administration Regulations. Licensee agrees that neither it nor + * any of its subsidiaries will export/re-export any technical data, process, + * software, or service, directly or indirectly, to any country for which the + * United States government or any agency thereof requires an export license, + * other governmental approval, or letter of assurance, without first obtaining + * such license, approval or letter. + * + ***************************************************************************** + * + * Alternatively, you may choose to be licensed under the terms of the + * following license: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, you may choose to be licensed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + *****************************************************************************/ + +#include "aslcompiler.h" + +/* + * Local caches. The caches are fully deleted after the compilation/disassembly + * of each individual input file. Thus, individual allocations from the cache + * memory do not need to be freed or even released back into the cache. + * + * See aslallocate.c for standard heap allocations. + */ + + +/******************************************************************************* + * + * FUNCTION: UtLocalCacheCalloc + * + * PARAMETERS: Length - Size of buffer requested + * + * RETURN: Pointer to the buffer. Aborts compiler on allocation failure + * + * DESCRIPTION: Allocate a string buffer. Bypass the local + * dynamic memory manager for performance reasons (This has a + * major impact on the speed of the compiler.) + * + ******************************************************************************/ + +char * +UtLocalCacheCalloc ( + UINT32 Length) +{ + char *Buffer; + ASL_CACHE_INFO *Cache; + UINT32 CacheSize = ASL_STRING_CACHE_SIZE; + + + if (Length > CacheSize) + { + CacheSize = Length; + + if (Gbl_StringCacheList) + { + Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize); + + /* Link new cache buffer just following head of list */ + + Cache->Next = Gbl_StringCacheList->Next; + Gbl_StringCacheList->Next = Cache; + + /* Leave cache management pointers alone as they pertain to head */ + + Gbl_StringCount++; + Gbl_StringSize += Length; + + return (Cache->Buffer); + } + } + + if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast) + { + /* Allocate a new buffer */ + + Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize); + + /* Link new cache buffer to head of list */ + + Cache->Next = Gbl_StringCacheList; + Gbl_StringCacheList = Cache; + + /* Setup cache management pointers */ + + Gbl_StringCacheNext = Cache->Buffer; + Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize; + } + + Gbl_StringCount++; + Gbl_StringSize += Length; + + Buffer = Gbl_StringCacheNext; + Gbl_StringCacheNext += Length; + return (Buffer); +} + + +/******************************************************************************* + * + * FUNCTION: UtParseOpCacheCalloc + * + * PARAMETERS: None + * + * RETURN: New parse op. Aborts on allocation failure + * + * DESCRIPTION: Allocate a new parse op for the parse tree. Bypass the local + * dynamic memory manager for performance reasons (This has a + * major impact on the speed of the compiler.) + * + ******************************************************************************/ + +ACPI_PARSE_OBJECT * +UtParseOpCacheCalloc ( + void) +{ + ASL_CACHE_INFO *Cache; + + + if (Gbl_ParseOpCacheNext >= Gbl_ParseOpCacheLast) + { + /* Allocate a new buffer */ + + Cache = UtLocalCalloc (sizeof (Cache->Next) + + (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE)); + + /* Link new cache buffer to head of list */ + + Cache->Next = Gbl_ParseOpCacheList; + Gbl_ParseOpCacheList = Cache; + + /* Setup cache management pointers */ + + Gbl_ParseOpCacheNext = ACPI_CAST_PTR (ACPI_PARSE_OBJECT, Cache->Buffer); + Gbl_ParseOpCacheLast = Gbl_ParseOpCacheNext + ASL_PARSEOP_CACHE_SIZE; + } + + Gbl_ParseOpCount++; + return (Gbl_ParseOpCacheNext++); +} + + +/******************************************************************************* + * + * FUNCTION: UtSubtableCacheCalloc - Data Table compiler + * + * PARAMETERS: None + * + * RETURN: Pointer to the buffer. Aborts on allocation failure + * + * DESCRIPTION: Allocate a subtable object buffer. Bypass the local + * dynamic memory manager for performance reasons (This has a + * major impact on the speed of the compiler.) + * + ******************************************************************************/ + +DT_SUBTABLE * +UtSubtableCacheCalloc ( + void) +{ + ASL_CACHE_INFO *Cache; + + + if (Gbl_SubtableCacheNext >= Gbl_SubtableCacheLast) + { + /* Allocate a new buffer */ + + Cache = UtLocalCalloc (sizeof (Cache->Next) + + (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE)); + + /* Link new cache buffer to head of list */ + + Cache->Next = Gbl_SubtableCacheList; + Gbl_SubtableCacheList = Cache; + + /* Setup cache management pointers */ + + Gbl_SubtableCacheNext = ACPI_CAST_PTR (DT_SUBTABLE, Cache->Buffer); + Gbl_SubtableCacheLast = Gbl_SubtableCacheNext + ASL_SUBTABLE_CACHE_SIZE; + } + + Gbl_SubtableCount++; + return (Gbl_SubtableCacheNext++); +} + + +/******************************************************************************* + * + * FUNCTION: UtFieldCacheCalloc - Data Table compiler + * + * PARAMETERS: None + * + * RETURN: Pointer to the buffer. Aborts on allocation failure + * + * DESCRIPTION: Allocate a field object buffer. Bypass the local + * dynamic memory manager for performance reasons (This has a + * major impact on the speed of the compiler.) + * + ******************************************************************************/ + +DT_FIELD * +UtFieldCacheCalloc ( + void) +{ + ASL_CACHE_INFO *Cache; + + + if (Gbl_FieldCacheNext >= Gbl_FieldCacheLast) + { + /* Allocate a new buffer */ + + Cache = UtLocalCalloc (sizeof (Cache->Next) + + (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE)); + + /* Link new cache buffer to head of list */ + + Cache->Next = Gbl_FieldCacheList; + Gbl_FieldCacheList = Cache; + + /* Setup cache management pointers */ + + Gbl_FieldCacheNext = ACPI_CAST_PTR (DT_FIELD, Cache->Buffer); + Gbl_FieldCacheLast = Gbl_FieldCacheNext + ASL_FIELD_CACHE_SIZE; + } + + Gbl_FieldCount++; + return (Gbl_FieldCacheNext++); +} + + +/******************************************************************************* + * + * FUNCTION: UtDeleteLocalCaches + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Delete all local cache buffer blocks + * + ******************************************************************************/ + +void +UtDeleteLocalCaches ( + void) +{ + UINT32 BufferCount; + ASL_CACHE_INFO *Next; + + + /* + * Generic cache, arbitrary size allocations + */ + BufferCount = 0; + while (Gbl_StringCacheList) + { + Next = Gbl_StringCacheList->Next; + ACPI_FREE (Gbl_StringCacheList); + Gbl_StringCacheList = Next; + BufferCount++; + } + + DbgPrint (ASL_DEBUG_OUTPUT, + "%u Strings (%u bytes), Buffer size: %u bytes, %u Buffers\n", + Gbl_StringCount, Gbl_StringSize, ASL_STRING_CACHE_SIZE, BufferCount); + + /* Reset cache globals */ + + Gbl_StringSize = 0; + Gbl_StringCount = 0; + Gbl_StringCacheNext = NULL; + Gbl_StringCacheLast = NULL; + + + /* + * Parse Op cache + */ + BufferCount = 0; + while (Gbl_ParseOpCacheList) + { + Next = Gbl_ParseOpCacheList->Next; + ACPI_FREE (Gbl_ParseOpCacheList); + Gbl_ParseOpCacheList = Next; + BufferCount++; + } + + DbgPrint (ASL_DEBUG_OUTPUT, + "%u ParseOps, Buffer size: %u ops (%u bytes), %u Buffers\n", + Gbl_ParseOpCount, ASL_PARSEOP_CACHE_SIZE, + (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE), BufferCount); + + /* Reset cache globals */ + + Gbl_ParseOpCount = 0; + Gbl_ParseOpCacheNext = NULL; + Gbl_ParseOpCacheLast = NULL; + Gbl_ParseTreeRoot = NULL; + + + /* + * Table Compiler - Field cache + */ + BufferCount = 0; + while (Gbl_FieldCacheList) + { + Next = Gbl_FieldCacheList->Next; + ACPI_FREE (Gbl_FieldCacheList); + Gbl_FieldCacheList = Next; + BufferCount++; + } + + DbgPrint (ASL_DEBUG_OUTPUT, + "%u Fields, Buffer size: %u fields (%u bytes), %u Buffers\n", + Gbl_FieldCount, ASL_FIELD_CACHE_SIZE, + (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE), BufferCount); + + /* Reset cache globals */ + + Gbl_FieldCount = 0; + Gbl_FieldCacheNext = NULL; + Gbl_FieldCacheLast = NULL; + + + /* + * Table Compiler - Subtable cache + */ + BufferCount = 0; + while (Gbl_SubtableCacheList) + { + Next = Gbl_SubtableCacheList->Next; + ACPI_FREE (Gbl_SubtableCacheList); + Gbl_SubtableCacheList = Next; + BufferCount++; + } + + DbgPrint (ASL_DEBUG_OUTPUT, + "%u Subtables, Buffer size: %u subtables (%u bytes), %u Buffers\n", + Gbl_SubtableCount, ASL_SUBTABLE_CACHE_SIZE, + (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE), BufferCount); + + /* Reset cache globals */ + + Gbl_SubtableCount = 0; + Gbl_SubtableCacheNext = NULL; + Gbl_SubtableCacheLast = NULL; +} diff --git a/source/compiler/aslcompile.c b/source/compiler/aslcompile.c index 385684401392..1ddb8864c465 100644 --- a/source/compiler/aslcompile.c +++ b/source/compiler/aslcompile.c @@ -150,7 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #include "acnamesp.h" #include <stdio.h> @@ -932,70 +931,7 @@ CmCleanupAndExit ( if (!Gbl_DoAslConversion) { - CmDeleteCaches (); + UtDeleteLocalCaches (); } } - - -/******************************************************************************* - * - * FUNCTION: CmDeleteCaches - * - * PARAMETERS: None - * - * RETURN: None - * - * DESCRIPTION: Delete all local cache buffer blocks - * - ******************************************************************************/ - -void -CmDeleteCaches ( - void) -{ - UINT32 BufferCount; - ASL_CACHE_INFO *Next; - - - /* Parse Op cache */ - - BufferCount = 0; - while (Gbl_ParseOpCacheList) - { - Next = Gbl_ParseOpCacheList->Next; - ACPI_FREE (Gbl_ParseOpCacheList); - Gbl_ParseOpCacheList = Next; - BufferCount++; - } - - DbgPrint (ASL_DEBUG_OUTPUT, - "%u ParseOps, Buffer size: %u ops (%u bytes), %u Buffers\n", - Gbl_ParseOpCount, ASL_PARSEOP_CACHE_SIZE, - (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE), BufferCount); - - Gbl_ParseOpCount = 0; - Gbl_ParseOpCacheNext = NULL; - Gbl_ParseOpCacheLast = NULL; - Gbl_ParseTreeRoot = NULL; - - /* Generic string cache */ - - BufferCount = 0; - while (Gbl_StringCacheList) - { - Next = Gbl_StringCacheList->Next; - ACPI_FREE (Gbl_StringCacheList); - Gbl_StringCacheList = Next; - BufferCount++; - } - - DbgPrint (ASL_DEBUG_OUTPUT, - "%u Strings (%u bytes), Buffer size: %u bytes, %u Buffers\n", - Gbl_StringCount, Gbl_StringSize, ASL_STRING_CACHE_SIZE, BufferCount); - - Gbl_StringSize = 0; - Gbl_StringCount = 0; - Gbl_StringCacheNext = NULL; - Gbl_StringCacheLast = NULL; -} diff --git a/source/compiler/aslcompiler.h b/source/compiler/aslcompiler.h index 3b6a9c1dc1c2..fdf7ea96d3ae 100644 --- a/source/compiler/aslcompiler.h +++ b/source/compiler/aslcompiler.h @@ -181,6 +181,7 @@ #include "aslmessages.h" #include "aslglobal.h" #include "preprocess.h" +#include "dtcompiler.h" /******************************************************************************* @@ -265,8 +266,50 @@ void CmCleanupAndExit ( void); + +/* + * aslallocate - memory allocation + */ +void * +UtLocalCalloc ( + UINT32 Size); + +void +UtExpandLineBuffers ( + void); + +void +UtReallocLineBuffers ( + char **Buffer, + UINT32 OldSize, + UINT32 NewSize); + +void +UtFreeLineBuffers ( + void); + + +/* + * aslcache - local cache support + */ +char * +UtLocalCacheCalloc ( + UINT32 Length); + +ACPI_PARSE_OBJECT * +UtParseOpCacheCalloc ( + void); + +DT_SUBTABLE * +UtSubtableCacheCalloc ( + void); + +DT_FIELD * +UtFieldCacheCalloc ( + void); + void -CmDeleteCaches ( +UtDeleteLocalCaches ( void); @@ -407,6 +450,16 @@ AslAbort ( void); void +AslDualParseOpError ( + UINT8 Level, + UINT16 MainMessageId, + ACPI_PARSE_OBJECT *MainOp, + char *MainMessage, + UINT16 SecondMessageId, + ACPI_PARSE_OBJECT *SecondOp, + char *SecondaryMessage); + +void AslError ( UINT8 Level, UINT16 MessageId, @@ -1150,10 +1203,6 @@ void UtEndEvent ( UINT8 Event); -void * -UtLocalCalloc ( - UINT32 Size); - void UtDisplaySummary ( UINT32 FileId); @@ -1176,18 +1225,6 @@ void UtSetParseOpName ( ACPI_PARSE_OBJECT *Op); -char * -UtStringCacheCalloc ( - UINT32 Length); - -void -UtExpandLineBuffers ( - void); - -void -UtFreeLineBuffers ( - void); - ACPI_STATUS UtInternalizeName ( char *ExternalName, diff --git a/source/compiler/aslcompiler.l b/source/compiler/aslcompiler.l index 5fcfc1886770..a5d0ee9a7f32 100644 --- a/source/compiler/aslcompiler.l +++ b/source/compiler/aslcompiler.l @@ -813,7 +813,7 @@ NamePathTail [.]{NameSeg} {NameSeg} { char *s; count (0); - s=UtStringCacheCalloc (ACPI_NAME_SIZE + 1); + s=UtLocalCacheCalloc (ACPI_NAME_SIZE + 1); if (strcmp (AslCompilertext, "\\")) { strcpy (s, "____"); @@ -826,7 +826,7 @@ NamePathTail [.]{NameSeg} {NameString} { char *s; count (0); - s=UtStringCacheCalloc (strlen (AslCompilertext)+1); + s=UtLocalCacheCalloc (strlen (AslCompilertext)+1); AcpiUtStrupr (AslCompilertext); strcpy (s, AslCompilertext); AslCompilerlval.s = s; diff --git a/source/compiler/asldebug.c b/source/compiler/asldebug.c index 684e222485bf..ba252251f72e 100644 --- a/source/compiler/asldebug.c +++ b/source/compiler/asldebug.c @@ -356,7 +356,7 @@ UtCreateEscapeSequences ( /* New string buffer, 3 extra chars per escape (4 total) */ - OutString = UtLocalCalloc (InStringLength + (EscapeCount * 3)); + OutString = UtLocalCacheCalloc (InStringLength + (EscapeCount * 3)); OutStringPtr = OutString; /* Convert non-ascii or non-printable chars to escape sequences */ diff --git a/source/compiler/aslerror.c b/source/compiler/aslerror.c index 56b5cabb9476..087f06ef10bd 100644 --- a/source/compiler/aslerror.c +++ b/source/compiler/aslerror.c @@ -170,6 +170,37 @@ AslIsExceptionDisabled ( UINT8 Level, UINT16 MessageId); +static void AslInitEnode ( + ASL_ERROR_MSG **Enode, + UINT8 Level, + UINT16 MessageId, + UINT32 LineNumber, + UINT32 LogicalLineNumber, + UINT32 LogicalByteOffset, + UINT32 Column, + char *Filename, + char *Message, + char *SourceLine, + ASL_ERROR_MSG *SubError); + +static void +AslLogNewError ( + UINT8 Level, + UINT16 MessageId, + UINT32 LineNumber, + UINT32 LogicalLineNumber, + UINT32 LogicalByteOffset, + UINT32 Column, + char *Filename, + char *Message, + char *SourceLine, + ASL_ERROR_MSG *SubError); + +static void +AePrintSubError ( + FILE *OutputFile, + ASL_ERROR_MSG *Enode); + /******************************************************************************* * @@ -220,6 +251,7 @@ AeClearErrorLog ( ASL_ERROR_MSG *Enode = Gbl_ErrorLog; ASL_ERROR_MSG *Next; + /* Walk the error node list */ while (Enode) @@ -270,8 +302,7 @@ AeAddToErrorLog ( Prev = NULL; Next = Gbl_ErrorLog; - while ((Next) && - (Next->LogicalLineNumber <= Enode->LogicalLineNumber)) + while ((Next) && (Next->LogicalLineNumber <= Enode->LogicalLineNumber)) { Prev = Next; Next = Next->Next; @@ -294,94 +325,143 @@ AeAddToErrorLog ( /******************************************************************************* * - * FUNCTION: AePrintException + * FUNCTION: AeDecodeErrorMessageId * - * PARAMETERS: FileId - ID of output file + * PARAMETERS: OutputFile - Output file * Enode - Error node to print - * Header - Additional text before each message + * PrematureEOF - True = PrematureEOF has been reached + * Total - Total legth of line * * RETURN: None * - * DESCRIPTION: Print the contents of an error node. - * - * NOTE: We don't use the FlxxxFile I/O functions here because on error - * they abort the compiler and call this function! Since we - * are reporting errors here, we ignore most output errors and - * just try to get out as much as we can. + * DESCRIPTION: Print the source line of an error. * ******************************************************************************/ -void -AePrintException ( - UINT32 FileId, +static void +AeDecodeErrorMessageId ( + FILE *OutputFile, ASL_ERROR_MSG *Enode, - char *Header) + BOOLEAN PrematureEOF, + UINT32 Total) { - UINT8 SourceByte; - int Actual; - size_t RActual; UINT32 MsgLength; const char *MainMessage; char *ExtraMessage; UINT32 SourceColumn; UINT32 ErrorColumn; - FILE *OutputFile; - FILE *SourceFile = NULL; - long FileSize; - BOOLEAN PrematureEOF = FALSE; - UINT32 Total = 0; - if (Gbl_NoErrors) + fprintf (OutputFile, "%s %4.4d -", + AeDecodeExceptionLevel (Enode->Level), + AeBuildFullExceptionCode (Enode->Level, Enode->MessageId)); + + MainMessage = AeDecodeMessageId (Enode->MessageId); + ExtraMessage = Enode->Message; + + /* If a NULL line number, just print the decoded message */ + + if (!Enode->LineNumber) { + fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage); return; } - /* - * Only listing files have a header, and remarks/optimizations - * are always output - */ - if (!Header) + MsgLength = strlen (MainMessage); + if (MsgLength == 0) { - /* Ignore remarks if requested */ + /* Use the secondary/extra message as main message */ - switch (Enode->Level) + MainMessage = Enode->Message; + if (!MainMessage) { - case ASL_WARNING: - case ASL_WARNING2: - case ASL_WARNING3: + MainMessage = ""; + } - if (!Gbl_DisplayWarnings) - { - return; - } - break; + MsgLength = strlen (MainMessage); + ExtraMessage = NULL; + } - case ASL_REMARK: + if (Gbl_VerboseErrors && !PrematureEOF) + { + if (Total >= 256) + { + fprintf (OutputFile, " %s", + MainMessage); + } + else + { + SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2; + ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1; - if (!Gbl_DisplayRemarks) + if ((MsgLength + ErrorColumn) < (SourceColumn - 1)) { - return; + fprintf (OutputFile, "%*s%s", + (int) ((SourceColumn - 1) - ErrorColumn), + MainMessage, " ^ "); } - break; - - case ASL_OPTIMIZATION: - - if (!Gbl_DisplayOptimizations) + else { - return; + fprintf (OutputFile, "%*s %s", + (int) ((SourceColumn - ErrorColumn) + 1), "^", + MainMessage); } - break; + } + } + else + { + fprintf (OutputFile, " %s", MainMessage); + } - default: + /* Print the extra info message if present */ - break; - } + if (ExtraMessage) + { + fprintf (OutputFile, " (%s)", ExtraMessage); } - /* Get the various required file handles */ + if (PrematureEOF) + { + fprintf (OutputFile, " and premature End-Of-File"); + } + + fprintf (OutputFile, "\n"); + if (Gbl_VerboseErrors && !Enode->SubError) + { + fprintf (OutputFile, "\n"); + } +} + + +/******************************************************************************* + * + * FUNCTION: AePrintErrorSourceLine + * + * PARAMETERS: OutputFile - Output file + * Enode - Error node to print + * PrematureEOF - True = PrematureEOF has been reached + * Total - amount of characters printed so far + * + * + * RETURN: Status + * + * DESCRIPTION: Print the source line of an error. + * + ******************************************************************************/ + +static ACPI_STATUS +AePrintErrorSourceLine ( + FILE *OutputFile, + ASL_ERROR_MSG *Enode, + BOOLEAN *PrematureEOF, + UINT32 *Total) +{ + UINT8 SourceByte; + int Actual; + size_t RActual; + FILE *SourceFile = NULL; + long FileSize; - OutputFile = Gbl_Files[FileId].Handle; if (!Enode->SourceLine) { @@ -404,213 +484,272 @@ AePrintException ( if ((long) Enode->LogicalByteOffset >= FileSize) { - PrematureEOF = TRUE; + *PrematureEOF = TRUE; } } - } - - if (Header) - { - fprintf (OutputFile, "%s", Header); + else + { + fprintf (OutputFile, + "[*** iASL: Source File Does not exist ***]\n"); + return AE_IO_ERROR; + } } /* Print filename and line number if present and valid */ - if (Enode->Filename) + if (Gbl_VerboseErrors) { - if (Gbl_VerboseErrors) + fprintf (OutputFile, "%-8s", Enode->Filename); + + if (Enode->SourceLine && Enode->LineNumber) + { + fprintf (OutputFile, " %6u: %s", + Enode->LineNumber, Enode->SourceLine); + } + else if (Enode->LineNumber) { - fprintf (OutputFile, "%-8s", Enode->Filename); + fprintf (OutputFile, " %6u: ", Enode->LineNumber); - if (Enode->LineNumber) + /* + * If not at EOF, get the corresponding source code line + * and display it. Don't attempt this if we have a + * premature EOF condition. + */ + if (*PrematureEOF) { - if (Enode->SourceLine) - { - fprintf (OutputFile, " %6u: %s", - Enode->LineNumber, Enode->SourceLine); - } - else + fprintf (OutputFile, "\n"); + return AE_OK; + } + /* + * Seek to the offset in the combined source file, + * read the source line, and write it to the output. + */ + Actual = fseek (SourceFile, + (long) Enode->LogicalByteOffset, (int) SEEK_SET); + if (Actual) + { + fprintf (OutputFile, + "[*** iASL: Seek error on source code temp file %s ***]", + Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); + + fprintf (OutputFile, "\n"); + return AE_OK; + } + RActual = fread (&SourceByte, 1, 1, SourceFile); + if (RActual != 1) + { + fprintf (OutputFile, + "[*** iASL: Read error on source code temp file %s ***]", + Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); + return AE_IO_ERROR; + } + /* Read/write the source line, up to the maximum line length */ + + while (RActual && SourceByte && (SourceByte != '\n')) + { + if (*Total < 256) { - fprintf (OutputFile, " %6u: ", Enode->LineNumber); - - /* - * If not at EOF, get the corresponding source code line - * and display it. Don't attempt this if we have a - * premature EOF condition. - */ - if (!PrematureEOF) + /* After the max line length, we will just read the line, no write */ + + if (fwrite (&SourceByte, 1, 1, OutputFile) != 1) { - /* - * Seek to the offset in the combined source file, - * read the source line, and write it to the output. - */ - Actual = fseek (SourceFile, - (long) Enode->LogicalByteOffset, (int) SEEK_SET); - if (Actual) - { - fprintf (OutputFile, - "[*** iASL: Seek error on source code temp file %s ***]", - Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); - } - else - { - RActual = fread (&SourceByte, 1, 1, SourceFile); - if (RActual != 1) - { - fprintf (OutputFile, - "[*** iASL: Read error on source code temp file %s ***]", - Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); - } - else - { - /* Read/write the source line, up to the maximum line length */ - - while (RActual && SourceByte && (SourceByte != '\n')) - { - if (Total < 256) - { - /* After the max line length, we will just read the line, no write */ - - if (fwrite (&SourceByte, 1, 1, OutputFile) != 1) - { - printf ("[*** iASL: Write error on output file ***]\n"); - return; - } - } - else if (Total == 256) - { - fprintf (OutputFile, - "\n[*** iASL: Very long input line, message below refers to column %u ***]", - Enode->Column); - } - - RActual = fread (&SourceByte, 1, 1, SourceFile); - if (RActual != 1) - { - fprintf (OutputFile, - "[*** iASL: Read error on source code temp file %s ***]", - Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); - return; - } - Total++; - } - } - } + printf ("[*** iASL: Write error on output file ***]\n"); + return AE_IO_ERROR; } + } + else if (*Total == 256) + { + fprintf (OutputFile, + "\n[*** iASL: Very long input line, message below refers to column %u ***]", + Enode->Column); + } + + RActual = fread (&SourceByte, 1, 1, SourceFile); + if (RActual != 1) + { + fprintf (OutputFile, + "[*** iASL: Read error on source code temp file %s ***]", + Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename); - fprintf (OutputFile, "\n"); + return AE_IO_ERROR; } + *Total += 1; } - } - else - { - /* - * Less verbose version of the error message, enabled via the - * -vi switch. The format is compatible with MS Visual Studio. - */ - fprintf (OutputFile, "%s", Enode->Filename); - if (Enode->LineNumber) - { - fprintf (OutputFile, "(%u) : ", - Enode->LineNumber); - } + fprintf (OutputFile, "\n"); } } - - /* If a NULL message ID, just print the raw message */ - - if (Enode->MessageId == 0) + else { - fprintf (OutputFile, "%s\n", Enode->Message); - return; + /* + * Less verbose version of the error message, enabled via the + * -vi switch. The format is compatible with MS Visual Studio. + */ + fprintf (OutputFile, "%s", Enode->Filename); + + if (Enode->LineNumber) + { + fprintf (OutputFile, "(%u) : ", + Enode->LineNumber); + } } - /* Decode the message ID */ + return AE_OK; +} - fprintf (OutputFile, "%s %4.4d -", - AeDecodeExceptionLevel (Enode->Level), - AeBuildFullExceptionCode (Enode->Level, Enode->MessageId)); +/******************************************************************************* + * + * FUNCTION: AePrintException + * + * PARAMETERS: FileId - ID of output file + * Enode - Error node to print + * Header - Additional text before each message + * + * RETURN: None + * + * DESCRIPTION: Print the contents of an error node. + * + * NOTE: We don't use the FlxxxFile I/O functions here because on error + * they abort the compiler and call this function! Since we + * are reporting errors here, we ignore most output errors and + * just try to get out as much as we can. + * + ******************************************************************************/ - MainMessage = AeDecodeMessageId (Enode->MessageId); - ExtraMessage = Enode->Message; +void +AePrintException ( + UINT32 FileId, + ASL_ERROR_MSG *Enode, + char *Header) +{ + FILE *OutputFile; + BOOLEAN PrematureEOF = FALSE; + UINT32 Total = 0; + ACPI_STATUS Status; + ASL_ERROR_MSG *Child = Enode->SubError; - /* If a NULL line number, just print the decoded message */ - if (!Enode->LineNumber) + if (Gbl_NoErrors) { - fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage); return; } - MsgLength = strlen (MainMessage); - if (MsgLength == 0) + /* + * Only listing files have a header, and remarks/optimizations + * are always output + */ + if (!Header) { - /* Use the secondary/extra message as main message */ + /* Ignore remarks if requested */ - MainMessage = Enode->Message; - if (!MainMessage) + switch (Enode->Level) { - MainMessage = ""; - } + case ASL_WARNING: + case ASL_WARNING2: + case ASL_WARNING3: - MsgLength = strlen (MainMessage); - ExtraMessage = NULL; - } + if (!Gbl_DisplayWarnings) + { + return; + } + break; - if (Gbl_VerboseErrors && !PrematureEOF) - { - if (Total >= 256) - { - fprintf (OutputFile, " %s", - MainMessage); - } - else - { - SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2; - ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1; + case ASL_REMARK: - if ((MsgLength + ErrorColumn) < (SourceColumn - 1)) + if (!Gbl_DisplayRemarks) { - fprintf (OutputFile, "%*s%s", - (int) ((SourceColumn - 1) - ErrorColumn), - MainMessage, " ^ "); + return; } - else + break; + + case ASL_OPTIMIZATION: + + if (!Gbl_DisplayOptimizations) { - fprintf (OutputFile, "%*s %s", - (int) ((SourceColumn - ErrorColumn) + 1), "^", - MainMessage); + return; } + break; + + default: + + break; } } - else + + /* Get the various required file handles */ + + OutputFile = Gbl_Files[FileId].Handle; + + if (Header) { - fprintf (OutputFile, " %s", MainMessage); + fprintf (OutputFile, "%s", Header); } - /* Print the extra info message if present */ + if (!Enode->Filename) + { + AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total); + return; + } - if (ExtraMessage) + Status = AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total); + if (ACPI_FAILURE (Status)) { - fprintf (OutputFile, " (%s)", ExtraMessage); + return; } - if (PrematureEOF) + /* If a NULL message ID, just print the raw message */ + + if (Enode->MessageId == 0) { - fprintf (OutputFile, " and premature End-Of-File"); + fprintf (OutputFile, "%s\n", Enode->Message); + return; } - fprintf (OutputFile, "\n"); - if (Gbl_VerboseErrors) + AeDecodeErrorMessageId (OutputFile, Enode, PrematureEOF, Total); + + while (Child) { fprintf (OutputFile, "\n"); + AePrintSubError (OutputFile, Child); + Child = Child->SubError; } } /******************************************************************************* * + * FUNCTION: AePrintSubError + * + * PARAMETERS: OutputFile - Output file + * Enode - Error node to print + * + * RETURN: None + * + * DESCRIPTION: Print the contents of an error nodes. This function is tailored + * to print error nodes that are SubErrors within ASL_ERROR_MSG + * + ******************************************************************************/ + +static void +AePrintSubError ( + FILE *OutputFile, + ASL_ERROR_MSG *Enode) +{ + UINT32 Total = 0; + BOOLEAN PrematureEOF = FALSE; + const char *MainMessage; + + + MainMessage = AeDecodeMessageId (Enode->MessageId); + + fprintf (OutputFile, " %s%s", MainMessage, "\n "); + (void) AePrintErrorSourceLine (OutputFile, Enode, &PrematureEOF, &Total); + fprintf (OutputFile, "\n"); +} + + +/******************************************************************************* + * * FUNCTION: AePrintErrorLog * * PARAMETERS: FileId - Where to output the error log @@ -640,54 +779,72 @@ AePrintErrorLog ( /******************************************************************************* * - * FUNCTION: AslCommonError2 + * FUNCTION: AslInitEnode * - * PARAMETERS: Level - Seriousness (Warning/error, etc.) + * PARAMETERS: InputEnode - Input Error node to initialize + * Level - Seriousness (Warning/error, etc.) * MessageId - Index into global message buffer - * LineNumber - Actual file line number + * CurrentLineNumber - Actual file line number + * LogicalLineNumber - Cumulative line number + * LogicalByteOffset - Byte offset in source file * Column - Column in current line - * SourceLine - Actual source code line * Filename - source filename * ExtraMessage - additional error message + * SourceLine - Line of error source code + * SubError - SubError of this InputEnode * * RETURN: None * - * DESCRIPTION: Create a new error node and add it to the error log + * DESCRIPTION: Initialize an Error node * ******************************************************************************/ -void -AslCommonError2 ( +static void AslInitEnode ( + ASL_ERROR_MSG **InputEnode, UINT8 Level, UINT16 MessageId, UINT32 LineNumber, + UINT32 LogicalLineNumber, + UINT32 LogicalByteOffset, UINT32 Column, - char *SourceLine, char *Filename, - char *ExtraMessage) + char *ExtraMessage, + char *SourceLine, + ASL_ERROR_MSG *SubError) { - char *MessageBuffer = NULL; - char *LineBuffer; ASL_ERROR_MSG *Enode; - Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); + *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); + Enode = *InputEnode; + Enode->Level = Level; + Enode->MessageId = MessageId; + Enode->LineNumber = LineNumber; + Enode->LogicalLineNumber = LogicalLineNumber; + Enode->LogicalByteOffset = LogicalByteOffset; + Enode->Column = Column; + Enode->SubError = SubError; + Enode->Message = NULL; + Enode->SourceLine = NULL; + Enode->Filename = NULL; if (ExtraMessage) { /* Allocate a buffer for the message and a new error node */ - MessageBuffer = UtStringCacheCalloc (strlen (ExtraMessage) + 1); + Enode->Message = UtLocalCacheCalloc (strlen (ExtraMessage) + 1); /* Keep a copy of the extra message */ - strcpy (MessageBuffer, ExtraMessage); + strcpy (Enode->Message, ExtraMessage); } - LineBuffer = UtLocalCalloc (strlen (SourceLine) + 1); - strcpy (LineBuffer, SourceLine); + if (SourceLine) + { + Enode->SourceLine = UtLocalCalloc (strlen (SourceLine) + 1); + strcpy (Enode->SourceLine, SourceLine); + } - /* Initialize the error node */ if (Filename) { @@ -698,28 +855,39 @@ AslCommonError2 ( Enode->FilenameLength = 6; } } +} - Enode->MessageId = MessageId; - Enode->Level = Level; - Enode->LineNumber = LineNumber; - Enode->LogicalLineNumber = LineNumber; - Enode->LogicalByteOffset = 0; - Enode->Column = Column; - Enode->Message = MessageBuffer; - Enode->SourceLine = LineBuffer; - - /* Add the new node to the error node list */ - - AeAddToErrorLog (Enode); - - if (Gbl_DebugFlag) - { - /* stderr is a file, send error to it immediately */ - AePrintException (ASL_FILE_STDERR, Enode, NULL); - } +/******************************************************************************* + * + * FUNCTION: AslCommonError2 + * + * PARAMETERS: Level - Seriousness (Warning/error, etc.) + * MessageId - Index into global message buffer + * LineNumber - Actual file line number + * Column - Column in current line + * SourceLine - Actual source code line + * Filename - source filename + * ExtraMessage - additional error message + * + * RETURN: None + * + * DESCRIPTION: Create a new error node and add it to the error log + * + ******************************************************************************/ - Gbl_ExceptionCount[Level]++; +void +AslCommonError2 ( + UINT8 Level, + UINT16 MessageId, + UINT32 LineNumber, + UINT32 Column, + char *SourceLine, + char *Filename, + char *ExtraMessage) +{ + AslLogNewError (Level, MessageId, LineNumber, LineNumber, 0, Column, + Filename, ExtraMessage, SourceLine, NULL); } @@ -753,48 +921,51 @@ AslCommonError ( char *Filename, char *ExtraMessage) { - char *MessageBuffer = NULL; - ASL_ERROR_MSG *Enode; - - - if (AslIsExceptionIgnored (Level, MessageId)) - { - return; - } - - Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); - - if (ExtraMessage) - { - /* Allocate a buffer for the message and a new error node */ - - MessageBuffer = UtStringCacheCalloc (strlen (ExtraMessage) + 1); - - /* Keep a copy of the extra message */ + AslLogNewError (Level, MessageId, CurrentLineNumber, LogicalLineNumber, + LogicalByteOffset, Column, Filename, ExtraMessage, + NULL, NULL); +} - strcpy (MessageBuffer, ExtraMessage); - } - /* Initialize the error node */ +/******************************************************************************* + * + * FUNCTION: AslLogNewError + * + * PARAMETERS: Level - Seriousness (Warning/error, etc.) + * MessageId - Index into global message buffer + * CurrentLineNumber - Actual file line number + * LogicalLineNumber - Cumulative line number + * LogicalByteOffset - Byte offset in source file + * Column - Column in current line + * Filename - source filename + * Message - additional error message + * SourceLine - Actual line of source code + * SubError - Sub-error associated with this error + * + * RETURN: None + * + * DESCRIPTION: Create a new error node and add it to the error log + * + ******************************************************************************/ +static void +AslLogNewError ( + UINT8 Level, + UINT16 MessageId, + UINT32 LineNumber, + UINT32 LogicalLineNumber, + UINT32 LogicalByteOffset, + UINT32 Column, + char *Filename, + char *Message, + char *SourceLine, + ASL_ERROR_MSG *SubError) +{ + ASL_ERROR_MSG *Enode = NULL; - if (Filename) - { - Enode->Filename = Filename; - Enode->FilenameLength = strlen (Filename); - if (Enode->FilenameLength < 6) - { - Enode->FilenameLength = 6; - } - } - Enode->MessageId = MessageId; - Enode->Level = Level; - Enode->LineNumber = CurrentLineNumber; - Enode->LogicalLineNumber = LogicalLineNumber; - Enode->LogicalByteOffset = LogicalByteOffset; - Enode->Column = Column; - Enode->Message = MessageBuffer; - Enode->SourceLine = NULL; + AslInitEnode (&Enode, Level, MessageId, LineNumber, LogicalLineNumber, + LogicalByteOffset, Column, Filename, Message, SourceLine, + SubError); /* Add the new node to the error node list */ @@ -825,8 +996,8 @@ AslCommonError ( * * FUNCTION: AslIsExceptionIgnored * - * PARAMETERS: Level - Seriousness (Warning/error, etc.) - * MessageId - Index into global message buffer + * PARAMETERS: Level - Seriousness (Warning/error, etc.) + * MessageId - Index into global message buffer * * RETURN: BOOLEAN * @@ -840,7 +1011,7 @@ AslIsExceptionIgnored ( UINT8 Level, UINT16 MessageId) { - BOOLEAN ExceptionIgnored; + BOOLEAN ExceptionIgnored; /* Note: this allows exception to be disabled and expected */ @@ -869,7 +1040,8 @@ void AslCheckExpectedExceptions ( void) { - UINT8 i; + UINT8 i; + for (i = 0; i < Gbl_ExpectedMessagesIndex; ++i) { @@ -980,8 +1152,8 @@ AslDisableException ( * * FUNCTION: AslIsExceptionDisabled * - * PARAMETERS: Level - Seriousness (Warning/error, etc.) - * MessageId - Index into global message buffer + * PARAMETERS: Level - Seriousness (Warning/error, etc.) + * MessageId - Index into global message buffer * * RETURN: TRUE if exception/message should be ignored * @@ -999,9 +1171,8 @@ AslIsExceptionExpected ( UINT32 i; - /* - * Mark this exception as received - */ + /* Mark this exception as received */ + EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId); for (i = 0; i < Gbl_ExpectedMessagesIndex; i++) { @@ -1082,6 +1253,61 @@ AslIsExceptionDisabled ( /******************************************************************************* * + * FUNCTION: AslDualParseOpError + * + * PARAMETERS: Level - Seriousness (Warning/error, etc.) + * MainMsgId - Index into global message buffer + * MainOp - Parse node where error happened + * MainMsg - Message pertaining to the MainOp + * SubMsgId - Index into global message buffer + * SubOp - Additional parse node for better message + * SubMsg - Message pertainint to SubOp + * + * + * RETURN: None + * + * DESCRIPTION: Main error reporting routine for the ASL compiler for error + * messages that point to multiple parse objects. + * + ******************************************************************************/ + +void +AslDualParseOpError ( + UINT8 Level, + UINT16 MainMsgId, + ACPI_PARSE_OBJECT *MainOp, + char *MainMsg, + UINT16 SubMsgId, + ACPI_PARSE_OBJECT *SubOp, + char *SubMsg) +{ + ASL_ERROR_MSG *SubEnode = NULL; + + + /* Check if user wants to ignore this exception */ + + if (AslIsExceptionIgnored (Level, MainMsgId) || !MainOp) + { + return; + } + + if (SubOp) + { + AslInitEnode (&SubEnode, Level, SubMsgId, SubOp->Asl.LineNumber, + SubOp->Asl.LogicalLineNumber, SubOp->Asl.LogicalByteOffset, + SubOp->Asl.Column, SubOp->Asl.Filename, SubMsg, + NULL, NULL); + } + + AslLogNewError (Level, MainMsgId, MainOp->Asl.LineNumber, + MainOp->Asl.LogicalLineNumber, MainOp->Asl.LogicalByteOffset, + MainOp->Asl.Column, MainOp->Asl.Filename, MainMsg, + NULL, SubEnode); +} + + +/******************************************************************************* + * * FUNCTION: AslError * * PARAMETERS: Level - Seriousness (Warning/error, etc.) diff --git a/source/compiler/aslfiles.c b/source/compiler/aslfiles.c index 46307ab04ad4..53df683e553f 100644 --- a/source/compiler/aslfiles.c +++ b/source/compiler/aslfiles.c @@ -151,7 +151,6 @@ #include "aslcompiler.h" #include "acapps.h" -#include "dtcompiler.h" #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("aslfiles") @@ -326,14 +325,14 @@ FlMergePathnames ( (*FilePathname == '/') || (FilePathname[1] == ':')) { - Pathname = UtStringCacheCalloc (strlen (FilePathname) + 1); + Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1); strcpy (Pathname, FilePathname); goto ConvertBackslashes; } /* Need a local copy of the prefix directory path */ - CommonPath = UtStringCacheCalloc (strlen (PrefixDir) + 1); + CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1); strcpy (CommonPath, PrefixDir); /* @@ -369,7 +368,7 @@ FlMergePathnames ( /* Build the final merged pathname */ ConcatenatePaths: - Pathname = UtStringCacheCalloc ( + Pathname = UtLocalCacheCalloc ( strlen (CommonPath) + strlen (FilePathname) + 2); if (LastElement && *CommonPath) { diff --git a/source/compiler/aslhelp.c b/source/compiler/aslhelp.c index e1266dc864ef..2d78aeb23b12 100644 --- a/source/compiler/aslhelp.c +++ b/source/compiler/aslhelp.c @@ -173,6 +173,7 @@ void Usage ( void) { + printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); printf ("%s\n\n", ASL_COMPLIANCE); ACPI_USAGE_HEADER ("iasl [Options] [Files]"); diff --git a/source/compiler/aslload.c b/source/compiler/aslload.c index 2c825f0fd3c7..7ccc0b58a67b 100644 --- a/source/compiler/aslload.c +++ b/source/compiler/aslload.c @@ -327,8 +327,9 @@ LdLoadFieldElements ( * The name already exists in this scope * But continue processing the elements */ - AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, - Child->Asl.Value.String); + AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child, + Child->Asl.Value.String, ASL_MSG_FOUND_HERE, Node->Op, + Node->Op->Asl.ExternalName); } } else @@ -388,8 +389,10 @@ LdLoadResourceElements ( { /* Actual node causing the error was saved in ParentMethod */ - AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, - (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, Op->Asl.Namepath); + AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, + (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, + Op->Asl.Namepath, ASL_MSG_FOUND_HERE, Node->Op, + Node->Op->Asl.ExternalName); return (AE_OK); } return (Status); @@ -805,8 +808,8 @@ LdNamespace1Begin ( /* * Allow one create on an object or segment that was * previously declared External only if WalkState->OwnerId and - * Node->OwnerId are found in different tables (meaning that - * they have differnt OwnerIds). + * Node->OwnerId are different (meaning that the current WalkState + * and the Node are in different tables). */ Node->Flags &= ~ANOBJ_IS_EXTERNAL; Node->Type = (UINT8) ObjectType; @@ -827,8 +830,9 @@ LdNamespace1Begin ( if (Node->OwnerId == WalkState->OwnerId && !(Node->Flags & IMPLICIT_EXTERNAL)) { - AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, - Op->Asl.ExternalName); + AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, + Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op, + Node->Op->Asl.ExternalName); } if (Node->Flags & IMPLICIT_EXTERNAL) { @@ -849,8 +853,9 @@ LdNamespace1Begin ( if (Node->OwnerId == WalkState->OwnerId) { - AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, - Op->Asl.ExternalName); + AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, + Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op, + Node->Op->Asl.ExternalName); } } else if ((Node->Flags & ANOBJ_IS_EXTERNAL) && @@ -905,8 +910,9 @@ LdNamespace1Begin ( { /* Valid error, object already exists */ - AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, - Op->Asl.ExternalName); + AslDualParseOpError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op, + Op->Asl.ExternalName, ASL_MSG_FOUND_HERE, Node->Op, + Node->Op->Asl.ExternalName); return_ACPI_STATUS (AE_OK); } } diff --git a/source/compiler/aslmapenter.c b/source/compiler/aslmapenter.c index da9f8e514ba9..69cea72f8ce1 100644 --- a/source/compiler/aslmapenter.c +++ b/source/compiler/aslmapenter.c @@ -332,7 +332,7 @@ MpCreateGpioInfo ( * sorted by both source device name and then the pin number. There is * one block per pin. */ - Buffer = UtStringCacheCalloc (sizeof (ACPI_GPIO_INFO)); + Buffer = UtLocalCacheCalloc (sizeof (ACPI_GPIO_INFO)); Info = ACPI_CAST_PTR (ACPI_GPIO_INFO, Buffer); NextGpio = Gbl_GpioList; @@ -409,7 +409,7 @@ MpCreateSerialInfo ( * Allocate a new info block and insert it into the global Serial list * sorted by both source device name and then the address. */ - Buffer = UtStringCacheCalloc (sizeof (ACPI_SERIAL_INFO)); + Buffer = UtLocalCacheCalloc (sizeof (ACPI_SERIAL_INFO)); Info = ACPI_CAST_PTR (ACPI_SERIAL_INFO, Buffer); NextSerial = Gbl_SerialList; diff --git a/source/compiler/aslmaputils.c b/source/compiler/aslmaputils.c index b66d176db2b6..82b1d2809bb4 100644 --- a/source/compiler/aslmaputils.c +++ b/source/compiler/aslmaputils.c @@ -212,7 +212,7 @@ MpGetHidFromParseTree ( /* Convert EISAID to a string */ - HidString = UtStringCacheCalloc (ACPI_EISAID_STRING_SIZE); + HidString = UtLocalCacheCalloc (ACPI_EISAID_STRING_SIZE); AcpiExEisaIdToString (HidString, Arg->Asl.Value.Integer); return (HidString); @@ -277,7 +277,7 @@ MpGetHidValue ( /* Convert EISAID to a string */ - HidString = UtStringCacheCalloc (ACPI_EISAID_STRING_SIZE); + HidString = UtLocalCacheCalloc (ACPI_EISAID_STRING_SIZE); AcpiExEisaIdToString (HidString, HidNode->Object->Integer.Value); return (HidString); diff --git a/source/compiler/aslmessages.c b/source/compiler/aslmessages.c index 159f9d23f859..5cff70a52265 100644 --- a/source/compiler/aslmessages.c +++ b/source/compiler/aslmessages.c @@ -350,7 +350,9 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_CONSTANT_REQUIRED */ "Non-reducible expression", /* ASL_MSG_CROSS_TABLE_SCOPE */ "Illegal open scope on external object from within DSDT", /* ASL_MSG_EXCEPTION_NOT_RECEIVED */ "Expected remark, warning, or error did not occur. Message ID:", -/* ASL_MSG_NULL_RESOURCE_TEMPLATE */ "Empty Resource Template (END_TAG only)" +/* ASL_MSG_NULL_RESOURCE_TEMPLATE */ "Empty Resource Template (END_TAG only)", +/* ASL_MSG_FOUND_HERE */ "Original name creation/declaration below: ", +/* ASL_MSG_ILLEGAL_RECURSION */ "Illegal recursive call to method that creates named objects" }; /* Table compiler */ diff --git a/source/compiler/aslmessages.h b/source/compiler/aslmessages.h index d69c05a176c6..a80184016ce1 100644 --- a/source/compiler/aslmessages.h +++ b/source/compiler/aslmessages.h @@ -353,6 +353,8 @@ typedef enum ASL_MSG_CROSS_TABLE_SCOPE, ASL_MSG_EXCEPTION_NOT_RECEIVED, ASL_MSG_NULL_RESOURCE_TEMPLATE, + ASL_MSG_FOUND_HERE, + ASL_MSG_ILLEGAL_RECURSION, /* These messages are used by the Data Table compiler only */ diff --git a/source/compiler/aslmethod.c b/source/compiler/aslmethod.c index 9734b643efd9..b2bb89c53664 100644 --- a/source/compiler/aslmethod.c +++ b/source/compiler/aslmethod.c @@ -347,10 +347,31 @@ MtMethodAnalysisWalkBegin ( case PARSEOP_METHODCALL: + /* Check for a recursive method call */ + if (MethodInfo && (Op->Asl.Node == MethodInfo->Op->Asl.Node)) { - AslError (ASL_REMARK, ASL_MSG_RECURSION, Op, Op->Asl.ExternalName); + if (MethodInfo->CreatesNamedObjects) + { + /* + * This is an error, as it will fail at runtime on all ACPI + * implementations. Any named object declarations will be + * executed twice, causing failure the second time. Note, + * this is independent of whether the method is declared + * Serialized, because the same thread is attempting to + * reenter the method, and this will always succeed. + */ + AslDualParseOpError (ASL_ERROR, ASL_MSG_ILLEGAL_RECURSION, Op, + Op->Asl.Value.String, ASL_MSG_FOUND_HERE, MethodInfo->Op, + MethodInfo->Op->Asl.ExternalName); + } + else + { + /* Method does not create objects, issue a remark */ + + AslError (ASL_REMARK, ASL_MSG_RECURSION, Op, Op->Asl.ExternalName); + } } break; @@ -622,20 +643,28 @@ MtCheckNamedObjectInMethod ( return; } - /* Determine if we are creating a named object */ + /* Determine if we are creating a named object within a method */ + + if (!MethodInfo) + { + return; + } OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode); if (OpInfo->Class == AML_CLASS_NAMED_OBJECT) { /* - * If we have a named object created within a non-serialized method, - * emit a remark that the method should be serialized. + * 1) Mark the method as a method that creates named objects. + * + * 2) If the method is non-serialized, emit a remark that the method + * should be serialized. * * Reason: If a thread blocks within the method for any reason, and - * another thread enters the method, the method will fail because an - * attempt will be made to create the same object twice. + * another thread enters the method, the method will fail because + * an attempt will be made to create the same object twice. */ - if (MethodInfo && !MethodInfo->ShouldBeSerialized) + MethodInfo->CreatesNamedObjects = TRUE; + if (!MethodInfo->ShouldBeSerialized) { AslError (ASL_REMARK, ASL_MSG_SERIALIZED_REQUIRED, MethodInfo->Op, "due to creation of named objects within"); diff --git a/source/compiler/asloperands.c b/source/compiler/asloperands.c index 03403a39a8c8..9e5788fa123f 100644 --- a/source/compiler/asloperands.c +++ b/source/compiler/asloperands.c @@ -1037,7 +1037,7 @@ OpnDoDefinitionBlock ( * We will use the AML filename that is embedded in the source file * for the output filename. */ - Filename = UtStringCacheCalloc (strlen (Gbl_DirectoryPath) + + Filename = UtLocalCacheCalloc (strlen (Gbl_DirectoryPath) + strlen ((char *) Child->Asl.Value.Buffer) + 1); /* Prepend the current directory path */ @@ -1094,7 +1094,7 @@ OpnDoDefinitionBlock ( if (Child->Asl.Value.String) { Length = strlen (Child->Asl.Value.String); - Gbl_TableId = UtStringCacheCalloc (Length + 1); + Gbl_TableId = UtLocalCacheCalloc (Length + 1); strcpy (Gbl_TableId, Child->Asl.Value.String); /* diff --git a/source/compiler/aslopt.c b/source/compiler/aslopt.c index 79e41da24650..fa92d711eb09 100644 --- a/source/compiler/aslopt.c +++ b/source/compiler/aslopt.c @@ -275,7 +275,7 @@ OptSearchToRoot ( /* We must allocate a new string for the name (TargetPath gets deleted) */ - *NewPath = UtStringCacheCalloc (ACPI_NAME_SIZE + 1); + *NewPath = UtLocalCacheCalloc (ACPI_NAME_SIZE + 1); strcpy (*NewPath, Path); if (strncmp (*NewPath, "_T_", 3)) diff --git a/source/compiler/asloptions.c b/source/compiler/asloptions.c index 6d39f6d25492..683aaa2f4ff6 100644 --- a/source/compiler/asloptions.c +++ b/source/compiler/asloptions.c @@ -178,9 +178,6 @@ AslDoResponseFile ( #define ASL_TOKEN_SEPARATORS " \t\n" #define ASL_SUPPORTED_OPTIONS "@:a:b|c|d^D:e:f^gh^i|I:l^m:no|p:P^q^r:s|t|T+G^v^w|x:z" -static char ASL_BUILD_DATE[] = __DATE__; -static char ASL_BUILD_TIME[] = __TIME__; - /******************************************************************************* * @@ -207,7 +204,6 @@ AslCommandLine ( if (argc < 2) { - printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); Usage (); exit (1); } @@ -541,7 +537,6 @@ AslDoOptions ( { case '^': - printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); Usage (); exit (0); @@ -891,8 +886,8 @@ AslDoOptions ( case 'd': - printf ("%s Build date/time: %s %s\n", - ASL_COMPILER_NAME, ASL_BUILD_DATE, ASL_BUILD_TIME); + printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); + printf (ACPI_COMMON_BUILD_TIME); exit (0); case 'e': diff --git a/source/compiler/aslparseop.c b/source/compiler/aslparseop.c index 41badcee5211..438e5a281a40 100644 --- a/source/compiler/aslparseop.c +++ b/source/compiler/aslparseop.c @@ -158,13 +158,6 @@ ACPI_MODULE_NAME ("aslparseop") -/* Local prototypes */ - -static ACPI_PARSE_OBJECT * -TrGetOpFromCache ( - void); - - /******************************************************************************* * * FUNCTION: TrCreateOp @@ -490,7 +483,7 @@ TrCreateTargetOp ( return (NULL); } - Op = TrGetOpFromCache (); + Op = UtParseOpCacheCalloc (); /* Copy the pertinent values (omit link pointer fields) */ @@ -788,7 +781,7 @@ TrAllocateOp ( ACPI_PARSE_OBJECT *LatestOp; - Op = TrGetOpFromCache (); + Op = UtParseOpCacheCalloc (); Op->Asl.ParseOpcode = (UINT16) ParseOpcode; Op->Asl.Filename = Gbl_Files[ASL_FILE_INPUT].Filename; @@ -877,50 +870,6 @@ TrAllocateOp ( /******************************************************************************* * - * FUNCTION: TrGetOpFromCache - * - * PARAMETERS: None - * - * RETURN: New parse op. Aborts on allocation failure - * - * DESCRIPTION: Allocate a new parse op for the parse tree. Bypass the local - * dynamic memory manager for performance reasons (This has a - * major impact on the speed of the compiler.) - * - ******************************************************************************/ - -static ACPI_PARSE_OBJECT * -TrGetOpFromCache ( - void) -{ - ASL_CACHE_INFO *Cache; - - - if (Gbl_ParseOpCacheNext >= Gbl_ParseOpCacheLast) - { - /* Allocate a new buffer */ - - Cache = UtLocalCalloc (sizeof (Cache->Next) + - (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE)); - - /* Link new cache buffer to head of list */ - - Cache->Next = Gbl_ParseOpCacheList; - Gbl_ParseOpCacheList = Cache; - - /* Setup cache management pointers */ - - Gbl_ParseOpCacheNext = ACPI_CAST_PTR (ACPI_PARSE_OBJECT, Cache->Buffer); - Gbl_ParseOpCacheLast = Gbl_ParseOpCacheNext + ASL_PARSEOP_CACHE_SIZE; - } - - Gbl_ParseOpCount++; - return (Gbl_ParseOpCacheNext++); -} - - -/******************************************************************************* - * * FUNCTION: TrPrintOpFlags * * PARAMETERS: Flags - Flags word to be decoded diff --git a/source/compiler/aslprintf.c b/source/compiler/aslprintf.c index e5f56f11fd93..48c2fb1fe53d 100644 --- a/source/compiler/aslprintf.c +++ b/source/compiler/aslprintf.c @@ -293,7 +293,7 @@ OpcParsePrintf ( if (StringToProcess) { - NewString = UtStringCacheCalloc (StringLength + 1); + NewString = UtLocalCacheCalloc (StringLength + 1); strncpy (NewString, StartPosition, StringLength); NewOp = TrAllocateOp (PARSEOP_STRING_LITERAL); @@ -382,7 +382,7 @@ OpcParsePrintf ( if (StringToProcess) { - NewString = UtStringCacheCalloc (StringLength + 1); + NewString = UtLocalCacheCalloc (StringLength + 1); strncpy (NewString, StartPosition, StringLength); NewOp = TrAllocateOp (PARSEOP_STRING_LITERAL); diff --git a/source/compiler/aslstartup.c b/source/compiler/aslstartup.c index 72c0d641e1ff..fa1ac25bd9ed 100644 --- a/source/compiler/aslstartup.c +++ b/source/compiler/aslstartup.c @@ -410,7 +410,7 @@ AslDoDisassembly ( Gbl_Files[ASL_FILE_INPUT].Filename = NULL; - CmDeleteCaches (); + UtDeleteLocalCaches (); return (AE_OK); } @@ -453,7 +453,7 @@ AslDoOneFile ( /* Take a copy of the input filename, convert any backslashes */ Gbl_Files[ASL_FILE_INPUT].Filename = - UtStringCacheCalloc (strlen (Filename) + 1); + UtLocalCacheCalloc (strlen (Filename) + 1); strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename); UtConvertBackslashes (Gbl_Files[ASL_FILE_INPUT].Filename); diff --git a/source/compiler/aslsupport.l b/source/compiler/aslsupport.l index 42cee752a952..40cead33c3c5 100644 --- a/source/compiler/aslsupport.l +++ b/source/compiler/aslsupport.l @@ -382,7 +382,7 @@ AslPushInputFileStack ( /* Reset the global line count and filename */ Gbl_Files[ASL_FILE_INPUT].Filename = - UtStringCacheCalloc (strlen (Filename) + 1); + UtLocalCacheCalloc (strlen (Filename) + 1); strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename); @@ -1009,7 +1009,7 @@ CompletedString: */ *StringBuffer = 0; - CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1); + CleanString = UtLocalCacheCalloc (strlen (MsgBuffer) + 1); strcpy (CleanString, MsgBuffer); AslCompilerlval.s = CleanString; return (TRUE); diff --git a/source/compiler/asltypes.h b/source/compiler/asltypes.h index e4250871fd12..f72226d5e0c9 100644 --- a/source/compiler/asltypes.h +++ b/source/compiler/asltypes.h @@ -202,6 +202,7 @@ typedef struct asl_method_info UINT8 ArgInitialized[ACPI_METHOD_NUM_ARGS]; UINT8 HasBeenTyped; UINT8 ShouldBeSerialized; + UINT8 CreatesNamedObjects; } ASL_METHOD_INFO; @@ -337,8 +338,11 @@ typedef struct asl_include_dir } ASL_INCLUDE_DIR; -/* An entry in the exception list, one for each error/warning */ - +/* + * An entry in the exception list, one for each error/warning + * Note: SubError nodes would be treated with the same messageId and Level + * as the parent error node. + */ typedef struct asl_error_msg { UINT32 LineNumber; @@ -347,6 +351,7 @@ typedef struct asl_error_msg UINT32 Column; char *Message; struct asl_error_msg *Next; + struct asl_error_msg *SubError; char *Filename; char *SourceLine; UINT32 FilenameLength; diff --git a/source/compiler/aslutils.c b/source/compiler/aslutils.c index 8b46d38bb532..82d11b4b967e 100644 --- a/source/compiler/aslutils.c +++ b/source/compiler/aslutils.c @@ -174,12 +174,6 @@ UtAttachNameseg ( ACPI_PARSE_OBJECT *Op, char *Name); -static void -UtReallocLineBuffers ( - char **Buffer, - UINT32 OldSize, - UINT32 NewSize); - /******************************************************************************* * @@ -311,45 +305,6 @@ UtDisplayConstantOpcodes ( /******************************************************************************* * - * FUNCTION: UtLocalCalloc - * - * PARAMETERS: Size - Bytes to be allocated - * - * RETURN: Pointer to the allocated memory. Guaranteed to be valid. - * - * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an - * allocation failure, on the assumption that nothing more can be - * accomplished. - * - ******************************************************************************/ - -void * -UtLocalCalloc ( - UINT32 Size) -{ - void *Allocated; - - - Allocated = ACPI_ALLOCATE_ZEROED (Size); - if (!Allocated) - { - AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, - Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, - Gbl_InputByteCount, Gbl_CurrentColumn, - Gbl_Files[ASL_FILE_INPUT].Filename, NULL); - - CmCleanupAndExit (); - exit (1); - } - - TotalAllocations++; - TotalAllocated += Size; - return (Allocated); -} - - -/******************************************************************************* - * * FUNCTION: UtBeginEvent * * PARAMETERS: Name - Ascii name of this event @@ -637,180 +592,6 @@ UtCheckIntegerRange ( /******************************************************************************* * - * FUNCTION: UtStringCacheCalloc - * - * PARAMETERS: Length - Size of buffer requested - * - * RETURN: Pointer to the buffer. Aborts compiler on allocation failure - * - * DESCRIPTION: Allocate a string buffer. Bypass the local - * dynamic memory manager for performance reasons (This has a - * major impact on the speed of the compiler.) - * - ******************************************************************************/ - -char * -UtStringCacheCalloc ( - UINT32 Length) -{ - char *Buffer; - ASL_CACHE_INFO *Cache; - UINT32 CacheSize = ASL_STRING_CACHE_SIZE; - - - if (Length > CacheSize) - { - CacheSize = Length; - - if (Gbl_StringCacheList) - { - Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize); - - /* Link new cache buffer just following head of list */ - - Cache->Next = Gbl_StringCacheList->Next; - Gbl_StringCacheList->Next = Cache; - - /* Leave cache management pointers alone as they pertain to head */ - - Gbl_StringCount++; - Gbl_StringSize += Length; - - return (Cache->Buffer); - } - } - - if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast) - { - /* Allocate a new buffer */ - - Cache = UtLocalCalloc (sizeof (Cache->Next) + CacheSize); - - /* Link new cache buffer to head of list */ - - Cache->Next = Gbl_StringCacheList; - Gbl_StringCacheList = Cache; - - /* Setup cache management pointers */ - - Gbl_StringCacheNext = Cache->Buffer; - Gbl_StringCacheLast = Gbl_StringCacheNext + CacheSize; - } - - Gbl_StringCount++; - Gbl_StringSize += Length; - - Buffer = Gbl_StringCacheNext; - Gbl_StringCacheNext += Length; - return (Buffer); -} - - -/****************************************************************************** - * - * FUNCTION: UtExpandLineBuffers - * - * PARAMETERS: None. Updates global line buffer pointers. - * - * RETURN: None. Reallocates the global line buffers - * - * DESCRIPTION: Called if the current line buffer becomes filled. Reallocates - * all global line buffers and updates Gbl_LineBufferSize. NOTE: - * Also used for the initial allocation of the buffers, when - * all of the buffer pointers are NULL. Initial allocations are - * of size ASL_DEFAULT_LINE_BUFFER_SIZE - * - *****************************************************************************/ - -void -UtExpandLineBuffers ( - void) -{ - UINT32 NewSize; - - - /* Attempt to double the size of all line buffers */ - - NewSize = Gbl_LineBufferSize * 2; - if (Gbl_CurrentLineBuffer) - { - DbgPrint (ASL_DEBUG_OUTPUT, - "Increasing line buffer size from %u to %u\n", - Gbl_LineBufferSize, NewSize); - } - - UtReallocLineBuffers (&Gbl_CurrentLineBuffer, Gbl_LineBufferSize, NewSize); - UtReallocLineBuffers (&Gbl_MainTokenBuffer, Gbl_LineBufferSize, NewSize); - UtReallocLineBuffers (&Gbl_MacroTokenBuffer, Gbl_LineBufferSize, NewSize); - UtReallocLineBuffers (&Gbl_ExpressionTokenBuffer, Gbl_LineBufferSize, NewSize); - - Gbl_LineBufPtr = Gbl_CurrentLineBuffer; - Gbl_LineBufferSize = NewSize; -} - - -/****************************************************************************** - * - * FUNCTION: UtReallocLineBuffers - * - * PARAMETERS: Buffer - Buffer to realloc - * OldSize - Old size of Buffer - * NewSize - New size of Buffer - * - * RETURN: none - * - * DESCRIPTION: Reallocate and initialize Buffer - * - *****************************************************************************/ - -static void -UtReallocLineBuffers ( - char **Buffer, - UINT32 OldSize, - UINT32 NewSize) -{ - - *Buffer = realloc (*Buffer, NewSize); - if (*Buffer) - { - memset (*Buffer + OldSize, 0, NewSize - OldSize); - return; - } - - printf ("Could not increase line buffer size from %u to %u\n", - OldSize, NewSize); - - AslError (ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, NULL, NULL); - AslAbort (); -} - - -/****************************************************************************** - * - * FUNCTION: UtFreeLineBuffers - * - * PARAMETERS: None - * - * RETURN: None - * - * DESCRIPTION: Free all line buffers - * - *****************************************************************************/ - -void -UtFreeLineBuffers ( - void) -{ - - free (Gbl_CurrentLineBuffer); - free (Gbl_MainTokenBuffer); - free (Gbl_MacroTokenBuffer); - free (Gbl_ExpressionTokenBuffer); -} - - -/******************************************************************************* - * * FUNCTION: UtInternalizeName * * PARAMETERS: ExternalName - Name to convert @@ -843,7 +624,7 @@ UtInternalizeName ( /* We need a segment to store the internal name */ - Info.InternalName = UtStringCacheCalloc (Info.Length); + Info.InternalName = UtLocalCacheCalloc (Info.Length); /* Build the name */ diff --git a/source/compiler/cvcompiler.c b/source/compiler/cvcompiler.c index afb6ea1bce57..d2a6c8f06fc6 100644 --- a/source/compiler/cvcompiler.c +++ b/source/compiler/cvcompiler.c @@ -193,7 +193,7 @@ CvProcessComment ( *StringBuffer = 0; CvDbgPrint ("Multi-line comment\n"); - CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1); + CommentString = UtLocalCacheCalloc (strlen (MsgBuffer) + 1); strcpy (CommentString, MsgBuffer); CvDbgPrint ("CommentString: %s\n", CommentString); @@ -208,7 +208,7 @@ CvProcessComment ( if (LineToken) { - FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1); + FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1); strcpy (FinalLineToken, LineToken); /* Get rid of any carriage returns */ @@ -238,7 +238,7 @@ CvProcessComment ( } } - FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1); + FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1); strcat (FinalLineToken, LineToken); /* Get rid of any carriage returns */ @@ -268,7 +268,7 @@ CvProcessComment ( * spacing. */ FinalCommentString = - UtStringCacheCalloc (strlen (CommentString) + + UtLocalCacheCalloc (strlen (CommentString) + CurrentState.SpacesBefore + 1); for (i = 0; (CurrentState.CommentType != ASL_COMMENT_STANDARD) && @@ -313,7 +313,7 @@ CvProcessCommentType2 ( { *StringBuffer = 0; /* null terminate */ CvDbgPrint ("Single-line comment\n"); - CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1); + CommentString = UtLocalCacheCalloc (strlen (MsgBuffer) + 1); strcpy (CommentString, MsgBuffer); /* If this comment lies on the same line as the latest parse op, @@ -342,7 +342,7 @@ CvProcessCommentType2 ( * [ (spaces) (comment) ( * /) ('\0') ] * */ - FinalCommentString = UtStringCacheCalloc (CurrentState.SpacesBefore + + FinalCommentString = UtLocalCacheCalloc (CurrentState.SpacesBefore + strlen (CommentString) + 3 + 1); for (i = 0; (CurrentState.CommentType != 1) && @@ -507,7 +507,7 @@ CgWriteAmlDefBlockComment( /* First, print the file name comment after changing .asl to .dsl */ - NewFilename = UtStringCacheCalloc (strlen (Op->Asl.Filename)); + NewFilename = UtLocalCacheCalloc (strlen (Op->Asl.Filename)); strcpy (NewFilename, Op->Asl.Filename); DirectoryPosition = strrchr (NewFilename, '/'); Position = strrchr (NewFilename, '.'); @@ -944,7 +944,7 @@ CvAppendInlineComment ( Size = strlen (ToAdd); Size += strlen (InlineComment); - Str = UtStringCacheCalloc (Size + 1); + Str = UtLocalCacheCalloc (Size + 1); strcpy (Str, InlineComment); strcat (Str, ToAdd); diff --git a/source/compiler/cvparser.c b/source/compiler/cvparser.c index 9941582a56db..b2e3e7674295 100644 --- a/source/compiler/cvparser.c +++ b/source/compiler/cvparser.c @@ -714,7 +714,7 @@ CvCaptureCommentsOnly ( UINT8 *Aml = ParserState->Aml; UINT16 Opcode = (UINT16) ACPI_GET8 (Aml); UINT32 Length = 0; - UINT8 CommentOption = (UINT16) ACPI_GET8 (Aml+1); + UINT8 CommentOption; BOOLEAN StdDefBlockFlag = FALSE; ACPI_COMMENT_NODE *CommentNode; ACPI_FILE_NODE *FileNode; diff --git a/source/compiler/dtcompile.c b/source/compiler/dtcompile.c index 5344562433c2..0823196feb1c 100644 --- a/source/compiler/dtcompile.c +++ b/source/compiler/dtcompile.c @@ -152,7 +152,6 @@ #define _DECLARE_DT_GLOBALS #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dtcompile") @@ -281,7 +280,6 @@ DtDoCompile ( CleanupAndExit: AcpiUtDeleteCaches (); - DtDeleteCaches (); CmCleanupAndExit (); return (Status); } @@ -412,7 +410,7 @@ DtCompileDataTable ( return (AE_ERROR); } - Gbl_Signature = UtStringCacheCalloc (strlen (Signature) + 1); + Gbl_Signature = UtLocalCacheCalloc (strlen (Signature) + 1); strcpy (Gbl_Signature, Signature); /* @@ -585,7 +583,7 @@ DtCompileTable ( if (Length > 0) { - String = UtStringCacheCalloc (Length); + String = UtLocalCacheCalloc (Length); Subtable->Buffer = ACPI_CAST_PTR (UINT8, String); } @@ -828,7 +826,7 @@ DtCompilePadding ( if (Length > 0) { - String = UtStringCacheCalloc (Length); + String = UtLocalCacheCalloc (Length); Subtable->Buffer = ACPI_CAST_PTR (UINT8, String); } diff --git a/source/compiler/dtcompiler.h b/source/compiler/dtcompiler.h index 90fad8896f8a..941e2c65e86d 100644 --- a/source/compiler/dtcompiler.h +++ b/source/compiler/dtcompiler.h @@ -154,7 +154,6 @@ #ifndef _DTCOMPILER #define _DTCOMPILER -#include <stdio.h> #include "acdisasm.h" @@ -510,18 +509,6 @@ void DtSetTableLength( void); -DT_SUBTABLE * -UtSubtableCacheCalloc ( - void); - -DT_FIELD * -UtFieldCacheCalloc ( - void); - -void -DtDeleteCaches ( - void); - /* dttable - individual table compilation */ @@ -622,15 +609,19 @@ DtCompileNfit ( void **PFieldList); ACPI_STATUS -DtCompilePmtt ( +DtCompilePcct ( void **PFieldList); ACPI_STATUS -DtCompilePptt ( +DtCompilePdtt ( void **PFieldList); ACPI_STATUS -DtCompilePcct ( +DtCompilePmtt ( + void **PFieldList); + +ACPI_STATUS +DtCompilePptt ( void **PFieldList); ACPI_STATUS @@ -642,6 +633,10 @@ DtCompileS3pt ( DT_FIELD **PFieldList); ACPI_STATUS +DtCompileSdev ( + void **PFieldList); + +ACPI_STATUS DtCompileSlic ( void **PFieldList); @@ -662,6 +657,10 @@ DtCompileTcpa ( void **PFieldList); ACPI_STATUS +DtCompileTpm2 ( + void **PFieldList); + +ACPI_STATUS DtCompileUefi ( void **PFieldList); @@ -724,6 +723,7 @@ extern const unsigned char TemplateMsdm[]; extern const unsigned char TemplateMtmr[]; extern const unsigned char TemplateNfit[]; extern const unsigned char TemplatePcct[]; +extern const unsigned char TemplatePdtt[]; extern const unsigned char TemplatePmtt[]; extern const unsigned char TemplatePptt[]; extern const unsigned char TemplateRasf[]; @@ -731,6 +731,7 @@ extern const unsigned char TemplateRsdt[]; extern const unsigned char TemplateS3pt[]; extern const unsigned char TemplateSbst[]; extern const unsigned char TemplateSdei[]; +extern const unsigned char TemplateSdev[]; extern const unsigned char TemplateSlic[]; extern const unsigned char TemplateSlit[]; extern const unsigned char TemplateSpcr[]; diff --git a/source/compiler/dtexpress.c b/source/compiler/dtexpress.c index 4e0ac89a8258..8b97bdc0f291 100644 --- a/source/compiler/dtexpress.c +++ b/source/compiler/dtexpress.c @@ -150,7 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #include "dtparser.y.h" #define _COMPONENT DT_COMPILER diff --git a/source/compiler/dtfield.c b/source/compiler/dtfield.c index b06877a8f84a..290fa18bd13e 100644 --- a/source/compiler/dtfield.c +++ b/source/compiler/dtfield.c @@ -150,7 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dtfield") diff --git a/source/compiler/dtio.c b/source/compiler/dtio.c index 0112999ef5a1..1d8ee98bfc1a 100644 --- a/source/compiler/dtio.c +++ b/source/compiler/dtio.c @@ -150,7 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #include "acapps.h" #define _COMPONENT DT_COMPILER @@ -239,7 +238,7 @@ DtTrim ( if (!strcmp (String, " ")) { - ReturnString = UtStringCacheCalloc (1); + ReturnString = UtLocalCacheCalloc (1); return (ReturnString); } @@ -287,7 +286,7 @@ DtTrim ( /* Create the trimmed return string */ Length = ACPI_PTR_DIFF (End, Start) + 1; - ReturnString = UtStringCacheCalloc (Length + 1); + ReturnString = UtLocalCacheCalloc (Length + 1); if (strlen (Start)) { strncpy (ReturnString, Start, Length); diff --git a/source/compiler/dtparser.y b/source/compiler/dtparser.y index d5990fe45fe5..17607d96ce14 100644 --- a/source/compiler/dtparser.y +++ b/source/compiler/dtparser.y @@ -151,7 +151,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dtparser") diff --git a/source/compiler/dtsubtable.c b/source/compiler/dtsubtable.c index 44e36492ffac..c7b85e908505 100644 --- a/source/compiler/dtsubtable.c +++ b/source/compiler/dtsubtable.c @@ -150,7 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dtsubtable") @@ -186,7 +185,7 @@ DtCreateSubtable ( /* Create a new buffer for the subtable data */ - String = UtStringCacheCalloc (Length); + String = UtLocalCacheCalloc (Length); Subtable->Buffer = ACPI_CAST_PTR (UINT8, String); memcpy (Subtable->Buffer, Buffer, Length); diff --git a/source/compiler/dttable.c b/source/compiler/dttable.c index 08b862d1a031..91e7544a9b3c 100644 --- a/source/compiler/dttable.c +++ b/source/compiler/dttable.c @@ -152,7 +152,6 @@ /* Compile routines for the basic ACPI tables */ #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dttable") diff --git a/source/compiler/dttable1.c b/source/compiler/dttable1.c index bdf0419cf940..138f4f3a1731 100644 --- a/source/compiler/dttable1.c +++ b/source/compiler/dttable1.c @@ -152,7 +152,6 @@ /* Compile all complex data tables, signatures starting with A-I */ #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dttable1") diff --git a/source/compiler/dttable2.c b/source/compiler/dttable2.c index 356a7d0d19f2..172354cde8ee 100644 --- a/source/compiler/dttable2.c +++ b/source/compiler/dttable2.c @@ -152,7 +152,6 @@ /* Compile all complex data tables, signatures starting with L-Z */ #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT DT_COMPILER ACPI_MODULE_NAME ("dttable2") @@ -904,6 +903,66 @@ DtCompilePcct ( /****************************************************************************** * + * FUNCTION: DtCompilePdtt + * + * PARAMETERS: List - Current field list pointer + * + * RETURN: Status + * + * DESCRIPTION: Compile PDTT. + * + *****************************************************************************/ + +ACPI_STATUS +DtCompilePdtt ( + void **List) +{ + ACPI_STATUS Status; + DT_SUBTABLE *Subtable; + DT_SUBTABLE *ParentTable; + DT_FIELD **PFieldList = (DT_FIELD **) List; + ACPI_TABLE_PDTT *PdttHeader; + UINT32 Count = 0; + + + /* Main table */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt, &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + PdttHeader = ACPI_CAST_PTR (ACPI_TABLE_PDTT, ParentTable->Buffer); + PdttHeader->ArrayOffset = sizeof (ACPI_TABLE_PDTT); + + /* There is only one type of subtable at this time, no need to decode */ + + while (*PFieldList) + { + /* List of subchannel IDs, each 2 bytes */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoPdtt0, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + DtInsertSubtable (ParentTable, Subtable); + Count++; + } + + PdttHeader->TriggerCount = (UINT8) Count; + return (AE_OK); +} + + +/****************************************************************************** + * * FUNCTION: DtCompilePmtt * * PARAMETERS: List - Current field list pointer @@ -1285,6 +1344,219 @@ DtCompileS3pt ( /****************************************************************************** * + * FUNCTION: DtCompileSdev + * + * PARAMETERS: List - Current field list pointer + * + * RETURN: Status + * + * DESCRIPTION: Compile SDEV. + * + *****************************************************************************/ + +ACPI_STATUS +DtCompileSdev ( + void **List) +{ + ACPI_STATUS Status; + ACPI_SDEV_HEADER *SdevHeader; + DT_SUBTABLE *Subtable; + DT_SUBTABLE *ParentTable; + ACPI_DMTABLE_INFO *InfoTable; + DT_FIELD **PFieldList = (DT_FIELD **) List; + DT_FIELD *SubtableStart; + ACPI_SDEV_PCIE *Pcie = NULL; + ACPI_SDEV_NAMESPACE *Namesp = NULL; + UINT32 EntryCount; + + + /* Subtables */ + + while (*PFieldList) + { + /* Compile common SDEV subtable header */ + + SubtableStart = *PFieldList; + Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdevHdr, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + + SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer); + SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER)); + + switch (SdevHeader->Type) + { + case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: + + InfoTable = AcpiDmTableInfoSdev0; + Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable->Buffer); + break; + + case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: + + InfoTable = AcpiDmTableInfoSdev1; + Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable->Buffer); + break; + + default: + + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); + return (AE_ERROR); + } + + /* Compile SDEV subtable body */ + + Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + /* Optional data fields are appended to the main subtable body */ + + switch (SdevHeader->Type) + { + case ACPI_SDEV_TYPE_NAMESPACE_DEVICE: + + /* Append DeviceId namespace string */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev0a, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + if (!Subtable) + { + break; + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + Namesp->DeviceIdOffset = sizeof (ACPI_SDEV_NAMESPACE); + Namesp->DeviceIdLength = (UINT16) Subtable->Length; + + /* Append Vendor data */ + + Namesp->VendorDataLength = 0; + Namesp->VendorDataOffset = 0; + + if (*PFieldList) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + if (Subtable) + { + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + Namesp->VendorDataOffset = + Namesp->DeviceIdOffset + Namesp->DeviceIdLength; + Namesp->VendorDataLength = + (UINT16) Subtable->Length; + } + } + + /* Final size of entire namespace structure */ + + SdevHeader->Length = (UINT16) (sizeof (ACPI_SDEV_NAMESPACE) + + Subtable->Length + Namesp->DeviceIdLength); + break; + + case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE: + + /* Append the PCIe path info first */ + + EntryCount = 0; + while (*PFieldList && !strcmp ((*PFieldList)->Name, "Device")) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1a, + &Subtable, FALSE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + if (!Subtable) + { + DtPopSubtable (); + break; + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + EntryCount++; + } + + /* Path offset will point immediately after the main subtable */ + + Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE); + Pcie->PathLength = (UINT16) + (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH)); + + /* Append the Vendor Data last */ + + Pcie->VendorDataLength = 0; + Pcie->VendorDataOffset = 0; + + if (*PFieldList) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoSdev1b, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + if (Subtable) + { + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + Pcie->VendorDataOffset = + Pcie->PathOffset + Pcie->PathLength; + Pcie->VendorDataLength = (UINT16) + Subtable->Length; + } + } + + SdevHeader->Length = + sizeof (ACPI_SDEV_PCIE) + + Pcie->PathLength + Pcie->VendorDataLength; + break; + + default: + + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SDEV"); + return (AE_ERROR); + } + + DtPopSubtable (); + } + + return (AE_OK); +} + + +/****************************************************************************** + * * FUNCTION: DtCompileSlic * * PARAMETERS: List - Current field list pointer @@ -1603,6 +1875,109 @@ DtCompileTcpa ( /****************************************************************************** * + * FUNCTION: DtCompileTpm2 + * + * PARAMETERS: PFieldList - Current field list pointer + * + * RETURN: Status + * + * DESCRIPTION: Compile TPM2. + * + *****************************************************************************/ + +ACPI_STATUS +DtCompileTpm2 ( + void **List) +{ + DT_FIELD **PFieldList = (DT_FIELD **) List; + DT_SUBTABLE *Subtable; + ACPI_TABLE_TPM2 *Tpm2Header; + DT_SUBTABLE *ParentTable; + ACPI_STATUS Status = AE_OK; + + + /* Compile the main table */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + Tpm2Header = ACPI_CAST_PTR (ACPI_TABLE_TPM2, ParentTable->Buffer); + + /* Method parameters */ + /* Optional: Log area minimum length */ + /* Optional: Log area start address */ + /* TBD: Optional fields above not fully implemented (not optional at this time) */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm2a, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + + /* Subtable type depends on the StartMethod */ + + switch (Tpm2Header->StartMethod) + { + case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC: + + /* Subtable specific to to ARM_SMC */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoTpm211, + &Subtable, TRUE); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + break; + + case ACPI_TPM2_START_METHOD: + case ACPI_TPM2_MEMORY_MAPPED: + case ACPI_TPM2_COMMAND_BUFFER: + case ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD: + break; + + case ACPI_TPM2_RESERVED1: + case ACPI_TPM2_RESERVED3: + case ACPI_TPM2_RESERVED4: + case ACPI_TPM2_RESERVED5: + case ACPI_TPM2_RESERVED9: + case ACPI_TPM2_RESERVED10: + + AcpiOsPrintf ("\n**** Reserved TPM2 Start Method type 0x%X\n", + Tpm2Header->StartMethod); + Status = AE_ERROR; + break; + + case ACPI_TPM2_NOT_ALLOWED: + default: + + AcpiOsPrintf ("\n**** Unknown TPM2 Start Method type 0x%X\n", + Tpm2Header->StartMethod); + Status = AE_ERROR; + break; + } + + return (Status); +} + + +/****************************************************************************** + * * FUNCTION: DtGetGenericTableInfo * * PARAMETERS: Name - Generic type name diff --git a/source/compiler/dttemplate.c b/source/compiler/dttemplate.c index 55c6e9d65dfd..4c14b688618c 100644 --- a/source/compiler/dttemplate.c +++ b/source/compiler/dttemplate.c @@ -151,7 +151,6 @@ #include "aslcompiler.h" #include "acapps.h" -#include "dtcompiler.h" #include "dttemplate.h" /* Contains the hex ACPI table templates */ #define _COMPONENT DT_COMPILER @@ -315,7 +314,7 @@ Exit: /* Shutdown ACPICA subsystem */ (void) AcpiTerminate (); - CmDeleteCaches (); + UtDeleteLocalCaches (); return (Status); } diff --git a/source/compiler/dttemplate.h b/source/compiler/dttemplate.h index 8d27359d9ad0..38750f79d979 100644 --- a/source/compiler/dttemplate.h +++ b/source/compiler/dttemplate.h @@ -1079,6 +1079,17 @@ const unsigned char TemplatePcct[] = 0x55,0x55,0x55,0x55,0x55,0x55 /* 00000248 "UUUUUU| */ }; +const unsigned char TemplatePdtt[] = +{ + 0x50,0x44,0x54,0x54,0x34,0x00,0x00,0x00, /* 00000000 "PDTT4..." */ + 0x01,0xCB,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x31,0x08,0x17,0x20,0x04,0x00,0x00,0x00, /* 00000020 "1.. ...." */ + 0x2C,0x00,0x00,0x00,0xAA,0x03,0xBB,0x02, /* 00000028 ",......." */ + 0xCC,0x01,0xDD,0x00 /* 00000030 "...." */ +}; + const unsigned char TemplatePmtt[] = { 0x50,0x4D,0x54,0x54,0xB4,0x00,0x00,0x00, /* 00000000 "PMTT...." */ @@ -1187,6 +1198,25 @@ const unsigned char TemplateSdei[] = 0x30,0x09,0x16,0x20 /* 00000028 "0.. " */ }; +const unsigned char TemplateSdev[] = +{ + 0x53,0x44,0x45,0x56,0x72,0x00,0x00,0x00, /* 00000000 "SDEVr..." */ + 0x01,0x2F,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "./INTEL " */ + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ + 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x31,0x08,0x17,0x20,0x00,0x01,0x2A,0x00, /* 00000020 "1.. ..*." */ + 0x0C,0x00,0x16,0x00,0x22,0x00,0x08,0x00, /* 00000028 "...."..." */ + 0x5C,0x5C,0x5F,0x53,0x42,0x5F,0x2E,0x50, /* 00000030 "\\_SB_.P" */ + 0x43,0x49,0x30,0x2E,0x55,0x53,0x42,0x31, /* 00000038 "CI0.USB1" */ + 0x2E,0x53,0x55,0x42,0x31,0x00,0x00,0x11, /* 00000040 ".SUB1..." */ + 0x22,0x33,0x44,0x55,0x66,0x77,0x01,0x01, /* 00000048 ""3DUfw.." */ + 0x24,0x00,0x10,0x00,0x20,0x00,0x10,0x00, /* 00000050 "$... ..." */ + 0x04,0x00,0x14,0x00,0x10,0x00,0x11,0x22, /* 00000058 "......."" */ + 0x33,0x44,0xEE,0xDD,0xCC,0xBB,0xAA,0x55, /* 00000060 "3D.....U" */ + 0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD, /* 00000068 "fw......" */ + 0xEE,0xFF /* 00000070 ".." */ +}; + const unsigned char TemplateSlic[] = { 0x53,0x4C,0x49,0x43,0x76,0x01,0x00,0x00, /* 00000000 "SLICv..." */ @@ -1388,13 +1418,17 @@ const unsigned char TemplateTcpa[] = const unsigned char TemplateTpm2[] = { - 0x54,0x50,0x4D,0x32,0x34,0x00,0x00,0x00, /* 00000000 "TPM24..." */ - 0x03,0x42,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 ".BINTEL " */ - 0x54,0x45,0x4D,0x50,0x4C,0x41,0x54,0x45, /* 00000010 "TEMPLATE" */ + 0x54,0x50,0x4D,0x32,0x58,0x00,0x00,0x00, /* 00000000 "TPM2X..." */ + 0x03,0xAB,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ 0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ - 0x14,0x11,0x12,0x20,0x00,0x00,0x00,0x00, /* 00000020 "... ...." */ - 0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00, /* 00000028 "wfUD3".." */ - 0x01,0x00,0x00,0x00 /* 00000030 "...." */ + 0x31,0x08,0x17,0x20,0x01,0x00,0x00,0x00, /* 00000020 "1.. ...." */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000028 "........" */ + 0x0B,0x00,0x00,0x00,0x01,0x02,0x03,0x04, /* 00000030 "........" */ + 0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C, /* 00000038 "........" */ + 0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000040 "........" */ + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, /* 00000048 "........" */ + 0x01,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF /* 00000050 "........" */ }; const unsigned char TemplateUefi[] = diff --git a/source/compiler/dtutils.c b/source/compiler/dtutils.c index c6c89eaa7d20..1e8f9b243a5a 100644 --- a/source/compiler/dtutils.c +++ b/source/compiler/dtutils.c @@ -150,7 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #include "actables.h" #define _COMPONENT DT_COMPILER @@ -570,6 +569,7 @@ DtGetFieldLength ( case ACPI_DMT_PCCT: case ACPI_DMT_PMTT: case ACPI_DMT_PPTT: + case ACPI_DMT_SDEV: case ACPI_DMT_SRAT: case ACPI_DMT_ASF: case ACPI_DMT_HESTNTYP: @@ -602,6 +602,7 @@ DtGetFieldLength ( case ACPI_DMT_NAME4: case ACPI_DMT_SIG: case ACPI_DMT_LPIT: + case ACPI_DMT_TPM2: ByteLength = 4; break; @@ -920,153 +921,3 @@ DtWalkTableTree ( } } } - - -/******************************************************************************* - * - * FUNCTION: UtSubtableCacheCalloc - * - * PARAMETERS: None - * - * RETURN: Pointer to the buffer. Aborts on allocation failure - * - * DESCRIPTION: Allocate a subtable object buffer. Bypass the local - * dynamic memory manager for performance reasons (This has a - * major impact on the speed of the compiler.) - * - ******************************************************************************/ - -DT_SUBTABLE * -UtSubtableCacheCalloc ( - void) -{ - ASL_CACHE_INFO *Cache; - - - if (Gbl_SubtableCacheNext >= Gbl_SubtableCacheLast) - { - /* Allocate a new buffer */ - - Cache = UtLocalCalloc (sizeof (Cache->Next) + - (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE)); - - /* Link new cache buffer to head of list */ - - Cache->Next = Gbl_SubtableCacheList; - Gbl_SubtableCacheList = Cache; - - /* Setup cache management pointers */ - - Gbl_SubtableCacheNext = ACPI_CAST_PTR (DT_SUBTABLE, Cache->Buffer); - Gbl_SubtableCacheLast = Gbl_SubtableCacheNext + ASL_SUBTABLE_CACHE_SIZE; - } - - Gbl_SubtableCount++; - return (Gbl_SubtableCacheNext++); -} - - -/******************************************************************************* - * - * FUNCTION: UtFieldCacheCalloc - * - * PARAMETERS: None - * - * RETURN: Pointer to the buffer. Aborts on allocation failure - * - * DESCRIPTION: Allocate a field object buffer. Bypass the local - * dynamic memory manager for performance reasons (This has a - * major impact on the speed of the compiler.) - * - ******************************************************************************/ - -DT_FIELD * -UtFieldCacheCalloc ( - void) -{ - ASL_CACHE_INFO *Cache; - - - if (Gbl_FieldCacheNext >= Gbl_FieldCacheLast) - { - /* Allocate a new buffer */ - - Cache = UtLocalCalloc (sizeof (Cache->Next) + - (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE)); - - /* Link new cache buffer to head of list */ - - Cache->Next = Gbl_FieldCacheList; - Gbl_FieldCacheList = Cache; - - /* Setup cache management pointers */ - - Gbl_FieldCacheNext = ACPI_CAST_PTR (DT_FIELD, Cache->Buffer); - Gbl_FieldCacheLast = Gbl_FieldCacheNext + ASL_FIELD_CACHE_SIZE; - } - - Gbl_FieldCount++; - return (Gbl_FieldCacheNext++); -} - - -/******************************************************************************* - * - * FUNCTION: DtDeleteCaches - * - * PARAMETERS: None - * - * RETURN: None - * - * DESCRIPTION: Delete all local cache buffer blocks - * - ******************************************************************************/ - -void -DtDeleteCaches ( - void) -{ - UINT32 BufferCount; - ASL_CACHE_INFO *Next; - - - /* Field cache */ - - BufferCount = 0; - while (Gbl_FieldCacheList) - { - Next = Gbl_FieldCacheList->Next; - ACPI_FREE (Gbl_FieldCacheList); - Gbl_FieldCacheList = Next; - BufferCount++; - } - - DbgPrint (ASL_DEBUG_OUTPUT, - "%u Fields, Buffer size: %u fields (%u bytes), %u Buffers\n", - Gbl_FieldCount, ASL_FIELD_CACHE_SIZE, - (sizeof (DT_FIELD) * ASL_FIELD_CACHE_SIZE), BufferCount); - - Gbl_FieldCount = 0; - Gbl_FieldCacheNext = NULL; - Gbl_FieldCacheLast = NULL; - - /* Subtable cache */ - - BufferCount = 0; - while (Gbl_SubtableCacheList) - { - Next = Gbl_SubtableCacheList->Next; - ACPI_FREE (Gbl_SubtableCacheList); - Gbl_SubtableCacheList = Next; - BufferCount++; - } - - DbgPrint (ASL_DEBUG_OUTPUT, - "%u Subtables, Buffer size: %u subtables (%u bytes), %u Buffers\n", - Gbl_SubtableCount, ASL_SUBTABLE_CACHE_SIZE, - (sizeof (DT_SUBTABLE) * ASL_SUBTABLE_CACHE_SIZE), BufferCount); - - Gbl_SubtableCount = 0; - Gbl_SubtableCacheNext = NULL; - Gbl_SubtableCacheLast = NULL; -} diff --git a/source/compiler/prexpress.c b/source/compiler/prexpress.c index a0ba7447d35c..a9ed5fe776a4 100644 --- a/source/compiler/prexpress.c +++ b/source/compiler/prexpress.c @@ -150,8 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" - #define _COMPONENT ASL_PREPROCESSOR ACPI_MODULE_NAME ("prexpress") diff --git a/source/compiler/prmacros.c b/source/compiler/prmacros.c index 675d4522cb93..5560c12aa9ee 100644 --- a/source/compiler/prmacros.c +++ b/source/compiler/prmacros.c @@ -150,8 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" - #define _COMPONENT ASL_PREPROCESSOR ACPI_MODULE_NAME ("prmacros") diff --git a/source/compiler/prparser.y b/source/compiler/prparser.y index d24a5bbee04f..17da8485cb14 100644 --- a/source/compiler/prparser.y +++ b/source/compiler/prparser.y @@ -151,7 +151,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" #define _COMPONENT ASL_PREPROCESSOR ACPI_MODULE_NAME ("prparser") diff --git a/source/compiler/prscan.c b/source/compiler/prscan.c index 75a986657693..a012e111b06c 100644 --- a/source/compiler/prscan.c +++ b/source/compiler/prscan.c @@ -152,7 +152,6 @@ #define _DECLARE_PR_GLOBALS #include "aslcompiler.h" -#include "dtcompiler.h" /* * TBDs: diff --git a/source/compiler/prutils.c b/source/compiler/prutils.c index 61641ddbe2ae..5fa77aa68943 100644 --- a/source/compiler/prutils.c +++ b/source/compiler/prutils.c @@ -150,8 +150,6 @@ *****************************************************************************/ #include "aslcompiler.h" -#include "dtcompiler.h" - #define _COMPONENT ASL_PREPROCESSOR ACPI_MODULE_NAME ("prutils") @@ -514,7 +512,7 @@ PrPushInputFileStack ( /* Reset the global line count and filename */ Gbl_Files[ASL_FILE_INPUT].Filename = - UtStringCacheCalloc (strlen (Filename) + 1); + UtLocalCacheCalloc (strlen (Filename) + 1); strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename); Gbl_Files[ASL_FILE_INPUT].Handle = InputFile; diff --git a/source/components/dispatcher/dscontrol.c b/source/components/dispatcher/dscontrol.c index 897200a5efae..7a06a1e6705a 100644 --- a/source/components/dispatcher/dscontrol.c +++ b/source/components/dispatcher/dscontrol.c @@ -234,7 +234,8 @@ AcpiDsExecBeginControlOp ( WalkState->ParserState.PkgEnd; ControlState->Control.Opcode = Op->Common.AmlOpcode; - + ControlState->Control.LoopTimeout = AcpiOsGetTimer () + + (UINT64) (AcpiGbl_MaxLoopIterations * ACPI_100NSEC_PER_SEC); /* Push the control state on this walk's control stack */ @@ -327,15 +328,15 @@ AcpiDsExecEndControlOp ( /* Predicate was true, the body of the loop was just executed */ /* - * This loop counter mechanism allows the interpreter to escape - * possibly infinite loops. This can occur in poorly written AML - * when the hardware does not respond within a while loop and the - * loop does not implement a timeout. + * This infinite loop detection mechanism allows the interpreter + * to escape possibly infinite loops. This can occur in poorly + * written AML when the hardware does not respond within a while + * loop and the loop does not implement a timeout. */ - ControlState->Control.LoopCount++; - if (ControlState->Control.LoopCount > AcpiGbl_MaxLoopIterations) + if (ACPI_TIME_AFTER (AcpiOsGetTimer (), + ControlState->Control.LoopTimeout)) { - Status = AE_AML_INFINITE_LOOP; + Status = AE_AML_LOOP_TIMEOUT; break; } diff --git a/source/components/hardware/hwtimer.c b/source/components/hardware/hwtimer.c index 358164ee8a31..0fc33e8acc06 100644 --- a/source/components/hardware/hwtimer.c +++ b/source/components/hardware/hwtimer.c @@ -283,7 +283,7 @@ AcpiGetTimerDuration ( UINT32 *TimeElapsed) { ACPI_STATUS Status; - UINT32 DeltaTicks; + UINT64 DeltaTicks; UINT64 Quotient; @@ -302,34 +302,33 @@ AcpiGetTimerDuration ( return_ACPI_STATUS (AE_SUPPORT); } + if (StartTicks == EndTicks) + { + *TimeElapsed = 0; + return_ACPI_STATUS (AE_OK); + } + /* * Compute Tick Delta: * Handle (max one) timer rollovers on 24-bit versus 32-bit timers. */ - if (StartTicks < EndTicks) - { - DeltaTicks = EndTicks - StartTicks; - } - else if (StartTicks > EndTicks) + DeltaTicks = EndTicks; + if (StartTicks > EndTicks) { if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0) { /* 24-bit Timer */ - DeltaTicks = (((0x00FFFFFF - StartTicks) + EndTicks) & 0x00FFFFFF); + DeltaTicks |= (UINT64) 1 << 24; } else { /* 32-bit Timer */ - DeltaTicks = (0xFFFFFFFF - StartTicks) + EndTicks; + DeltaTicks |= (UINT64) 1 << 32; } } - else /* StartTicks == EndTicks */ - { - *TimeElapsed = 0; - return_ACPI_STATUS (AE_OK); - } + DeltaTicks -= StartTicks; /* * Compute Duration (Requires a 64-bit multiply and divide): @@ -337,7 +336,7 @@ AcpiGetTimerDuration ( * TimeElapsed (microseconds) = * (DeltaTicks * ACPI_USEC_PER_SEC) / ACPI_PM_TIMER_FREQUENCY; */ - Status = AcpiUtShortDivide (((UINT64) DeltaTicks) * ACPI_USEC_PER_SEC, + Status = AcpiUtShortDivide (DeltaTicks * ACPI_USEC_PER_SEC, ACPI_PM_TIMER_FREQUENCY, &Quotient, NULL); *TimeElapsed = (UINT32) Quotient; diff --git a/source/components/namespace/nsaccess.c b/source/components/namespace/nsaccess.c index 0ae1fbdd0875..8f98ca68273e 100644 --- a/source/components/namespace/nsaccess.c +++ b/source/components/namespace/nsaccess.c @@ -775,19 +775,19 @@ AcpiNsLookup ( ThisNode = (ACPI_NAMESPACE_NODE *) ThisNode->Object; } } -#ifdef ACPI_ASL_COMPILER - if (!AcpiGbl_DisasmFlag && - (ThisNode->Flags & ANOBJ_IS_EXTERNAL)) - { - ThisNode->Flags |= IMPLICIT_EXTERNAL; - } -#endif } /* Special handling for the last segment (NumSegments == 0) */ else { +#ifdef ACPI_ASL_COMPILER + if (!AcpiGbl_DisasmFlag && (ThisNode->Flags & ANOBJ_IS_EXTERNAL)) + { + ThisNode->Flags &= ~IMPLICIT_EXTERNAL; + } +#endif + /* * Sanity typecheck of the target object: * diff --git a/source/components/namespace/nssearch.c b/source/components/namespace/nssearch.c index 3504092aedc3..3697ea4be007 100644 --- a/source/components/namespace/nssearch.c +++ b/source/components/namespace/nssearch.c @@ -545,6 +545,7 @@ AcpiNsSearchAndEnter ( (WalkState && WalkState->Opcode == AML_SCOPE_OP)) { NewNode->Flags |= ANOBJ_IS_EXTERNAL; + NewNode->Flags |= IMPLICIT_EXTERNAL; } #endif diff --git a/source/components/parser/psobject.c b/source/components/parser/psobject.c index 8f31750c5f7e..b6aa802590d6 100644 --- a/source/components/parser/psobject.c +++ b/source/components/parser/psobject.c @@ -500,15 +500,10 @@ AcpiPsCreateOp ( * external declaration opcode. Setting WalkState->Aml to * WalkState->ParserState.Aml + 2 moves increments the * WalkState->Aml past the object type and the paramcount of the - * external opcode. For the error message, only print the AML - * offset. We could attempt to print the name but this may cause - * a segmentation fault when printing the namepath because the - * AML may be incorrect. + * external opcode. */ - AcpiOsPrintf ( - "// Invalid external declaration at AML offset 0x%x.\n", - WalkState->Aml - WalkState->ParserState.AmlStart); WalkState->Aml = WalkState->ParserState.Aml + 2; + WalkState->ParserState.Aml = WalkState->Aml; return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE); } #endif diff --git a/source/components/parser/psutils.c b/source/components/parser/psutils.c index 19ae3a9d4bdd..a04b2e50aabc 100644 --- a/source/components/parser/psutils.c +++ b/source/components/parser/psutils.c @@ -292,11 +292,11 @@ AcpiPsAllocOp ( { AcpiGbl_CurrentScope = Op; } - } - if (Gbl_CaptureComments) - { - ASL_CV_TRANSFER_COMMENTS (Op); + if (Gbl_CaptureComments) + { + ASL_CV_TRANSFER_COMMENTS (Op); + } } return (Op); diff --git a/source/components/utilities/utinit.c b/source/components/utilities/utinit.c index d1937a57aafd..faa34bbd20b7 100644 --- a/source/components/utilities/utinit.c +++ b/source/components/utilities/utinit.c @@ -334,7 +334,6 @@ AcpiUtInitGlobals ( AcpiGbl_NextOwnerIdOffset = 0; AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING; AcpiGbl_OsiMutex = NULL; - AcpiGbl_MaxLoopIterations = ACPI_MAX_LOOP_COUNT; /* Hardware oriented */ diff --git a/source/components/utilities/utmath.c b/source/components/utilities/utmath.c index 4aa940251d18..a4c3fba36915 100644 --- a/source/components/utilities/utmath.c +++ b/source/components/utilities/utmath.c @@ -260,7 +260,7 @@ AcpiUtShortShiftLeft ( if ((Count & 63) >= 32) { OperandOvl.Part.Hi = OperandOvl.Part.Lo; - OperandOvl.Part.Lo ^= OperandOvl.Part.Lo; + OperandOvl.Part.Lo = 0; Count = (Count & 63) - 32; } ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi, @@ -305,7 +305,7 @@ AcpiUtShortShiftRight ( if ((Count & 63) >= 32) { OperandOvl.Part.Lo = OperandOvl.Part.Hi; - OperandOvl.Part.Hi ^= OperandOvl.Part.Hi; + OperandOvl.Part.Hi = 0; Count = (Count & 63) - 32; } ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi, diff --git a/source/include/acapps.h b/source/include/acapps.h index 4ca3e80fb31e..faae2fb6917e 100644 --- a/source/include/acapps.h +++ b/source/include/acapps.h @@ -188,6 +188,9 @@ Prefix, ACPICA_COPYRIGHT, \ Prefix +#define ACPI_COMMON_BUILD_TIME \ + "Build date/time: %s %s\n", __DATE__, __TIME__ + /* Macros for usage messages */ #define ACPI_USAGE_HEADER(Usage) \ diff --git a/source/include/acconfig.h b/source/include/acconfig.h index 6fc043639e32..7cff0636516a 100644 --- a/source/include/acconfig.h +++ b/source/include/acconfig.h @@ -255,9 +255,9 @@ #define ACPI_ADDRESS_RANGE_MAX 2 -/* Maximum number of While() loops before abort */ +/* Maximum time (default 30s) of While() loops before abort */ -#define ACPI_MAX_LOOP_COUNT 0x000FFFFF +#define ACPI_MAX_LOOP_TIMEOUT 30 /****************************************************************************** diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h index 26d4f47b709c..0c465602d1df 100644 --- a/source/include/acdisasm.h +++ b/source/include/acdisasm.h @@ -272,8 +272,10 @@ typedef enum ACPI_DMT_PMTT, ACPI_DMT_PPTT, ACPI_DMT_SDEI, + ACPI_DMT_SDEV, ACPI_DMT_SLIC, ACPI_DMT_SRAT, + ACPI_DMT_TPM2, /* Special opcodes */ @@ -502,6 +504,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit4[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit5[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit6[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoNfit6a[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPmtt[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPmtt0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPmtt1[]; @@ -515,6 +518,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct1[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct2[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct3[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPcct4[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPptt0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPptt0a[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoPptt1[]; @@ -529,6 +533,13 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3pt0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3pt1[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdei[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdev[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdevHdr[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdev0[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdev0a[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdev1[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdev1a[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoSdev1b[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlit[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpcr[]; @@ -546,6 +557,8 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaHdr[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaClient[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm2a[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoTpm211[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoUefi[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoVrtc0[]; @@ -586,7 +599,7 @@ AcpiDmDumpTable ( UINT32 TableLength, UINT32 TableOffset, void *Table, - UINT32 SubTableLength, + UINT32 SubtableLength, ACPI_DMTABLE_INFO *Info); void @@ -713,6 +726,10 @@ AcpiDmDumpPcct ( ACPI_TABLE_HEADER *Table); void +AcpiDmDumpPdtt ( + ACPI_TABLE_HEADER *Table); + +void AcpiDmDumpPmtt ( ACPI_TABLE_HEADER *Table); @@ -733,6 +750,10 @@ AcpiDmDumpS3pt ( ACPI_TABLE_HEADER *Table); void +AcpiDmDumpSdev ( + ACPI_TABLE_HEADER *Table); + +void AcpiDmDumpSlic ( ACPI_TABLE_HEADER *Table); @@ -753,6 +774,10 @@ AcpiDmDumpTcpa ( ACPI_TABLE_HEADER *Table); void +AcpiDmDumpTpm2 ( + ACPI_TABLE_HEADER *Table); + +void AcpiDmDumpVrtc ( ACPI_TABLE_HEADER *Table); diff --git a/source/include/acexcep.h b/source/include/acexcep.h index d808f275144f..21db48dcb082 100644 --- a/source/include/acexcep.h +++ b/source/include/acexcep.h @@ -309,7 +309,7 @@ typedef struct acpi_exception_info #define AE_AML_CIRCULAR_REFERENCE EXCEP_AML (0x001E) #define AE_AML_BAD_RESOURCE_LENGTH EXCEP_AML (0x001F) #define AE_AML_ILLEGAL_ADDRESS EXCEP_AML (0x0020) -#define AE_AML_INFINITE_LOOP EXCEP_AML (0x0021) +#define AE_AML_LOOP_TIMEOUT EXCEP_AML (0x0021) #define AE_AML_UNINITIALIZED_NODE EXCEP_AML (0x0022) #define AE_AML_TARGET_TYPE EXCEP_AML (0x0023) @@ -441,7 +441,7 @@ static const ACPI_EXCEPTION_INFO AcpiGbl_ExceptionNames_Aml[] = EXCEP_TXT ("AE_AML_CIRCULAR_REFERENCE", "Two references refer to each other"), EXCEP_TXT ("AE_AML_BAD_RESOURCE_LENGTH", "The length of a Resource Descriptor in the AML is incorrect"), EXCEP_TXT ("AE_AML_ILLEGAL_ADDRESS", "A memory, I/O, or PCI configuration address is invalid"), - EXCEP_TXT ("AE_AML_INFINITE_LOOP", "An apparent infinite AML While loop, method was aborted"), + EXCEP_TXT ("AE_AML_LOOP_TIMEOUT", "An AML While loop exceeded the maximum execution time"), EXCEP_TXT ("AE_AML_UNINITIALIZED_NODE", "A namespace node is uninitialized or unresolved"), EXCEP_TXT ("AE_AML_TARGET_TYPE", "A target operand of an incorrect type was encountered") }; diff --git a/source/include/aclocal.h b/source/include/aclocal.h index 00be20ede3e7..7a20fe6fca66 100644 --- a/source/include/aclocal.h +++ b/source/include/aclocal.h @@ -834,7 +834,7 @@ typedef struct acpi_control_state union acpi_parse_object *PredicateOp; UINT8 *AmlPredicateStart; /* Start of if/while predicate */ UINT8 *PackageEnd; /* End of if/while block */ - UINT32 LoopCount; /* While() loop counter */ + UINT64 LoopTimeout; /* While() loop timeout */ } ACPI_CONTROL_STATE; diff --git a/source/include/acpixf.h b/source/include/acpixf.h index 7d6c18d69811..bd5fde1765e9 100644 --- a/source/include/acpixf.h +++ b/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20170831 +#define ACPI_CA_VERSION 0x20170929 #include "acconfig.h" #include "actypes.h" @@ -370,11 +370,11 @@ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_OsiData, 0); ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_ReducedHardware, FALSE); /* - * Maximum number of While() loop iterations before forced method abort. + * Maximum timeout for While() loop iterations before forced method abort. * This mechanism is intended to prevent infinite loops during interpreter * execution within a host kernel. */ -ACPI_INIT_GLOBAL (UINT32, AcpiGbl_MaxLoopIterations, ACPI_MAX_LOOP_COUNT); +ACPI_INIT_GLOBAL (UINT32, AcpiGbl_MaxLoopIterations, ACPI_MAX_LOOP_TIMEOUT); /* * This mechanism is used to trace a specified AML method. The method is diff --git a/source/include/actbl1.h b/source/include/actbl1.h index 537c33e7c3b9..7eed2c5507ae 100644 --- a/source/include/actbl1.h +++ b/source/include/actbl1.h @@ -179,9 +179,10 @@ #define ACPI_SIG_HEST "HEST" /* Hardware Error Source Table */ #define ACPI_SIG_MADT "APIC" /* Multiple APIC Description Table */ #define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */ -#define ACPI_SIG_PDTT "PDTT" /* Processor Debug Trigger Table */ +#define ACPI_SIG_PDTT "PDTT" /* Platform Debug Trigger Table */ #define ACPI_SIG_PPTT "PPTT" /* Processor Properties Topology Table */ #define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */ +#define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */ #define ACPI_SIG_SLIT "SLIT" /* System Locality Distance Information Table */ #define ACPI_SIG_SRAT "SRAT" /* System Resource Affinity Table */ #define ACPI_SIG_NFIT "NFIT" /* NVDIMM Firmware Interface Table */ @@ -1603,7 +1604,7 @@ typedef struct acpi_nfit_flush_address /******************************************************************************* * - * PDTT - Processor Debug Trigger Table (ACPI 6.2) + * PDTT - Platform Debug Trigger Table (ACPI 6.2) * Version 0 * ******************************************************************************/ @@ -1625,16 +1626,15 @@ typedef struct acpi_table_pdtt */ typedef struct acpi_pdtt_channel { - UINT16 SubChannelId; + UINT8 SubchannelId; + UINT8 Flags; } ACPI_PDTT_CHANNEL; +/* Flags for above */ -/* Mask and Flags for above */ - -#define ACPI_PDTT_SUBCHANNEL_ID_MASK 0x00FF -#define ACPI_PDTT_RUNTIME_TRIGGER (1<<8) -#define ACPI_PPTT_WAIT_COMPLETION (1<<9) +#define ACPI_PDTT_RUNTIME_TRIGGER (1) +#define ACPI_PPTT_WAIT_COMPLETION (1<<1) /******************************************************************************* @@ -1748,6 +1748,82 @@ typedef struct acpi_table_sbst /******************************************************************************* * + * SDEV - Secure Devices Table (ACPI 6.2) + * Version 1 + * + ******************************************************************************/ + +typedef struct acpi_table_sdev +{ + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ + +} ACPI_TABLE_SDEV; + + +typedef struct acpi_sdev_header +{ + UINT8 Type; + UINT8 Flags; + UINT16 Length; + +} ACPI_SDEV_HEADER; + + +/* Values for subtable type above */ + +enum AcpiSdevType +{ + ACPI_SDEV_TYPE_NAMESPACE_DEVICE = 0, + ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE = 1, + ACPI_SDEV_TYPE_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* Values for flags above */ + +#define ACPI_SDEV_HANDOFF_TO_UNSECURE_OS (1) + +/* + * SDEV subtables + */ + +/* 0: Namespace Device Based Secure Device Structure */ + +typedef struct acpi_sdev_namespace +{ + ACPI_SDEV_HEADER Header; + UINT16 DeviceIdOffset; + UINT16 DeviceIdLength; + UINT16 VendorDataOffset; + UINT16 VendorDataLength; + +} ACPI_SDEV_NAMESPACE; + +/* 1: PCIe Endpoint Device Based Device Structure */ + +typedef struct acpi_sdev_pcie +{ + ACPI_SDEV_HEADER Header; + UINT16 Segment; + UINT16 StartBus; + UINT16 PathOffset; + UINT16 PathLength; + UINT16 VendorDataOffset; + UINT16 VendorDataLength; + +} ACPI_SDEV_PCIE; + +/* 1a: PCIe Endpoint path entry */ + +typedef struct acpi_sdev_pcie_path +{ + UINT8 Device; + UINT8 Function; + +} ACPI_SDEV_PCIE_PATH; + + +/******************************************************************************* + * * SLIT - System Locality Distance Information Table * Version 1 * diff --git a/source/include/actbl2.h b/source/include/actbl2.h index 951d65531a33..02a897b0fb19 100644 --- a/source/include/actbl2.h +++ b/source/include/actbl2.h @@ -1550,6 +1550,8 @@ enum AcpiSpmiInterfaceTypes * TCPA - Trusted Computing Platform Alliance table * Version 2 * + * TCG Hardware Interface Table for TPM 1.2 Clients and Servers + * * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0", * Version 1.2, Revision 8 * February 27, 2017 @@ -1622,6 +1624,8 @@ typedef struct acpi_table_tcpa_server * TPM2 - Trusted Platform Module (TPM) 2.0 Hardware Interface Table * Version 4 * + * TCG Hardware Interface Table for TPM 2.0 Clients and Servers + * * Conforms to "TCG ACPI Specification, Family 1.2 and 2.0", * Version 1.2, Revision 8 * February 27, 2017 @@ -1643,17 +1647,25 @@ typedef struct acpi_table_tpm2 /* Values for StartMethod above */ #define ACPI_TPM2_NOT_ALLOWED 0 +#define ACPI_TPM2_RESERVED1 1 #define ACPI_TPM2_START_METHOD 2 +#define ACPI_TPM2_RESERVED3 3 +#define ACPI_TPM2_RESERVED4 4 +#define ACPI_TPM2_RESERVED5 5 #define ACPI_TPM2_MEMORY_MAPPED 6 #define ACPI_TPM2_COMMAND_BUFFER 7 #define ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD 8 +#define ACPI_TPM2_RESERVED9 9 +#define ACPI_TPM2_RESERVED10 10 #define ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC 11 /* V1.2 Rev 8 */ +#define ACPI_TPM2_RESERVED 12 -/* Trailer appears after any StartMethod subtables */ +/* Optional trailer appears after any StartMethod subtables */ typedef struct acpi_tpm2_trailer { + UINT8 MethodParameters[12]; UINT32 MinimumLogLength; /* Minimum length for the event log area */ UINT64 LogAddress; /* Address of the event log area */ diff --git a/source/include/actypes.h b/source/include/actypes.h index 1839f936e4e5..4cc6d4fd071e 100644 --- a/source/include/actypes.h +++ b/source/include/actypes.h @@ -586,6 +586,8 @@ typedef void * ACPI_HANDLE; /* Actually a ptr to a N #define ACPI_NSEC_PER_MSEC 1000000L #define ACPI_NSEC_PER_SEC 1000000000L +#define ACPI_TIME_AFTER(a, b) ((INT64)((b) - (a)) < 0) + /* Owner IDs are used to track namespace nodes for selective deletion */ diff --git a/source/tools/acpibin/abmain.c b/source/tools/acpibin/abmain.c index a3e0ba89bf3e..c5fc7860ad21 100644 --- a/source/tools/acpibin/abmain.c +++ b/source/tools/acpibin/abmain.c @@ -160,7 +160,7 @@ AbDisplayUsage ( #define AB_UTILITY_NAME "ACPI Binary Table Dump Utility" -#define AB_SUPPORTED_OPTIONS "a:c:d:h:o:s:tv" +#define AB_SUPPORTED_OPTIONS "a:c:d:h:o:s:tv^" /****************************************************************************** @@ -192,6 +192,7 @@ AbDisplayUsage ( ACPI_OPTION ("-s <File>", "Update checksum for binary AML file"); ACPI_OPTION ("-t", "Terse mode"); ACPI_OPTION ("-v", "Display version information"); + ACPI_OPTION ("-vd", "Display build date and time"); } @@ -292,7 +293,23 @@ main ( case 'v': /* -v: (Version): signon already emitted, just exit */ - return (0); + switch (AcpiGbl_Optarg[0]) + { + case '^': /* -v: (Version): signon already emitted, just exit */ + + return (1); + + case 'd': + + printf (ACPI_COMMON_BUILD_TIME); + return (1); + + default: + + printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); + return (-1); + } + break; default: diff --git a/source/tools/acpidump/apmain.c b/source/tools/acpidump/apmain.c index 99962797d702..e95ad6c3b1bc 100644 --- a/source/tools/acpidump/apmain.c +++ b/source/tools/acpidump/apmain.c @@ -199,7 +199,7 @@ UINT32 CurrentAction = 0; #define AP_UTILITY_NAME "ACPI Binary Table Dump Utility" -#define AP_SUPPORTED_OPTIONS "?a:bc:f:hn:o:r:svxz" +#define AP_SUPPORTED_OPTIONS "?a:bc:f:hn:o:r:sv^xz" /****************************************************************************** @@ -223,6 +223,7 @@ ApDisplayUsage ( ACPI_OPTION ("-r <Address>", "Dump tables from specified RSDP"); ACPI_OPTION ("-s", "Print table summaries only"); ACPI_OPTION ("-v", "Display version information"); + ACPI_OPTION ("-vd", "Display build date and time"); ACPI_OPTION ("-z", "Verbose mode"); ACPI_USAGE_TEXT ("\nTable Options:\n"); @@ -369,10 +370,27 @@ ApDoOptions ( } continue; - case 'v': /* Revision/version */ + case 'v': /* -v: (Version): signon already emitted, just exit */ - AcpiOsPrintf (ACPI_COMMON_SIGNON (AP_UTILITY_NAME)); - return (1); + switch (AcpiGbl_Optarg[0]) + { + case '^': /* -v: (Version) */ + + fprintf (stderr, ACPI_COMMON_SIGNON (AP_UTILITY_NAME)); + return (1); + + case 'd': + + fprintf (stderr, ACPI_COMMON_SIGNON (AP_UTILITY_NAME)); + printf (ACPI_COMMON_BUILD_TIME); + return (1); + + default: + + printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); + return (-1); + } + break; case 'z': /* Verbose mode */ diff --git a/source/tools/acpiexec/aecommon.h b/source/tools/acpiexec/aecommon.h index b4864610a69d..00bf09b41312 100644 --- a/source/tools/acpiexec/aecommon.h +++ b/source/tools/acpiexec/aecommon.h @@ -190,6 +190,7 @@ typedef struct ae_debug_regions extern BOOLEAN AcpiGbl_IgnoreErrors; +extern BOOLEAN AcpiGbl_AbortLoopOnTimeout; extern UINT8 AcpiGbl_RegionFillValue; extern UINT8 AcpiGbl_UseHwReducedFadt; extern BOOLEAN AcpiGbl_DisplayRegionAccess; diff --git a/source/tools/acpiexec/aeexception.c b/source/tools/acpiexec/aeexception.c index 62e9db0a0122..2e44dbc504a3 100644 --- a/source/tools/acpiexec/aeexception.c +++ b/source/tools/acpiexec/aeexception.c @@ -196,13 +196,22 @@ AeExceptionHandler ( Exception = AcpiFormatException (AmlStatus); AcpiOsPrintf (AE_PREFIX "Exception %s during execution\n", Exception); + if (Name) { AcpiOsPrintf (AE_PREFIX - "Evaluating Method or Node: [%4.4s]", + "Evaluating Method or Node: [%4.4s]\n", (char *) &Name); } + /* Be terse about loop timeouts */ + + if ((AmlStatus == AE_AML_LOOP_TIMEOUT) && AcpiGbl_AbortLoopOnTimeout) + { + AcpiOsPrintf (AE_PREFIX "Aborting loop after timeout\n"); + return (AE_OK); + } + AcpiOsPrintf ("\n" AE_PREFIX "AML Opcode [%s], Method Offset ~%5.5X\n", AcpiPsGetOpcodeName (Opcode), AmlOffset); diff --git a/source/tools/acpiexec/aeexec.c b/source/tools/acpiexec/aeexec.c index 2594f7d00ac9..d609ec1cce40 100644 --- a/source/tools/acpiexec/aeexec.c +++ b/source/tools/acpiexec/aeexec.c @@ -715,6 +715,7 @@ AeMiscellaneousTests ( ACPI_HANDLE Handle; #if (!ACPI_REDUCED_HARDWARE) + UINT32 Temp; UINT32 LockHandle1; UINT32 LockHandle2; ACPI_VENDOR_UUID Uuid = @@ -973,5 +974,17 @@ AeMiscellaneousTests ( Status = AcpiReleaseGlobalLock (LockHandle2); ACPI_CHECK_OK (AcpiReleaseGlobalLock, Status); + /* Test timer interfaces */ + + Status = AcpiGetTimerResolution (&Temp); + ACPI_CHECK_OK (AcpiGetTimerResolution, Status); + + Status = AcpiGetTimer (&Temp); + ACPI_CHECK_OK (AcpiGetTimer, Status); + + Status = AcpiGetTimerDuration (0x1000, 0x2000, &Temp); + ACPI_CHECK_OK (AcpiGetTimerDuration, Status); + + #endif /* !ACPI_REDUCED_HARDWARE */ } diff --git a/source/tools/acpiexec/aemain.c b/source/tools/acpiexec/aemain.c index 323e2bfa1700..e9908e848868 100644 --- a/source/tools/acpiexec/aemain.c +++ b/source/tools/acpiexec/aemain.c @@ -189,6 +189,7 @@ AeDoOptions ( UINT8 AcpiGbl_RegionFillValue = 0; BOOLEAN AcpiGbl_IgnoreErrors = FALSE; +BOOLEAN AcpiGbl_AbortLoopOnTimeout = FALSE; BOOLEAN AcpiGbl_DbOpt_NoRegionSupport = FALSE; UINT8 AcpiGbl_UseHwReducedFadt = FALSE; BOOLEAN AcpiGbl_DoInterfaceTests = FALSE; @@ -196,11 +197,9 @@ BOOLEAN AcpiGbl_LoadTestTables = FALSE; BOOLEAN AcpiGbl_AeLoadOnly = FALSE; static UINT8 AcpiGbl_ExecutionMode = AE_MODE_COMMAND_LOOP; static char BatchBuffer[AE_BUFFER_SIZE]; /* Batch command buffer */ -static char AeBuildDate[] = __DATE__; -static char AeBuildTime[] = __TIME__; #define ACPIEXEC_NAME "AML Execution/Debug Utility" -#define AE_SUPPORTED_OPTIONS "?b:d:e:f^ghi:lm^rv^:x:" +#define AE_SUPPORTED_OPTIONS "?b:d:e:f^ghlm^rt^v^:x:" /* Stubs for the disassembler */ @@ -270,9 +269,12 @@ usage ( ACPI_OPTION ("-fv <Value>", "Operation Region initialization fill value"); printf ("\n"); - ACPI_OPTION ("-i <Count>", "Maximum iterations for AML while loops"); ACPI_OPTION ("-l", "Load tables and namespace only"); ACPI_OPTION ("-r", "Use hardware-reduced FADT V5"); + ACPI_OPTION ("-te", "Exit loop on timeout instead of aborting method"); + ACPI_OPTION ("-to <Seconds>", "Set timeout period for AML while loops"); + printf ("\n"); + ACPI_OPTION ("-v", "Display version information"); ACPI_OPTION ("-vd", "Display build date and time"); ACPI_OPTION ("-vi", "Verbose initialization output"); @@ -461,20 +463,6 @@ AeDoOptions ( usage(); return (1); - case 'i': - - Temp = strtoul (AcpiGbl_Optarg, NULL, 0); - if (!Temp || (Temp > ACPI_UINT16_MAX)) - { - printf ("%s: Invalid max loops value\n", AcpiGbl_Optarg); - return (-1); - } - - AcpiGbl_MaxLoopIterations = (UINT16) Temp; - printf ("Max Loop Iterations is %u (0x%X)\n", - AcpiGbl_MaxLoopIterations, AcpiGbl_MaxLoopIterations); - break; - case 'l': AcpiGbl_AeLoadOnly = TRUE; @@ -503,6 +491,42 @@ AeDoOptions ( printf ("Using ACPI 5.0 Hardware Reduced Mode via version 5 FADT\n"); break; + case 't': + + switch (AcpiGbl_Optarg[0]) + { + case 'o': /* -to: Set loop timeout in seconds */ + + if (AcpiGetoptArgument (argc, argv)) + { + return (-1); + } + + Temp = strtoul (AcpiGbl_Optarg, NULL, 0); + if (!Temp || (Temp > ACPI_UINT16_MAX)) + { + printf ("%s: Invalid loop timeout value\n", + AcpiGbl_Optarg); + return (-1); + } + + AcpiGbl_MaxLoopIterations = (UINT16) Temp; + printf ("Automatic loop timeout after %u seconds\n", + AcpiGbl_MaxLoopIterations); + break; + + case 'e': + + AcpiGbl_AbortLoopOnTimeout = TRUE; + break; + + default: + + printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); + return (-1); + } + break; + case 'v': switch (AcpiGbl_Optarg[0]) @@ -514,7 +538,7 @@ AeDoOptions ( case 'd': - printf ("Build date/time: %s %s\n", AeBuildDate, AeBuildTime); + printf (ACPI_COMMON_BUILD_TIME); return (1); case 'i': @@ -598,6 +622,10 @@ main ( goto ErrorExit; } + /* Use a shorter timeout value for acpiexec */ + + AcpiGbl_MaxLoopIterations = 1; + /* Initialize the AML debugger */ Status = AcpiInitializeDebugger (); diff --git a/source/tools/acpihelp/ahmain.c b/source/tools/acpihelp/ahmain.c index cbc28573f265..ee7fd23e2f94 100644 --- a/source/tools/acpihelp/ahmain.c +++ b/source/tools/acpihelp/ahmain.c @@ -160,7 +160,7 @@ AhDisplayUsage ( void); #define AH_UTILITY_NAME "ACPI Help Utility" -#define AH_SUPPORTED_OPTIONS "adeghikmopstuv" +#define AH_SUPPORTED_OPTIONS "adeghikmopstuv^" #if defined ACPI_OPTION @@ -187,6 +187,7 @@ AhDisplayUsage ( ACPI_USAGE_HEADER ("acpihelp <options> [Name/Prefix | HexValue]"); ACPI_OPTION ("-h", "Display help"); ACPI_OPTION ("-v", "Display version information"); + ACPI_OPTION ("-vd", "Display build date and time"); ACPI_USAGE_TEXT ("\nAML Names and Encodings (ACPI Machine Language):\n"); ACPI_OPTION ("-a [Name/Prefix | *]", "Display both ASL operator and AML opcode name(s)"); @@ -310,7 +311,23 @@ main ( case 'v': /* -v: (Version): signon already emitted, just exit */ - return (0); + switch (AcpiGbl_Optarg[0]) + { + case '^': /* -v: (Version) */ + + return (1); + + case 'd': + + printf (ACPI_COMMON_BUILD_TIME); + return (1); + + default: + + printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); + return (-1); + } + break; case 'h': default: diff --git a/source/tools/acpinames/anmain.c b/source/tools/acpinames/anmain.c index 256acaa97df8..7fe629a9504b 100644 --- a/source/tools/acpinames/anmain.c +++ b/source/tools/acpinames/anmain.c @@ -179,7 +179,7 @@ BOOLEAN AcpiGbl_NsLoadOnly = FALSE; #define AN_UTILITY_NAME "ACPI Namespace Dump Utility" -#define AN_SUPPORTED_OPTIONS "?hlvx:" +#define AN_SUPPORTED_OPTIONS "?hlv^x:" /****************************************************************************** @@ -203,6 +203,7 @@ usage ( ACPI_OPTION ("-?", "Display this message"); ACPI_OPTION ("-l", "Load namespace only, no display"); ACPI_OPTION ("-v", "Display version information"); + ACPI_OPTION ("-vd", "Display build date and time"); ACPI_OPTION ("-x <DebugLevel>", "Debug output level"); } @@ -259,9 +260,25 @@ main ( AcpiGbl_NsLoadOnly = TRUE; break; - case 'v': /* -v: (Version): signon already emitted, just exit */ + case 'v': - return (0); + switch (AcpiGbl_Optarg[0]) + { + case '^': /* -v: (Version): signon already emitted, just exit */ + + exit (0); + + case 'd': + + printf (ACPI_COMMON_BUILD_TIME); + return (0); + + default: + + printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); + return (-1); + } + break; case 'x': diff --git a/source/tools/acpisrc/asmain.c b/source/tools/acpisrc/asmain.c index a14af868a451..0ab58a93724b 100644 --- a/source/tools/acpisrc/asmain.c +++ b/source/tools/acpisrc/asmain.c @@ -374,6 +374,7 @@ AsDisplayUsage ( ACPI_OPTION ("-s", "Generate source statistics only"); ACPI_OPTION ("-v", "Display version information"); ACPI_OPTION ("-vb", "Verbose mode"); + ACPI_OPTION ("-vd", "Display build date and time"); ACPI_OPTION ("-y", "Suppress file overwrite prompts"); } @@ -478,6 +479,11 @@ main ( Gbl_VerboseMode = TRUE; break; + case 'd': + + printf (ACPI_COMMON_BUILD_TIME); + return (0); + default: printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); diff --git a/source/tools/acpisrc/astable.c b/source/tools/acpisrc/astable.c index e0215e97a459..c4b023d81b13 100644 --- a/source/tools/acpisrc/astable.c +++ b/source/tools/acpisrc/astable.c @@ -663,12 +663,14 @@ ACPI_TYPED_IDENTIFIER_TABLE AcpiIdentifiers[] = { {"ACPI_TABLE_MSDM", SRC_TYPE_STRUCT}, {"ACPI_TABLE_NFIT", SRC_TYPE_STRUCT}, {"ACPI_TABLE_PCCT", SRC_TYPE_STRUCT}, + {"ACPI_TABLE_PDTT", SRC_TYPE_STRUCT}, {"ACPI_TABLE_PPTT", SRC_TYPE_STRUCT}, {"ACPI_TABLE_RSDP", SRC_TYPE_STRUCT}, {"ACPI_TABLE_RSDT", SRC_TYPE_STRUCT}, {"ACPI_TABLE_MCHI", SRC_TYPE_STRUCT}, {"ACPI_TABLE_S3PT", SRC_TYPE_STRUCT}, {"ACPI_TABLE_SBST", SRC_TYPE_STRUCT}, + {"ACPI_TABLE_SDEV", SRC_TYPE_STRUCT}, {"ACPI_TABLE_SLIC", SRC_TYPE_STRUCT}, {"ACPI_TABLE_SLIT", SRC_TYPE_STRUCT}, {"ACPI_TABLE_SPCR", SRC_TYPE_STRUCT}, @@ -806,13 +808,18 @@ ACPI_TYPED_IDENTIFIER_TABLE AcpiIdentifiers[] = { {"ACPI_PCCT_EXT_PCC_SLAVE", SRC_TYPE_STRUCT}, {"ACPI_PCCT_SHARED_MEMORY", SRC_TYPE_STRUCT}, {"ACPI_PCCT_SUBSPACE", SRC_TYPE_STRUCT}, - {"ACPI_PPTT_PROCESSOR", SRC_TYPE_STRUCT}, + {"ACPI_PDTT_CHANNEL", SRC_TYPE_STRUCT}, {"ACPI_PPTT_CACHE", SRC_TYPE_STRUCT}, {"ACPI_PPTT_ID", SRC_TYPE_STRUCT}, + {"ACPI_PPTT_PROCESSOR", SRC_TYPE_STRUCT}, {"ACPI_RSDP_COMMON", SRC_TYPE_STRUCT}, {"ACPI_RSDP_EXTENSION", SRC_TYPE_STRUCT}, {"ACPI_S3PT_RESUME", SRC_TYPE_STRUCT}, {"ACPI_S3PT_SUSPEND", SRC_TYPE_STRUCT}, + {"ACPI_SDEV_HEADER", SRC_TYPE_STRUCT}, + {"ACPI_SDEV_NAMESPACE", SRC_TYPE_STRUCT}, + {"ACPI_SDEV_PCIE", SRC_TYPE_STRUCT}, + {"ACPI_SDEV_PCIE_PATH", SRC_TYPE_STRUCT}, {"ACPI_SRAT_CPU_AFFINITY", SRC_TYPE_STRUCT}, {"ACPI_SRAT_HEADER", SRC_TYPE_STRUCT}, {"ACPI_SRAT_GIC_ITS_AFFINITY", SRC_TYPE_STRUCT}, diff --git a/source/tools/acpixtract/acpixtract.c b/source/tools/acpixtract/acpixtract.c index 32f40f52d073..ea78846da1ac 100644 --- a/source/tools/acpixtract/acpixtract.c +++ b/source/tools/acpixtract/acpixtract.c @@ -1,6 +1,7 @@ /****************************************************************************** * - * Module Name: acpixtract - convert ascii ACPI tables to binary + * Module Name: acpixtract - Top level functions to convert ascii/hex + * ACPI tables to the original binary tables * *****************************************************************************/ @@ -152,13 +153,6 @@ #include "acpixtract.h" -/* Local prototypes */ - -static BOOLEAN -AxIsFileAscii ( - FILE *Handle); - - /****************************************************************************** * * FUNCTION: AxExtractTables @@ -217,14 +211,14 @@ AxExtractTables ( /* Are there enough instances of the table to continue? */ AxNormalizeSignature (UpperSignature); - Instances = AxCountTableInstances (InputPathname, UpperSignature); + if (Instances < MinimumInstances) { printf ("Table [%s] was not found in %s\n", UpperSignature, InputPathname); fclose (InputFile); - return (-1); + return (0); /* Don't abort */ } if (Instances == 0) @@ -238,6 +232,28 @@ AxExtractTables ( while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile)) { + /* + * Check up front if we have a header line of the form: + * DSDT @ 0xdfffd0c0 (10999 bytes) + */ + if (AX_IS_TABLE_BLOCK_HEADER && + (State == AX_STATE_EXTRACT_DATA)) + { + /* End of previous table, start of new table */ + + if (ThisTableBytesWritten) + { + printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, + ThisTableBytesWritten, Gbl_OutputFilename); + } + else + { + Gbl_TableCount--; + } + + State = AX_STATE_FIND_HEADER; + } + switch (State) { case AX_STATE_FIND_HEADER: @@ -301,10 +317,15 @@ AxExtractTables ( case AX_STATE_EXTRACT_DATA: + if (!AxIsHexDataLine ()) + { + continue; /* Toss any lines that are not raw hex data */ + } + /* Empty line or non-data line terminates the data block */ - BytesConverted = AxProcessOneTextLine ( - OutputFile, ThisSignature, ThisTableBytesWritten); + BytesConverted = AxConvertAndWrite (OutputFile, ThisSignature, + ThisTableBytesWritten); switch (BytesConverted) { case 0: @@ -341,14 +362,8 @@ CleanupAndExit: { /* Received an input file EOF while extracting data */ - printf (AX_TABLE_INFO_FORMAT, - ThisSignature, ThisTableBytesWritten, Gbl_OutputFilename); - } - - if (Gbl_TableCount > 1) - { - printf ("\n%u binary ACPI tables extracted\n", - Gbl_TableCount); + printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, + ThisTableBytesWritten, Gbl_OutputFilename); } if (OutputFile) @@ -385,7 +400,7 @@ AxExtractToMultiAmlFile ( int Status = 0; unsigned int TotalBytesWritten = 0; unsigned int ThisTableBytesWritten = 0; - unsigned int BytesConverted; + unsigned int BytesConverted; char ThisSignature[4]; unsigned int State = AX_STATE_FIND_HEADER; @@ -421,6 +436,28 @@ AxExtractToMultiAmlFile ( while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile)) { + /* + * Check up front if we have a header line of the form: + * DSDT @ 0xdfffd0c0 (10999 bytes) + */ + if (AX_IS_TABLE_BLOCK_HEADER && + (State == AX_STATE_EXTRACT_DATA)) + { + /* End of previous table, start of new table */ + + if (ThisTableBytesWritten) + { + printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, + ThisTableBytesWritten, Gbl_OutputFilename); + } + else + { + Gbl_TableCount--; + } + + State = AX_STATE_FIND_HEADER; + } + switch (State) { case AX_STATE_FIND_HEADER: @@ -451,9 +488,14 @@ AxExtractToMultiAmlFile ( case AX_STATE_EXTRACT_DATA: + if (!AxIsHexDataLine ()) + { + continue; /* Toss any lines that are not raw hex data */ + } + /* Empty line or non-data line terminates the data block */ - BytesConverted = AxProcessOneTextLine ( + BytesConverted = AxConvertAndWrite ( OutputFile, ThisSignature, ThisTableBytesWritten); switch (BytesConverted) { @@ -487,8 +529,8 @@ CleanupAndExit: { /* Received an input file EOF or error while writing data */ - printf (AX_TABLE_INFO_FORMAT, - ThisSignature, ThisTableBytesWritten, Gbl_OutputFilename); + printf (AX_TABLE_INFO_FORMAT, ThisSignature, ThisTableBytesWritten, + ThisTableBytesWritten, Gbl_OutputFilename); } printf ("\n%u binary ACPI tables extracted and written to %s (%u bytes)\n", @@ -502,7 +544,7 @@ CleanupAndExit: /****************************************************************************** * - * FUNCTION: AxListTables + * FUNCTION: AxListAllTables * * PARAMETERS: InputPathname - Filename for acpidump file * @@ -514,13 +556,13 @@ CleanupAndExit: ******************************************************************************/ int -AxListTables ( +AxListAllTables ( char *InputPathname) { FILE *InputFile; - size_t HeaderSize; unsigned char Header[48]; - ACPI_TABLE_HEADER *TableHeader = (ACPI_TABLE_HEADER *) (void *) Header; + UINT32 ByteCount = 0; + unsigned int State = AX_STATE_FIND_HEADER; /* Open input in text mode, output is in binary mode */ @@ -538,133 +580,74 @@ AxListTables ( return (-1); } - /* Dump the headers for all tables found in the input file */ + /* Info header */ + + printf ("\n Signature Length Version Oem Oem " + "Oem Compiler Compiler\n"); + printf ( " Id TableId " + "RevisionId Name Revision\n"); + printf ( " _________ __________ ____ ________ __________ " + "__________ _______ __________\n\n"); - printf ("\nSignature Length Revision OemId OemTableId" - " OemRevision CompilerId CompilerRevision\n\n"); + /* Dump the headers for all tables found in the input file */ while (fgets (Gbl_LineBuffer, AX_LINE_BUFFER_SIZE, InputFile)) { - /* Ignore empty lines and lines that start with a space */ + /* Ignore empty lines */ - if (AxIsEmptyLine (Gbl_LineBuffer) || - (Gbl_LineBuffer[0] == ' ')) + if (AxIsEmptyLine (Gbl_LineBuffer)) { continue; } - /* Get the 36 byte header and display the fields */ - - HeaderSize = AxGetTableHeader (InputFile, Header); - if (HeaderSize < 16) + /* + * Check up front if we have a header line of the form: + * DSDT @ 0xdfffd0c0 (10999 bytes) + */ + if (AX_IS_TABLE_BLOCK_HEADER && + (State == AX_STATE_EXTRACT_DATA)) { - continue; + State = AX_STATE_FIND_HEADER; } - /* RSDP has an oddball signature and header */ - - if (!strncmp (TableHeader->Signature, "RSD PTR ", 8)) + switch (State) { - AxCheckAscii ((char *) &Header[9], 6); - printf ("%7.4s \"%6.6s\"\n", "RSDP", - &Header[9]); - Gbl_TableCount++; - continue; - } + case AX_STATE_FIND_HEADER: - /* Minimum size for table with standard header */ + ByteCount = 0; + if (!AxIsDataBlockHeader ()) + { + continue; + } - if (HeaderSize < sizeof (ACPI_TABLE_HEADER)) - { + State = AX_STATE_EXTRACT_DATA; continue; - } - if (!AcpiUtValidNameseg (TableHeader->Signature)) - { - continue; - } + case AX_STATE_EXTRACT_DATA: - /* Signature and Table length */ + /* Ignore any lines that don't look like a data line */ - Gbl_TableCount++; - printf ("%7.4s 0x%8.8X", TableHeader->Signature, - TableHeader->Length); + if (!AxIsHexDataLine ()) + { + continue; /* Toss any lines that are not raw hex data */ + } - /* FACS has only signature and length */ + /* Convert header to hex and display it */ - if (ACPI_COMPARE_NAME (TableHeader->Signature, "FACS")) - { - printf ("\n"); + ByteCount += AxConvertToBinary (Gbl_LineBuffer, &Header[ByteCount]); + if (ByteCount >= sizeof (ACPI_TABLE_HEADER)) + { + AxDumpTableHeader (Header); + State = AX_STATE_FIND_HEADER; + } continue; - } - - /* OEM IDs and Compiler IDs */ - - AxCheckAscii (TableHeader->OemId, 6); - AxCheckAscii (TableHeader->OemTableId, 8); - AxCheckAscii (TableHeader->AslCompilerId, 4); - printf ( - " 0x%2.2X \"%6.6s\" \"%8.8s\" 0x%8.8X" - " \"%4.4s\" 0x%8.8X\n", - TableHeader->Revision, TableHeader->OemId, - TableHeader->OemTableId, TableHeader->OemRevision, - TableHeader->AslCompilerId, TableHeader->AslCompilerRevision); + default: + break; + } } printf ("\nFound %u ACPI tables in %s\n", Gbl_TableCount, InputPathname); fclose (InputFile); return (0); } - - -/******************************************************************************* - * - * FUNCTION: AxIsFileAscii - * - * PARAMETERS: Handle - To open input file - * - * RETURN: TRUE if file is entirely ASCII and printable - * - * DESCRIPTION: Verify that the input file is entirely ASCII. - * - ******************************************************************************/ - -static BOOLEAN -AxIsFileAscii ( - FILE *Handle) -{ - UINT8 Byte; - - - /* Read the entire file */ - - while (fread (&Byte, 1, 1, Handle) == 1) - { - /* Check for an ASCII character */ - - if (!ACPI_IS_ASCII (Byte)) - { - goto ErrorExit; - } - - /* Ensure character is either printable or a "space" char */ - - else if (!isprint (Byte) && !isspace (Byte)) - { - goto ErrorExit; - } - } - - /* File is OK (100% ASCII) */ - - fseek (Handle, 0, SEEK_SET); - return (TRUE); - -ErrorExit: - - printf ("File is binary (contains non-text or non-ascii characters)\n"); - fseek (Handle, 0, SEEK_SET); - return (FALSE); - -} diff --git a/source/tools/acpixtract/acpixtract.h b/source/tools/acpixtract/acpixtract.h index abe2a1903c1c..c998f6b72ba8 100644 --- a/source/tools/acpixtract/acpixtract.h +++ b/source/tools/acpixtract/acpixtract.h @@ -180,9 +180,9 @@ #define AX_REQUIRED_TABLE 1 #define AX_UTILITY_NAME "ACPI Binary Table Extraction Utility" -#define AX_SUPPORTED_OPTIONS "ahlms:v" +#define AX_SUPPORTED_OPTIONS "ahlms:v^" #define AX_MULTI_TABLE_FILENAME "amltables.dat" -#define AX_TABLE_INFO_FORMAT "Acpi table [%4.4s] - %7u bytes written to %s\n" +#define AX_TABLE_INFO_FORMAT " %4.4s - %7u bytes written (0x%8.8X) - %s\n" /* Extraction states */ @@ -193,6 +193,8 @@ #define AX_LINE_BUFFER_SIZE 256 #define AX_MIN_BLOCK_HEADER_LENGTH 6 /* strlen ("DSDT @") */ +#define AX_IS_TABLE_BLOCK_HEADER strstr (Gbl_LineBuffer, " @ ") +#define AX_END_OF_HEX_DATA 55 typedef struct AxTableInfo @@ -210,12 +212,12 @@ typedef struct AxTableInfo ACPI_GLOBAL (char, Gbl_LineBuffer[AX_LINE_BUFFER_SIZE]); ACPI_GLOBAL (char, Gbl_HeaderBuffer[AX_LINE_BUFFER_SIZE]); ACPI_GLOBAL (char, Gbl_InstanceBuffer[AX_LINE_BUFFER_SIZE]); - ACPI_GLOBAL (AX_TABLE_INFO, *Gbl_TableListHead); ACPI_GLOBAL (char, Gbl_OutputFilename[32]); ACPI_GLOBAL (unsigned char, Gbl_BinaryData[16]); ACPI_GLOBAL (unsigned int, Gbl_TableCount); + /* * acpixtract.c */ @@ -230,18 +232,13 @@ AxExtractToMultiAmlFile ( char *InputPathname); int -AxListTables ( +AxListAllTables ( char *InputPathname); /* * axutils.c */ -size_t -AxGetTableHeader ( - FILE *InputFile, - unsigned char *OutputData); - unsigned int AxCountTableInstances ( char *InputPathname, @@ -261,21 +258,33 @@ AxCheckAscii ( char *Name, int Count); -int +BOOLEAN +AxIsFileAscii ( + FILE *Handle); + +BOOLEAN +AxIsHexDataLine ( + void); + +BOOLEAN AxIsEmptyLine ( char *Buffer); -int +BOOLEAN AxIsDataBlockHeader ( void); long -AxProcessOneTextLine ( +AxConvertAndWrite ( FILE *OutputFile, char *ThisSignature, unsigned int ThisTableBytesWritten); size_t -AxConvertLine ( +AxConvertToBinary ( char *InputLine, unsigned char *OutputData); + +void +AxDumpTableHeader ( + unsigned char *Header); diff --git a/source/tools/acpixtract/axmain.c b/source/tools/acpixtract/axmain.c index f5aa710113fa..e0a274cbcdc5 100644 --- a/source/tools/acpixtract/axmain.c +++ b/source/tools/acpixtract/axmain.c @@ -180,6 +180,7 @@ DisplayUsage ( ACPI_OPTION ("-m", "Extract multiple DSDT/SSDTs to a single file"); ACPI_OPTION ("-s <signature>", "Extract all tables with <signature>"); ACPI_OPTION ("-v", "Display version information"); + ACPI_OPTION ("-vd", "Display build date and time"); ACPI_USAGE_TEXT ("\nExtract binary ACPI tables from text acpidump output\n"); ACPI_USAGE_TEXT ("Default invocation extracts the DSDT and all SSDTs\n"); @@ -243,9 +244,25 @@ main ( AxAction = AX_EXTRACT_SIGNATURE; /* Extract only tables with this sig */ break; - case 'v': /* -v: (Version): signon already emitted, just exit */ + case 'v': - return (0); + switch (AcpiGbl_Optarg[0]) + { + case '^': /* -v: (Version): signon already emitted, just exit */ + + exit (0); + + case 'd': + + printf (ACPI_COMMON_BUILD_TIME); + return (0); + + default: + + printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); + return (-1); + } + break; case 'h': default: @@ -279,7 +296,7 @@ main ( case AX_LIST_ALL: - Status = AxListTables (Filename); + Status = AxListAllTables (Filename); break; case AX_EXTRACT_SIGNATURE: diff --git a/source/tools/acpixtract/axutils.c b/source/tools/acpixtract/axutils.c index 00882c6fed91..6f887668426e 100644 --- a/source/tools/acpixtract/axutils.c +++ b/source/tools/acpixtract/axutils.c @@ -184,6 +184,70 @@ AxCheckAscii ( } +/******************************************************************************* + * + * FUNCTION: AxIsFileAscii + * + * PARAMETERS: Handle - To open input file + * + * RETURN: TRUE if file is entirely ASCII and printable + * + * DESCRIPTION: Verify that the input file is entirely ASCII. + * + ******************************************************************************/ + +BOOLEAN +AxIsFileAscii ( + FILE *Handle) +{ + UINT8 Byte; + + + /* Read the entire file */ + + fseek (Handle, 0, SEEK_SET); + while (fread (&Byte, 1, 1, Handle) == 1) + { + /* + * Ignore null characters. Some acpidump-type utilities insert + * a few of these, probably a bug in the utility. As long as these + * characters are in lines that are tossed (non-data), they + * won't cause a problem. + */ + if (!Byte) + { + continue; + } + + /* Check for an ASCII character */ + + if (!ACPI_IS_ASCII (Byte)) + { + goto ErrorExit; + } + + /* Ensure character is either printable or a "space" char */ + + else if (!isprint (Byte) && !isspace (Byte)) + { + goto ErrorExit; + } + } + + /* File is OK (100% ASCII) */ + + fseek (Handle, 0, SEEK_SET); + return (TRUE); + +ErrorExit: + + printf ("File appears to be binary " + "(contains non-text or non-ascii characters)\n"); + fseek (Handle, 0, SEEK_SET); + return (FALSE); +} + + /****************************************************************************** * * FUNCTION: AxIsEmptyLine @@ -196,7 +260,7 @@ AxCheckAscii ( * ******************************************************************************/ -int +BOOLEAN AxIsEmptyLine ( char *Buffer) { @@ -219,6 +283,96 @@ AxIsEmptyLine ( } +/****************************************************************************** + * + * FUNCTION: AxIsHexDataLine + * + * PARAMETERS: None + * + * RETURN: Status. 1 if the table header is valid, 0 otherwise. + * + * DESCRIPTION: Check for a valid line of hex data of the form: + * + * 00a0: 0c 00 00 00 03 00 00 00 43 48 41 35 0c 00 00 00 ........CHA5.... + * + ******************************************************************************/ + +BOOLEAN +AxIsHexDataLine ( + void) +{ + + if (AxIsEmptyLine (Gbl_LineBuffer) || + (Gbl_LineBuffer[0] != ' ')) + { + return (FALSE); + } + + if (!strstr (Gbl_LineBuffer, ": ")) + { + /* Not valid data line */ + + return (FALSE); + } + + return (TRUE); +} + + +/****************************************************************************** + * + * FUNCTION: AxIsDataBlockHeader + * + * PARAMETERS: None + * + * RETURN: Status. 1 if the table header is valid, 0 otherwise. + * + * DESCRIPTION: Check if the ACPI table identifier in the input acpidump text + * file is valid (of the form: <sig> @ <addr>). + * + ******************************************************************************/ + +BOOLEAN +AxIsDataBlockHeader ( + void) +{ + + /* Ignore lines that are too short to be header lines */ + + if (strlen (Gbl_LineBuffer) < AX_MIN_BLOCK_HEADER_LENGTH) + { + return (FALSE); + } + + /* Ignore empty lines and lines that start with a space */ + + if (AxIsEmptyLine (Gbl_LineBuffer) || + (Gbl_LineBuffer[0] == ' ')) + { + return (FALSE); + } + + /* + * Ignore lines that are not headers of the form <sig> @ <addr>. + * Basically, just look for the '@' symbol, surrounded by spaces. + * + * Examples of headers that must be supported: + * + * DSDT @ 0x737e4000 + * XSDT @ 0x737f2fff + * RSD PTR @ 0xf6cd0 + * SSDT @ (nil) + */ + if (!AX_IS_TABLE_BLOCK_HEADER) + { + return (FALSE); + } + + AxNormalizeSignature (Gbl_LineBuffer); + return (TRUE); +} + + /******************************************************************************* * * FUNCTION: AxNormalizeSignature @@ -245,7 +399,7 @@ AxNormalizeSignature ( /****************************************************************************** * - * FUNCTION: AxConvertLine + * FUNCTION: AxConvertToBinary * * PARAMETERS: InputLine - One line from the input acpidump file * OutputData - Where the converted data is returned @@ -254,27 +408,30 @@ AxNormalizeSignature ( * * DESCRIPTION: Convert one line of ascii text binary (up to 16 bytes) * + * NOTE: Assumes the input data line has been validated to be of the form: + * + * 0010: 48 53 57 55 4c 54 2d 52 01 00 00 00 49 4e 54 4c HSWULT-R....INTL + * ******************************************************************************/ size_t -AxConvertLine ( +AxConvertToBinary ( char *InputLine, unsigned char *OutputData) { - char *End; int BytesConverted; int Converted[16]; int i; - /* Terminate the input line at the end of the actual data (for sscanf) */ - - End = strstr (InputLine + 2, " "); - if (!End) - { - return (0); /* Don't understand the format */ - } - *End = 0; + /* + * Terminate input line immediately after the data. Otherwise, the + * second line below will not scan correctly. + * + * 00b0: 03 00 00 00 43 48 41 36 0c 00 00 00 03 00 00 00 ....CHA6........ + * 00c0: 43 48 41 37 CHA7 + */ + InputLine [AX_END_OF_HEX_DATA] = 0; /* * Convert one line of table data, of the form: @@ -284,7 +441,7 @@ AxConvertLine ( * 02C0: 5F 53 42 5F 4C 4E 4B 44 00 12 13 04 0C FF FF 08 _SB_LNKD........ */ BytesConverted = sscanf (InputLine, - "%*s %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x", + "%*s %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X", &Converted[0], &Converted[1], &Converted[2], &Converted[3], &Converted[4], &Converted[5], &Converted[6], &Converted[7], &Converted[8], &Converted[9], &Converted[10], &Converted[11], @@ -303,52 +460,6 @@ AxConvertLine ( /****************************************************************************** * - * FUNCTION: AxGetTableHeader - * - * PARAMETERS: InputFile - Handle for the input acpidump file - * OutputData - Where the table header is returned - * - * RETURN: The actual number of bytes converted - * - * DESCRIPTION: Extract and convert an ACPI table header - * - ******************************************************************************/ - -size_t -AxGetTableHeader ( - FILE *InputFile, - unsigned char *OutputData) -{ - size_t BytesConverted; - size_t TotalConverted = 0; - int i; - - - /* Get the full 36 byte ACPI table header, requires 3 input text lines */ - - for (i = 0; i < 3; i++) - { - if (!fgets (Gbl_HeaderBuffer, AX_LINE_BUFFER_SIZE, InputFile)) - { - return (TotalConverted); - } - - BytesConverted = AxConvertLine (Gbl_HeaderBuffer, OutputData); - TotalConverted += BytesConverted; - OutputData += 16; - - if (BytesConverted != 16) - { - return (TotalConverted); - } - } - - return (TotalConverted); -} - - -/****************************************************************************** - * * FUNCTION: AxCountTableInstances * * PARAMETERS: InputPathname - Filename for acpidump file @@ -467,105 +578,154 @@ AxGetNextInstance ( /****************************************************************************** * - * FUNCTION: AxIsDataBlockHeader + * FUNCTION: AxConvertAndWrite * - * PARAMETERS: None + * PARAMETERS: OutputFile - Where to write the binary data + * ThisSignature - Signature of current ACPI table + * ThisTableBytesWritten - Total count of data written * - * RETURN: Status. 1 if the table header is valid, 0 otherwise. + * RETURN: Length of the converted line * - * DESCRIPTION: Check if the ACPI table identifier in the input acpidump text - * file is valid (of the form: <sig> @ <addr>). + * DESCRIPTION: Convert one line of input hex ascii text to binary, and write + * the binary data to the table output file. + * + * NOTE: Assumes the input data line has been validated to be of the form: + * + * 0010: 48 53 57 55 4c 54 2d 52 01 00 00 00 49 4e 54 4c HSWULT-R....INTL * ******************************************************************************/ -int -AxIsDataBlockHeader ( - void) +long +AxConvertAndWrite ( + FILE *OutputFile, + char *ThisSignature, + unsigned int ThisTableBytesWritten) { + size_t BytesWritten; + size_t BytesConverted; - /* Ignore lines that are too short to be header lines */ - if (strlen (Gbl_LineBuffer) < AX_MIN_BLOCK_HEADER_LENGTH) - { - return (0); - } + /* Convert one line of ascii hex data to binary */ - /* Ignore empty lines and lines that start with a space */ + BytesConverted = AxConvertToBinary (Gbl_LineBuffer, Gbl_BinaryData); - if (AxIsEmptyLine (Gbl_LineBuffer) || - (Gbl_LineBuffer[0] == ' ')) + /* Write the binary data */ + + if (!BytesConverted) { return (0); } - /* - * Ignore lines that are not headers of the form <sig> @ <addr>. - * Basically, just look for the '@' symbol, surrounded by spaces. - * - * Examples of headers that must be supported: - * - * DSDT @ 0x737e4000 - * XSDT @ 0x737f2fff - * RSD PTR @ 0xf6cd0 - * SSDT @ (nil) - */ - if (!strstr (Gbl_LineBuffer, " @ ")) + BytesWritten = fwrite (Gbl_BinaryData, 1, BytesConverted, OutputFile); + if (BytesWritten != BytesConverted) { - return (0); + printf ("Error while writing file %s\n", Gbl_OutputFilename); + return (-1); } - AxNormalizeSignature (Gbl_LineBuffer); - return (1); + return (BytesWritten); } /****************************************************************************** * - * FUNCTION: AxProcessOneTextLine + * FUNCTION: AxDumpTableHeader * - * PARAMETERS: OutputFile - Where to write the binary data - * ThisSignature - Signature of current ACPI table - * ThisTableBytesWritten - Total count of data written + * PARAMETERS: Header - A binary ACPI table header * - * RETURN: Length of the converted line + * RETURN: None * - * DESCRIPTION: Convert one line of input hex ascii text to binary, and write - * the binary data to the table output file. + * DESCRIPTION: Display the contents of a standard ACPI table header * ******************************************************************************/ -long -AxProcessOneTextLine ( - FILE *OutputFile, - char *ThisSignature, - unsigned int ThisTableBytesWritten) +void +AxDumpTableHeader ( + unsigned char *Header) { - size_t BytesWritten; - size_t BytesConverted; + ACPI_TABLE_HEADER *TableHeader = (ACPI_TABLE_HEADER *) (void *) Header; + ACPI_TABLE_RSDP *Rsdp = (ACPI_TABLE_RSDP *) (void *) Header; + ACPI_TABLE_FACS *Facs = (ACPI_TABLE_FACS *) (void *) Header; - /* Check for the end of this table data block */ + /* RSDP has an oddball signature and header */ - if (AxIsEmptyLine (Gbl_LineBuffer) || - (Gbl_LineBuffer[0] != ' ')) + if (!strncmp (TableHeader->Signature, "RSD PTR ", 8)) { - printf (AX_TABLE_INFO_FORMAT, - ThisSignature, ThisTableBytesWritten, Gbl_OutputFilename); - return (0); + AxCheckAscii ((char *) &Header[9], 6); + + Gbl_TableCount++; + printf (" %.2u) %5.4s 0x%8.8X 0x%2.2X \"%6.6s\"\n", + Gbl_TableCount, "RSDP", Rsdp->Length, Rsdp->Revision, Rsdp->OemId); + return; } - /* Convert one line of ascii hex data to binary */ + if (!AcpiUtValidNameseg (TableHeader->Signature)) + { + return; + } - BytesConverted = AxConvertLine (Gbl_LineBuffer, Gbl_BinaryData); + /* Signature and Table length */ - /* Write the binary data */ + Gbl_TableCount++; + printf (" %.2u) %5.4s 0x%8.8X", Gbl_TableCount, TableHeader->Signature, + TableHeader->Length); - BytesWritten = fwrite (Gbl_BinaryData, 1, BytesConverted, OutputFile); - if (BytesWritten != BytesConverted) + /* FACS has only signature and length */ + + if (ACPI_COMPARE_NAME (TableHeader->Signature, "FACS")) { - printf ("Error while writing file %s\n", Gbl_OutputFilename); - return (-1); + printf (" 0x%2.2X\n", Facs->Version); + return; } - return (BytesWritten); + /* OEM IDs and Compiler IDs */ + + AxCheckAscii (TableHeader->OemId, 6); + AxCheckAscii (TableHeader->OemTableId, 8); + AxCheckAscii (TableHeader->AslCompilerId, 4); + + printf ( + " 0x%2.2X \"%6.6s\" \"%8.8s\" 0x%8.8X" + " \"%4.4s\" 0x%8.8X\n", + TableHeader->Revision, TableHeader->OemId, + TableHeader->OemTableId, TableHeader->OemRevision, + TableHeader->AslCompilerId, TableHeader->AslCompilerRevision); +} + + +#ifdef _AX_FUTURE_ENHANCEMENTS + +/* Possible enhancement to validate table lengths */ + +void +AxCheckTableLengths ( + UINT32 ByteCount, + UINT32 AmlByteCount) +{ + + if (AmlByteCount == 0) + { + return; + } + + if (ByteCount == 0) + { + return; + } + + if ((ByteCount < sizeof (ACPI_TABLE_HEADER)) && + (ByteCount >= ACPI_NAME_SIZE)) + { + printf (" : (Table too short for an ACPI table)"); + } + + else if (ByteCount != AmlByteCount) + { + printf (" : (Hex data length mismatch with AML length 0x%X)", + AmlByteCount); + } + + printf ("\n"); } +#endif |