Message ID | 20221028170256.675875-2-colin.i.king@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | update to ACPCIA 20221020 | expand |
On 10/29/22 01:02, Colin Ian King wrote: > Changes in this release of ACPICA are detailed on the ACPICA developer > mailing list for ACPICA 20221020 > > Signed-off-by: Colin Ian King <colin.i.king@gmail.com> > --- > src/acpica/source/common/acfileio.c | 131 +++++-- > src/acpica/source/common/adisasm.c | 4 +- > src/acpica/source/common/ahtable.c | 2 + > src/acpica/source/common/ahuuids.c | 3 + > src/acpica/source/common/dmtable.c | 116 +++--- > src/acpica/source/common/dmtables.c | 2 +- > src/acpica/source/common/dmtbdump.c | 4 +- > src/acpica/source/common/dmtbdump1.c | 205 ++++++++++- > src/acpica/source/common/dmtbdump2.c | 100 +++++- > src/acpica/source/common/dmtbinfo1.c | 110 ++++++ > src/acpica/source/common/dmtbinfo2.c | 33 +- > src/acpica/source/common/dmtbinfo3.c | 17 + > src/acpica/source/compiler/aslcodegen.c | 75 +++- > src/acpica/source/compiler/aslcompile.c | 12 +- > src/acpica/source/compiler/aslerror.c | 1 - > src/acpica/source/compiler/aslhelp.c | 1 + > src/acpica/source/compiler/asloptions.c | 30 +- > src/acpica/source/compiler/aslpredef.c | 2 +- > src/acpica/source/compiler/aslstartup.c | 2 +- > src/acpica/source/compiler/dtcompile.c | 42 +++ > src/acpica/source/compiler/dtcompiler.h | 8 +- > src/acpica/source/compiler/dtio.c | 2 +- > src/acpica/source/compiler/dttable1.c | 128 ++++++- > src/acpica/source/compiler/dttable2.c | 169 +++++++-- > src/acpica/source/compiler/dttemplate.h | 63 +++- > src/acpica/source/compiler/dtutils.c | 3 +- > src/acpica/source/components/events/evevent.c | 11 +- > .../source/components/events/evregion.c | 8 + > .../source/components/executer/exconfig.c | 2 +- > .../source/components/executer/exfield.c | 6 +- > .../source/components/executer/exserial.c | 6 + > .../source/components/executer/exsystem.c | 12 - > .../source/components/hardware/hwsleep.c | 10 + > src/acpica/source/components/tables/tbdata.c | 2 +- > src/acpica/source/components/tables/tbfadt.c | 2 +- > src/acpica/source/components/tables/tbprint.c | 90 +---- > src/acpica/source/components/tables/tbutils.c | 2 +- > .../source/components/tables/tbxfroot.c | 32 +- > .../source/components/utilities/utcksum.c | 335 ++++++++++++++++++ > .../source/components/utilities/utglobal.c | 1 + > .../source/components/utilities/utstring.c | 10 +- > src/acpica/source/include/acconfig.h | 2 + > src/acpica/source/include/acdisasm.h | 19 + > src/acpica/source/include/acglobal.h | 1 + > src/acpica/source/include/acpixf.h | 2 +- > src/acpica/source/include/actables.h | 10 - > src/acpica/source/include/actbinfo.h | 10 + > src/acpica/source/include/actbl1.h | 179 +++++++++- > src/acpica/source/include/actbl2.h | 163 ++++++++- > src/acpica/source/include/actypes.h | 9 +- > src/acpica/source/include/acutils.h | 25 ++ > src/acpica/source/include/acuuid.h | 3 +- > src/libfwtsacpica/Makefile.am | 1 + > src/libfwtsacpica/fwts_acpica.c | 8 +- > 54 files changed, 1924 insertions(+), 302 deletions(-) > create mode 100644 src/acpica/source/components/utilities/utcksum.c > > diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c > index 7c624f5d..77f7337a 100644 > --- a/src/acpica/source/common/acfileio.c > +++ b/src/acpica/source/common/acfileio.c > @@ -387,16 +387,36 @@ AcGetOneTableFromFile ( > ACPI_TABLE_HEADER TableHeader; > ACPI_TABLE_HEADER *Table; > INT32 Count; > - long TableOffset; > - > + UINT32 TableLength; > + UINT32 HeaderLength; > + long TableOffset = 0; > > *ReturnTable = NULL; > > /* Get the table header to examine signature and length */ > + /* > + * Special handling for the CDAT table (both the Length field > + * and the Checksum field are not in the standard positions). > + * (The table header is non-standard). > + */ > + if (AcpiGbl_CDAT) > + { > + HeaderLength = sizeof (ACPI_TABLE_CDAT); > + } > + else > + { > + HeaderLength = sizeof (ACPI_TABLE_HEADER); > + } > + > + Status = AcValidateTableHeader (File, TableOffset); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > > TableOffset = ftell (File); > - Count = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File); > - if (Count != sizeof (ACPI_TABLE_HEADER)) > + Count = fread (&TableHeader, 1, HeaderLength, File); > + if (Count != (INT32) HeaderLength) > { > return (AE_CTRL_TERMINATE); > } > @@ -405,12 +425,6 @@ AcGetOneTableFromFile ( > { > /* Validate the table signature/header (limited ASCII chars) */ > > - Status = AcValidateTableHeader (File, TableOffset); > - if (ACPI_FAILURE (Status)) > - { > - return (Status); > - } > - > /* > * Table must be an AML table (DSDT/SSDT). > * Used for iASL -e option only. > @@ -425,9 +439,22 @@ AcGetOneTableFromFile ( > } > } > > + /* > + * Special handling for the CDAT table (both the Length field > + * and the Checksum field are not in the standard positions). > + */ > + if (AcpiGbl_CDAT) > + { > + TableLength = ACPI_CAST_PTR (ACPI_TABLE_CDAT, &TableHeader)->Length; > + } > + else > + { > + TableLength = TableHeader.Length; > + } > + > /* Allocate a buffer for the entire table */ > > - Table = AcpiOsAllocate ((ACPI_SIZE) TableHeader.Length); > + Table = AcpiOsAllocate ((ACPI_SIZE) TableLength); > if (!Table) > { > return (AE_NO_MEMORY); > @@ -436,22 +463,31 @@ AcGetOneTableFromFile ( > /* Read the entire ACPI table, including header */ > > fseek (File, TableOffset, SEEK_SET); > - > - Count = fread (Table, 1, TableHeader.Length, File); > + Count = fread (Table, 1, TableLength, File); > > /* > * Checks for data table headers happen later in the execution. Only verify > * for Aml tables at this point in the code. > */ > - if (GetOnlyAmlTables && Count != (INT32) TableHeader.Length) > + if (GetOnlyAmlTables && Count != (INT32) TableLength) > { > Status = AE_ERROR; > goto ErrorExit; > } > > - /* Validate the checksum (just issue a warning) */ > + /* > + * Validate the checksum (just issue a warning if incorrect). > + * Note: CDAT is special cased here because the table does > + * not have the checksum field in the standard position. > + */ > + if (AcpiGbl_CDAT) > + { > + Status = AcpiUtVerifyCdatChecksum ((ACPI_TABLE_CDAT *) Table, TableLength); > + } else > + { > + Status = AcpiUtVerifyChecksum (Table, TableLength); > + } > > - Status = AcpiTbVerifyChecksum (Table, TableHeader.Length); > if (ACPI_FAILURE (Status)) > { > Status = AcCheckTextModeCorruption (Table); > @@ -540,6 +576,8 @@ AcValidateTableHeader ( > long TableOffset) > { > ACPI_TABLE_HEADER TableHeader; > + ACPI_TABLE_CDAT *CdatTableHeader = ACPI_CAST_PTR (ACPI_TABLE_CDAT, &TableHeader); > + UINT32 HeaderLength; > ACPI_SIZE Actual; > long OriginalOffset; > UINT32 FileSize; > @@ -548,6 +586,16 @@ AcValidateTableHeader ( > > ACPI_FUNCTION_TRACE (AcValidateTableHeader); > > + /* Determine the type of table header */ > + > + if (AcpiGbl_CDAT) > + { > + HeaderLength = sizeof (ACPI_TABLE_CDAT); > + } > + else > + { > + HeaderLength = sizeof (ACPI_TABLE_HEADER); > + } > > /* Read a potential table header */ > > @@ -556,41 +604,76 @@ AcValidateTableHeader ( > { > fprintf (stderr, "SEEK error\n"); > } > - Actual = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File); > + Actual = fread (&TableHeader, 1, HeaderLength, File); > if (fseek (File, OriginalOffset, SEEK_SET)) > { > fprintf (stderr, "SEEK error\n"); > } > > - if (Actual < sizeof (ACPI_TABLE_HEADER)) > + if (Actual < HeaderLength) > { > fprintf (stderr, > "Could not read entire table header: Actual %u, Requested %u\n", > - (UINT32) Actual, (UINT32) sizeof (ACPI_TABLE_HEADER)); > + (UINT32) Actual, HeaderLength); > return (AE_ERROR); > } > > /* Validate the signature (limited ASCII chars) */ > > - if (!AcpiUtValidNameseg (TableHeader.Signature)) > + if (!AcpiGbl_CDAT && !AcpiUtValidNameseg (TableHeader.Signature)) > { > + /* > + * The "-ds cdat" option was not used, and the signature is not valid. > + * > + * For CDAT we are assuming that there should be at least one non-ASCII > + * byte in the (normally) 4-character Signature field (at least the > + * high-order byte should be zero). Otherwise, this is OK. > + */ > + fprintf (stderr, > + "\nTable appears to be a CDAT table, which has no signature.\n" > + "If this is in fact a CDAT table, use the -ds option on the\n" > + "command line to specify the table type (signature):\n" > + "\"iasl -d -ds CDAT <file>\" or \"iasl -ds CDAT -T CDAT\"\n\n"); > + > return (AE_BAD_SIGNATURE); > } > > /* Validate table length against bytes remaining in the file */ > > FileSize = CmGetFileSize (File); > - if (TableHeader.Length > (UINT32) (FileSize - TableOffset)) > + if (!AcpiGbl_CDAT) > + { > + /* Standard ACPI table header */ > + > + if (TableHeader.Length > (UINT32) (FileSize - TableOffset)) > + { > + fprintf (stderr, "Table [%4.4s] is too long for file - " > + "needs: 0x%.2X, remaining in file: 0x%.2X\n", > + TableHeader.Signature, TableHeader.Length, > + (UINT32) (FileSize - TableOffset)); > + return (AE_BAD_HEADER); > + } > + } > + else if (CdatTableHeader->Length > (UINT32) (FileSize - TableOffset)) > { > - fprintf (stderr, "Table [%4.4s] is too long for file - " > + /* Special header for CDAT table */ > + > + fprintf (stderr, "Table [CDAT] is too long for file - " > "needs: 0x%.2X, remaining in file: 0x%.2X\n", > - TableHeader.Signature, TableHeader.Length, > + CdatTableHeader->Length, > (UINT32) (FileSize - TableOffset)); > return (AE_BAD_HEADER); > } > > + /* For CDAT table, there are no ASCII fields in the header, we are done */ > + > + if (AcpiGbl_CDAT) > + { > + return (AE_OK); > + } > + > /* > - * These fields must be ASCII: OemId, OemTableId, AslCompilerId. > + * These standard fields must be ASCII: OemId, OemTableId, AslCompilerId. > * We allow a NULL terminator in OemId and OemTableId. > */ > for (i = 0; i < ACPI_NAMESEG_SIZE; i++) > diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c > index ecb98485..49338e74 100644 > --- a/src/acpica/source/common/adisasm.c > +++ b/src/acpica/source/common/adisasm.c > @@ -476,13 +476,13 @@ AdDisassembleOneTable ( > /* This is a "Data Table" (non-AML table) */ > > AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n", > - Table->Signature); > + AcpiGbl_CDAT ? (char *) AcpiGbl_CDAT : Table->Signature); > AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] " > "FieldName : FieldValue (in hex)\n */\n\n"); > > AcpiDmDumpDataTable (Table); > fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n", > - Table->Signature); > + AcpiGbl_CDAT ? (char *) AcpiGbl_CDAT : Table->Signature); > > if (File) > { > diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c > index bff8ae79..418621b6 100644 > --- a/src/acpica/source/common/ahtable.c > +++ b/src/acpica/source/common/ahtable.c > @@ -206,6 +206,8 @@ const AH_TABLE AcpiGbl_SupportedTables[] = > {ACPI_SIG_BERT, "Boot Error Record Table"}, > {ACPI_SIG_BGRT, "Boot Graphics Resource Table"}, > {ACPI_SIG_BOOT, "Simple Boot Flag Table"}, > + {ACPI_SIG_CCEL, "CC-Event Log Table"}, > + {ACPI_SIG_CDAT, "Coherent Device Attribute Table"}, > {ACPI_SIG_CEDT, "CXL Early Discovery Table"}, > {ACPI_SIG_CPEP, "Corrected Platform Error Polling Table"}, > {ACPI_SIG_CSRT, "Core System Resource Table"}, > diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c > index 909698c5..dcf0c4bb 100644 > --- a/src/acpica/source/common/ahuuids.c > +++ b/src/acpica/source/common/ahuuids.c > @@ -209,6 +209,9 @@ const AH_UUID Gbl_AcpiUuids[] = > {"Hierarchical Data Extension", UUID_HIERARCHICAL_DATA_EXTENSION}, > {"ARM Coresight Graph", UUID_CORESIGHT_GRAPH}, > {"USB4 Capabilities", UUID_USB4_CAPABILITIES}, > + {"First Function ID for _DSM", UUID_1ST_FUNCTION_ID}, > + {"Second Function ID for _DSM", UUID_2ND_FUNCTION_ID}, > + > {NULL, NULL} > }; > > diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c > index 440c5fb4..9b95ecc7 100644 > --- a/src/acpica/source/common/dmtable.c > +++ b/src/acpica/source/common/dmtable.c > @@ -234,6 +234,17 @@ static const char *AcpiDmAsfSubnames[] = > "Unknown Subtable Type" /* Reserved */ > }; > > +static const char *AcpiDmCdatSubnames[] = > +{ > + "Device Scoped Memory Affinity Structure (DSMAS)", > + "Device scoped Latency and Bandwidth Information Structure (DSLBIS)", > + "Device Scoped Memory Side Cache Information Structure (DSMSCIS)", > + "Device Scoped Initiator Structure (DSIS)", > + "Device Scoped EFI Memory Type Structure (DSEMTS)", > + "Switch Scoped Latency and Bandwidth Information Structure (SSLBIS)", > + "Unknown Subtable Type" /* Reserved */ > +}; > + > static const char *AcpiDmCedtSubnames[] = > { > "CXL Host Bridge Structure", > @@ -403,6 +414,13 @@ static const char *AcpiDmMadtSubnames[] = > "Generic Interrupt Redistributor", /* ACPI_MADT_GENERIC_REDISTRIBUTOR */ > "Generic Interrupt Translator", /* ACPI_MADT_GENERIC_TRANSLATOR */ > "Mutiprocessor Wakeup", /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */ > + "CPU Core Interrupt Controller", /* ACPI_MADT_TYPE_CORE_PIC */ > + "Legacy I/O Interrupt Controller", /* ACPI_MADT_TYPE_LIO_PIC */ > + "HT Interrupt Controller", /* ACPI_MADT_TYPE_HT_PIC */ > + "Extend I/O Interrupt Controller", /* ACPI_MADT_TYPE_EIO_PIC */ > + "MSI Interrupt Controller", /* ACPI_MADT_TYPE_MSI_PIC */ > + "Bridge I/O Interrupt Controller", /* ACPI_MADT_TYPE_BIO_PIC */ > + "LPC Interrupt Controller", /* ACPI_MADT_TYPE_LPC_PIC */ > "Unknown Subtable Type", /* Reserved */ > "Types 80-FF are used for OEM data" /* Reserved for OEM data */ > }; > @@ -658,6 +676,8 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = > {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, > {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt}, > {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot}, > + {ACPI_SIG_CCEL, AcpiDmTableInfoCcel, NULL, NULL, TemplateCcel}, > + {ACPI_SIG_CDAT, NULL, AcpiDmDumpCdat, NULL, TemplateCdat}, > {ACPI_SIG_CEDT, NULL, AcpiDmDumpCedt, DtCompileCedt, TemplateCedt}, > {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep}, > {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt}, > @@ -722,44 +742,6 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = > }; > > > -/******************************************************************************* > - * > - * FUNCTION: AcpiDmGenerateChecksum > - * > - * PARAMETERS: Table - Pointer to table to be checksummed > - * Length - Length of the table > - * OriginalChecksum - Value of the checksum field > - * > - * RETURN: 8 bit checksum of buffer > - * > - * DESCRIPTION: Computes an 8 bit checksum of the table. > - * > - ******************************************************************************/ > - > -UINT8 > -AcpiDmGenerateChecksum ( > - void *Table, > - UINT32 Length, > - UINT8 OriginalChecksum) > -{ > - UINT8 Checksum; > - > - > - /* Sum the entire table as-is */ > - > - Checksum = AcpiTbChecksum ((UINT8 *) Table, Length); > - > - /* Subtract off the existing checksum value in the table */ > - > - Checksum = (UINT8) (Checksum - OriginalChecksum); > - > - /* Compute the final checksum */ > - > - Checksum = (UINT8) (0 - Checksum); > - return (Checksum); > -} > - > - > /******************************************************************************* > * > * FUNCTION: AcpiDmGetTableData > @@ -834,7 +816,7 @@ AcpiDmDumpDataTable ( > > /* > * Handle tables that don't use the common ACPI table header structure. > - * Currently, these are the FACS, RSDP, and S3PT. > + * Currently, these are the FACS, RSDP, S3PT and CDAT. > */ > if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) > { > @@ -854,6 +836,28 @@ AcpiDmDumpDataTable ( > { > Length = AcpiDmDumpS3pt (Table); > } > + else if (!AcpiUtValidNameseg (Table->Signature)) > + { > + /* > + * For CDAT we are assuming that there should be at least one non-ASCII > + * byte in the (normally) 4-character Signature field (at least the > + * high-order byte should be zero). > + */ > + if (AcpiGbl_CDAT) > + { > + /* > + * Invalid signature and <-ds CDAT> was specified on the command line. > + * Therefore, we have a CDAT table. > + */ > + AcpiDmDumpCdat (Table); > + } > + else > + { > + fprintf (stderr, "Table has an invalid signature\n"); > + } > + > + return; > + } > else > { > /* > @@ -977,7 +981,7 @@ AcpiDmLineHeader ( > { > if (ByteLength) > { > - AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ", > + AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ", > Offset, Offset, ByteLength, Name); > } > else > @@ -1019,12 +1023,12 @@ AcpiDmLineHeader2 ( > { > if (ByteLength) > { > - AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ", > + AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ", > Offset, Offset, ByteLength, Name, Value); > } > else > { > - AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ", > + AcpiOsPrintf ("[%3.3Xh %4.4u ] %24s %3d : ", > Offset, Offset, Name, Value); > } > } > @@ -1106,7 +1110,8 @@ AcpiDmDumpTable ( > { > AcpiOsPrintf ( > "/**** ACPI table terminates " > - "in the middle of a data structure! (dump table) */\n"); > + "in the middle of a data structure! (dump table) \n" > + "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength); > return (AE_BAD_DATA); > } > > @@ -1140,6 +1145,7 @@ AcpiDmDumpTable ( > case ACPI_DMT_AEST_XFACE: > case ACPI_DMT_AEST_XRUPT: > case ACPI_DMT_ASF: > + case ACPI_DMT_CDAT: > case ACPI_DMT_HESTNTYP: > case ACPI_DMT_FADTPM: > case ACPI_DMT_EINJACT: > @@ -1522,7 +1528,7 @@ AcpiDmDumpTable ( > /* Checksum, display and validate */ > > AcpiOsPrintf ("%2.2X", *Target); > - Temp8 = AcpiDmGenerateChecksum (Table, > + Temp8 = AcpiUtGenerateChecksum (Table, > ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, > ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); > > @@ -1668,6 +1674,20 @@ AcpiDmDumpTable ( > AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); > break; > > + case ACPI_DMT_CDAT: > + > + /* CDAT subtable types */ > + > + Temp8 = *Target; > + if (Temp8 > ACPI_CDAT_TYPE_RESERVED) > + { > + Temp8 = ACPI_CDAT_TYPE_RESERVED; > + } > + > + AcpiOsPrintf (UINT8_FORMAT, *Target, > + AcpiDmCdatSubnames[Temp8]); > + break; > + > case ACPI_DMT_CEDT: > > /* CEDT subtable types */ > @@ -2017,15 +2037,15 @@ AcpiDmDumpTable ( > > case ACPI_DMT_PHAT: > > - /* PMTT subtable types */ > + /* PHAT subtable types */ > > - Temp16 = *Target; > + Temp16 = ACPI_GET16 (Target); > if (Temp16 > ACPI_PHAT_TYPE_RESERVED) > { > Temp16 = ACPI_PHAT_TYPE_RESERVED; > } > > - AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target), > + AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), > AcpiDmPhatSubnames[Temp16]); > break; > > @@ -2069,7 +2089,7 @@ AcpiDmDumpTable ( > break; > } > > - AcpiDmDumpUnicode (Table, CurrentOffset, ByteLength); > + AcpiDmDumpUnicode (Table, 0, ByteLength); > break; > > case ACPI_DMT_RAW_BUFFER: > diff --git a/src/acpica/source/common/dmtables.c b/src/acpica/source/common/dmtables.c > index 6f42bcb3..7ade7868 100644 > --- a/src/acpica/source/common/dmtables.c > +++ b/src/acpica/source/common/dmtables.c > @@ -296,7 +296,7 @@ AdCreateTableHeader ( > > AcpiOsPrintf ("\n * Checksum 0x%2.2X", Table->Checksum); > > - Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); > + Checksum = AcpiUtChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); > if (Checksum) > { > AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X", > diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c > index b4faf683..dc1745d5 100644 > --- a/src/acpica/source/common/dmtbdump.c > +++ b/src/acpica/source/common/dmtbdump.c > @@ -384,7 +384,7 @@ AcpiDmDumpRsdp ( > > /* Validate the first checksum */ > > - Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), > + Checksum = AcpiUtGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), > Rsdp->Checksum); > if (Checksum != Rsdp->Checksum) > { > @@ -405,7 +405,7 @@ AcpiDmDumpRsdp ( > > /* Validate the extended checksum over entire RSDP */ > > - Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), > + Checksum = AcpiUtGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), > Rsdp->ExtendedChecksum); > if (Checksum != Rsdp->ExtendedChecksum) > { > diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c > index 13662611..ae5f0f86 100644 > --- a/src/acpica/source/common/dmtbdump1.c > +++ b/src/acpica/source/common/dmtbdump1.c > @@ -153,6 +153,7 @@ > #include "accommon.h" > #include "acdisasm.h" > #include "actables.h" > +#include "aslcompiler.h" > > /* This module used for application-level code only */ > > @@ -608,6 +609,192 @@ AcpiDmDumpAsf ( > } > } > > + > +/******************************************************************************* > + * > + * FUNCTION: AcpiDmDumpCdat > + * > + * PARAMETERS: InTable - A CDAT table > + * > + * RETURN: None > + * > + * DESCRIPTION: Format the contents of a CDAT. This table type consists > + * of an open-ended number of subtables. > + * > + ******************************************************************************/ > + > +void > +AcpiDmDumpCdat ( > + ACPI_TABLE_HEADER *InTable) > +{ > + ACPI_TABLE_CDAT *Table = ACPI_CAST_PTR (ACPI_TABLE_CDAT, InTable); > + ACPI_STATUS Status; > + ACPI_CDAT_HEADER *Subtable; > + ACPI_TABLE_CDAT *CdatTable = ACPI_CAST_PTR (ACPI_TABLE_CDAT, Table); > + ACPI_DMTABLE_INFO *InfoTable; > + UINT32 Length = CdatTable->Length; > + UINT32 Offset = sizeof (ACPI_TABLE_CDAT); > + UINT32 SubtableLength; > + UINT32 SubtableType; > + INT32 EntriesLength; > + > + > + /* Main table */ > + > + Status = AcpiDmDumpTable (Offset, 0, CdatTable, 0, > + AcpiDmTableInfoCdatTableHdr); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, sizeof (ACPI_TABLE_CDAT)); > + while (Offset < Table->Length) > + { > + /* Dump the common subtable header */ > + > + DbgPrint (ASL_DEBUG_OUTPUT, "0) HeaderOffset: %X\n", Offset); > + AcpiOsPrintf ("\n"); > + Status = AcpiDmDumpTable (Length, Offset, Subtable, > + sizeof (ACPI_CDAT_HEADER), AcpiDmTableInfoCdatHeader); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + /* Point past the common subtable header, decode the subtable type */ > + > + Offset += sizeof (ACPI_CDAT_HEADER); > + SubtableType = Subtable->Type; > + > + switch (Subtable->Type) > + { > + case ACPI_CDAT_TYPE_DSMAS: > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + SubtableLength = sizeof (ACPI_CDAT_DSMAS); > + > + InfoTable = AcpiDmTableInfoCdat0; > + break; > + > + case ACPI_CDAT_TYPE_DSLBIS: > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + SubtableLength = sizeof (ACPI_CDAT_DSLBIS); > + DbgPrint (ASL_DEBUG_OUTPUT, "1) Offset: %X\n", Offset); > + > + InfoTable = AcpiDmTableInfoCdat1; > + break; > + > + case ACPI_CDAT_TYPE_DSMSCIS: > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + SubtableLength = sizeof (ACPI_CDAT_DSMSCIS); > + > + InfoTable = AcpiDmTableInfoCdat2; > + break; > + > + case ACPI_CDAT_TYPE_DSIS: > + DbgPrint (ASL_DEBUG_OUTPUT, "2) Offset: %X ", Offset); > + SubtableLength = sizeof (ACPI_CDAT_DSIS); > + DbgPrint (ASL_DEBUG_OUTPUT, "1) input pointer: %p\n", Table); > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + DbgPrint (ASL_DEBUG_OUTPUT, "1) output pointers: %p, %p, Offset: %X\n", > + Table, Subtable, Offset); > + DbgPrint (ASL_DEBUG_OUTPUT, "3) Offset: %X\n", Offset); > + > + InfoTable = AcpiDmTableInfoCdat3; > + break; > + > + case ACPI_CDAT_TYPE_DSEMTS: > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + SubtableLength = sizeof (ACPI_CDAT_DSEMTS); > + > + InfoTable = AcpiDmTableInfoCdat4; > + break; > + > + case ACPI_CDAT_TYPE_SSLBIS: > + SubtableLength = Subtable->Length; > + > + InfoTable = AcpiDmTableInfoCdat5; > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + break; > + > + default: > + fprintf (stderr, "ERROR: Unknown SubtableType: %X\n", Subtable->Type); > + return; > + } > + > + DbgPrint (ASL_DEBUG_OUTPUT, "SubtableType: %X, Length: %X Actual " > + "Length: %X Offset: %X tableptr: %p\n", SubtableType, > + Subtable->Length, SubtableLength, Offset, Table); > + > + /* > + * Do the subtable-specific fields > + */ > + Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, InfoTable); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + DbgPrint (ASL_DEBUG_OUTPUT, "Subtable Type: %X, Offset: %X, SubtableLength: %X\n", > + SubtableType, Offset, SubtableLength); > + > + /* Additional sub-subtables, dependent on the main subtable type */ > + > + switch (SubtableType) > + { > + case ACPI_CDAT_TYPE_SSLBIS: > + Offset += sizeof (ACPI_CDAT_SSLBIS); > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, > + Offset); > + > + DbgPrint (ASL_DEBUG_OUTPUT, "Case SSLBIS, Offset: %X, SubtableLength: %X " > + "Subtable->Length %X\n", Offset, SubtableLength, Subtable->Length); > + > + /* Generate the total length of all the SSLBE entries */ > + > + EntriesLength = SubtableLength - sizeof (ACPI_CDAT_HEADER) - > + sizeof (ACPI_CDAT_SSLBIS); > + DbgPrint (ASL_DEBUG_OUTPUT, "EntriesLength: %X, Offset: %X, Table->Length: %X\n", > + EntriesLength, Offset, Table->Length); > + > + /* Do each of the SSLBE Entries */ > + > + while ((EntriesLength > 0) && (Offset < Table->Length)) > + { > + AcpiOsPrintf ("\n"); > + > + Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, > + AcpiDmTableInfoCdatEntries); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + EntriesLength -= sizeof (ACPI_CDAT_SSLBE); > + Offset += sizeof (ACPI_CDAT_SSLBE); > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + } > + > + SubtableLength = 0; > + break; > + > + default: > + break; > + } > + > + DbgPrint (ASL_DEBUG_OUTPUT, "Offset: %X, Subtable Length: %X\n", > + Offset, SubtableLength); > + > + /* Point to next subtable */ > + > + Offset += SubtableLength; > + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); > + } > + > + return; > +} > + > + > /******************************************************************************* > * > * FUNCTION: AcpiDmDumpCedt > @@ -651,12 +838,14 @@ AcpiDmDumpCedt ( > case ACPI_CEDT_TYPE_CHBS: > Status = AcpiDmDumpTable (Length, Offset, Subtable, > Subtable->Length, AcpiDmTableInfoCedt0); > - if (ACPI_FAILURE (Status)) { > + if (ACPI_FAILURE (Status)) > + { > return; > } > break; > > - case ACPI_CEDT_TYPE_CFMWS: { > + case ACPI_CEDT_TYPE_CFMWS: > + { > ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable; > unsigned int i, max = 0x01 << (ptr->InterleaveWays); > > @@ -664,18 +853,22 @@ AcpiDmDumpCedt ( > > Status = AcpiDmDumpTable (Length, Offset, Subtable, > Subtable->Length, AcpiDmTableInfoCedt1); > - if (ACPI_FAILURE (Status)) { > + if (ACPI_FAILURE (Status)) > + { > return; > } > > /* Now, print out any interleave targets beyond the first. */ > > - for (i = 1; i < max; i++) { > - unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET(ACPI_CEDT_CFMWS, InterleaveTargets); > + for (i = 1; i < max; i++) > + { > + unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveTargets); > unsigned int *trg = &(ptr->InterleaveTargets[i]); > + > Status = AcpiDmDumpTable (Length, loc_offset, trg, > Subtable->Length, AcpiDmTableInfoCedt1_te); > - if (ACPI_FAILURE (Status)) { > + if (ACPI_FAILURE (Status)) > + { > return; > } > } > diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c > index c50a6a24..3fb4d531 100644 > --- a/src/acpica/source/common/dmtbdump2.c > +++ b/src/acpica/source/common/dmtbdump2.c > @@ -149,6 +149,7 @@ > * > *****************************************************************************/ > > +#include <wchar.h> > #include "acpi.h" > #include "accommon.h" > #include "acdisasm.h" > @@ -2104,9 +2105,12 @@ AcpiDmDumpPhat ( > UINT32 RecordCount; > UINT32 Length = Table->Length; > UINT32 Offset = sizeof (ACPI_TABLE_PHAT); > + UINT32 OriginalOffset; > UINT32 SubtableLength; > UINT32 PathLength; > UINT32 VendorLength; > + UINT16 RecordType; > + const wchar_t *WideString; > > > Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT)); > @@ -2116,58 +2120,93 @@ AcpiDmDumpPhat ( > /* Common subtable header */ > > AcpiOsPrintf ("\n"); > - Status = AcpiDmDumpTable (Length, 0, Subtable, > + Status = AcpiDmDumpTable (Length, Offset, Subtable, > sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr); > if (ACPI_FAILURE (Status)) > { > return; > } > > + DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n", > + __LINE__, Subtable->Type); > + > switch (Subtable->Type) > { > case ACPI_PHAT_TYPE_FW_VERSION_DATA: > > InfoTable = AcpiDmTableInfoPhat0; > - SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA); > + SubtableLength = Offset += sizeof (ACPI_PHAT_VERSION_DATA); > break; > > case ACPI_PHAT_TYPE_FW_HEALTH_DATA: > > InfoTable = AcpiDmTableInfoPhat1; > - SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA); > + SubtableLength = Offset += sizeof (ACPI_PHAT_TYPE_FW_HEALTH_DATA); > break; > > default: > > - AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n", > + DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n", > Subtable->Type); > > return; > } > > - Status = AcpiDmDumpTable (Length, 0, Subtable, > + Status = AcpiDmDumpTable (Length, SubtableLength, Subtable, > SubtableLength, InfoTable); > if (ACPI_FAILURE (Status)) > { > return; > } > > + OriginalOffset = Offset; > switch (Subtable->Type) > { > case ACPI_PHAT_TYPE_FW_VERSION_DATA: > > VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable); > RecordCount = VersionData->ElementCount; > - while (RecordCount) > + RecordType = *ACPI_CAST_PTR (UINT8, Subtable); > + > + /* > + * Skip past a zero-valued block (not part of the ACPI PHAT specification). > + * First, check for a zero length record and a zero element count > + */ > + if (!VersionData->Header.Length && !VersionData->ElementCount) > { > - Status = AcpiDmDumpTable (Length, Offset, > - ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)), > + while (RecordType == 0) > + { > + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); > + RecordType = *ACPI_CAST_PTR (UINT8, Subtable); > + RecordCount = VersionData->ElementCount; > + Offset += 1; > + } > + > + Offset -= 1; > + AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n" > + "/* (not compliant to PHAT specification -- ignoring block) */\n", > + OriginalOffset - 12, Offset - OriginalOffset + 12); > + } > + > + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n", > + __LINE__, RecordCount, Offset, SubtableLength); > + > + /* Emit each of the version elements */ > + > + while (RecordCount && VersionData->Header.Length) > + { > + AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n", > + VersionData->ElementCount - RecordCount + 1, Offset); > + > + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); > + Status = AcpiDmDumpTable (Length, Offset, Subtable, > sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a); > if (ACPI_FAILURE (Status)) > { > return; > } > > + Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT); > RecordCount--; > } > > @@ -2175,24 +2214,48 @@ AcpiDmDumpPhat ( > > case ACPI_PHAT_TYPE_FW_HEALTH_DATA: > > - /* account for the null terminator */ > + /* > + * Get the length of the Device Path (UEFI wide string). > + * Include the wide null terminator (+2), > + */ > + WideString = ACPI_ADD_PTR (wchar_t, Subtable, > + sizeof (ACPI_PHAT_HEALTH_DATA)); > + > + PathLength = (wcslen (WideString) * 2) + 2; > + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X, Table->Length %X */\n", > + __LINE__, PathLength, Offset, Length); > > - PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1; > Status = AcpiDmDumpTable (Length, Offset, > ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), > PathLength, AcpiDmTableInfoPhat1a); > + Offset += PathLength; > if (ACPI_FAILURE (Status)) > { > return; > } > > - /* Get vendor data - data length is the remaining subtable length */ > + /* Get Device-Specific Data - length of which is the remaining subtable length. */ > > VendorLength = > Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; > - Status = AcpiDmDumpTable (Length, 0, > - ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), > - VendorLength, AcpiDmTableInfoPhat1b); > + DbgPrint (ASL_DEBUG_OUTPUT, "%u, Subtable->Length %X, VendorLength %X, Offset %X PathLength: %X\n", > + __LINE__, Subtable->Length, VendorLength, Offset, PathLength); > + > + if (VendorLength) > + { > + /* Point past the Device Path, Compile the Device-Specific Data */ > + > + Status = AcpiDmDumpTable (Length, Offset, > + ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), > + VendorLength, AcpiDmTableInfoPhat1b); > + if (ACPI_FAILURE (Status)) > + { > + return; > + } > + > + Offset += VendorLength; > + } > + > if (ACPI_FAILURE (Status)) > { > return; > @@ -2208,9 +2271,12 @@ AcpiDmDumpPhat ( > > /* Next subtable */ > > - Offset += Subtable->Length; > - Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, > - Subtable->Length); > + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, " > + "Subtable->Length %X, Table->Length %X */\n", > + __LINE__, Offset, Subtable->Length, Table->Length); > + > + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, > + Offset); > } > } > > diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c > index d6a94bfc..9afed4d6 100644 > --- a/src/acpica/source/common/dmtbinfo1.c > +++ b/src/acpica/source/common/dmtbinfo1.c > @@ -494,6 +494,116 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoBoot[] = > ACPI_DMT_TERMINATOR > }; > > +/******************************************************************************* > + * > + * CDAT - Coherent Device Attribute Table > + * > + ******************************************************************************/ > + > + /* Table header (not ACPI-compliant) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdatTableHdr[] = > +{ > + {ACPI_DMT_UINT32, ACPI_CDAT_OFFSET (Length), "CDAT Table Length", DT_LENGTH}, > + {ACPI_DMT_UINT8, ACPI_CDAT_OFFSET (Revision), "Revision", 0}, > + {ACPI_DMT_UINT8, ACPI_CDAT_OFFSET (Checksum), "Checksum", 0}, > + {ACPI_DMT_UINT48, ACPI_CDAT_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT32, ACPI_CDAT_OFFSET (Sequence), "Sequence", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Common subtable header */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdatHeader[] = > +{ > + {ACPI_DMT_CDAT, ACPI_CDATH_OFFSET (Type), "Subtable Type", 0}, > + {ACPI_DMT_UINT8, ACPI_CDATH_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT16, ACPI_CDATH_OFFSET (Length), "Length", DT_LENGTH}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Subtable 0: Device Scoped Memory Affinity Structure (DSMAS) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat0[] = > +{ > + {ACPI_DMT_UINT8, ACPI_CDAT0_OFFSET (DsmadHandle), "DSMAD Handle", 0}, > + {ACPI_DMT_UINT8, ACPI_CDAT0_OFFSET (Flags), "Flags", 0}, > + {ACPI_DMT_UINT16, ACPI_CDAT0_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_CDAT0_OFFSET (DpaBaseAddress), "DPA Base Address", 0}, > + {ACPI_DMT_UINT64, ACPI_CDAT0_OFFSET (DpaLength), "DPA Length", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Subtable 1: Device scoped Latency and Bandwidth Information Structure (DSLBIS) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat1[] = > +{ > + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (Handle), "Handle", 0}, > + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (Flags), "Flags", 0}, > + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (DataType), "Data Type", 0}, > + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_CDAT1_OFFSET (EntryBaseUnit), "Entry Base Unit", 0}, > + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Entry[0]), "Entry0", 0}, > + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Entry[1]), "Entry1", 0}, > + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Entry[2]), "Entry2", 0}, > + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Reserved2), "Reserved", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Subtable 2: Device Scoped Memory Side Cache Information Structure (DSMSCIS) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat2[] = > +{ > + {ACPI_DMT_UINT8, ACPI_CDAT2_OFFSET (DsmasHandle), "DSMAS Handle", 0}, > + {ACPI_DMT_UINT24, ACPI_CDAT2_OFFSET (Reserved[3]), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_CDAT2_OFFSET (SideCacheSize), "Side Cache Size", 0}, > + {ACPI_DMT_UINT32, ACPI_CDAT2_OFFSET (CacheAttributes), "Cache Attributes", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Subtable 3: Device Scoped Initiator Structure (DSIS) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat3[] = > +{ > + {ACPI_DMT_UINT8, ACPI_CDAT3_OFFSET (Flags), "Flags", 0}, > + {ACPI_DMT_UINT8, ACPI_CDAT3_OFFSET (Handle), "Handle", 0}, > + {ACPI_DMT_UINT16, ACPI_CDAT3_OFFSET (Reserved), "Reserved", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Subtable 4: Device Scoped EFI Memory Type Structure (DSEMTS) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat4[] = > +{ > + {ACPI_DMT_UINT8, ACPI_CDAT4_OFFSET (DsmasHandle), "DSMAS Handle", 0}, > + {ACPI_DMT_UINT8, ACPI_CDAT4_OFFSET (MemoryType), "Memory Type", 0}, > + {ACPI_DMT_UINT16, ACPI_CDAT4_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_CDAT4_OFFSET (DpaOffset), "DPA Offset", 0}, > + {ACPI_DMT_UINT64, ACPI_CDAT4_OFFSET (RangeLength), "DPA Range Length", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Subtable 5: Switch Scoped Latency and Bandwidth Information Structure (SSLBIS) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat5[] = > +{ > + {ACPI_DMT_UINT8, ACPI_CDAT5_OFFSET (DataType), "Data Type", 0}, > + {ACPI_DMT_UINT24, ACPI_CDAT5_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_CDAT5_OFFSET (EntryBaseUnit), "Entry Base Unit", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > +/* Switch Scoped Latency and Bandwidth Entry (SSLBE) (For subtable 5 above) */ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCdatEntries[] = > +{ > + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (PortxId), "Port X Id", 0}, > + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (PortyId), "Port Y Id", 0}, > + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (LatencyOrBandwidth), "Latency or Bandwidth", 0}, > + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (Reserved), "Reserved", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > > /******************************************************************************* > * > diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c > index 2c7d8178..3676be81 100644 > --- a/src/acpica/source/common/dmtbinfo2.c > +++ b/src/acpica/source/common/dmtbinfo2.c > @@ -412,6 +412,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoIort4[] = > {ACPI_DMT_FLAG0, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "COHACC Override", 0}, > {ACPI_DMT_FLAG1, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "HTTU Override", 0}, > {ACPI_DMT_FLAG3, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "Proximity Domain Valid", 0}, > + {ACPI_DMT_FLAG4, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "DeviceID Valid", 0}, > {ACPI_DMT_UINT32, ACPI_IORT4_OFFSET (Reserved), "Reserved", 0}, > {ACPI_DMT_UINT64, ACPI_IORT4_OFFSET (VatosAddress), "VATOS Address", 0}, > {ACPI_DMT_UINT32, ACPI_IORT4_OFFSET (Model), "Model", 0}, > @@ -1652,11 +1653,13 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt0[] = > * > ******************************************************************************/ > > +/* Common subtable header */ > + > ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[] = > { > - {ACPI_DMT_PHAT, ACPI_PHATH_OFFSET (Type), "Subtable Type", 0}, > - {ACPI_DMT_UINT16, ACPI_PHATH_OFFSET (Length), "Length", 0}, > - {ACPI_DMT_UINT8, ACPI_PHATH_OFFSET (Revision), "Revision", 0}, > + {ACPI_DMT_PHAT, ACPI_PHATH_OFFSET (Type), "Subtable Type", 0}, > + {ACPI_DMT_UINT16, ACPI_PHATH_OFFSET (Length), "Length", DT_LENGTH}, > + {ACPI_DMT_UINT8, ACPI_PHATH_OFFSET (Revision), "Revision", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1664,16 +1667,16 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0[] = > { > - {ACPI_DMT_UINT24, ACPI_PHAT0_OFFSET (Reserved), "Reserved", 0}, > - {ACPI_DMT_UINT32, ACPI_PHAT0_OFFSET (ElementCount), "Element Count", 0}, > + {ACPI_DMT_UINT24, ACPI_PHAT0_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT32, ACPI_PHAT0_OFFSET (ElementCount), "Element Count", 0}, > ACPI_DMT_TERMINATOR > }; > > ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[] = > { > - {ACPI_DMT_UUID, ACPI_PHAT0A_OFFSET (Guid), "GUID", 0}, > - {ACPI_DMT_UINT64, ACPI_PHAT0A_OFFSET (VersionValue), "Version Value", 0}, > - {ACPI_DMT_UINT32, ACPI_PHAT0A_OFFSET (ProducerId), "Producer ID", 0}, > + {ACPI_DMT_UUID, ACPI_PHAT0A_OFFSET (Guid), "GUID", 0}, > + {ACPI_DMT_UINT64, ACPI_PHAT0A_OFFSET (VersionValue), "Version Value", 0}, > + {ACPI_DMT_UINT32, ACPI_PHAT0A_OFFSET (ProducerId), "Producer ID", 0}, > ACPI_DMT_TERMINATOR > }; > > @@ -1681,22 +1684,22 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[] = > > ACPI_DMTABLE_INFO AcpiDmTableInfoPhat1[] = > { > - {ACPI_DMT_UINT16, ACPI_PHAT1_OFFSET (Reserved), "Reserved", 0}, > - {ACPI_DMT_UINT8, ACPI_PHAT1_OFFSET (Health), "Health", 0}, > - {ACPI_DMT_UUID, ACPI_PHAT1_OFFSET (DeviceGuid), "Device GUID", 0}, > - {ACPI_DMT_UINT32, ACPI_PHAT1_OFFSET (DeviceSpecificOffset), "Device specific offset", 0}, > + {ACPI_DMT_UINT16, ACPI_PHAT1_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT8, ACPI_PHAT1_OFFSET (Health), "Health", 0}, > + {ACPI_DMT_UUID, ACPI_PHAT1_OFFSET (DeviceGuid), "Device GUID", 0}, > + {ACPI_DMT_UINT32, ACPI_PHAT1_OFFSET (DeviceSpecificOffset), "Device-Specific Offset", 0}, > ACPI_DMT_TERMINATOR > }; > > ACPI_DMTABLE_INFO AcpiDmTableInfoPhat1a[] = > { > - {ACPI_DMT_STRING, 0, "Namepath", 0}, > + {ACPI_DMT_UNICODE, 0, "Device Path", 0}, > ACPI_DMT_TERMINATOR > }; > > ACPI_DMTABLE_INFO AcpiDmTableInfoPhat1b[] = > { > - {ACPI_DMT_RAW_BUFFER, 0, "Vendor Data", 0}, > + {ACPI_DMT_RAW_BUFFER, 0, "Device-Specific Data", DT_OPTIONAL}, > ACPI_DMT_TERMINATOR > }; > > @@ -1895,7 +1898,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPrmtHandler[] = > {ACPI_DMT_UINT16, ACPI_PRMT1_OFFSET (Length), "Length", 0}, > {ACPI_DMT_UUID, ACPI_PRMT1_OFFSET (HandlerGuid[0]), "Handler GUID", 0}, > {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (HandlerAddress), "Handler address", 0}, > - {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (StaticDataBufferAddress),"Satic Data Address", 0}, > + {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (StaticDataBufferAddress),"Static Data Address", 0}, > {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (AcpiParamBufferAddress), "ACPI Parameter Address", 0}, > ACPI_DMT_NEW_LINE, > ACPI_DMT_TERMINATOR > diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c > index fa698d2f..b8ddb7aa 100644 > --- a/src/acpica/source/common/dmtbinfo3.c > +++ b/src/acpica/source/common/dmtbinfo3.c > @@ -190,6 +190,23 @@ > * Each entry is of the form: <Field Type, Field Offset, Field Name> > */ > > +/******************************************************************************* > + * > + * CCEL - CC-Event Log Table > + * > + ******************************************************************************/ > + > +ACPI_DMTABLE_INFO AcpiDmTableInfoCcel[] = > +{ > + {ACPI_DMT_UINT8, ACPI_CCEL_OFFSET (CCType), "CC Type", 0}, > + {ACPI_DMT_UINT8, ACPI_CCEL_OFFSET (CCSubType), "CC Sub Type", 0}, > + {ACPI_DMT_UINT32, ACPI_CCEL_OFFSET (Reserved), "Reserved", 0}, > + {ACPI_DMT_UINT64, ACPI_CCEL_OFFSET (LogAreaMinimumLength), "Log Area Minimum Length", 0}, > + {ACPI_DMT_UINT64, ACPI_CCEL_OFFSET (LogAreaStartAddress), "Log Area Start Address", 0}, > + ACPI_DMT_TERMINATOR > +}; > + > + > /******************************************************************************* > * > * SLIC - Software Licensing Description Table. This table contains the standard > diff --git a/src/acpica/source/compiler/aslcodegen.c b/src/acpica/source/compiler/aslcodegen.c > index 6ae3a0aa..a0c67424 100644 > --- a/src/acpica/source/compiler/aslcodegen.c > +++ b/src/acpica/source/compiler/aslcodegen.c > @@ -153,6 +153,7 @@ > #include "aslcompiler.y.h" > #include "amlcode.h" > #include "acconvert.h" > +#include "actbinfo.h" > > #define _COMPONENT ACPI_COMPILER > ACPI_MODULE_NAME ("aslcodegen") > @@ -181,6 +182,10 @@ static void > CgUpdateHeader ( > ACPI_PARSE_OBJECT *Op); > > +static void > +CgUpdateCdatHeader ( > + ACPI_PARSE_OBJECT *Op); > + > > /******************************************************************************* > * > @@ -207,7 +212,14 @@ CgGenerateAmlOutput ( > CgAmlWriteWalk, NULL, NULL); > > DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER2); > - CgUpdateHeader (AslGbl_CurrentDB); > + if (AcpiGbl_CDAT) > + { > + CgUpdateCdatHeader (AslGbl_CurrentDB); > + } > + else > + { > + CgUpdateHeader (AslGbl_CurrentDB); > + } > } > > > @@ -656,6 +668,67 @@ CgWriteTableHeader ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: CgUpdateCdatHeader > + * > + * PARAMETERS: Op - Op for the Definition Block > + * > + * RETURN: None. > + * > + * DESCRIPTION: Complete the ACPI table by calculating the checksum and > + * re-writing the header for the input definition block > + * > + ******************************************************************************/ > + > +static void > +CgUpdateCdatHeader ( > + ACPI_PARSE_OBJECT *Op) > +{ > + signed char Sum; > + UINT32 i; > + UINT32 Length; > + UINT8 FileByte; > + UINT8 Checksum; > + > + > + /* Calculate the checksum over the entire definition block */ > + > + Sum = 0; > + Length = sizeof (ACPI_TABLE_CDAT) + Op->Asl.AmlSubtreeLength; > + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset); > + > + for (i = 0; i < Length; i++) > + { > + if (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1) != AE_OK) > + { > + AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL, > + "Table length is greater than size of the input file"); > + return; > + } > + > + Sum = (signed char) (Sum + FileByte); > + } > + > + Checksum = (UINT8) (0 - Sum); > + > + DbgPrint (ASL_DEBUG_OUTPUT, "Computed checksum = %X\n", Checksum); > + > + /* Re-write the checksum byte */ > + > + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + > + ACPI_CDAT_OFFSET (Checksum)); > + > + FlWriteFile (ASL_FILE_AML_OUTPUT, &Checksum, 1); > + > + /* > + * Seek to the end of the file. This is done to support multiple file > + * compilation. Doing this simplifies other parts of the codebase because > + * it eliminates the need to seek for a different starting place. > + */ > + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + Length); > +} > + > /******************************************************************************* > * > * FUNCTION: CgUpdateHeader > diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c > index c17e219c..f97cd9d8 100644 > --- a/src/acpica/source/compiler/aslcompile.c > +++ b/src/acpica/source/compiler/aslcompile.c > @@ -241,7 +241,7 @@ CmDoCompile ( > > if (AslGbl_SyntaxError) > { > - fprintf (stderr, > + AslError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, > "Compiler aborting due to parser-detected syntax error(s)\n"); > > /* Flag this error in the FileNode for compilation summary */ > @@ -250,6 +250,8 @@ CmDoCompile ( > FileNode->ParserErrorDetected = TRUE; > AslGbl_ParserErrorDetected = TRUE; > LsDumpParseTree (); > + AePrintErrorLog(ASL_FILE_STDERR); > + > goto ErrorExit; > } > > @@ -267,6 +269,8 @@ CmDoCompile ( > goto ErrorExit; > } > > + AePrintErrorLog(ASL_FILE_STDERR); > + > /* Flush out any remaining source after parse tree is complete */ > > Event = UtBeginEvent ("Flush source input"); > @@ -283,10 +287,13 @@ CmDoCompile ( > > LsDumpParseTree (); > > + AslGbl_ParserErrorDetected = FALSE; > + AslGbl_SyntaxError = FALSE; > UtEndEvent (Event); > UtEndEvent (FullCompile); > - return (AE_OK); > > + AslGbl_ParserErrorDetected = FALSE; > + AslGbl_SyntaxError = FALSE; > ErrorExit: > UtEndEvent (FullCompile); > return (AE_ERROR); > @@ -919,7 +926,6 @@ CmCleanupAndExit ( > ASL_MAX_ERROR_COUNT); > } > > - AslGbl_ExceptionCount[ASL_ERROR] = 0; > UtDisplaySummary (ASL_FILE_STDOUT); > > /* > diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c > index a0ebe7b3..3a61bc6e 100644 > --- a/src/acpica/source/compiler/aslerror.c > +++ b/src/acpica/source/compiler/aslerror.c > @@ -1033,7 +1033,6 @@ AslLogNewError ( > exit(1); > } > > - AslGbl_ExceptionCount[ASL_ERROR] = 0; > return; > } > > diff --git a/src/acpica/source/compiler/aslhelp.c b/src/acpica/source/compiler/aslhelp.c > index d83d41e3..1cdbf8a7 100644 > --- a/src/acpica/source/compiler/aslhelp.c > +++ b/src/acpica/source/compiler/aslhelp.c > @@ -262,6 +262,7 @@ Usage ( > ACPI_OPTION ("", " (Obtain DSDT from current system if no input file)"); > ACPI_OPTION ("-df", "Force disassembler to assume table contains valid AML"); > ACPI_OPTION ("-dl", "Emit legacy ASL code only (no C-style operators)"); > + ACPI_OPTION ("-ds <signature(4)>", "Specify a table signature(4) (CDAT table only)"); > ACPI_OPTION ("-e <f1 f2 ...>", "Include ACPI table(s) for external symbol resolution"); > ACPI_OPTION ("-fe <file>", "Specify external symbol declaration file"); > ACPI_OPTION ("-in", "Ignore NoOp opcodes"); > diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c > index 2808650e..37484f79 100644 > --- a/src/acpica/source/compiler/asloptions.c > +++ b/src/acpica/source/compiler/asloptions.c > @@ -152,6 +152,7 @@ > #include "aslcompiler.h" > #include "acapps.h" > #include "acdisasm.h" > +#include "acglobal.h" > > #define _COMPONENT ACPI_COMPILER > ACPI_MODULE_NAME ("asloption") > @@ -176,7 +177,7 @@ 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" > +#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" > > > /******************************************************************************* > @@ -270,7 +271,7 @@ AslDoOptions ( > BOOLEAN IsResponseFile) > { > ACPI_STATUS Status; > - UINT32 j; > + INT32 j; > > > /* Get the command line options */ > @@ -366,7 +367,6 @@ AslDoOptions ( > { > return (-1); > } > - > AslGbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); > break; > > @@ -445,6 +445,28 @@ AslDoOptions ( > AcpiGbl_CstyleDisassembly = FALSE; > break; > > + case 's': /* Specify table signature (Only supported for CDAT table) */ > + > + /* Get the required argument */ > + > + if (AcpiGetoptArgument (argc, argv)) > + { > + return (-1); > + } > + > + /* Check for exact string "CDAT" (upper or lower case) */ > + > + AcpiGbl_CDAT = ACPI_CAST_PTR (char, &AcpiGbl_Optarg); > + if (AcpiUtStricmp (AcpiGbl_Optarg, ACPI_SIG_CDAT)) > + { > + printf ("\nUnknown table signature: %s\n", AcpiGbl_Optarg); > + return (-1); > + } > + > + AcpiGbl_CDAT = malloc (5); > + AcpiUtSafeStrncpy ((char *) AcpiGbl_CDAT, ACPI_SIG_CDAT, 5); > + break; > + > default: > > printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); > @@ -837,7 +859,7 @@ AslDoOptions ( > AslGbl_HexOutputFlag = HEX_OUTPUT_C; > break; > > - case 'p': /* data table flex/bison prototype */ > + case 'p': /* data table flex/bison prototype */ > > AslGbl_DtLexBisonPrototype = TRUE; > break; > diff --git a/src/acpica/source/compiler/aslpredef.c b/src/acpica/source/compiler/aslpredef.c > index c52295ee..2804e12d 100644 > --- a/src/acpica/source/compiler/aslpredef.c > +++ b/src/acpica/source/compiler/aslpredef.c > @@ -563,7 +563,7 @@ ApCheckForPredefinedName ( > if (Name[0] == 0) > { > AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, > - "zero length name found"); > + "Zero length name found"); > } > > /* All reserved names are prefixed with a single underscore */ > diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c > index 45462adf..9542a79d 100644 > --- a/src/acpica/source/compiler/aslstartup.c > +++ b/src/acpica/source/compiler/aslstartup.c > @@ -317,7 +317,7 @@ AslDetectSourceFileType ( > else > { > fprintf (stderr, > - "Binary file does not contain a valid ACPI table\n"); > + "Binary file does not contain a valid standard ACPI table\n"); > } > > Type = ASL_INPUT_TYPE_BINARY; > diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c > index 89eb937d..11fcb8b9 100644 > --- a/src/acpica/source/compiler/dtcompile.c > +++ b/src/acpica/source/compiler/dtcompile.c > @@ -451,6 +451,48 @@ DtCompileDataTable ( > return (Status); > } > > + /* > + * If the first field is named "CDAT Table Length" (not "Signature"), > + * assume that we have a CDAT table (whose table header does not have > + * a signature). Instead, the TableLength field is where the > + * signature would (normally) be. > + */ > + else if (!strcmp ((*FieldList)->Name, "CDAT Table Length")) > + { > + /* No longer true: (However, use this technique in the disassembler) > + * We are assuming that there > + * should be at least one non-ASCII byte in the 4-character > + * Signature field, (At least the high-order byte should be zero). > + */ > + Status = DtCompileTable (FieldList, AcpiDmTableInfoCdatTableHdr, > + &AslGbl_RootTable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + /* Compile the CDAT */ > + > + DtPushSubtable (AslGbl_RootTable); > + Status = DtCompileCdat ((void **) FieldList); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + /* > + * Set the overall table length and the table checksum. > + * The entire compiled table (including the CDAT table header with > + * the table length and checksum) is in AslGbl_RootTable->Buffer. > + */ > + DtSetTableLength (); > + DtSetTableChecksum (&ACPI_CAST_PTR (ACPI_TABLE_CDAT, AslGbl_RootTable->Buffer)->Checksum); > + > + DtDumpFieldList (RootField); > + DtDumpSubtableList (); > + return (AE_OK); > + } > + > /* > * All other tables must use the common ACPI table header. Insert the > * current iASL IDs (name, version), and compile the header now. > diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h > index 3b3683cc..e85ca539 100644 > --- a/src/acpica/source/compiler/dtcompiler.h > +++ b/src/acpica/source/compiler/dtcompiler.h > @@ -578,13 +578,17 @@ DtCompileAsf ( > void **PFieldList); > > ACPI_STATUS > -DtCompileCpep ( > +DtCompileCdat ( > void **PFieldList); > > ACPI_STATUS > DtCompileCedt ( > void **PFieldList); > > +ACPI_STATUS > +DtCompileCpep ( > + void **PFieldList); > + > ACPI_STATUS > DtCompileCsrt ( > void **PFieldList); > @@ -773,6 +777,8 @@ extern const unsigned char TemplateBoot[]; > extern const unsigned char TemplateBdat[]; > extern const unsigned char TemplateBert[]; > extern const unsigned char TemplateBgrt[]; > +extern const unsigned char TemplateCcel[]; > +extern const unsigned char TemplateCdat[]; > extern const unsigned char TemplateCedt[]; > extern const unsigned char TemplateCpep[]; > extern const unsigned char TemplateCsrt[]; > diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c > index 1a00424c..9ec18cd1 100644 > --- a/src/acpica/source/compiler/dtio.c > +++ b/src/acpica/source/compiler/dtio.c > @@ -952,7 +952,7 @@ DtDumpBuffer ( > UINT8 BufChar; > > > - FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ", > + FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3.3Xh] ", > Offset, Offset, Length); > > i = 0; > diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c > index 9ac04350..dc25e9b9 100644 > --- a/src/acpica/source/compiler/dttable1.c > +++ b/src/acpica/source/compiler/dttable1.c > @@ -655,6 +655,133 @@ DtCompileAsf ( > } > > > +/****************************************************************************** > + * > + * FUNCTION: DtCompileCdat > + * > + * PARAMETERS: List - Current field list pointer > + * > + * RETURN: Status > + * > + * DESCRIPTION: Compile CDAT. > + * > + *****************************************************************************/ > + > +ACPI_STATUS > +DtCompileCdat ( > + void **List) > +{ > + ACPI_STATUS Status = AE_OK; > + DT_SUBTABLE *Subtable; > + DT_SUBTABLE *ParentTable; > + DT_FIELD **PFieldList = (DT_FIELD **) List; > + ACPI_CDAT_HEADER *CdatHeader; > + ACPI_DMTABLE_INFO *InfoTable = NULL; > + DT_FIELD *SubtableStart; > + > + > + /* Walk the parse tree. > + * > + * Note: Main table consists of only the CDAT table header > + * (This is not the standard ACPI table header, however)-- > + * Followed by some number of subtables. > + */ > + while (*PFieldList) > + { > + SubtableStart = *PFieldList; > + > + /* Compile the expected CDAT Subtable header */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatHeader, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + DtPushSubtable (Subtable); > + > + CdatHeader = ACPI_CAST_PTR (ACPI_CDAT_HEADER, Subtable->Buffer); > + > + /* Decode the subtable by type */ > + > + switch (CdatHeader->Type) > + { > + case ACPI_CDAT_TYPE_DSMAS: > + InfoTable = AcpiDmTableInfoCdat0; > + break; > + > + case ACPI_CDAT_TYPE_DSLBIS: > + InfoTable = AcpiDmTableInfoCdat1; > + break; > + > + case ACPI_CDAT_TYPE_DSMSCIS: > + InfoTable = AcpiDmTableInfoCdat2; > + break; > + > + case ACPI_CDAT_TYPE_DSIS: > + InfoTable = AcpiDmTableInfoCdat3; > + break; > + > + case ACPI_CDAT_TYPE_DSEMTS: > + InfoTable = AcpiDmTableInfoCdat4; > + break; > + > + case ACPI_CDAT_TYPE_SSLBIS: > + InfoTable = AcpiDmTableInfoCdat5; > + break; > + > + default: > + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CDAT"); > + } > + > + /* Compile the CDAT subtable */ > + > + Status = DtCompileTable (PFieldList, InfoTable, &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + switch (CdatHeader->Type) > + { > + /* Multiple entries supported for this type */ > + > + case ACPI_CDAT_TYPE_SSLBIS: > + > + /* > + * Check for multiple SSLBEs > + */ > + while (*PFieldList && !AcpiUtStricmp ((*PFieldList)->Name, "Port X ID")) > + { > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatEntries, &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > + break; > + > + default: > + break; > + } > + > + /* Pop off the CDAT Subtable header subtree */ > + > + DtPopSubtable (); > + } > + > + return (AE_OK); > +} > + > + > /****************************************************************************** > * > * FUNCTION: DtCompileCedt > @@ -2592,7 +2719,6 @@ DtCompileIvrs ( > > DtInsertSubtable (MainSubtable, Subtable); > DtPushSubtable (Subtable); > - ParentTable = MainSubtable; > break; > > case ACPI_IVRS_TYPE_HID: > diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c > index 1798a963..59d578f9 100644 > --- a/src/acpica/source/compiler/dttable2.c > +++ b/src/acpica/source/compiler/dttable2.c > @@ -825,6 +825,7 @@ DtCompileNhlt ( > ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; > ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D *ConfigSpecific; > ACPI_NHLT_DEVICE_INFO_COUNT *DeviceInfo; > + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B *Terminator; > > > /* Main table */ > @@ -1088,7 +1089,7 @@ DtCompileNhlt ( > * some non documeneted structure(s) yet to be processed. First, get > * the count of such structure(s). > */ > - if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) > + if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Device Info struct count"))) > { > /* Get the count of non documented structures */ > > @@ -1124,9 +1125,8 @@ DtCompileNhlt ( > DtInsertSubtable (ParentTable, Subtable); > } /* for (j = 0; j < LinuxSpecificCount; j++) */ > > - > /* Undocumented data at the end of endpoint */ > - if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) > + if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Bytes"))) > { > Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b, > &Subtable); > @@ -1148,7 +1148,7 @@ DtCompileNhlt ( > * All Endpoint Descriptors are completed. > * Do the table terminator specific config (not in NHLT spec, optional) > */ > - if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) > + if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Capabilities Size"))) > { > Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b, > &Subtable); > @@ -1160,15 +1160,20 @@ DtCompileNhlt ( > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > > - Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, > - &Subtable); > - if (ACPI_FAILURE (Status)) > + Terminator = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B, Subtable->Buffer); > + > + if (Terminator->CapabilitiesSize) > { > - return (Status); > - } > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, > + &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > > - ParentTable = DtPeekSubtable (); > - DtInsertSubtable (ParentTable, Subtable); > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + } > } > > return (AE_OK); > @@ -1369,19 +1374,30 @@ DtCompilePhat ( > ACPI_PHAT_HEADER *PhatHeader; > ACPI_DMTABLE_INFO *Info; > ACPI_PHAT_VERSION_DATA *VersionData; > + UINT32 DeviceDataLength; > UINT32 RecordCount; > + DT_FIELD *DataOffsetField; > + DT_FIELD *DevicePathField; > + UINT32 TableOffset = 0; > + UINT32 DataOffsetValue; > + UINT32 i; > > > - /* The table consist of subtables */ > + /* The table consists of subtables */ > > while (*PFieldList) > { > + /* Compile the common subtable header */ > + > Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable); > if (ACPI_FAILURE (Status)) > { > return (Status); > } > > + TableOffset += Subtable->Length; > + DbgPrint (ASL_DEBUG_OUTPUT, "0 Subtable->Length: %X\n", Subtable->Length); > + > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > DtPushSubtable (Subtable); > @@ -1392,12 +1408,66 @@ DtCompilePhat ( > { > case ACPI_PHAT_TYPE_FW_VERSION_DATA: > > + /* Compile the middle portion of the Firmware Version Data */ > + > Info = AcpiDmTableInfoPhat0; > PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA); > + DataOffsetField = NULL; > break; > > case ACPI_PHAT_TYPE_FW_HEALTH_DATA: > > + DbgPrint (ASL_DEBUG_OUTPUT, "1 Offset: %X, Name: \"%s\" Length: %X\n", > + (*PFieldList)->TableOffset, (*PFieldList)->Name, Subtable->Length); > + > + DataOffsetField = *PFieldList; > + > + /* Walk the field list to get to the "Device-specific data Offset" field */ > + > + TableOffset = sizeof (ACPI_PHAT_HEALTH_DATA); > + for (i = 0; i < 3; i++) > + { > + DataOffsetField = DataOffsetField->Next; > + DbgPrint (ASL_DEBUG_OUTPUT, "2 Offset: %X, Name: \"%s\" Length: %X Value: %s:\n", > + TableOffset, DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value); > + } > + > + /* Convert DataOffsetField->Value (a char * string) to an integer value */ > + > + sscanf (DataOffsetField->Value, "%X", &DataOffsetValue); > + > + /* > + * Get the next field (Device Path): > + * DataOffsetField points to "Device-Specific Offset", next field is > + * "Device Path". > + */ > + DevicePathField = DataOffsetField->Next; > + > + /* Compute the size of the input ASCII string as a unicode string (*2 + 2) */ > + > + DevicePathField->StringLength = (strlen ((const char *) DevicePathField->Value) * 2) + 2; > + TableOffset += DevicePathField->StringLength; > + > + DbgPrint (ASL_DEBUG_OUTPUT, "3 Offset: %X, Length: %X devicepathLength: %X\n", > + TableOffset, Subtable->Length, DevicePathField->StringLength); > + > + /* Set the DataOffsetField to the current TableOffset */ > + /* Must set the DataOffsetField here (not later) */ > + > + if (DataOffsetValue != 0) > + { > + snprintf (DataOffsetField->Value, Subtable->Length, "%X", TableOffset); > + } > + > + DbgPrint (ASL_DEBUG_OUTPUT, "4 Offset: %X, Length: %X\n", TableOffset, Subtable->Length); > + > + DbgPrint (ASL_DEBUG_OUTPUT, "5 TableOffset: %X, DataOffsetField->StringLength: " > + "%X DevicePathField Length: %X DevicePathField->Value: %s, DataOffsetField->Value: %s DataOffsetField->ByteOffset %X\n", > + TableOffset, DataOffsetField->StringLength, DevicePathField->StringLength, > + DevicePathField->Value, DataOffsetField->Value, DataOffsetField->ByteOffset); > + > + /* Compile the middle portion of the Health Data Record */ > + > Info = AcpiDmTableInfoPhat1; > PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA); > break; > @@ -1406,16 +1476,19 @@ DtCompilePhat ( > > DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); > return (AE_ERROR); > - > - break; > } > > + /* Compile either the Version Data or the Health Data */ > + > Status = DtCompileTable (PFieldList, Info, &Subtable); > if (ACPI_FAILURE (Status)) > { > return (Status); > } > > + DbgPrint (ASL_DEBUG_OUTPUT, "6 Offset: %X, Name: \"%s\" SubtableLength: %X\n", > + TableOffset /* - StartTableOffset*/, (*PFieldList)->Name, Subtable->Length); > + > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > > @@ -1427,6 +1500,8 @@ DtCompilePhat ( > (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); > RecordCount = VersionData->ElementCount; > > + /* Compile all of the Version Elements */ > + > while (RecordCount) > { > Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a, > @@ -1435,17 +1510,29 @@ DtCompilePhat ( > { > return (Status); > } > + > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > > + TableOffset += Subtable->Length; > RecordCount--; > PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT); > } > + > + DtPopSubtable (); > break; > > case ACPI_PHAT_TYPE_FW_HEALTH_DATA: > > - /* Compile device path */ > + /* Compile the Device Path */ > + > + DeviceDataLength = Subtable->Length; > + TableOffset += Subtable->Length; > + > + DbgPrint (ASL_DEBUG_OUTPUT, "7 Device Path Length: %X FieldName: \"%s\" FieldLength: " > + "%s FieldValue: %s SubtableLength: %X TableOffset: %X\n", DeviceDataLength, > + (*PFieldList)->Name, DataOffsetField->Value, (*PFieldList)->Value, > + Subtable->Length, TableOffset); > > Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable); > if (ACPI_FAILURE (Status)) > @@ -1455,20 +1542,58 @@ DtCompilePhat ( > ParentTable = DtPeekSubtable (); > DtInsertSubtable (ParentTable, Subtable); > > + /* *PFieldList will be null if previous field was at the end-of-ParseTree (EOF) */ > + > + if (!*PFieldList) > + { > + DbgPrint (ASL_DEBUG_OUTPUT, "8 Exit on end-of-ParseTree\n"); > + return (AE_OK); > + } > + > + DbgPrint (ASL_DEBUG_OUTPUT, "9 Device Data Length: %X FieldName: \"%s" > + " TableOffset: %X FieldLength: %X Field Value: %s SubtableLength: %X\n", > + DeviceDataLength, (*PFieldList)->Name, TableOffset, > + (*PFieldList)->StringLength, (*PFieldList)->Value, Subtable->Length); > + > PhatHeader->Length += (UINT16) Subtable->Length; > > - /* Compile vendor specific data */ > + /* Convert DataOffsetField->Value (a hex char * string) to an integer value */ > > - Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable); > - if (ACPI_FAILURE (Status)) > + sscanf (DataOffsetField->Value, "%X", &DataOffsetValue); > + > + DbgPrint (ASL_DEBUG_OUTPUT, "10 Device-Specific Offset: %X Table Offset: %X\n", > + DataOffsetValue, TableOffset); > + if (DataOffsetValue != 0) > { > - return (Status); > + /* Compile Device-Specific Data - only if the Data Offset is non-zero */ > + > + Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + DbgPrint (ASL_DEBUG_OUTPUT, "11 Subtable: %p Table Offset: %X\n", > + Subtable, TableOffset); > + if (Subtable) > + { > + DbgPrint (ASL_DEBUG_OUTPUT, "12 Device Specific Offset: " > + "%X FieldName \"%s\" SubtableLength %X\n", > + DeviceDataLength, DataOffsetField->Name, Subtable->Length); > + > + DeviceDataLength += Subtable->Length; > + > + ParentTable = DtPeekSubtable (); > + DtInsertSubtable (ParentTable, Subtable); > + > + PhatHeader->Length += (UINT16) Subtable->Length; > + } > } > - ParentTable = DtPeekSubtable (); > - DtInsertSubtable (ParentTable, Subtable); > > - PhatHeader->Length += (UINT16) Subtable->Length; > + DtPopSubtable (); > > + DbgPrint (ASL_DEBUG_OUTPUT, "13 FieldName: \"%s\" FieldLength: %X Field Value: %s\n", > + DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value); > break; > > default: > diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h > index ad5af707..3ab99978 100644 > --- a/src/acpica/source/compiler/dttemplate.h > +++ b/src/acpica/source/compiler/dttemplate.h > @@ -341,6 +341,17 @@ const unsigned char TemplateBoot[] = > 0x28,0x05,0x10,0x20,0x00,0x00,0x00,0x00 /* 00000020 "(.. ...." */ > }; > > +const unsigned char TemplateCcel[] = > +{ > + 0x43,0x43,0x45,0x4C,0x38,0x00,0x00,0x00, /* 00000000 "CCEL8..." */ > + 0x04,0x1C,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ > + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ > + 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ > + 0x30,0x09,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "0.! ...." */ > + 0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,0x00, /* 00000028 "...xV4.." */ > + 0x78,0x56,0x34,0x12,0xEF,0xCD,0xAB,0x00 /* 00000030 "xV4....." */ > +}; > + > const unsigned char TemplateCedt[] = > { > 0x43,0x45,0x44,0x54,0x9c,0x01,0x00,0x00, /* 00000000 "CEDT...." */ > @@ -397,6 +408,39 @@ const unsigned char TemplateCedt[] = > 0x03,0x5e,0xba,0x00 /* 00000198 ".^.." */ > }; > > +const unsigned char TemplateCdat[] = > +{ > + 0xE4,0x00,0x00,0x00,0x01,0x0C,0x00,0x00, /* 00000000 "........" */ > + 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, /* 00000008 "........" */ > + 0x03,0x00,0x08,0x00,0x04,0x56,0x00,0x00, /* 00000010 ".....V.." */ > + 0x00,0x00,0x18,0x00,0xEF,0x01,0x00,0x00, /* 00000018 "........" */ > + 0x89,0x67,0x45,0x23,0x01,0x00,0x00,0x00, /* 00000020 ".gE#...." */ > + 0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000028 "........" */ > + 0x03,0x00,0x08,0x00,0x04,0x56,0x00,0x00, /* 00000030 ".....V.." */ > + 0x01,0x00,0x18,0x00,0x44,0x04,0x64,0x00, /* 00000038 "....D.d." */ > + 0xCD,0xAB,0x89,0x67,0x45,0x23,0x01,0x00, /* 00000040 "...gE#.." */ > + 0x33,0x22,0x44,0x33,0x55,0x44,0x00,0x00, /* 00000048 "3"D3UD.." */ > + 0x02,0x00,0x14,0x00,0x99,0x00,0x00,0x00, /* 00000050 "........" */ > + 0x00,0x00,0x00,0x00,0x78,0x56,0x34,0x12, /* 00000058 "....xV4." */ > + 0x55,0x55,0x44,0x44,0x04,0x00,0x18,0x00, /* 00000060 "UUDD...." */ > + 0x88,0x32,0x00,0x00,0x77,0x77,0x77,0x77, /* 00000068 ".2..wwww" */ > + 0x11,0x11,0x11,0x11,0x88,0x88,0x88,0x88, /* 00000070 "........" */ > + 0x22,0x22,0x22,0x22,0x05,0x00,0x20,0x00, /* 00000078 """"".. ." */ > + 0x04,0x00,0x00,0x00,0x44,0x44,0x44,0x44, /* 00000080 "....DDDD" */ > + 0x33,0x33,0x33,0x33,0x44,0x44,0x55,0x55, /* 00000088 "3333DDUU" */ > + 0x66,0x66,0x00,0x00,0x77,0x77,0x88,0x88, /* 00000090 "ff..ww.." */ > + 0x99,0x99,0x00,0x00,0x05,0x00,0x18,0x00, /* 00000098 "........" */ > + 0x04,0x00,0x00,0x00,0x22,0x22,0x22,0x22, /* 000000A0 "....""""" */ > + 0x11,0x11,0x11,0x11,0x34,0x12,0x56,0x78, /* 000000A8 "....4.Vx" */ > + 0x11,0x11,0x00,0x00,0x05,0x00,0x30,0x00, /* 000000B0 "......0." */ > + 0x08,0x00,0x00,0x00,0x66,0x66,0x66,0x66, /* 000000B8 "....ffff" */ > + 0x55,0x55,0x55,0x55,0x44,0x44,0x55,0x55, /* 000000C0 "UUUUDDUU" */ > + 0x66,0x66,0x00,0x00,0x77,0x77,0x88,0x88, /* 000000C8 "ff..ww.." */ > + 0x99,0x99,0x00,0x00,0xAA,0xAA,0xBB,0xBB, /* 000000D0 "........" */ > + 0xCC,0xCC,0x00,0x00,0x55,0x55,0x44,0x44, /* 000000D8 "....UUDD" */ > + 0x33,0x33,0x00,0x00 /* 000000E0 "33.." */ > +}; > + > const unsigned char TemplateCpep[] = > { > 0x43,0x50,0x45,0x50,0x34,0x00,0x00,0x00, /* 00000000 "CPEP4..." */ > @@ -1430,20 +1474,27 @@ const unsigned char TemplatePdtt[] = > > const unsigned char TemplatePhat [] = > { > - 0x50,0x48,0x41,0x54,0x6F,0x00,0x00,0x00, /* 00000000 "PHATo..." */ > - 0x01,0xC7,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ > + 0x50,0x48,0x41,0x54,0xA2,0x00,0x00,0x00, /* 00000000 "PHAT...." */ > + 0x01,0xCA,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" */ > - 0x05,0x01,0x21,0x20,0x00,0x00,0x28,0x00, /* 00000020 "..! ..(." */ > + 0x31,0x03,0x22,0x20,0x00,0x00,0x28,0x00, /* 00000020 "1." ..(." */ > 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, /* 00000028 "........" */ > 0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47, /* 00000030 "0....].G" */ > 0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49, /* 00000038 "...-.@.I" */ > 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01, /* 00000040 "........" */ > - 0x0C,0x0B,0x0A,0x09,0x01,0x00,0x23,0x00, /* 00000048 "......#." */ > + 0x0C,0x0B,0x0A,0x09,0x01,0x00,0x2E,0x00, /* 00000048 "........" */ > 0x00,0x00,0x00,0x00,0x30,0x05,0xAF,0x91, /* 00000050 "....0..." */ > 0x86,0x5D,0x0E,0x47,0xA6,0xB0,0x0A,0x2D, /* 00000058 ".].G...-" */ > - 0xB9,0x40,0x82,0x49,0x00,0x00,0x00,0x00, /* 00000060 ".@.I...." */ > - 0x61,0x73,0x64,0x66,0x00,0xFF,0x11 /* 00000068 "asdf..." */ > + 0xB9,0x40,0x82,0x49,0x2A,0x00,0x00,0x00, /* 00000060 ".@.I*..." */ > + 0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00, /* 00000068 "A.B.C.D." */ > + 0x45,0x00,0x46,0x00,0x00,0x00,0x01,0x02, /* 00000070 "E.F....." */ > + 0x03,0x04,0x00,0x00,0x28,0x00,0x00,0x00, /* 00000078 "....(..." */ > + 0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x05, /* 00000080 "......0." */ > + 0xAF,0x91,0x86,0x5D,0x0E,0x47,0xA6,0xB0, /* 00000088 "...].G.." */ > + 0x0A,0x2D,0xB9,0x40,0x82,0x49,0x08,0x07, /* 00000090 ".-.@.I.." */ > + 0x06,0x05,0x04,0x03,0x02,0x01,0x0C,0x0B, /* 00000098 "........" */ > + 0x0A,0x09 /* 000000A0 ".." */ > }; > > const unsigned char TemplatePmtt[] = > diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c > index e950763e..45bff3df 100644 > --- a/src/acpica/source/compiler/dtutils.c > +++ b/src/acpica/source/compiler/dtutils.c > @@ -601,6 +601,7 @@ DtGetFieldLength ( > case ACPI_DMT_AEST_XFACE: > case ACPI_DMT_AEST_XRUPT: > case ACPI_DMT_ASF: > + case ACPI_DMT_CDAT: > case ACPI_DMT_HESTNTYP: > case ACPI_DMT_FADTPM: > case ACPI_DMT_EINJACT: > @@ -800,7 +801,7 @@ DtSum ( > UINT8 *Sum = ReturnValue; > > > - Checksum = AcpiTbChecksum (Subtable->Buffer, Subtable->Length); > + Checksum = AcpiUtChecksum (Subtable->Buffer, Subtable->Length); > *Sum = (UINT8) (*Sum + Checksum); > } > > diff --git a/src/acpica/source/components/events/evevent.c b/src/acpica/source/components/events/evevent.c > index 8b08338a..b92646a4 100644 > --- a/src/acpica/source/components/events/evevent.c > +++ b/src/acpica/source/components/events/evevent.c > @@ -312,7 +312,8 @@ AcpiEvFixedEventInitialize ( > { > Status = AcpiWriteBitRegister ( > AcpiGbl_FixedEventInfo[i].EnableRegisterId, > - ACPI_DISABLE_EVENT); > + (i == ACPI_EVENT_PCIE_WAKE) ? > + ACPI_ENABLE_EVENT : ACPI_DISABLE_EVENT); > if (ACPI_FAILURE (Status)) > { > return (Status); > @@ -361,6 +362,11 @@ AcpiEvFixedEventDetect ( > return (IntStatus); > } > > + if (FixedEnable & ACPI_BITMASK_PCIEXP_WAKE_DISABLE) > + FixedEnable &= ~ACPI_BITMASK_PCIEXP_WAKE_DISABLE; > + else > + FixedEnable |= ACPI_BITMASK_PCIEXP_WAKE_DISABLE; > + > ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS, > "Fixed Event Block: Enable %08X Status %08X\n", > FixedEnable, FixedStatus)); > @@ -431,7 +437,8 @@ AcpiEvFixedEventDispatch ( > { > (void) AcpiWriteBitRegister ( > AcpiGbl_FixedEventInfo[Event].EnableRegisterId, > - ACPI_DISABLE_EVENT); > + (Event == ACPI_EVENT_PCIE_WAKE) ? > + ACPI_ENABLE_EVENT : ACPI_DISABLE_EVENT); > > ACPI_ERROR ((AE_INFO, > "No installed handler for fixed event - %s (%u), disabling", > diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c > index 6cf77791..fb0cc436 100644 > --- a/src/acpica/source/components/events/evregion.c > +++ b/src/acpica/source/components/events/evregion.c > @@ -329,6 +329,14 @@ AcpiEvAddressSpaceDispatch ( > Ctx->SubspaceId = (UINT8) RegionObj->Region.Address; > } > > + if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE) > + { > + ACPI_FFH_INFO *Ctx = HandlerDesc->AddressSpace.Context; > + > + Ctx->Length = RegionObj->Region.Length; > + Ctx->Offset = RegionObj->Region.Address; > + } > + > /* > * We must exit the interpreter because the region setup will > * potentially execute control methods (for example, the _REG method > diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c > index a87316ba..11c8ba64 100644 > --- a/src/acpica/source/components/executer/exconfig.c > +++ b/src/acpica/source/components/executer/exconfig.c > @@ -471,7 +471,7 @@ AcpiExLoadOp ( > } > if (Target->Common.Type != ACPI_TYPE_INTEGER) > { > - fprintf (stderr, "Type not integer: %X\n", Target->Common.Type); > + ACPI_ERROR ((AE_INFO, "Type not integer: %X", Target->Common.Type)); > return_ACPI_STATUS (AE_AML_OPERAND_TYPE); > } > > diff --git a/src/acpica/source/components/executer/exfield.c b/src/acpica/source/components/executer/exfield.c > index 2834e7b3..4175b8ee 100644 > --- a/src/acpica/source/components/executer/exfield.c > +++ b/src/acpica/source/components/executer/exfield.c > @@ -296,7 +296,8 @@ AcpiExReadDataFromField ( > (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS || > ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS || > ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI || > - ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT)) > + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT || > + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)) > { > /* SMBus, GSBus, IPMI serial */ > > @@ -469,7 +470,8 @@ AcpiExWriteDataToField ( > (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS || > ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS || > ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI || > - ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT)) > + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT || > + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)) > { > /* SMBus, GSBus, IPMI serial */ > > diff --git a/src/acpica/source/components/executer/exserial.c b/src/acpica/source/components/executer/exserial.c > index 4dfd6599..c92a895a 100644 > --- a/src/acpica/source/components/executer/exserial.c > +++ b/src/acpica/source/components/executer/exserial.c > @@ -484,6 +484,12 @@ AcpiExWriteSerialBus ( > Function = ACPI_WRITE; > break; > > + case ACPI_ADR_SPACE_FIXED_HARDWARE: > + > + BufferLength = ACPI_FFH_INPUT_BUFFER_SIZE; > + Function = ACPI_WRITE; > + break; > + > default: > return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID); > } > diff --git a/src/acpica/source/components/executer/exsystem.c b/src/acpica/source/components/executer/exsystem.c > index 62768bcf..44d3a00b 100644 > --- a/src/acpica/source/components/executer/exsystem.c > +++ b/src/acpica/source/components/executer/exsystem.c > @@ -338,18 +338,6 @@ AcpiExSystemDoSleep ( > > AcpiExExitInterpreter (); > > - /* > - * Warn users about excessive sleep times, so ASL code can be improved to > - * use polling or similar techniques. > - */ > - if (HowLongMs > 10) > - { > - ACPI_WARNING ((AE_INFO, > - "Firmware issue: Excessive sleep time (0x%8.8X%8.8X ms > 10 ms)" > - " in ACPI Control Method", > - ACPI_FORMAT_UINT64 (HowLongMs))); > - } > - > /* > * For compatibility with other ACPI implementations and to prevent > * accidental deep sleeps, limit the sleep time to something reasonable. > diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c > index 45ff336a..6667c27e 100644 > --- a/src/acpica/source/components/hardware/hwsleep.c > +++ b/src/acpica/source/components/hardware/hwsleep.c > @@ -475,6 +475,16 @@ AcpiHwLegacyWake ( > AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].StatusRegisterId, > ACPI_CLEAR_STATUS); > > + /* Enable pcie wake event if support */ > + if ((AcpiGbl_FADT.Flags & ACPI_FADT_PCI_EXPRESS_WAKE)) { > + (void) AcpiWriteBitRegister ( > + AcpiGbl_FixedEventInfo[ACPI_EVENT_PCIE_WAKE].EnableRegisterId, > + ACPI_DISABLE_EVENT); > + (void) AcpiWriteBitRegister ( > + AcpiGbl_FixedEventInfo[ACPI_EVENT_PCIE_WAKE].StatusRegisterId, > + ACPI_CLEAR_STATUS); > + } > + > AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING); > return_ACPI_STATUS (Status); > } > diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c > index 5e4f7ca7..d974d951 100644 > --- a/src/acpica/source/components/tables/tbdata.c > +++ b/src/acpica/source/components/tables/tbdata.c > @@ -724,7 +724,7 @@ AcpiTbVerifyTempTable ( > { > /* Verify the checksum */ > > - Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length); > + Status = AcpiUtVerifyChecksum (TableDesc->Pointer, TableDesc->Length); > if (ACPI_FAILURE (Status)) > { > ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY, > diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c > index 7ae35f19..97876614 100644 > --- a/src/acpica/source/components/tables/tbfadt.c > +++ b/src/acpica/source/components/tables/tbfadt.c > @@ -472,7 +472,7 @@ AcpiTbParseFadt ( > * Validate the FADT checksum before we copy the table. Ignore > * checksum error as we want to try to get the DSDT and FACS. > */ > - (void) AcpiTbVerifyChecksum (Table, Length); > + (void) AcpiUtVerifyChecksum (Table, Length); > > /* Create a local copy of the FADT in common ACPI 2.0+ format */ > > diff --git a/src/acpica/source/components/tables/tbprint.c b/src/acpica/source/components/tables/tbprint.c > index 0b53e737..cdad69af 100644 > --- a/src/acpica/source/components/tables/tbprint.c > +++ b/src/acpica/source/components/tables/tbprint.c > @@ -152,6 +152,8 @@ > #include "acpi.h" > #include "accommon.h" > #include "actables.h" > +#include "acdisasm.h" > +#include "acutils.h" > > #define _COMPONENT ACPI_TABLES > ACPI_MODULE_NAME ("tbprint") > @@ -192,7 +194,7 @@ AcpiTbFixString ( > > while (Length && *String) > { > - if (!isprint ((int) *String)) > + if (!isprint ((int) (UINT8) *String)) > { > *String = '?'; > } > @@ -293,89 +295,3 @@ AcpiTbPrintTableHeader ( > } > } > > - > -/******************************************************************************* > - * > - * FUNCTION: AcpiTbValidateChecksum > - * > - * PARAMETERS: Table - ACPI table to verify > - * Length - Length of entire table > - * > - * RETURN: Status > - * > - * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns > - * exception on bad checksum. > - * > - ******************************************************************************/ > - > -ACPI_STATUS > -AcpiTbVerifyChecksum ( > - ACPI_TABLE_HEADER *Table, > - UINT32 Length) > -{ > - UINT8 Checksum; > - > - > - /* > - * FACS/S3PT: > - * They are the odd tables, have no standard ACPI header and no checksum > - */ > - > - if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT) || > - ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) > - { > - return (AE_OK); > - } > - > - /* Compute the checksum on the table */ > - > - Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); > - > - /* Checksum ok? (should be zero) */ > - > - if (Checksum) > - { > - ACPI_BIOS_WARNING ((AE_INFO, > - "Incorrect checksum in table [%4.4s] - 0x%2.2X, " > - "should be 0x%2.2X", > - Table->Signature, Table->Checksum, > - (UINT8) (Table->Checksum - Checksum))); > - > -#if (ACPI_CHECKSUM_ABORT) > - return (AE_BAD_CHECKSUM); > -#endif > - } > - > - return (AE_OK); > -} > - > - > -/******************************************************************************* > - * > - * FUNCTION: AcpiTbChecksum > - * > - * PARAMETERS: Buffer - Pointer to memory region to be checked > - * Length - Length of this memory region > - * > - * RETURN: Checksum (UINT8) > - * > - * DESCRIPTION: Calculates circular checksum of memory region. > - * > - ******************************************************************************/ > - > -UINT8 > -AcpiTbChecksum ( > - UINT8 *Buffer, > - UINT32 Length) > -{ > - UINT8 Sum = 0; > - UINT8 *End = Buffer + Length; > - > - > - while (Buffer < End) > - { > - Sum = (UINT8) (Sum + *(Buffer++)); > - } > - > - return (Sum); > -} > diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c > index d2a30dc3..5188d26d 100644 > --- a/src/acpica/source/components/tables/tbutils.c > +++ b/src/acpica/source/components/tables/tbutils.c > @@ -471,7 +471,7 @@ AcpiTbParseRootTable ( > > /* Validate the root table checksum */ > > - Status = AcpiTbVerifyChecksum (Table, Length); > + Status = AcpiUtVerifyChecksum (Table, Length); > if (ACPI_FAILURE (Status)) > { > AcpiOsUnmapMemory (Table, Length); > diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c > index bb90f605..97cb65c7 100644 > --- a/src/acpica/source/components/tables/tbxfroot.c > +++ b/src/acpica/source/components/tables/tbxfroot.c > @@ -227,7 +227,7 @@ AcpiTbValidateRsdp ( > > /* Check the standard checksum */ > > - if (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) > + if (AcpiUtChecksum ((UINT8 *) Rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) > { > return (AE_BAD_CHECKSUM); > } > @@ -235,7 +235,7 @@ AcpiTbValidateRsdp ( > /* Check extended checksum if table version >= 2 */ > > if ((Rsdp->Revision >= 2) && > - (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) > + (AcpiUtChecksum ((UINT8 *) Rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) > { > return (AE_BAD_CHECKSUM); > } > @@ -271,6 +271,7 @@ AcpiFindRootPointer ( > UINT8 *TablePtr; > UINT8 *MemRover; > UINT32 PhysicalAddress; > + UINT32 EbdaWindowSize; > > > ACPI_FUNCTION_TRACE (AcpiFindRootPointer); > @@ -299,27 +300,40 @@ AcpiFindRootPointer ( > > /* EBDA present? */ > > - if (PhysicalAddress > 0x400) > + /* > + * Check that the EBDA pointer from memory is sane and does not point > + * above valid low memory > + */ > + if (PhysicalAddress > 0x400 && > + PhysicalAddress < 0xA0000) > { > /* > - * 1b) Search EBDA paragraphs (EBDA is required to be a > - * minimum of 1K length) > + * Calculate the scan window size > + * The EBDA is not guaranteed to be larger than a KiB and in case > + * that it is smaller, the scanning function would leave the low > + * memory and continue to the VGA range. > + */ > + EbdaWindowSize = ACPI_MIN(ACPI_EBDA_WINDOW_SIZE, > + 0xA0000 - PhysicalAddress); > + > + /* > + * 1b) Search EBDA paragraphs > */ > TablePtr = AcpiOsMapMemory ( > (ACPI_PHYSICAL_ADDRESS) PhysicalAddress, > - ACPI_EBDA_WINDOW_SIZE); > + EbdaWindowSize); > if (!TablePtr) > { > ACPI_ERROR ((AE_INFO, > "Could not map memory at 0x%8.8X for length %u", > - PhysicalAddress, ACPI_EBDA_WINDOW_SIZE)); > + PhysicalAddress, EbdaWindowSize)); > > return_ACPI_STATUS (AE_NO_MEMORY); > } > > MemRover = AcpiTbScanMemoryForRsdp ( > - TablePtr, ACPI_EBDA_WINDOW_SIZE); > - AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_WINDOW_SIZE); > + TablePtr, EbdaWindowSize); > + AcpiOsUnmapMemory (TablePtr, EbdaWindowSize); > > if (MemRover) > { > diff --git a/src/acpica/source/components/utilities/utcksum.c b/src/acpica/source/components/utilities/utcksum.c > new file mode 100644 > index 00000000..b8ea869b > --- /dev/null > +++ b/src/acpica/source/components/utilities/utcksum.c > @@ -0,0 +1,335 @@ > +/****************************************************************************** > + * > + * Module Name: utcksum - Support generating table checksums > + * > + *****************************************************************************/ > + > +/****************************************************************************** > + * > + * 1. Copyright Notice > + * > + * Some or all of this work - Copyright (c) 1999 - 2022, Intel Corp. > + * All rights reserved. > + * > + * 2. License > + * > + * 2.1. This is your license from Intel Corp. under its intellectual property > + * rights. You may have additional license terms from the party that provided > + * you this software, covering your right to use that party's intellectual > + * property rights. > + * > + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a > + * copy of the source code appearing in this file ("Covered Code") an > + * irrevocable, perpetual, worldwide license under Intel's copyrights in the > + * base code distributed originally by Intel ("Original Intel Code") to copy, > + * make derivatives, distribute, use and display any portion of the Covered > + * Code in any form, with the right to sublicense such rights; and > + * > + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent > + * license (with the right to sublicense), under only those claims of Intel > + * patents that are infringed by the Original Intel Code, to make, use, sell, > + * offer to sell, and import the Covered Code and derivative works thereof > + * solely to the minimum extent necessary to exercise the above copyright > + * license, and in no event shall the patent license extend to any additions > + * to or modifications of the Original Intel Code. No other license or right > + * is granted directly or by implication, estoppel or otherwise; > + * > + * The above copyright and patent license is granted only if the following > + * conditions are met: > + * > + * 3. Conditions > + * > + * 3.1. Redistribution of Source with Rights to Further Distribute Source. > + * Redistribution of source code of any substantial portion of the Covered > + * Code or modification with rights to further distribute source must include > + * the above Copyright Notice, the above License, this list of Conditions, > + * and the following Disclaimer and Export Compliance provision. In addition, > + * Licensee must cause all Covered Code to which Licensee contributes to > + * contain a file documenting the changes Licensee made to create that Covered > + * Code and the date of any change. Licensee must include in that file the > + * documentation of any changes made by any predecessor Licensee. Licensee > + * must include a prominent statement that the modification is derived, > + * directly or indirectly, from Original Intel Code. > + * > + * 3.2. Redistribution of Source with no Rights to Further Distribute Source. > + * Redistribution of source code of any substantial portion of the Covered > + * Code or modification without rights to further distribute source must > + * include the following Disclaimer and Export Compliance provision in the > + * documentation and/or other materials provided with distribution. In > + * addition, Licensee may not authorize further sublicense of source of any > + * portion of the Covered Code, and must include terms to the effect that the > + * license from Licensee to its licensee is limited to the intellectual > + * property embodied in the software Licensee provides to its licensee, and > + * not to intellectual property embodied in modifications its licensee may > + * make. > + * > + * 3.3. Redistribution of Executable. Redistribution in executable form of any > + * substantial portion of the Covered Code or modification must reproduce the > + * above Copyright Notice, and the following Disclaimer and Export Compliance > + * provision in the documentation and/or other materials provided with the > + * distribution. > + * > + * 3.4. Intel retains all right, title, and interest in and to the Original > + * Intel Code. > + * > + * 3.5. Neither the name Intel nor any other trademark owned or controlled by > + * Intel shall be used in advertising or otherwise to promote the sale, use or > + * other dealings in products derived from or relating to the Covered Code > + * without prior written authorization from Intel. > + * > + * 4. Disclaimer and Export Compliance > + * > + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED > + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE > + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, > + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY > + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY > + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A > + * PARTICULAR PURPOSE. > + * > + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES > + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR > + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, > + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY > + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL > + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS > + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY > + * LIMITED REMEDY. > + * > + * 4.3. Licensee shall not export, either directly or indirectly, any of this > + * software or system incorporating such software without first obtaining any > + * required license or other approval from the U. S. Department of Commerce or > + * any other agency or department of the United States Government. In the > + * event Licensee exports any such software from the United States or > + * re-exports any such software from a foreign destination, Licensee shall > + * ensure that the distribution and export/re-export of the software is in > + * compliance with all laws, regulations, orders, or other restrictions of the > + * U.S. Export Administration Regulations. Licensee agrees that neither it nor > + * any of its subsidiaries will export/re-export any technical data, process, > + * software, or service, directly or indirectly, to any country for which the > + * United States government or any agency thereof requires an export license, > + * other governmental approval, or letter of assurance, without first obtaining > + * such license, approval or letter. > + * > + ***************************************************************************** > + * > + * Alternatively, you may choose to be licensed under the terms of the > + * following license: > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions, and the following disclaimer, > + * without modification. > + * 2. Redistributions in binary form must reproduce at minimum a disclaimer > + * substantially similar to the "NO WARRANTY" disclaimer below > + * ("Disclaimer") and any redistribution must be conditioned upon > + * including a substantially similar Disclaimer requirement for further > + * binary redistribution. > + * 3. Neither the names of the above-listed copyright holders nor the names > + * of any contributors may be used to endorse or promote products derived > + * from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + * > + * Alternatively, you may choose to be licensed under the terms of the > + * GNU General Public License ("GPL") version 2 as published by the Free > + * Software Foundation. > + * > + *****************************************************************************/ > + > +#include "acpi.h" > +#include "accommon.h" > +#include "acdisasm.h" > +#include "acutils.h" > + > + > +/* This module used for application-level code only */ > + > +#define _COMPONENT ACPI_CA_DISASSEMBLER > + ACPI_MODULE_NAME ("utcksum") > + > + > +/******************************************************************************* > + * > + * FUNCTION: AcpiUtVerifyChecksum > + * > + * PARAMETERS: Table - ACPI table to verify > + * Length - Length of entire table > + * > + * RETURN: Status > + * > + * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns > + * exception on bad checksum. > + * Note: We don't have to check for a CDAT here, since CDAT is > + * not in the RSDT/XSDT, and the CDAT table is never installed > + * via ACPICA. > + * > + ******************************************************************************/ > + > +ACPI_STATUS > +AcpiUtVerifyChecksum ( > + ACPI_TABLE_HEADER *Table, > + UINT32 Length) > +{ > + UINT8 Checksum; > + > + > + /* > + * FACS/S3PT: > + * They are the odd tables, have no standard ACPI header and no checksum > + */ > + if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT) || > + ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) > + { > + return (AE_OK); > + } > + > + /* Compute the checksum on the table */ > + > + Length = Table->Length; > + Checksum = AcpiUtGenerateChecksum (ACPI_CAST_PTR (UINT8, Table), Length, Table->Checksum); > + > + /* Computed checksum matches table? */ > + > + if (Checksum != Table->Checksum) > + { > + ACPI_BIOS_WARNING ((AE_INFO, > + "Incorrect checksum in table [%4.4s] - 0x%2.2X, " > + "should be 0x%2.2X", > + Table->Signature, Table->Checksum, > + Table->Checksum - Checksum)); > + > +#if (ACPI_CHECKSUM_ABORT) > + return (AE_BAD_CHECKSUM); > +#endif > + } > + > + return (AE_OK); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: AcpiUtVerifyCdatChecksum > + * > + * PARAMETERS: Table - CDAT ACPI table to verify > + * Length - Length of entire table > + * > + * RETURN: Status > + * > + * DESCRIPTION: Verifies that the CDAT table checksums to zero. Optionally > + * returns an exception on bad checksum. > + * > + ******************************************************************************/ > + > +ACPI_STATUS > +AcpiUtVerifyCdatChecksum ( > + ACPI_TABLE_CDAT *CdatTable, > + UINT32 Length) > +{ > + UINT8 Checksum; > + > + > + /* Compute the checksum on the table */ > + > + Checksum = AcpiUtGenerateChecksum (ACPI_CAST_PTR (UINT8, CdatTable), > + CdatTable->Length, CdatTable->Checksum); > + > + /* Computed checksum matches table? */ > + > + if (Checksum != CdatTable->Checksum) > + { > + ACPI_BIOS_WARNING ((AE_INFO, > + "Incorrect checksum in table [%4.4s] - 0x%2.2X, " > + "should be 0x%2.2X", > + AcpiGbl_CDAT, CdatTable->Checksum, Checksum)); > + > +#if (ACPI_CHECKSUM_ABORT) > + return (AE_BAD_CHECKSUM); > +#endif > + } > + > + CdatTable->Checksum = Checksum; > + return (AE_OK); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: AcpiUtGenerateChecksum > + * > + * PARAMETERS: Table - Pointer to table to be checksummed > + * Length - Length of the table > + * OriginalChecksum - Value of the checksum field > + * > + * RETURN: 8 bit checksum of buffer > + * > + * DESCRIPTION: Computes an 8 bit checksum of the table. > + * > + ******************************************************************************/ > + > +UINT8 > +AcpiUtGenerateChecksum ( > + void *Table, > + UINT32 Length, > + UINT8 OriginalChecksum) > +{ > + UINT8 Checksum; > + > + > + /* Sum the entire table as-is */ > + > + Checksum = AcpiUtChecksum ((UINT8 *) Table, Length); > + > + /* Subtract off the existing checksum value in the table */ > + > + Checksum = (UINT8) (Checksum - OriginalChecksum); > + > + /* Compute and return the final checksum */ > + > + Checksum = (UINT8) (0 - Checksum); > + return (Checksum); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: AcpiUtChecksum > + * > + * PARAMETERS: Buffer - Pointer to memory region to be checked > + * Length - Length of this memory region > + * > + * RETURN: Checksum (UINT8) > + * > + * DESCRIPTION: Calculates circular checksum of memory region. > + * > + ******************************************************************************/ > + > +UINT8 > +AcpiUtChecksum ( > + UINT8 *Buffer, > + UINT32 Length) > +{ > + UINT8 Sum = 0; > + UINT8 *End = Buffer + Length; > + > + > + while (Buffer < End) > + { > + Sum = (UINT8) (Sum + *(Buffer++)); > + } > + > + return (Sum); > +} > diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c > index 7de4a9c3..43de5c0a 100644 > --- a/src/acpica/source/components/utilities/utglobal.c > +++ b/src/acpica/source/components/utilities/utglobal.c > @@ -287,6 +287,7 @@ ACPI_FIXED_EVENT_INFO AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] = > /* ACPI_EVENT_POWER_BUTTON */ {ACPI_BITREG_POWER_BUTTON_STATUS, ACPI_BITREG_POWER_BUTTON_ENABLE, ACPI_BITMASK_POWER_BUTTON_STATUS, ACPI_BITMASK_POWER_BUTTON_ENABLE}, > /* ACPI_EVENT_SLEEP_BUTTON */ {ACPI_BITREG_SLEEP_BUTTON_STATUS, ACPI_BITREG_SLEEP_BUTTON_ENABLE, ACPI_BITMASK_SLEEP_BUTTON_STATUS, ACPI_BITMASK_SLEEP_BUTTON_ENABLE}, > /* ACPI_EVENT_RTC */ {ACPI_BITREG_RT_CLOCK_STATUS, ACPI_BITREG_RT_CLOCK_ENABLE, ACPI_BITMASK_RT_CLOCK_STATUS, ACPI_BITMASK_RT_CLOCK_ENABLE}, > + /* ACPI_EVENT_PCIE_WAKE */ {ACPI_BITREG_PCIEXP_WAKE_STATUS, ACPI_BITREG_PCIEXP_WAKE_DISABLE, ACPI_BITMASK_PCIEXP_WAKE_STATUS, ACPI_BITMASK_PCIEXP_WAKE_DISABLE}, > }; > #endif /* !ACPI_REDUCED_HARDWARE */ > > diff --git a/src/acpica/source/components/utilities/utstring.c b/src/acpica/source/components/utilities/utstring.c > index 5af4c4d3..770f3078 100644 > --- a/src/acpica/source/components/utilities/utstring.c > +++ b/src/acpica/source/components/utilities/utstring.c > @@ -308,7 +308,7 @@ AcpiUtRepairName ( > return; > } > > - ACPI_COPY_NAMESEG (&OriginalName, Name); > + ACPI_COPY_NAMESEG (&OriginalName, &Name[0]); > > /* Check each character in the name */ > > @@ -321,10 +321,10 @@ AcpiUtRepairName ( > > /* > * Replace a bad character with something printable, yet technically > - * still invalid. This prevents any collisions with existing "good" > + * "odd". This prevents any collisions with existing "good" > * names in the namespace. > */ > - Name[i] = '*'; > + Name[i] = '_'; > FoundBadChar = TRUE; > } > > @@ -335,8 +335,8 @@ AcpiUtRepairName ( > if (!AcpiGbl_EnableInterpreterSlack) > { > ACPI_WARNING ((AE_INFO, > - "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", > - OriginalName, Name)); > + "Invalid character(s) in name (0x%.8X) %p, repaired: [%4.4s]", > + OriginalName, Name, &Name[0])); > } > else > { > diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h > index 8ba7dc28..04f7f4f0 100644 > --- a/src/acpica/source/include/acconfig.h > +++ b/src/acpica/source/include/acconfig.h > @@ -335,6 +335,8 @@ > > #define ACPI_PRM_INPUT_BUFFER_SIZE 26 > > +#define ACPI_FFH_INPUT_BUFFER_SIZE 256 > + > /* _SxD and _SxW control methods */ > > #define ACPI_NUM_SxD_METHODS 4 > diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h > index 352417cb..47ce0b15 100644 > --- a/src/acpica/source/include/acdisasm.h > +++ b/src/acpica/source/include/acdisasm.h > @@ -260,6 +260,7 @@ typedef enum > ACPI_DMT_AEST_XRUPT, > ACPI_DMT_AGDI, > ACPI_DMT_ASF, > + ACPI_DMT_CDAT, > ACPI_DMT_CEDT, > ACPI_DMT_DMAR, > ACPI_DMT_DMAR_SCOPE, > @@ -402,6 +403,16 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoBdat[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoBoot[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoBert[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoBgrt[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCcel[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdatTableHdr[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdatHeader[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat0[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat1[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat2[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat3[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat4[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat5[]; > +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdatEntries[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoCedtHdr[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoCedt0[]; > extern ACPI_DMTABLE_INFO AcpiDmTableInfoCedt1[]; > @@ -747,6 +758,14 @@ void > AcpiDmDumpAsf ( > ACPI_TABLE_HEADER *Table); > > +void > +AcpiDmDumpCcel ( > + ACPI_TABLE_HEADER *Table); > + > +void > +AcpiDmDumpCdat ( > + ACPI_TABLE_HEADER *Table); > + > void > AcpiDmDumpCedt ( > ACPI_TABLE_HEADER *Table); > diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h > index b8831b46..1850d94b 100644 > --- a/src/acpica/source/include/acglobal.h > +++ b/src/acpica/source/include/acglobal.h > @@ -167,6 +167,7 @@ ACPI_GLOBAL (ACPI_TABLE_LIST, AcpiGbl_RootTableList); > > ACPI_GLOBAL (ACPI_TABLE_HEADER *, AcpiGbl_DSDT); > ACPI_GLOBAL (ACPI_TABLE_HEADER, AcpiGbl_OriginalDsdtHeader); > +ACPI_INIT_GLOBAL (char *, AcpiGbl_CDAT, NULL); > ACPI_INIT_GLOBAL (UINT32, AcpiGbl_DsdtIndex, ACPI_INVALID_TABLE_INDEX); > ACPI_INIT_GLOBAL (UINT32, AcpiGbl_FacsIndex, ACPI_INVALID_TABLE_INDEX); > ACPI_INIT_GLOBAL (UINT32, AcpiGbl_XFacsIndex, ACPI_INVALID_TABLE_INDEX); > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index f62c16cb..7b779375 100644 > --- a/src/acpica/source/include/acpixf.h > +++ b/src/acpica/source/include/acpixf.h > @@ -154,7 +154,7 @@ > > /* Current ACPICA subsystem version in YYYYMMDD format */ > > -#define ACPI_CA_VERSION 0x20220331 > +#define ACPI_CA_VERSION 0x20221020 > > #include "acconfig.h" > #include "actypes.h" > diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h > index 40b79a47..e9b070f9 100644 > --- a/src/acpica/source/include/actables.h > +++ b/src/acpica/source/include/actables.h > @@ -345,16 +345,6 @@ AcpiTbPrintTableHeader( > ACPI_PHYSICAL_ADDRESS Address, > ACPI_TABLE_HEADER *Header); > > -UINT8 > -AcpiTbChecksum ( > - UINT8 *Buffer, > - UINT32 Length); > - > -ACPI_STATUS > -AcpiTbVerifyChecksum ( > - ACPI_TABLE_HEADER *Table, > - UINT32 Length); > - > void > AcpiTbCheckDsdtHeader ( > void); > diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h > index 633f7349..7ce3c21e 100644 > --- a/src/acpica/source/include/actbinfo.h > +++ b/src/acpica/source/include/actbinfo.h > @@ -161,6 +161,7 @@ > #define ACPI_BERT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_BERT,f) > #define ACPI_BGRT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_BGRT,f) > #define ACPI_BOOT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_BOOT,f) > +#define ACPI_CCEL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_CCEL,f) > #define ACPI_CPEP_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_CPEP,f) > #define ACPI_DBG2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_DBG2,f) > #define ACPI_DBGP_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_DBGP,f) > @@ -233,6 +234,15 @@ > #define ACPI_ASF2a_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_CONTROL_DATA,f) > #define ACPI_ASF3_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_RMCP,f) > #define ACPI_ASF4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_ADDRESS,f) > +#define ACPI_CDAT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_CDAT,f) > +#define ACPI_CDATH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_HEADER,f) > +#define ACPI_CDAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSMAS,f) > +#define ACPI_CDAT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSLBIS,f) > +#define ACPI_CDAT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSMSCIS,f) > +#define ACPI_CDAT3_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSIS,f) > +#define ACPI_CDAT4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSEMTS,f) > +#define ACPI_CDAT5_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_SSLBIS,f) > +#define ACPI_CDATE_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_SSLBE,f) > #define ACPI_CEDT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CEDT_HEADER, f) > #define ACPI_CEDT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CEDT_CHBS, f) > #define ACPI_CEDT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CEDT_CFMWS, f) > diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h > index 3de78b0d..340b636b 100644 > --- a/src/acpica/source/include/actbl1.h > +++ b/src/acpica/source/include/actbl1.h > @@ -189,6 +189,7 @@ > #define ACPI_SIG_HMAT "HMAT" /* Heterogeneous Memory Attributes Table */ > #define ACPI_SIG_HPET "HPET" /* High Precision Event Timer table */ > #define ACPI_SIG_IBFT "IBFT" /* iSCSI Boot Firmware Table */ > +#define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table*/ > > #define ACPI_SIG_S3PT "S3PT" /* S3 Performance (sub)Table */ > #define ACPI_SIG_PCCS "PCC" /* PCC Shared Memory Region */ > @@ -494,12 +495,154 @@ typedef struct acpi_table_boot > } ACPI_TABLE_BOOT; > > > + > +/******************************************************************************* > + * > + * CDAT - Coherent Device Attribute Table > + * Version 1 > + * > + * Conforms to the "Coherent Device Attribute Table (CDAT) Specification > + " (Revision 1.01, October 2020.) > + * > + ******************************************************************************/ > + > +typedef struct acpi_table_cdat > +{ > + UINT32 Length; /* Length of table in bytes, including this header */ > + UINT8 Revision; /* ACPI Specification minor version number */ > + UINT8 Checksum; /* To make sum of entire table == 0 */ > + UINT8 Reserved[6]; > + UINT32 Sequence; /* Used to detect runtime CDAT table changes */ > + > +} ACPI_TABLE_CDAT; > + > + > +/* CDAT common subtable header */ > + > +typedef struct acpi_cdat_header > +{ > + UINT8 Type; > + UINT8 Reserved; > + UINT16 Length; > + > +} ACPI_CDAT_HEADER; > + > +/* Values for Type field above */ > + > +enum AcpiCdatType > +{ > + ACPI_CDAT_TYPE_DSMAS = 0, > + ACPI_CDAT_TYPE_DSLBIS = 1, > + ACPI_CDAT_TYPE_DSMSCIS = 2, > + ACPI_CDAT_TYPE_DSIS = 3, > + ACPI_CDAT_TYPE_DSEMTS = 4, > + ACPI_CDAT_TYPE_SSLBIS = 5, > + ACPI_CDAT_TYPE_RESERVED = 6 /* 6 through 0xFF are reserved */ > +}; > + > + > +/* Subtable 0: Device Scoped Memory Affinity Structure (DSMAS) */ > + > +typedef struct acpi_cadt_dsmas > +{ > + UINT8 DsmadHandle; > + UINT8 Flags; > + UINT16 Reserved; > + UINT64 DpaBaseAddress; > + UINT64 DpaLength; > + > +} ACPI_CDAT_DSMAS; > + > +/* Flags for subtable above */ > + > +#define ACPI_CEDT_DSMAS_NON_VOLATILE (1 << 2) > + > + > +/* Subtable 1: Device scoped Latency and Bandwidth Information Structure (DSLBIS) */ > + > +typedef struct acpi_cdat_dslbis > +{ > + UINT8 Handle; > + UINT8 Flags; /* If Handle matches a DSMAS handle, the definition of this field matches > + * Flags field in HMAT System Locality Latency */ > + UINT8 DataType; > + UINT8 Reserved; > + UINT64 EntryBaseUnit; > + UINT16 Entry[3]; > + UINT16 Reserved2; > + > +} ACPI_CDAT_DSLBIS; > + > + > +/* Subtable 2: Device Scoped Memory Side Cache Information Structure (DSMSCIS) */ > + > +typedef struct acpi_cdat_dsmscis > +{ > + UINT8 DsmasHandle; > + UINT8 Reserved[3]; > + UINT64 SideCacheSize; > + UINT32 CacheAttributes; > + > +} ACPI_CDAT_DSMSCIS; > + > + > +/* Subtable 3: Device Scoped Initiator Structure (DSIS) */ > + > +typedef struct acpi_cdat_dsis > +{ > + UINT8 Flags; > + UINT8 Handle; > + UINT16 Reserved; > + > +} ACPI_CDAT_DSIS; > + > +/* Flags for above subtable */ > + > +#define ACPI_CDAT_DSIS_MEM_ATTACHED (1 << 0) > + > + > +/* Subtable 4: Device Scoped EFI Memory Type Structure (DSEMTS) */ > + > +typedef struct acpi_cdat_dsemts > +{ > + UINT8 DsmasHandle; > + UINT8 MemoryType; > + UINT16 Reserved; > + UINT64 DpaOffset; > + UINT64 RangeLength; > + > +} ACPI_CDAT_DSEMTS; > + > + > +/* Subtable 5: Switch Scoped Latency and Bandwidth Information Structure (SSLBIS) */ > + > +typedef struct acpi_cdat_sslbis > +{ > + UINT8 DataType; > + UINT8 Reserved[3]; > + UINT64 EntryBaseUnit; > + > +} ACPI_CDAT_SSLBIS; > + > + > +/* Sub-subtable for above, SslbeEntries field */ > + > +typedef struct acpi_cdat_sslbe > +{ > + UINT16 PortxId; > + UINT16 PortyId; > + UINT16 LatencyOrBandwidth; > + UINT16 Reserved; > + > +} ACPI_CDAT_SSLBE; > + > + > /******************************************************************************* > * > * CEDT - CXL Early Discovery Table > * Version 1 > * > - * Conforms to the "CXL Early Discovery Table" (CXL 2.0) > + * Conforms to the "CXL Early Discovery Table" (CXL 2.0, October 2020) > * > ******************************************************************************/ > > @@ -525,7 +668,9 @@ enum AcpiCedtType > { > ACPI_CEDT_TYPE_CHBS = 0, > ACPI_CEDT_TYPE_CFMWS = 1, > - ACPI_CEDT_TYPE_RESERVED = 2, > + ACPI_CEDT_TYPE_CXIMS = 2, > + ACPI_CEDT_TYPE_RDPAS = 3, > + ACPI_CEDT_TYPE_RESERVED = 4, > }; > > /* Values for version field above */ > @@ -583,6 +728,7 @@ typedef struct acpi_cedt_cfmws_target_element > /* Values for Interleave Arithmetic field above */ > > #define ACPI_CEDT_CFMWS_ARITHMETIC_MODULO (0) > +#define ACPI_CEDT_CFMWS_ARITHMETIC_XOR (1) > > /* Values for Restrictions field above */ > > @@ -592,6 +738,35 @@ typedef struct acpi_cedt_cfmws_target_element > #define ACPI_CEDT_CFMWS_RESTRICT_PMEM (1<<3) > #define ACPI_CEDT_CFMWS_RESTRICT_FIXED (1<<4) > > +/* 2: CXL XOR Interleave Math Structure */ > + > +struct acpi_cedt_cxims { > + ACPI_CEDT_HEADER Header; > + UINT16 Reserved1; > + UINT8 Hbig; > + UINT8 NrXormaps; > + UINT64 XormapList[]; > +}; > + > +/* 3: CXL RCEC Downstream Port Association Structure */ > + > +struct acpi_cedt_rdpas { > + ACPI_CEDT_HEADER Header; > + UINT8 Reserved1; > + UINT16 Length; > + UINT16 Segment; > + UINT16 Bdf; > + UINT8 Protocol; > + UINT64 Address; > +}; > + > +/* Masks for bdf field above */ > +#define ACPI_CEDT_RDPAS_BUS_MASK 0xff00 > +#define ACPI_CEDT_RDPAS_DEVICE_MASK 0x00f8 > +#define ACPI_CEDT_RDPAS_FUNCTION_MASK 0x0007 > + > +#define ACPI_CEDT_RDPAS_PROTOCOL_IO (0) > +#define ACPI_CEDT_RDPAS_PROTOCOL_CACHEMEM (1) > > /******************************************************************************* > * > diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h > index 3032c5e2..4be5f0fc 100644 > --- a/src/acpica/source/include/actbl2.h > +++ b/src/acpica/source/include/actbl2.h > @@ -171,6 +171,8 @@ > #define ACPI_SIG_AGDI "AGDI" /* Arm Generic Diagnostic Dump and Reset Device Interface */ > #define ACPI_SIG_APMT "APMT" /* Arm Performance Monitoring Unit table */ > #define ACPI_SIG_BDAT "BDAT" /* BIOS Data ACPI Table */ > +#define ACPI_SIG_CCEL "CCEL" /* CC Event Log Table */ > +#define ACPI_SIG_CDAT "CDAT" /* Coherent Device Attribute Table */ > #define ACPI_SIG_IORT "IORT" /* IO Remapping Table */ > #define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */ > #define ACPI_SIG_LPIT "LPIT" /* Low Power Idle Table */ > @@ -178,7 +180,6 @@ > #define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */ > #define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */ > #define ACPI_SIG_MPST "MPST" /* Memory Power State Table */ > -#define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */ > #define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */ > #define ACPI_SIG_NFIT "NFIT" /* NVDIMM Firmware Interface Table */ > #define ACPI_SIG_NHLT "NHLT" /* Non HD Audio Link Table */ > @@ -521,13 +522,31 @@ typedef struct acpi_table_bdat > > } ACPI_TABLE_BDAT; > > +/******************************************************************************* > + * > + * CCEL - CC-Event Log > + * From: "Guest-Host-Communication Interface (GHCI) for Intel > + * Trust Domain Extensions (Intel TDX)". Feb 2022 > + * > + ******************************************************************************/ > + > +typedef struct acpi_table_ccel > +{ > + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ > + UINT8 CCType; > + UINT8 CCSubType; > + UINT16 Reserved; > + UINT64 LogAreaMinimumLength; > + UINT64 LogAreaStartAddress; > + > +} ACPI_TABLE_CCEL; > > /******************************************************************************* > * > * IORT - IO Remapping Table > * > * Conforms to "IO Remapping Table System Software on ARM Platforms", > - * Document number: ARM DEN 0049E.d, Feb 2022 > + * Document number: ARM DEN 0049E.e, Sep 2022 > * > ******************************************************************************/ > > @@ -725,6 +744,7 @@ typedef struct acpi_iort_smmu_v3 > #define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1) > #define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (3<<1) > #define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3) > +#define ACPI_IORT_SMMU_V3_DEVICEID_VALID (1<<4) > > typedef struct acpi_iort_pmcg > { > @@ -1107,7 +1127,14 @@ enum AcpiMadtType > ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, > ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, > ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16, > - ACPI_MADT_TYPE_RESERVED = 17, /* 17 to 0x7F are reserved */ > + ACPI_MADT_TYPE_CORE_PIC = 17, > + ACPI_MADT_TYPE_LIO_PIC = 18, > + ACPI_MADT_TYPE_HT_PIC = 19, > + ACPI_MADT_TYPE_EIO_PIC = 20, > + ACPI_MADT_TYPE_MSI_PIC = 21, > + ACPI_MADT_TYPE_BIO_PIC = 22, > + ACPI_MADT_TYPE_LPC_PIC = 23, > + ACPI_MADT_TYPE_RESERVED = 24, /* 24 to 0x7F are reserved */ > ACPI_MADT_TYPE_OEM_RESERVED = 0x80 /* 0x80 to 0xFF are reserved for OEM use */ > }; > > @@ -1391,7 +1418,135 @@ typedef struct acpi_madt_multiproc_wakeup_mailbox > > #define ACPI_MP_WAKE_COMMAND_WAKEUP 1 > > -/* 17: OEM data */ > +/* 17: CPU Core Interrupt Controller (ACPI 6.5) */ > + > +typedef struct acpi_madt_core_pic { > + ACPI_SUBTABLE_HEADER Header; > + UINT8 Version; > + UINT32 ProcessorId; > + UINT32 CoreId; > + UINT32 Flags; > +} ACPI_MADT_CORE_PIC; > + > +/* Values for Version field above */ > + > +enum AcpiMadtCorePicVersion { > + ACPI_MADT_CORE_PIC_VERSION_NONE = 0, > + ACPI_MADT_CORE_PIC_VERSION_V1 = 1, > + ACPI_MADT_CORE_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ > +}; > + > +/* 18: Legacy I/O Interrupt Controller (ACPI 6.5) */ > + > +typedef struct acpi_madt_lio_pic { > + ACPI_SUBTABLE_HEADER Header; > + UINT8 Version; > + UINT64 Address; > + UINT16 Size; > + UINT8 Cascade[2]; > + UINT32 CascadeMap[2]; > +} ACPI_MADT_LIO_PIC; > + > +/* Values for Version field above */ > + > +enum AcpiMadtLioPicVersion { > + ACPI_MADT_LIO_PIC_VERSION_NONE = 0, > + ACPI_MADT_LIO_PIC_VERSION_V1 = 1, > + ACPI_MADT_LIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ > +}; > + > +/* 19: HT Interrupt Controller (ACPI 6.5) */ > + > +typedef struct acpi_madt_ht_pic { > + ACPI_SUBTABLE_HEADER Header; > + UINT8 Version; > + UINT64 Address; > + UINT16 Size; > + UINT8 Cascade[8]; > +} ACPI_MADT_HT_PIC; > + > +/* Values for Version field above */ > + > +enum AcpiMadtHtPicVersion { > + ACPI_MADT_HT_PIC_VERSION_NONE = 0, > + ACPI_MADT_HT_PIC_VERSION_V1 = 1, > + ACPI_MADT_HT_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ > +}; > + > +/* 20: Extend I/O Interrupt Controller (ACPI 6.5) */ > + > +typedef struct acpi_madt_eio_pic { > + ACPI_SUBTABLE_HEADER Header; > + UINT8 Version; > + UINT8 Cascade; > + UINT8 Node; > + UINT64 NodeMap; > +} ACPI_MADT_EIO_PIC; > + > +/* Values for Version field above */ > + > +enum AcpiMadtEioPicVersion { > + ACPI_MADT_EIO_PIC_VERSION_NONE = 0, > + ACPI_MADT_EIO_PIC_VERSION_V1 = 1, > + ACPI_MADT_EIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ > +}; > + > +/* 21: MSI Interrupt Controller (ACPI 6.5) */ > + > +typedef struct acpi_madt_msi_pic { > + ACPI_SUBTABLE_HEADER Header; > + UINT8 Version; > + UINT64 MsgAddress; > + UINT32 Start; > + UINT32 Count; > +} ACPI_MADT_MSI_PIC; > + > +/* Values for Version field above */ > + > +enum AcpiMadtMsiPicVersion { > + ACPI_MADT_MSI_PIC_VERSION_NONE = 0, > + ACPI_MADT_MSI_PIC_VERSION_V1 = 1, > + ACPI_MADT_MSI_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ > +}; > + > +/* 22: Bridge I/O Interrupt Controller (ACPI 6.5) */ > + > +typedef struct acpi_madt_bio_pic { > + ACPI_SUBTABLE_HEADER Header; > + UINT8 Version; > + UINT64 Address; > + UINT16 Size; > + UINT16 Id; > + UINT16 GsiBase; > +} ACPI_MADT_BIO_PIC; > + > +/* Values for Version field above */ > + > +enum AcpiMadtBioPicVersion { > + ACPI_MADT_BIO_PIC_VERSION_NONE = 0, > + ACPI_MADT_BIO_PIC_VERSION_V1 = 1, > + ACPI_MADT_BIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ > +}; > + > +/* 23: LPC Interrupt Controller (ACPI 6.5) */ > + > +typedef struct acpi_madt_lpc_pic { > + ACPI_SUBTABLE_HEADER Header; > + UINT8 Version; > + UINT64 Address; > + UINT16 Size; > + UINT8 Cascade; > +} ACPI_MADT_LPC_PIC; > + > +/* Values for Version field above */ > + > +enum AcpiMadtLpcPicVersion { > + ACPI_MADT_LPC_PIC_VERSION_NONE = 0, > + ACPI_MADT_LPC_PIC_VERSION_V1 = 1, > + ACPI_MADT_LPC_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ > +}; > + > +/* 80: OEM data */ > > typedef struct acpi_madt_oem_data > { > diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h > index 99588f67..92da002a 100644 > --- a/src/acpica/source/include/actypes.h > +++ b/src/acpica/source/include/actypes.h > @@ -873,7 +873,8 @@ typedef UINT32 ACPI_EVENT_TYPE; > #define ACPI_EVENT_POWER_BUTTON 2 > #define ACPI_EVENT_SLEEP_BUTTON 3 > #define ACPI_EVENT_RTC 4 > -#define ACPI_EVENT_MAX 4 > +#define ACPI_EVENT_PCIE_WAKE 5 > +#define ACPI_EVENT_MAX 5 > #define ACPI_NUM_FIXED_EVENTS ACPI_EVENT_MAX + 1 > > /* > @@ -1335,6 +1336,12 @@ typedef struct acpi_pcc_info { > UINT8 *InternalBuffer; > } ACPI_PCC_INFO; > > +/* Special Context data for FFH Opregion (ACPI 6.5) */ > + > +typedef struct acpi_ffh_info { > + UINT64 Offset; > + UINT64 Length; > +} ACPI_FFH_INFO; > > typedef > ACPI_STATUS (*ACPI_ADR_SPACE_SETUP) ( > diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h > index f23ee559..a0e7953b 100644 > --- a/src/acpica/source/include/acutils.h > +++ b/src/acpica/source/include/acutils.h > @@ -317,6 +317,31 @@ AcpiUtCheckAndRepairAscii ( > UINT32 Count); > > > +/* > + * utcksum - Checksum utilities > + */ > +UINT8 > +AcpiUtGenerateChecksum ( > + void *Table, > + UINT32 Length, > + UINT8 OriginalChecksum); > + > +UINT8 > +AcpiUtChecksum ( > + UINT8 *Buffer, > + UINT32 Length); > + > +ACPI_STATUS > +AcpiUtVerifyCdatChecksum ( > + ACPI_TABLE_CDAT *CdatTable, > + UINT32 Length); > + > +ACPI_STATUS > +AcpiUtVerifyChecksum ( > + ACPI_TABLE_HEADER *Table, > + UINT32 Length); > + > + > /* > * utnonansi - Non-ANSI C library functions > */ > diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h > index bc41fa40..2ab07bb3 100644 > --- a/src/acpica/source/include/acuuid.h > +++ b/src/acpica/source/include/acuuid.h > @@ -211,5 +211,6 @@ > #define UUID_HIERARCHICAL_DATA_EXTENSION "dbb8e3e6-5886-4ba6-8795-1319f52a966b" > #define UUID_CORESIGHT_GRAPH "3ecbc8b6-1d0e-4fb3-8107-e627f805c6cd" > #define UUID_USB4_CAPABILITIES "23a0d13a-26ab-486c-9c5f-0ffa525a575a" > - > +#define UUID_1ST_FUNCTION_ID "893f00a6-660c-494e-bcfd-3043f4fb67c0" > +#define UUID_2ND_FUNCTION_ID "107ededd-d381-4fd7-8da9-08e9a6c79644" > #endif /* __ACUUID_H__ */ > diff --git a/src/libfwtsacpica/Makefile.am b/src/libfwtsacpica/Makefile.am > index 57cd7b82..ee515597 100644 > --- a/src/libfwtsacpica/Makefile.am > +++ b/src/libfwtsacpica/Makefile.am > @@ -236,6 +236,7 @@ libfwtsacpica_la_SOURCES = \ > ../../src/acpica/source/components/utilities/utalloc.c \ > ../../src/acpica/source/components/utilities/utascii.c \ > ../../src/acpica/source/components/utilities/utcache.c \ > + ../../src/acpica/source/components/utilities/utcksum.c \ > ../../src/acpica/source/components/utilities/utcopy.c \ > ../../src/acpica/source/components/utilities/utdebug.c \ > ../../src/acpica/source/components/utilities/utdelete.c \ > diff --git a/src/libfwtsacpica/fwts_acpica.c b/src/libfwtsacpica/fwts_acpica.c > index 50231464..35e26c05 100644 > --- a/src/libfwtsacpica/fwts_acpica.c > +++ b/src/libfwtsacpica/fwts_acpica.c > @@ -1104,7 +1104,7 @@ int fwts_acpica_init(fwts_framework *fw) > } > > fwts_acpica_FADT->Header.Checksum = 0; > - fwts_acpica_FADT->Header.Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_FADT, table->length); > + fwts_acpica_FADT->Header.Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_FADT, table->length); > } else { > fwts_acpica_FADT = NULL; > } > @@ -1144,7 +1144,7 @@ int fwts_acpica_init(fwts_framework *fw) > } > } > fwts_acpica_XSDT->Header.Checksum = 0; > - fwts_acpica_XSDT->Header.Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_XSDT, table->length); > + fwts_acpica_XSDT->Header.Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_XSDT, table->length); > } else { > fwts_acpica_XSDT = NULL; > } > @@ -1180,7 +1180,7 @@ int fwts_acpica_init(fwts_framework *fw) > } > } > fwts_acpica_RSDT->Header.Checksum = 0; > - fwts_acpica_RSDT->Header.Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_RSDT, table->length); > + fwts_acpica_RSDT->Header.Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_RSDT, table->length); > } else { > fwts_acpica_RSDT = NULL; > } > @@ -1199,7 +1199,7 @@ int fwts_acpica_init(fwts_framework *fw) > if (table->length > 20) > fwts_acpica_RSDP->XsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR(fwts_acpica_XSDT); > fwts_acpica_RSDP->RsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR(fwts_acpica_RSDT); > - fwts_acpica_RSDP->Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_RSDP, ACPI_RSDP_CHECKSUM_LENGTH); > + fwts_acpica_RSDP->Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_RSDP, ACPI_RSDP_CHECKSUM_LENGTH); > } else { > fwts_acpica_RSDP = NULL; > } Acked-by: Ivan Hu<ivan.hu@canonical.com>
diff --git a/src/acpica/source/common/acfileio.c b/src/acpica/source/common/acfileio.c index 7c624f5d..77f7337a 100644 --- a/src/acpica/source/common/acfileio.c +++ b/src/acpica/source/common/acfileio.c @@ -387,16 +387,36 @@ AcGetOneTableFromFile ( ACPI_TABLE_HEADER TableHeader; ACPI_TABLE_HEADER *Table; INT32 Count; - long TableOffset; - + UINT32 TableLength; + UINT32 HeaderLength; + long TableOffset = 0; *ReturnTable = NULL; /* Get the table header to examine signature and length */ + /* + * Special handling for the CDAT table (both the Length field + * and the Checksum field are not in the standard positions). + * (The table header is non-standard). + */ + if (AcpiGbl_CDAT) + { + HeaderLength = sizeof (ACPI_TABLE_CDAT); + } + else + { + HeaderLength = sizeof (ACPI_TABLE_HEADER); + } + + Status = AcValidateTableHeader (File, TableOffset); + if (ACPI_FAILURE (Status)) + { + return (Status); + } TableOffset = ftell (File); - Count = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File); - if (Count != sizeof (ACPI_TABLE_HEADER)) + Count = fread (&TableHeader, 1, HeaderLength, File); + if (Count != (INT32) HeaderLength) { return (AE_CTRL_TERMINATE); } @@ -405,12 +425,6 @@ AcGetOneTableFromFile ( { /* Validate the table signature/header (limited ASCII chars) */ - Status = AcValidateTableHeader (File, TableOffset); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - /* * Table must be an AML table (DSDT/SSDT). * Used for iASL -e option only. @@ -425,9 +439,22 @@ AcGetOneTableFromFile ( } } + /* + * Special handling for the CDAT table (both the Length field + * and the Checksum field are not in the standard positions). + */ + if (AcpiGbl_CDAT) + { + TableLength = ACPI_CAST_PTR (ACPI_TABLE_CDAT, &TableHeader)->Length; + } + else + { + TableLength = TableHeader.Length; + } + /* Allocate a buffer for the entire table */ - Table = AcpiOsAllocate ((ACPI_SIZE) TableHeader.Length); + Table = AcpiOsAllocate ((ACPI_SIZE) TableLength); if (!Table) { return (AE_NO_MEMORY); @@ -436,22 +463,31 @@ AcGetOneTableFromFile ( /* Read the entire ACPI table, including header */ fseek (File, TableOffset, SEEK_SET); - - Count = fread (Table, 1, TableHeader.Length, File); + Count = fread (Table, 1, TableLength, File); /* * Checks for data table headers happen later in the execution. Only verify * for Aml tables at this point in the code. */ - if (GetOnlyAmlTables && Count != (INT32) TableHeader.Length) + if (GetOnlyAmlTables && Count != (INT32) TableLength) { Status = AE_ERROR; goto ErrorExit; } - /* Validate the checksum (just issue a warning) */ + /* + * Validate the checksum (just issue a warning if incorrect). + * Note: CDAT is special cased here because the table does + * not have the checksum field in the standard position. + */ + if (AcpiGbl_CDAT) + { + Status = AcpiUtVerifyCdatChecksum ((ACPI_TABLE_CDAT *) Table, TableLength); + } else + { + Status = AcpiUtVerifyChecksum (Table, TableLength); + } - Status = AcpiTbVerifyChecksum (Table, TableHeader.Length); if (ACPI_FAILURE (Status)) { Status = AcCheckTextModeCorruption (Table); @@ -540,6 +576,8 @@ AcValidateTableHeader ( long TableOffset) { ACPI_TABLE_HEADER TableHeader; + ACPI_TABLE_CDAT *CdatTableHeader = ACPI_CAST_PTR (ACPI_TABLE_CDAT, &TableHeader); + UINT32 HeaderLength; ACPI_SIZE Actual; long OriginalOffset; UINT32 FileSize; @@ -548,6 +586,16 @@ AcValidateTableHeader ( ACPI_FUNCTION_TRACE (AcValidateTableHeader); + /* Determine the type of table header */ + + if (AcpiGbl_CDAT) + { + HeaderLength = sizeof (ACPI_TABLE_CDAT); + } + else + { + HeaderLength = sizeof (ACPI_TABLE_HEADER); + } /* Read a potential table header */ @@ -556,41 +604,76 @@ AcValidateTableHeader ( { fprintf (stderr, "SEEK error\n"); } - Actual = fread (&TableHeader, 1, sizeof (ACPI_TABLE_HEADER), File); + Actual = fread (&TableHeader, 1, HeaderLength, File); if (fseek (File, OriginalOffset, SEEK_SET)) { fprintf (stderr, "SEEK error\n"); } - if (Actual < sizeof (ACPI_TABLE_HEADER)) + if (Actual < HeaderLength) { fprintf (stderr, "Could not read entire table header: Actual %u, Requested %u\n", - (UINT32) Actual, (UINT32) sizeof (ACPI_TABLE_HEADER)); + (UINT32) Actual, HeaderLength); return (AE_ERROR); } /* Validate the signature (limited ASCII chars) */ - if (!AcpiUtValidNameseg (TableHeader.Signature)) + if (!AcpiGbl_CDAT && !AcpiUtValidNameseg (TableHeader.Signature)) { + /* + * The "-ds cdat" option was not used, and the signature is not valid. + * + * For CDAT we are assuming that there should be at least one non-ASCII + * byte in the (normally) 4-character Signature field (at least the + * high-order byte should be zero). Otherwise, this is OK. + */ + fprintf (stderr, + "\nTable appears to be a CDAT table, which has no signature.\n" + "If this is in fact a CDAT table, use the -ds option on the\n" + "command line to specify the table type (signature):\n" + "\"iasl -d -ds CDAT <file>\" or \"iasl -ds CDAT -T CDAT\"\n\n"); + return (AE_BAD_SIGNATURE); } /* Validate table length against bytes remaining in the file */ FileSize = CmGetFileSize (File); - if (TableHeader.Length > (UINT32) (FileSize - TableOffset)) + if (!AcpiGbl_CDAT) + { + /* Standard ACPI table header */ + + if (TableHeader.Length > (UINT32) (FileSize - TableOffset)) + { + fprintf (stderr, "Table [%4.4s] is too long for file - " + "needs: 0x%.2X, remaining in file: 0x%.2X\n", + TableHeader.Signature, TableHeader.Length, + (UINT32) (FileSize - TableOffset)); + return (AE_BAD_HEADER); + } + } + else if (CdatTableHeader->Length > (UINT32) (FileSize - TableOffset)) { - fprintf (stderr, "Table [%4.4s] is too long for file - " + /* Special header for CDAT table */ + + fprintf (stderr, "Table [CDAT] is too long for file - " "needs: 0x%.2X, remaining in file: 0x%.2X\n", - TableHeader.Signature, TableHeader.Length, + CdatTableHeader->Length, (UINT32) (FileSize - TableOffset)); return (AE_BAD_HEADER); } + /* For CDAT table, there are no ASCII fields in the header, we are done */ + + if (AcpiGbl_CDAT) + { + return (AE_OK); + } + /* - * These fields must be ASCII: OemId, OemTableId, AslCompilerId. + * These standard fields must be ASCII: OemId, OemTableId, AslCompilerId. * We allow a NULL terminator in OemId and OemTableId. */ for (i = 0; i < ACPI_NAMESEG_SIZE; i++) diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c index ecb98485..49338e74 100644 --- a/src/acpica/source/common/adisasm.c +++ b/src/acpica/source/common/adisasm.c @@ -476,13 +476,13 @@ AdDisassembleOneTable ( /* This is a "Data Table" (non-AML table) */ AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n", - Table->Signature); + AcpiGbl_CDAT ? (char *) AcpiGbl_CDAT : Table->Signature); AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] " "FieldName : FieldValue (in hex)\n */\n\n"); AcpiDmDumpDataTable (Table); fprintf (stderr, "Acpi Data Table [%4.4s] decoded\n", - Table->Signature); + AcpiGbl_CDAT ? (char *) AcpiGbl_CDAT : Table->Signature); if (File) { diff --git a/src/acpica/source/common/ahtable.c b/src/acpica/source/common/ahtable.c index bff8ae79..418621b6 100644 --- a/src/acpica/source/common/ahtable.c +++ b/src/acpica/source/common/ahtable.c @@ -206,6 +206,8 @@ const AH_TABLE AcpiGbl_SupportedTables[] = {ACPI_SIG_BERT, "Boot Error Record Table"}, {ACPI_SIG_BGRT, "Boot Graphics Resource Table"}, {ACPI_SIG_BOOT, "Simple Boot Flag Table"}, + {ACPI_SIG_CCEL, "CC-Event Log Table"}, + {ACPI_SIG_CDAT, "Coherent Device Attribute Table"}, {ACPI_SIG_CEDT, "CXL Early Discovery Table"}, {ACPI_SIG_CPEP, "Corrected Platform Error Polling Table"}, {ACPI_SIG_CSRT, "Core System Resource Table"}, diff --git a/src/acpica/source/common/ahuuids.c b/src/acpica/source/common/ahuuids.c index 909698c5..dcf0c4bb 100644 --- a/src/acpica/source/common/ahuuids.c +++ b/src/acpica/source/common/ahuuids.c @@ -209,6 +209,9 @@ const AH_UUID Gbl_AcpiUuids[] = {"Hierarchical Data Extension", UUID_HIERARCHICAL_DATA_EXTENSION}, {"ARM Coresight Graph", UUID_CORESIGHT_GRAPH}, {"USB4 Capabilities", UUID_USB4_CAPABILITIES}, + {"First Function ID for _DSM", UUID_1ST_FUNCTION_ID}, + {"Second Function ID for _DSM", UUID_2ND_FUNCTION_ID}, + {NULL, NULL} }; diff --git a/src/acpica/source/common/dmtable.c b/src/acpica/source/common/dmtable.c index 440c5fb4..9b95ecc7 100644 --- a/src/acpica/source/common/dmtable.c +++ b/src/acpica/source/common/dmtable.c @@ -234,6 +234,17 @@ static const char *AcpiDmAsfSubnames[] = "Unknown Subtable Type" /* Reserved */ }; +static const char *AcpiDmCdatSubnames[] = +{ + "Device Scoped Memory Affinity Structure (DSMAS)", + "Device scoped Latency and Bandwidth Information Structure (DSLBIS)", + "Device Scoped Memory Side Cache Information Structure (DSMSCIS)", + "Device Scoped Initiator Structure (DSIS)", + "Device Scoped EFI Memory Type Structure (DSEMTS)", + "Switch Scoped Latency and Bandwidth Information Structure (SSLBIS)", + "Unknown Subtable Type" /* Reserved */ +}; + static const char *AcpiDmCedtSubnames[] = { "CXL Host Bridge Structure", @@ -403,6 +414,13 @@ static const char *AcpiDmMadtSubnames[] = "Generic Interrupt Redistributor", /* ACPI_MADT_GENERIC_REDISTRIBUTOR */ "Generic Interrupt Translator", /* ACPI_MADT_GENERIC_TRANSLATOR */ "Mutiprocessor Wakeup", /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */ + "CPU Core Interrupt Controller", /* ACPI_MADT_TYPE_CORE_PIC */ + "Legacy I/O Interrupt Controller", /* ACPI_MADT_TYPE_LIO_PIC */ + "HT Interrupt Controller", /* ACPI_MADT_TYPE_HT_PIC */ + "Extend I/O Interrupt Controller", /* ACPI_MADT_TYPE_EIO_PIC */ + "MSI Interrupt Controller", /* ACPI_MADT_TYPE_MSI_PIC */ + "Bridge I/O Interrupt Controller", /* ACPI_MADT_TYPE_BIO_PIC */ + "LPC Interrupt Controller", /* ACPI_MADT_TYPE_LPC_PIC */ "Unknown Subtable Type", /* Reserved */ "Types 80-FF are used for OEM data" /* Reserved for OEM data */ }; @@ -658,6 +676,8 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert}, {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt}, {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot}, + {ACPI_SIG_CCEL, AcpiDmTableInfoCcel, NULL, NULL, TemplateCcel}, + {ACPI_SIG_CDAT, NULL, AcpiDmDumpCdat, NULL, TemplateCdat}, {ACPI_SIG_CEDT, NULL, AcpiDmDumpCedt, DtCompileCedt, TemplateCedt}, {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep}, {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt}, @@ -722,44 +742,6 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] = }; -/******************************************************************************* - * - * FUNCTION: AcpiDmGenerateChecksum - * - * PARAMETERS: Table - Pointer to table to be checksummed - * Length - Length of the table - * OriginalChecksum - Value of the checksum field - * - * RETURN: 8 bit checksum of buffer - * - * DESCRIPTION: Computes an 8 bit checksum of the table. - * - ******************************************************************************/ - -UINT8 -AcpiDmGenerateChecksum ( - void *Table, - UINT32 Length, - UINT8 OriginalChecksum) -{ - UINT8 Checksum; - - - /* Sum the entire table as-is */ - - Checksum = AcpiTbChecksum ((UINT8 *) Table, Length); - - /* Subtract off the existing checksum value in the table */ - - Checksum = (UINT8) (Checksum - OriginalChecksum); - - /* Compute the final checksum */ - - Checksum = (UINT8) (0 - Checksum); - return (Checksum); -} - - /******************************************************************************* * * FUNCTION: AcpiDmGetTableData @@ -834,7 +816,7 @@ AcpiDmDumpDataTable ( /* * Handle tables that don't use the common ACPI table header structure. - * Currently, these are the FACS, RSDP, and S3PT. + * Currently, these are the FACS, RSDP, S3PT and CDAT. */ if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) { @@ -854,6 +836,28 @@ AcpiDmDumpDataTable ( { Length = AcpiDmDumpS3pt (Table); } + else if (!AcpiUtValidNameseg (Table->Signature)) + { + /* + * For CDAT we are assuming that there should be at least one non-ASCII + * byte in the (normally) 4-character Signature field (at least the + * high-order byte should be zero). + */ + if (AcpiGbl_CDAT) + { + /* + * Invalid signature and <-ds CDAT> was specified on the command line. + * Therefore, we have a CDAT table. + */ + AcpiDmDumpCdat (Table); + } + else + { + fprintf (stderr, "Table has an invalid signature\n"); + } + + return; + } else { /* @@ -977,7 +981,7 @@ AcpiDmLineHeader ( { if (ByteLength) { - AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ", + AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %27s : ", Offset, Offset, ByteLength, Name); } else @@ -1019,12 +1023,12 @@ AcpiDmLineHeader2 ( { if (ByteLength) { - AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ", + AcpiOsPrintf ("[%3.3Xh %4.4u %3.3Xh] %24s %3d : ", Offset, Offset, ByteLength, Name, Value); } else { - AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ", + AcpiOsPrintf ("[%3.3Xh %4.4u ] %24s %3d : ", Offset, Offset, Name, Value); } } @@ -1106,7 +1110,8 @@ AcpiDmDumpTable ( { AcpiOsPrintf ( "/**** ACPI table terminates " - "in the middle of a data structure! (dump table) */\n"); + "in the middle of a data structure! (dump table) \n" + "CurrentOffset: %X, TableLength: %X ***/", CurrentOffset, TableLength); return (AE_BAD_DATA); } @@ -1140,6 +1145,7 @@ AcpiDmDumpTable ( case ACPI_DMT_AEST_XFACE: case ACPI_DMT_AEST_XRUPT: case ACPI_DMT_ASF: + case ACPI_DMT_CDAT: case ACPI_DMT_HESTNTYP: case ACPI_DMT_FADTPM: case ACPI_DMT_EINJACT: @@ -1522,7 +1528,7 @@ AcpiDmDumpTable ( /* Checksum, display and validate */ AcpiOsPrintf ("%2.2X", *Target); - Temp8 = AcpiDmGenerateChecksum (Table, + Temp8 = AcpiUtGenerateChecksum (Table, ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length, ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum); @@ -1668,6 +1674,20 @@ AcpiDmDumpTable ( AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]); break; + case ACPI_DMT_CDAT: + + /* CDAT subtable types */ + + Temp8 = *Target; + if (Temp8 > ACPI_CDAT_TYPE_RESERVED) + { + Temp8 = ACPI_CDAT_TYPE_RESERVED; + } + + AcpiOsPrintf (UINT8_FORMAT, *Target, + AcpiDmCdatSubnames[Temp8]); + break; + case ACPI_DMT_CEDT: /* CEDT subtable types */ @@ -2017,15 +2037,15 @@ AcpiDmDumpTable ( case ACPI_DMT_PHAT: - /* PMTT subtable types */ + /* PHAT subtable types */ - Temp16 = *Target; + Temp16 = ACPI_GET16 (Target); if (Temp16 > ACPI_PHAT_TYPE_RESERVED) { Temp16 = ACPI_PHAT_TYPE_RESERVED; } - AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target), + AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmPhatSubnames[Temp16]); break; @@ -2069,7 +2089,7 @@ AcpiDmDumpTable ( break; } - AcpiDmDumpUnicode (Table, CurrentOffset, ByteLength); + AcpiDmDumpUnicode (Table, 0, ByteLength); break; case ACPI_DMT_RAW_BUFFER: diff --git a/src/acpica/source/common/dmtables.c b/src/acpica/source/common/dmtables.c index 6f42bcb3..7ade7868 100644 --- a/src/acpica/source/common/dmtables.c +++ b/src/acpica/source/common/dmtables.c @@ -296,7 +296,7 @@ AdCreateTableHeader ( AcpiOsPrintf ("\n * Checksum 0x%2.2X", Table->Checksum); - Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); + Checksum = AcpiUtChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length); if (Checksum) { AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X", diff --git a/src/acpica/source/common/dmtbdump.c b/src/acpica/source/common/dmtbdump.c index b4faf683..dc1745d5 100644 --- a/src/acpica/source/common/dmtbdump.c +++ b/src/acpica/source/common/dmtbdump.c @@ -384,7 +384,7 @@ AcpiDmDumpRsdp ( /* Validate the first checksum */ - Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), + Checksum = AcpiUtGenerateChecksum (Rsdp, sizeof (ACPI_RSDP_COMMON), Rsdp->Checksum); if (Checksum != Rsdp->Checksum) { @@ -405,7 +405,7 @@ AcpiDmDumpRsdp ( /* Validate the extended checksum over entire RSDP */ - Checksum = AcpiDmGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), + Checksum = AcpiUtGenerateChecksum (Rsdp, sizeof (ACPI_TABLE_RSDP), Rsdp->ExtendedChecksum); if (Checksum != Rsdp->ExtendedChecksum) { diff --git a/src/acpica/source/common/dmtbdump1.c b/src/acpica/source/common/dmtbdump1.c index 13662611..ae5f0f86 100644 --- a/src/acpica/source/common/dmtbdump1.c +++ b/src/acpica/source/common/dmtbdump1.c @@ -153,6 +153,7 @@ #include "accommon.h" #include "acdisasm.h" #include "actables.h" +#include "aslcompiler.h" /* This module used for application-level code only */ @@ -608,6 +609,192 @@ AcpiDmDumpAsf ( } } + +/******************************************************************************* + * + * FUNCTION: AcpiDmDumpCdat + * + * PARAMETERS: InTable - A CDAT table + * + * RETURN: None + * + * DESCRIPTION: Format the contents of a CDAT. This table type consists + * of an open-ended number of subtables. + * + ******************************************************************************/ + +void +AcpiDmDumpCdat ( + ACPI_TABLE_HEADER *InTable) +{ + ACPI_TABLE_CDAT *Table = ACPI_CAST_PTR (ACPI_TABLE_CDAT, InTable); + ACPI_STATUS Status; + ACPI_CDAT_HEADER *Subtable; + ACPI_TABLE_CDAT *CdatTable = ACPI_CAST_PTR (ACPI_TABLE_CDAT, Table); + ACPI_DMTABLE_INFO *InfoTable; + UINT32 Length = CdatTable->Length; + UINT32 Offset = sizeof (ACPI_TABLE_CDAT); + UINT32 SubtableLength; + UINT32 SubtableType; + INT32 EntriesLength; + + + /* Main table */ + + Status = AcpiDmDumpTable (Offset, 0, CdatTable, 0, + AcpiDmTableInfoCdatTableHdr); + if (ACPI_FAILURE (Status)) + { + return; + } + + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, sizeof (ACPI_TABLE_CDAT)); + while (Offset < Table->Length) + { + /* Dump the common subtable header */ + + DbgPrint (ASL_DEBUG_OUTPUT, "0) HeaderOffset: %X\n", Offset); + AcpiOsPrintf ("\n"); + Status = AcpiDmDumpTable (Length, Offset, Subtable, + sizeof (ACPI_CDAT_HEADER), AcpiDmTableInfoCdatHeader); + if (ACPI_FAILURE (Status)) + { + return; + } + + /* Point past the common subtable header, decode the subtable type */ + + Offset += sizeof (ACPI_CDAT_HEADER); + SubtableType = Subtable->Type; + + switch (Subtable->Type) + { + case ACPI_CDAT_TYPE_DSMAS: + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + SubtableLength = sizeof (ACPI_CDAT_DSMAS); + + InfoTable = AcpiDmTableInfoCdat0; + break; + + case ACPI_CDAT_TYPE_DSLBIS: + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + SubtableLength = sizeof (ACPI_CDAT_DSLBIS); + DbgPrint (ASL_DEBUG_OUTPUT, "1) Offset: %X\n", Offset); + + InfoTable = AcpiDmTableInfoCdat1; + break; + + case ACPI_CDAT_TYPE_DSMSCIS: + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + SubtableLength = sizeof (ACPI_CDAT_DSMSCIS); + + InfoTable = AcpiDmTableInfoCdat2; + break; + + case ACPI_CDAT_TYPE_DSIS: + DbgPrint (ASL_DEBUG_OUTPUT, "2) Offset: %X ", Offset); + SubtableLength = sizeof (ACPI_CDAT_DSIS); + DbgPrint (ASL_DEBUG_OUTPUT, "1) input pointer: %p\n", Table); + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + DbgPrint (ASL_DEBUG_OUTPUT, "1) output pointers: %p, %p, Offset: %X\n", + Table, Subtable, Offset); + DbgPrint (ASL_DEBUG_OUTPUT, "3) Offset: %X\n", Offset); + + InfoTable = AcpiDmTableInfoCdat3; + break; + + case ACPI_CDAT_TYPE_DSEMTS: + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + SubtableLength = sizeof (ACPI_CDAT_DSEMTS); + + InfoTable = AcpiDmTableInfoCdat4; + break; + + case ACPI_CDAT_TYPE_SSLBIS: + SubtableLength = Subtable->Length; + + InfoTable = AcpiDmTableInfoCdat5; + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + break; + + default: + fprintf (stderr, "ERROR: Unknown SubtableType: %X\n", Subtable->Type); + return; + } + + DbgPrint (ASL_DEBUG_OUTPUT, "SubtableType: %X, Length: %X Actual " + "Length: %X Offset: %X tableptr: %p\n", SubtableType, + Subtable->Length, SubtableLength, Offset, Table); + + /* + * Do the subtable-specific fields + */ + Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, InfoTable); + if (ACPI_FAILURE (Status)) + { + return; + } + + DbgPrint (ASL_DEBUG_OUTPUT, "Subtable Type: %X, Offset: %X, SubtableLength: %X\n", + SubtableType, Offset, SubtableLength); + + /* Additional sub-subtables, dependent on the main subtable type */ + + switch (SubtableType) + { + case ACPI_CDAT_TYPE_SSLBIS: + Offset += sizeof (ACPI_CDAT_SSLBIS); + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, + Offset); + + DbgPrint (ASL_DEBUG_OUTPUT, "Case SSLBIS, Offset: %X, SubtableLength: %X " + "Subtable->Length %X\n", Offset, SubtableLength, Subtable->Length); + + /* Generate the total length of all the SSLBE entries */ + + EntriesLength = SubtableLength - sizeof (ACPI_CDAT_HEADER) - + sizeof (ACPI_CDAT_SSLBIS); + DbgPrint (ASL_DEBUG_OUTPUT, "EntriesLength: %X, Offset: %X, Table->Length: %X\n", + EntriesLength, Offset, Table->Length); + + /* Do each of the SSLBE Entries */ + + while ((EntriesLength > 0) && (Offset < Table->Length)) + { + AcpiOsPrintf ("\n"); + + Status = AcpiDmDumpTable (Length, Offset, Subtable, Offset, + AcpiDmTableInfoCdatEntries); + if (ACPI_FAILURE (Status)) + { + return; + } + + EntriesLength -= sizeof (ACPI_CDAT_SSLBE); + Offset += sizeof (ACPI_CDAT_SSLBE); + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + } + + SubtableLength = 0; + break; + + default: + break; + } + + DbgPrint (ASL_DEBUG_OUTPUT, "Offset: %X, Subtable Length: %X\n", + Offset, SubtableLength); + + /* Point to next subtable */ + + Offset += SubtableLength; + Subtable = ACPI_ADD_PTR (ACPI_CDAT_HEADER, Table, Offset); + } + + return; +} + + /******************************************************************************* * * FUNCTION: AcpiDmDumpCedt @@ -651,12 +838,14 @@ AcpiDmDumpCedt ( case ACPI_CEDT_TYPE_CHBS: Status = AcpiDmDumpTable (Length, Offset, Subtable, Subtable->Length, AcpiDmTableInfoCedt0); - if (ACPI_FAILURE (Status)) { + if (ACPI_FAILURE (Status)) + { return; } break; - case ACPI_CEDT_TYPE_CFMWS: { + case ACPI_CEDT_TYPE_CFMWS: + { ACPI_CEDT_CFMWS *ptr = (ACPI_CEDT_CFMWS *) Subtable; unsigned int i, max = 0x01 << (ptr->InterleaveWays); @@ -664,18 +853,22 @@ AcpiDmDumpCedt ( Status = AcpiDmDumpTable (Length, Offset, Subtable, Subtable->Length, AcpiDmTableInfoCedt1); - if (ACPI_FAILURE (Status)) { + if (ACPI_FAILURE (Status)) + { return; } /* Now, print out any interleave targets beyond the first. */ - for (i = 1; i < max; i++) { - unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET(ACPI_CEDT_CFMWS, InterleaveTargets); + for (i = 1; i < max; i++) + { + unsigned int loc_offset = Offset + (i * 4) + ACPI_OFFSET (ACPI_CEDT_CFMWS, InterleaveTargets); unsigned int *trg = &(ptr->InterleaveTargets[i]); + Status = AcpiDmDumpTable (Length, loc_offset, trg, Subtable->Length, AcpiDmTableInfoCedt1_te); - if (ACPI_FAILURE (Status)) { + if (ACPI_FAILURE (Status)) + { return; } } diff --git a/src/acpica/source/common/dmtbdump2.c b/src/acpica/source/common/dmtbdump2.c index c50a6a24..3fb4d531 100644 --- a/src/acpica/source/common/dmtbdump2.c +++ b/src/acpica/source/common/dmtbdump2.c @@ -149,6 +149,7 @@ * *****************************************************************************/ +#include <wchar.h> #include "acpi.h" #include "accommon.h" #include "acdisasm.h" @@ -2104,9 +2105,12 @@ AcpiDmDumpPhat ( UINT32 RecordCount; UINT32 Length = Table->Length; UINT32 Offset = sizeof (ACPI_TABLE_PHAT); + UINT32 OriginalOffset; UINT32 SubtableLength; UINT32 PathLength; UINT32 VendorLength; + UINT16 RecordType; + const wchar_t *WideString; Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT)); @@ -2116,58 +2120,93 @@ AcpiDmDumpPhat ( /* Common subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Length, 0, Subtable, + Status = AcpiDmDumpTable (Length, Offset, Subtable, sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr); if (ACPI_FAILURE (Status)) { return; } + DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n", + __LINE__, Subtable->Type); + switch (Subtable->Type) { case ACPI_PHAT_TYPE_FW_VERSION_DATA: InfoTable = AcpiDmTableInfoPhat0; - SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA); + SubtableLength = Offset += sizeof (ACPI_PHAT_VERSION_DATA); break; case ACPI_PHAT_TYPE_FW_HEALTH_DATA: InfoTable = AcpiDmTableInfoPhat1; - SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA); + SubtableLength = Offset += sizeof (ACPI_PHAT_TYPE_FW_HEALTH_DATA); break; default: - AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n", + DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n", Subtable->Type); return; } - Status = AcpiDmDumpTable (Length, 0, Subtable, + Status = AcpiDmDumpTable (Length, SubtableLength, Subtable, SubtableLength, InfoTable); if (ACPI_FAILURE (Status)) { return; } + OriginalOffset = Offset; switch (Subtable->Type) { case ACPI_PHAT_TYPE_FW_VERSION_DATA: VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable); RecordCount = VersionData->ElementCount; - while (RecordCount) + RecordType = *ACPI_CAST_PTR (UINT8, Subtable); + + /* + * Skip past a zero-valued block (not part of the ACPI PHAT specification). + * First, check for a zero length record and a zero element count + */ + if (!VersionData->Header.Length && !VersionData->ElementCount) { - Status = AcpiDmDumpTable (Length, Offset, - ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)), + while (RecordType == 0) + { + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); + RecordType = *ACPI_CAST_PTR (UINT8, Subtable); + RecordCount = VersionData->ElementCount; + Offset += 1; + } + + Offset -= 1; + AcpiOsPrintf ("\n/* Warning: Block of zeros found above starting at Offset %X Length %X */\n" + "/* (not compliant to PHAT specification -- ignoring block) */\n", + OriginalOffset - 12, Offset - OriginalOffset + 12); + } + + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, RecordCount: %X, Offset %X, SubtableLength %X */\n", + __LINE__, RecordCount, Offset, SubtableLength); + + /* Emit each of the version elements */ + + while (RecordCount && VersionData->Header.Length) + { + AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n", + VersionData->ElementCount - RecordCount + 1, Offset); + + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); + Status = AcpiDmDumpTable (Length, Offset, Subtable, sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a); if (ACPI_FAILURE (Status)) { return; } + Offset += sizeof (ACPI_PHAT_VERSION_ELEMENT); RecordCount--; } @@ -2175,24 +2214,48 @@ AcpiDmDumpPhat ( case ACPI_PHAT_TYPE_FW_HEALTH_DATA: - /* account for the null terminator */ + /* + * Get the length of the Device Path (UEFI wide string). + * Include the wide null terminator (+2), + */ + WideString = ACPI_ADD_PTR (wchar_t, Subtable, + sizeof (ACPI_PHAT_HEALTH_DATA)); + + PathLength = (wcslen (WideString) * 2) + 2; + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X, Table->Length %X */\n", + __LINE__, PathLength, Offset, Length); - PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1; Status = AcpiDmDumpTable (Length, Offset, ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), PathLength, AcpiDmTableInfoPhat1a); + Offset += PathLength; if (ACPI_FAILURE (Status)) { return; } - /* Get vendor data - data length is the remaining subtable length */ + /* Get Device-Specific Data - length of which is the remaining subtable length. */ VendorLength = Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; - Status = AcpiDmDumpTable (Length, 0, - ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), - VendorLength, AcpiDmTableInfoPhat1b); + DbgPrint (ASL_DEBUG_OUTPUT, "%u, Subtable->Length %X, VendorLength %X, Offset %X PathLength: %X\n", + __LINE__, Subtable->Length, VendorLength, Offset, PathLength); + + if (VendorLength) + { + /* Point past the Device Path, Compile the Device-Specific Data */ + + Status = AcpiDmDumpTable (Length, Offset, + ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), + VendorLength, AcpiDmTableInfoPhat1b); + if (ACPI_FAILURE (Status)) + { + return; + } + + Offset += VendorLength; + } + if (ACPI_FAILURE (Status)) { return; @@ -2208,9 +2271,12 @@ AcpiDmDumpPhat ( /* Next subtable */ - Offset += Subtable->Length; - Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, - Subtable->Length); + DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, " + "Subtable->Length %X, Table->Length %X */\n", + __LINE__, Offset, Subtable->Length, Table->Length); + + Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, + Offset); } } diff --git a/src/acpica/source/common/dmtbinfo1.c b/src/acpica/source/common/dmtbinfo1.c index d6a94bfc..9afed4d6 100644 --- a/src/acpica/source/common/dmtbinfo1.c +++ b/src/acpica/source/common/dmtbinfo1.c @@ -494,6 +494,116 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoBoot[] = ACPI_DMT_TERMINATOR }; +/******************************************************************************* + * + * CDAT - Coherent Device Attribute Table + * + ******************************************************************************/ + + /* Table header (not ACPI-compliant) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdatTableHdr[] = +{ + {ACPI_DMT_UINT32, ACPI_CDAT_OFFSET (Length), "CDAT Table Length", DT_LENGTH}, + {ACPI_DMT_UINT8, ACPI_CDAT_OFFSET (Revision), "Revision", 0}, + {ACPI_DMT_UINT8, ACPI_CDAT_OFFSET (Checksum), "Checksum", 0}, + {ACPI_DMT_UINT48, ACPI_CDAT_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT32, ACPI_CDAT_OFFSET (Sequence), "Sequence", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Common subtable header */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdatHeader[] = +{ + {ACPI_DMT_CDAT, ACPI_CDATH_OFFSET (Type), "Subtable Type", 0}, + {ACPI_DMT_UINT8, ACPI_CDATH_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT16, ACPI_CDATH_OFFSET (Length), "Length", DT_LENGTH}, + ACPI_DMT_TERMINATOR +}; + +/* Subtable 0: Device Scoped Memory Affinity Structure (DSMAS) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat0[] = +{ + {ACPI_DMT_UINT8, ACPI_CDAT0_OFFSET (DsmadHandle), "DSMAD Handle", 0}, + {ACPI_DMT_UINT8, ACPI_CDAT0_OFFSET (Flags), "Flags", 0}, + {ACPI_DMT_UINT16, ACPI_CDAT0_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_CDAT0_OFFSET (DpaBaseAddress), "DPA Base Address", 0}, + {ACPI_DMT_UINT64, ACPI_CDAT0_OFFSET (DpaLength), "DPA Length", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Subtable 1: Device scoped Latency and Bandwidth Information Structure (DSLBIS) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat1[] = +{ + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (Handle), "Handle", 0}, + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (Flags), "Flags", 0}, + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (DataType), "Data Type", 0}, + {ACPI_DMT_UINT8, ACPI_CDAT1_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_CDAT1_OFFSET (EntryBaseUnit), "Entry Base Unit", 0}, + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Entry[0]), "Entry0", 0}, + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Entry[1]), "Entry1", 0}, + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Entry[2]), "Entry2", 0}, + {ACPI_DMT_UINT16, ACPI_CDAT1_OFFSET (Reserved2), "Reserved", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Subtable 2: Device Scoped Memory Side Cache Information Structure (DSMSCIS) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat2[] = +{ + {ACPI_DMT_UINT8, ACPI_CDAT2_OFFSET (DsmasHandle), "DSMAS Handle", 0}, + {ACPI_DMT_UINT24, ACPI_CDAT2_OFFSET (Reserved[3]), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_CDAT2_OFFSET (SideCacheSize), "Side Cache Size", 0}, + {ACPI_DMT_UINT32, ACPI_CDAT2_OFFSET (CacheAttributes), "Cache Attributes", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Subtable 3: Device Scoped Initiator Structure (DSIS) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat3[] = +{ + {ACPI_DMT_UINT8, ACPI_CDAT3_OFFSET (Flags), "Flags", 0}, + {ACPI_DMT_UINT8, ACPI_CDAT3_OFFSET (Handle), "Handle", 0}, + {ACPI_DMT_UINT16, ACPI_CDAT3_OFFSET (Reserved), "Reserved", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Subtable 4: Device Scoped EFI Memory Type Structure (DSEMTS) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat4[] = +{ + {ACPI_DMT_UINT8, ACPI_CDAT4_OFFSET (DsmasHandle), "DSMAS Handle", 0}, + {ACPI_DMT_UINT8, ACPI_CDAT4_OFFSET (MemoryType), "Memory Type", 0}, + {ACPI_DMT_UINT16, ACPI_CDAT4_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_CDAT4_OFFSET (DpaOffset), "DPA Offset", 0}, + {ACPI_DMT_UINT64, ACPI_CDAT4_OFFSET (RangeLength), "DPA Range Length", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Subtable 5: Switch Scoped Latency and Bandwidth Information Structure (SSLBIS) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdat5[] = +{ + {ACPI_DMT_UINT8, ACPI_CDAT5_OFFSET (DataType), "Data Type", 0}, + {ACPI_DMT_UINT24, ACPI_CDAT5_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_CDAT5_OFFSET (EntryBaseUnit), "Entry Base Unit", 0}, + ACPI_DMT_TERMINATOR +}; + +/* Switch Scoped Latency and Bandwidth Entry (SSLBE) (For subtable 5 above) */ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCdatEntries[] = +{ + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (PortxId), "Port X Id", 0}, + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (PortyId), "Port Y Id", 0}, + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (LatencyOrBandwidth), "Latency or Bandwidth", 0}, + {ACPI_DMT_UINT16, ACPI_CDATE_OFFSET (Reserved), "Reserved", 0}, + ACPI_DMT_TERMINATOR +}; + /******************************************************************************* * diff --git a/src/acpica/source/common/dmtbinfo2.c b/src/acpica/source/common/dmtbinfo2.c index 2c7d8178..3676be81 100644 --- a/src/acpica/source/common/dmtbinfo2.c +++ b/src/acpica/source/common/dmtbinfo2.c @@ -412,6 +412,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoIort4[] = {ACPI_DMT_FLAG0, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "COHACC Override", 0}, {ACPI_DMT_FLAG1, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "HTTU Override", 0}, {ACPI_DMT_FLAG3, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "Proximity Domain Valid", 0}, + {ACPI_DMT_FLAG4, ACPI_IORT4_FLAG_OFFSET (Flags, 0), "DeviceID Valid", 0}, {ACPI_DMT_UINT32, ACPI_IORT4_OFFSET (Reserved), "Reserved", 0}, {ACPI_DMT_UINT64, ACPI_IORT4_OFFSET (VatosAddress), "VATOS Address", 0}, {ACPI_DMT_UINT32, ACPI_IORT4_OFFSET (Model), "Model", 0}, @@ -1652,11 +1653,13 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPdtt0[] = * ******************************************************************************/ +/* Common subtable header */ + ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[] = { - {ACPI_DMT_PHAT, ACPI_PHATH_OFFSET (Type), "Subtable Type", 0}, - {ACPI_DMT_UINT16, ACPI_PHATH_OFFSET (Length), "Length", 0}, - {ACPI_DMT_UINT8, ACPI_PHATH_OFFSET (Revision), "Revision", 0}, + {ACPI_DMT_PHAT, ACPI_PHATH_OFFSET (Type), "Subtable Type", 0}, + {ACPI_DMT_UINT16, ACPI_PHATH_OFFSET (Length), "Length", DT_LENGTH}, + {ACPI_DMT_UINT8, ACPI_PHATH_OFFSET (Revision), "Revision", 0}, ACPI_DMT_TERMINATOR }; @@ -1664,16 +1667,16 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPhatHdr[] = ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0[] = { - {ACPI_DMT_UINT24, ACPI_PHAT0_OFFSET (Reserved), "Reserved", 0}, - {ACPI_DMT_UINT32, ACPI_PHAT0_OFFSET (ElementCount), "Element Count", 0}, + {ACPI_DMT_UINT24, ACPI_PHAT0_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT32, ACPI_PHAT0_OFFSET (ElementCount), "Element Count", 0}, ACPI_DMT_TERMINATOR }; ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[] = { - {ACPI_DMT_UUID, ACPI_PHAT0A_OFFSET (Guid), "GUID", 0}, - {ACPI_DMT_UINT64, ACPI_PHAT0A_OFFSET (VersionValue), "Version Value", 0}, - {ACPI_DMT_UINT32, ACPI_PHAT0A_OFFSET (ProducerId), "Producer ID", 0}, + {ACPI_DMT_UUID, ACPI_PHAT0A_OFFSET (Guid), "GUID", 0}, + {ACPI_DMT_UINT64, ACPI_PHAT0A_OFFSET (VersionValue), "Version Value", 0}, + {ACPI_DMT_UINT32, ACPI_PHAT0A_OFFSET (ProducerId), "Producer ID", 0}, ACPI_DMT_TERMINATOR }; @@ -1681,22 +1684,22 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPhat0a[] = ACPI_DMTABLE_INFO AcpiDmTableInfoPhat1[] = { - {ACPI_DMT_UINT16, ACPI_PHAT1_OFFSET (Reserved), "Reserved", 0}, - {ACPI_DMT_UINT8, ACPI_PHAT1_OFFSET (Health), "Health", 0}, - {ACPI_DMT_UUID, ACPI_PHAT1_OFFSET (DeviceGuid), "Device GUID", 0}, - {ACPI_DMT_UINT32, ACPI_PHAT1_OFFSET (DeviceSpecificOffset), "Device specific offset", 0}, + {ACPI_DMT_UINT16, ACPI_PHAT1_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT8, ACPI_PHAT1_OFFSET (Health), "Health", 0}, + {ACPI_DMT_UUID, ACPI_PHAT1_OFFSET (DeviceGuid), "Device GUID", 0}, + {ACPI_DMT_UINT32, ACPI_PHAT1_OFFSET (DeviceSpecificOffset), "Device-Specific Offset", 0}, ACPI_DMT_TERMINATOR }; ACPI_DMTABLE_INFO AcpiDmTableInfoPhat1a[] = { - {ACPI_DMT_STRING, 0, "Namepath", 0}, + {ACPI_DMT_UNICODE, 0, "Device Path", 0}, ACPI_DMT_TERMINATOR }; ACPI_DMTABLE_INFO AcpiDmTableInfoPhat1b[] = { - {ACPI_DMT_RAW_BUFFER, 0, "Vendor Data", 0}, + {ACPI_DMT_RAW_BUFFER, 0, "Device-Specific Data", DT_OPTIONAL}, ACPI_DMT_TERMINATOR }; @@ -1895,7 +1898,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoPrmtHandler[] = {ACPI_DMT_UINT16, ACPI_PRMT1_OFFSET (Length), "Length", 0}, {ACPI_DMT_UUID, ACPI_PRMT1_OFFSET (HandlerGuid[0]), "Handler GUID", 0}, {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (HandlerAddress), "Handler address", 0}, - {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (StaticDataBufferAddress),"Satic Data Address", 0}, + {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (StaticDataBufferAddress),"Static Data Address", 0}, {ACPI_DMT_UINT64, ACPI_PRMT1_OFFSET (AcpiParamBufferAddress), "ACPI Parameter Address", 0}, ACPI_DMT_NEW_LINE, ACPI_DMT_TERMINATOR diff --git a/src/acpica/source/common/dmtbinfo3.c b/src/acpica/source/common/dmtbinfo3.c index fa698d2f..b8ddb7aa 100644 --- a/src/acpica/source/common/dmtbinfo3.c +++ b/src/acpica/source/common/dmtbinfo3.c @@ -190,6 +190,23 @@ * Each entry is of the form: <Field Type, Field Offset, Field Name> */ +/******************************************************************************* + * + * CCEL - CC-Event Log Table + * + ******************************************************************************/ + +ACPI_DMTABLE_INFO AcpiDmTableInfoCcel[] = +{ + {ACPI_DMT_UINT8, ACPI_CCEL_OFFSET (CCType), "CC Type", 0}, + {ACPI_DMT_UINT8, ACPI_CCEL_OFFSET (CCSubType), "CC Sub Type", 0}, + {ACPI_DMT_UINT32, ACPI_CCEL_OFFSET (Reserved), "Reserved", 0}, + {ACPI_DMT_UINT64, ACPI_CCEL_OFFSET (LogAreaMinimumLength), "Log Area Minimum Length", 0}, + {ACPI_DMT_UINT64, ACPI_CCEL_OFFSET (LogAreaStartAddress), "Log Area Start Address", 0}, + ACPI_DMT_TERMINATOR +}; + + /******************************************************************************* * * SLIC - Software Licensing Description Table. This table contains the standard diff --git a/src/acpica/source/compiler/aslcodegen.c b/src/acpica/source/compiler/aslcodegen.c index 6ae3a0aa..a0c67424 100644 --- a/src/acpica/source/compiler/aslcodegen.c +++ b/src/acpica/source/compiler/aslcodegen.c @@ -153,6 +153,7 @@ #include "aslcompiler.y.h" #include "amlcode.h" #include "acconvert.h" +#include "actbinfo.h" #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("aslcodegen") @@ -181,6 +182,10 @@ static void CgUpdateHeader ( ACPI_PARSE_OBJECT *Op); +static void +CgUpdateCdatHeader ( + ACPI_PARSE_OBJECT *Op); + /******************************************************************************* * @@ -207,7 +212,14 @@ CgGenerateAmlOutput ( CgAmlWriteWalk, NULL, NULL); DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER2); - CgUpdateHeader (AslGbl_CurrentDB); + if (AcpiGbl_CDAT) + { + CgUpdateCdatHeader (AslGbl_CurrentDB); + } + else + { + CgUpdateHeader (AslGbl_CurrentDB); + } } @@ -656,6 +668,67 @@ CgWriteTableHeader ( } +/******************************************************************************* + * + * FUNCTION: CgUpdateCdatHeader + * + * PARAMETERS: Op - Op for the Definition Block + * + * RETURN: None. + * + * DESCRIPTION: Complete the ACPI table by calculating the checksum and + * re-writing the header for the input definition block + * + ******************************************************************************/ + +static void +CgUpdateCdatHeader ( + ACPI_PARSE_OBJECT *Op) +{ + signed char Sum; + UINT32 i; + UINT32 Length; + UINT8 FileByte; + UINT8 Checksum; + + + /* Calculate the checksum over the entire definition block */ + + Sum = 0; + Length = sizeof (ACPI_TABLE_CDAT) + Op->Asl.AmlSubtreeLength; + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset); + + for (i = 0; i < Length; i++) + { + if (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1) != AE_OK) + { + AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL, + "Table length is greater than size of the input file"); + return; + } + + Sum = (signed char) (Sum + FileByte); + } + + Checksum = (UINT8) (0 - Sum); + + DbgPrint (ASL_DEBUG_OUTPUT, "Computed checksum = %X\n", Checksum); + + /* Re-write the checksum byte */ + + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + + ACPI_CDAT_OFFSET (Checksum)); + + FlWriteFile (ASL_FILE_AML_OUTPUT, &Checksum, 1); + + /* + * Seek to the end of the file. This is done to support multiple file + * compilation. Doing this simplifies other parts of the codebase because + * it eliminates the need to seek for a different starting place. + */ + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + Length); +} + /******************************************************************************* * * FUNCTION: CgUpdateHeader diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c index c17e219c..f97cd9d8 100644 --- a/src/acpica/source/compiler/aslcompile.c +++ b/src/acpica/source/compiler/aslcompile.c @@ -241,7 +241,7 @@ CmDoCompile ( if (AslGbl_SyntaxError) { - fprintf (stderr, + AslError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, "Compiler aborting due to parser-detected syntax error(s)\n"); /* Flag this error in the FileNode for compilation summary */ @@ -250,6 +250,8 @@ CmDoCompile ( FileNode->ParserErrorDetected = TRUE; AslGbl_ParserErrorDetected = TRUE; LsDumpParseTree (); + AePrintErrorLog(ASL_FILE_STDERR); + goto ErrorExit; } @@ -267,6 +269,8 @@ CmDoCompile ( goto ErrorExit; } + AePrintErrorLog(ASL_FILE_STDERR); + /* Flush out any remaining source after parse tree is complete */ Event = UtBeginEvent ("Flush source input"); @@ -283,10 +287,13 @@ CmDoCompile ( LsDumpParseTree (); + AslGbl_ParserErrorDetected = FALSE; + AslGbl_SyntaxError = FALSE; UtEndEvent (Event); UtEndEvent (FullCompile); - return (AE_OK); + AslGbl_ParserErrorDetected = FALSE; + AslGbl_SyntaxError = FALSE; ErrorExit: UtEndEvent (FullCompile); return (AE_ERROR); @@ -919,7 +926,6 @@ CmCleanupAndExit ( ASL_MAX_ERROR_COUNT); } - AslGbl_ExceptionCount[ASL_ERROR] = 0; UtDisplaySummary (ASL_FILE_STDOUT); /* diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c index a0ebe7b3..3a61bc6e 100644 --- a/src/acpica/source/compiler/aslerror.c +++ b/src/acpica/source/compiler/aslerror.c @@ -1033,7 +1033,6 @@ AslLogNewError ( exit(1); } - AslGbl_ExceptionCount[ASL_ERROR] = 0; return; } diff --git a/src/acpica/source/compiler/aslhelp.c b/src/acpica/source/compiler/aslhelp.c index d83d41e3..1cdbf8a7 100644 --- a/src/acpica/source/compiler/aslhelp.c +++ b/src/acpica/source/compiler/aslhelp.c @@ -262,6 +262,7 @@ Usage ( ACPI_OPTION ("", " (Obtain DSDT from current system if no input file)"); ACPI_OPTION ("-df", "Force disassembler to assume table contains valid AML"); ACPI_OPTION ("-dl", "Emit legacy ASL code only (no C-style operators)"); + ACPI_OPTION ("-ds <signature(4)>", "Specify a table signature(4) (CDAT table only)"); ACPI_OPTION ("-e <f1 f2 ...>", "Include ACPI table(s) for external symbol resolution"); ACPI_OPTION ("-fe <file>", "Specify external symbol declaration file"); ACPI_OPTION ("-in", "Ignore NoOp opcodes"); diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c index 2808650e..37484f79 100644 --- a/src/acpica/source/compiler/asloptions.c +++ b/src/acpica/source/compiler/asloptions.c @@ -152,6 +152,7 @@ #include "aslcompiler.h" #include "acapps.h" #include "acdisasm.h" +#include "acglobal.h" #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("asloption") @@ -176,7 +177,7 @@ 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" +#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" /******************************************************************************* @@ -270,7 +271,7 @@ AslDoOptions ( BOOLEAN IsResponseFile) { ACPI_STATUS Status; - UINT32 j; + INT32 j; /* Get the command line options */ @@ -366,7 +367,6 @@ AslDoOptions ( { return (-1); } - AslGbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); break; @@ -445,6 +445,28 @@ AslDoOptions ( AcpiGbl_CstyleDisassembly = FALSE; break; + case 's': /* Specify table signature (Only supported for CDAT table) */ + + /* Get the required argument */ + + if (AcpiGetoptArgument (argc, argv)) + { + return (-1); + } + + /* Check for exact string "CDAT" (upper or lower case) */ + + AcpiGbl_CDAT = ACPI_CAST_PTR (char, &AcpiGbl_Optarg); + if (AcpiUtStricmp (AcpiGbl_Optarg, ACPI_SIG_CDAT)) + { + printf ("\nUnknown table signature: %s\n", AcpiGbl_Optarg); + return (-1); + } + + AcpiGbl_CDAT = malloc (5); + AcpiUtSafeStrncpy ((char *) AcpiGbl_CDAT, ACPI_SIG_CDAT, 5); + break; + default: printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); @@ -837,7 +859,7 @@ AslDoOptions ( AslGbl_HexOutputFlag = HEX_OUTPUT_C; break; - case 'p': /* data table flex/bison prototype */ + case 'p': /* data table flex/bison prototype */ AslGbl_DtLexBisonPrototype = TRUE; break; diff --git a/src/acpica/source/compiler/aslpredef.c b/src/acpica/source/compiler/aslpredef.c index c52295ee..2804e12d 100644 --- a/src/acpica/source/compiler/aslpredef.c +++ b/src/acpica/source/compiler/aslpredef.c @@ -563,7 +563,7 @@ ApCheckForPredefinedName ( if (Name[0] == 0) { AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op, - "zero length name found"); + "Zero length name found"); } /* All reserved names are prefixed with a single underscore */ diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c index 45462adf..9542a79d 100644 --- a/src/acpica/source/compiler/aslstartup.c +++ b/src/acpica/source/compiler/aslstartup.c @@ -317,7 +317,7 @@ AslDetectSourceFileType ( else { fprintf (stderr, - "Binary file does not contain a valid ACPI table\n"); + "Binary file does not contain a valid standard ACPI table\n"); } Type = ASL_INPUT_TYPE_BINARY; diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c index 89eb937d..11fcb8b9 100644 --- a/src/acpica/source/compiler/dtcompile.c +++ b/src/acpica/source/compiler/dtcompile.c @@ -451,6 +451,48 @@ DtCompileDataTable ( return (Status); } + /* + * If the first field is named "CDAT Table Length" (not "Signature"), + * assume that we have a CDAT table (whose table header does not have + * a signature). Instead, the TableLength field is where the + * signature would (normally) be. + */ + else if (!strcmp ((*FieldList)->Name, "CDAT Table Length")) + { + /* No longer true: (However, use this technique in the disassembler) + * We are assuming that there + * should be at least one non-ASCII byte in the 4-character + * Signature field, (At least the high-order byte should be zero). + */ + Status = DtCompileTable (FieldList, AcpiDmTableInfoCdatTableHdr, + &AslGbl_RootTable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* Compile the CDAT */ + + DtPushSubtable (AslGbl_RootTable); + Status = DtCompileCdat ((void **) FieldList); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* + * Set the overall table length and the table checksum. + * The entire compiled table (including the CDAT table header with + * the table length and checksum) is in AslGbl_RootTable->Buffer. + */ + DtSetTableLength (); + DtSetTableChecksum (&ACPI_CAST_PTR (ACPI_TABLE_CDAT, AslGbl_RootTable->Buffer)->Checksum); + + DtDumpFieldList (RootField); + DtDumpSubtableList (); + return (AE_OK); + } + /* * All other tables must use the common ACPI table header. Insert the * current iASL IDs (name, version), and compile the header now. diff --git a/src/acpica/source/compiler/dtcompiler.h b/src/acpica/source/compiler/dtcompiler.h index 3b3683cc..e85ca539 100644 --- a/src/acpica/source/compiler/dtcompiler.h +++ b/src/acpica/source/compiler/dtcompiler.h @@ -578,13 +578,17 @@ DtCompileAsf ( void **PFieldList); ACPI_STATUS -DtCompileCpep ( +DtCompileCdat ( void **PFieldList); ACPI_STATUS DtCompileCedt ( void **PFieldList); +ACPI_STATUS +DtCompileCpep ( + void **PFieldList); + ACPI_STATUS DtCompileCsrt ( void **PFieldList); @@ -773,6 +777,8 @@ extern const unsigned char TemplateBoot[]; extern const unsigned char TemplateBdat[]; extern const unsigned char TemplateBert[]; extern const unsigned char TemplateBgrt[]; +extern const unsigned char TemplateCcel[]; +extern const unsigned char TemplateCdat[]; extern const unsigned char TemplateCedt[]; extern const unsigned char TemplateCpep[]; extern const unsigned char TemplateCsrt[]; diff --git a/src/acpica/source/compiler/dtio.c b/src/acpica/source/compiler/dtio.c index 1a00424c..9ec18cd1 100644 --- a/src/acpica/source/compiler/dtio.c +++ b/src/acpica/source/compiler/dtio.c @@ -952,7 +952,7 @@ DtDumpBuffer ( UINT8 BufChar; - FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ", + FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3.3Xh] ", Offset, Offset, Length); i = 0; diff --git a/src/acpica/source/compiler/dttable1.c b/src/acpica/source/compiler/dttable1.c index 9ac04350..dc25e9b9 100644 --- a/src/acpica/source/compiler/dttable1.c +++ b/src/acpica/source/compiler/dttable1.c @@ -655,6 +655,133 @@ DtCompileAsf ( } +/****************************************************************************** + * + * FUNCTION: DtCompileCdat + * + * PARAMETERS: List - Current field list pointer + * + * RETURN: Status + * + * DESCRIPTION: Compile CDAT. + * + *****************************************************************************/ + +ACPI_STATUS +DtCompileCdat ( + void **List) +{ + ACPI_STATUS Status = AE_OK; + DT_SUBTABLE *Subtable; + DT_SUBTABLE *ParentTable; + DT_FIELD **PFieldList = (DT_FIELD **) List; + ACPI_CDAT_HEADER *CdatHeader; + ACPI_DMTABLE_INFO *InfoTable = NULL; + DT_FIELD *SubtableStart; + + + /* Walk the parse tree. + * + * Note: Main table consists of only the CDAT table header + * (This is not the standard ACPI table header, however)-- + * Followed by some number of subtables. + */ + while (*PFieldList) + { + SubtableStart = *PFieldList; + + /* Compile the expected CDAT Subtable header */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatHeader, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + DtPushSubtable (Subtable); + + CdatHeader = ACPI_CAST_PTR (ACPI_CDAT_HEADER, Subtable->Buffer); + + /* Decode the subtable by type */ + + switch (CdatHeader->Type) + { + case ACPI_CDAT_TYPE_DSMAS: + InfoTable = AcpiDmTableInfoCdat0; + break; + + case ACPI_CDAT_TYPE_DSLBIS: + InfoTable = AcpiDmTableInfoCdat1; + break; + + case ACPI_CDAT_TYPE_DSMSCIS: + InfoTable = AcpiDmTableInfoCdat2; + break; + + case ACPI_CDAT_TYPE_DSIS: + InfoTable = AcpiDmTableInfoCdat3; + break; + + case ACPI_CDAT_TYPE_DSEMTS: + InfoTable = AcpiDmTableInfoCdat4; + break; + + case ACPI_CDAT_TYPE_SSLBIS: + InfoTable = AcpiDmTableInfoCdat5; + break; + + default: + DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "CDAT"); + } + + /* Compile the CDAT subtable */ + + Status = DtCompileTable (PFieldList, InfoTable, &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + switch (CdatHeader->Type) + { + /* Multiple entries supported for this type */ + + case ACPI_CDAT_TYPE_SSLBIS: + + /* + * Check for multiple SSLBEs + */ + while (*PFieldList && !AcpiUtStricmp ((*PFieldList)->Name, "Port X ID")) + { + Status = DtCompileTable (PFieldList, AcpiDmTableInfoCdatEntries, &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + } + break; + + default: + break; + } + + /* Pop off the CDAT Subtable header subtree */ + + DtPopSubtable (); + } + + return (AE_OK); +} + + /****************************************************************************** * * FUNCTION: DtCompileCedt @@ -2592,7 +2719,6 @@ DtCompileIvrs ( DtInsertSubtable (MainSubtable, Subtable); DtPushSubtable (Subtable); - ParentTable = MainSubtable; break; case ACPI_IVRS_TYPE_HID: diff --git a/src/acpica/source/compiler/dttable2.c b/src/acpica/source/compiler/dttable2.c index 1798a963..59d578f9 100644 --- a/src/acpica/source/compiler/dttable2.c +++ b/src/acpica/source/compiler/dttable2.c @@ -825,6 +825,7 @@ DtCompileNhlt ( ACPI_NHLT_FORMATS_CONFIG *FormatsConfig; ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_D *ConfigSpecific; ACPI_NHLT_DEVICE_INFO_COUNT *DeviceInfo; + ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B *Terminator; /* Main table */ @@ -1088,7 +1089,7 @@ DtCompileNhlt ( * some non documeneted structure(s) yet to be processed. First, get * the count of such structure(s). */ - if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) + if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Device Info struct count"))) { /* Get the count of non documented structures */ @@ -1124,9 +1125,8 @@ DtCompileNhlt ( DtInsertSubtable (ParentTable, Subtable); } /* for (j = 0; j < LinuxSpecificCount; j++) */ - /* Undocumented data at the end of endpoint */ - if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) + if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Bytes"))) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt7b, &Subtable); @@ -1148,7 +1148,7 @@ DtCompileNhlt ( * All Endpoint Descriptors are completed. * Do the table terminator specific config (not in NHLT spec, optional) */ - if (*PFieldList && (strcmp ((const char *) (*PFieldList)->Name, "Descriptor Length"))) + if (*PFieldList && !(strcmp ((const char *) (*PFieldList)->Name, "Capabilities Size"))) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt5b, &Subtable); @@ -1160,15 +1160,20 @@ DtCompileNhlt ( ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); - Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, - &Subtable); - if (ACPI_FAILURE (Status)) + Terminator = ACPI_CAST_PTR (ACPI_NHLT_DEVICE_SPECIFIC_CONFIG_B, Subtable->Buffer); + + if (Terminator->CapabilitiesSize) { - return (Status); - } + Status = DtCompileTable (PFieldList, AcpiDmTableInfoNhlt3a, + &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } - ParentTable = DtPeekSubtable (); - DtInsertSubtable (ParentTable, Subtable); + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + } } return (AE_OK); @@ -1369,19 +1374,30 @@ DtCompilePhat ( ACPI_PHAT_HEADER *PhatHeader; ACPI_DMTABLE_INFO *Info; ACPI_PHAT_VERSION_DATA *VersionData; + UINT32 DeviceDataLength; UINT32 RecordCount; + DT_FIELD *DataOffsetField; + DT_FIELD *DevicePathField; + UINT32 TableOffset = 0; + UINT32 DataOffsetValue; + UINT32 i; - /* The table consist of subtables */ + /* The table consists of subtables */ while (*PFieldList) { + /* Compile the common subtable header */ + Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhatHdr, &Subtable); if (ACPI_FAILURE (Status)) { return (Status); } + TableOffset += Subtable->Length; + DbgPrint (ASL_DEBUG_OUTPUT, "0 Subtable->Length: %X\n", Subtable->Length); + ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); DtPushSubtable (Subtable); @@ -1392,12 +1408,66 @@ DtCompilePhat ( { case ACPI_PHAT_TYPE_FW_VERSION_DATA: + /* Compile the middle portion of the Firmware Version Data */ + Info = AcpiDmTableInfoPhat0; PhatHeader->Length = sizeof (ACPI_PHAT_VERSION_DATA); + DataOffsetField = NULL; break; case ACPI_PHAT_TYPE_FW_HEALTH_DATA: + DbgPrint (ASL_DEBUG_OUTPUT, "1 Offset: %X, Name: \"%s\" Length: %X\n", + (*PFieldList)->TableOffset, (*PFieldList)->Name, Subtable->Length); + + DataOffsetField = *PFieldList; + + /* Walk the field list to get to the "Device-specific data Offset" field */ + + TableOffset = sizeof (ACPI_PHAT_HEALTH_DATA); + for (i = 0; i < 3; i++) + { + DataOffsetField = DataOffsetField->Next; + DbgPrint (ASL_DEBUG_OUTPUT, "2 Offset: %X, Name: \"%s\" Length: %X Value: %s:\n", + TableOffset, DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value); + } + + /* Convert DataOffsetField->Value (a char * string) to an integer value */ + + sscanf (DataOffsetField->Value, "%X", &DataOffsetValue); + + /* + * Get the next field (Device Path): + * DataOffsetField points to "Device-Specific Offset", next field is + * "Device Path". + */ + DevicePathField = DataOffsetField->Next; + + /* Compute the size of the input ASCII string as a unicode string (*2 + 2) */ + + DevicePathField->StringLength = (strlen ((const char *) DevicePathField->Value) * 2) + 2; + TableOffset += DevicePathField->StringLength; + + DbgPrint (ASL_DEBUG_OUTPUT, "3 Offset: %X, Length: %X devicepathLength: %X\n", + TableOffset, Subtable->Length, DevicePathField->StringLength); + + /* Set the DataOffsetField to the current TableOffset */ + /* Must set the DataOffsetField here (not later) */ + + if (DataOffsetValue != 0) + { + snprintf (DataOffsetField->Value, Subtable->Length, "%X", TableOffset); + } + + DbgPrint (ASL_DEBUG_OUTPUT, "4 Offset: %X, Length: %X\n", TableOffset, Subtable->Length); + + DbgPrint (ASL_DEBUG_OUTPUT, "5 TableOffset: %X, DataOffsetField->StringLength: " + "%X DevicePathField Length: %X DevicePathField->Value: %s, DataOffsetField->Value: %s DataOffsetField->ByteOffset %X\n", + TableOffset, DataOffsetField->StringLength, DevicePathField->StringLength, + DevicePathField->Value, DataOffsetField->Value, DataOffsetField->ByteOffset); + + /* Compile the middle portion of the Health Data Record */ + Info = AcpiDmTableInfoPhat1; PhatHeader->Length = sizeof (ACPI_PHAT_HEALTH_DATA); break; @@ -1406,16 +1476,19 @@ DtCompilePhat ( DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); return (AE_ERROR); - - break; } + /* Compile either the Version Data or the Health Data */ + Status = DtCompileTable (PFieldList, Info, &Subtable); if (ACPI_FAILURE (Status)) { return (Status); } + DbgPrint (ASL_DEBUG_OUTPUT, "6 Offset: %X, Name: \"%s\" SubtableLength: %X\n", + TableOffset /* - StartTableOffset*/, (*PFieldList)->Name, Subtable->Length); + ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); @@ -1427,6 +1500,8 @@ DtCompilePhat ( (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); RecordCount = VersionData->ElementCount; + /* Compile all of the Version Elements */ + while (RecordCount) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat0a, @@ -1435,17 +1510,29 @@ DtCompilePhat ( { return (Status); } + ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); + TableOffset += Subtable->Length; RecordCount--; PhatHeader->Length += sizeof (ACPI_PHAT_VERSION_ELEMENT); } + + DtPopSubtable (); break; case ACPI_PHAT_TYPE_FW_HEALTH_DATA: - /* Compile device path */ + /* Compile the Device Path */ + + DeviceDataLength = Subtable->Length; + TableOffset += Subtable->Length; + + DbgPrint (ASL_DEBUG_OUTPUT, "7 Device Path Length: %X FieldName: \"%s\" FieldLength: " + "%s FieldValue: %s SubtableLength: %X TableOffset: %X\n", DeviceDataLength, + (*PFieldList)->Name, DataOffsetField->Value, (*PFieldList)->Value, + Subtable->Length, TableOffset); Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1a, &Subtable); if (ACPI_FAILURE (Status)) @@ -1455,20 +1542,58 @@ DtCompilePhat ( ParentTable = DtPeekSubtable (); DtInsertSubtable (ParentTable, Subtable); + /* *PFieldList will be null if previous field was at the end-of-ParseTree (EOF) */ + + if (!*PFieldList) + { + DbgPrint (ASL_DEBUG_OUTPUT, "8 Exit on end-of-ParseTree\n"); + return (AE_OK); + } + + DbgPrint (ASL_DEBUG_OUTPUT, "9 Device Data Length: %X FieldName: \"%s" + " TableOffset: %X FieldLength: %X Field Value: %s SubtableLength: %X\n", + DeviceDataLength, (*PFieldList)->Name, TableOffset, + (*PFieldList)->StringLength, (*PFieldList)->Value, Subtable->Length); + PhatHeader->Length += (UINT16) Subtable->Length; - /* Compile vendor specific data */ + /* Convert DataOffsetField->Value (a hex char * string) to an integer value */ - Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable); - if (ACPI_FAILURE (Status)) + sscanf (DataOffsetField->Value, "%X", &DataOffsetValue); + + DbgPrint (ASL_DEBUG_OUTPUT, "10 Device-Specific Offset: %X Table Offset: %X\n", + DataOffsetValue, TableOffset); + if (DataOffsetValue != 0) { - return (Status); + /* Compile Device-Specific Data - only if the Data Offset is non-zero */ + + Status = DtCompileTable (PFieldList, AcpiDmTableInfoPhat1b, &Subtable); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + DbgPrint (ASL_DEBUG_OUTPUT, "11 Subtable: %p Table Offset: %X\n", + Subtable, TableOffset); + if (Subtable) + { + DbgPrint (ASL_DEBUG_OUTPUT, "12 Device Specific Offset: " + "%X FieldName \"%s\" SubtableLength %X\n", + DeviceDataLength, DataOffsetField->Name, Subtable->Length); + + DeviceDataLength += Subtable->Length; + + ParentTable = DtPeekSubtable (); + DtInsertSubtable (ParentTable, Subtable); + + PhatHeader->Length += (UINT16) Subtable->Length; + } } - ParentTable = DtPeekSubtable (); - DtInsertSubtable (ParentTable, Subtable); - PhatHeader->Length += (UINT16) Subtable->Length; + DtPopSubtable (); + DbgPrint (ASL_DEBUG_OUTPUT, "13 FieldName: \"%s\" FieldLength: %X Field Value: %s\n", + DataOffsetField->Name, DataOffsetField->StringLength, DataOffsetField->Value); break; default: diff --git a/src/acpica/source/compiler/dttemplate.h b/src/acpica/source/compiler/dttemplate.h index ad5af707..3ab99978 100644 --- a/src/acpica/source/compiler/dttemplate.h +++ b/src/acpica/source/compiler/dttemplate.h @@ -341,6 +341,17 @@ const unsigned char TemplateBoot[] = 0x28,0x05,0x10,0x20,0x00,0x00,0x00,0x00 /* 00000020 "(.. ...." */ }; +const unsigned char TemplateCcel[] = +{ + 0x43,0x43,0x45,0x4C,0x38,0x00,0x00,0x00, /* 00000000 "CCEL8..." */ + 0x04,0x1C,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ + 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */ + 0x00,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */ + 0x30,0x09,0x21,0x20,0x00,0x00,0x00,0x00, /* 00000020 "0.! ...." */ + 0xEF,0xCD,0xAB,0x78,0x56,0x34,0x12,0x00, /* 00000028 "...xV4.." */ + 0x78,0x56,0x34,0x12,0xEF,0xCD,0xAB,0x00 /* 00000030 "xV4....." */ +}; + const unsigned char TemplateCedt[] = { 0x43,0x45,0x44,0x54,0x9c,0x01,0x00,0x00, /* 00000000 "CEDT...." */ @@ -397,6 +408,39 @@ const unsigned char TemplateCedt[] = 0x03,0x5e,0xba,0x00 /* 00000198 ".^.." */ }; +const unsigned char TemplateCdat[] = +{ + 0xE4,0x00,0x00,0x00,0x01,0x0C,0x00,0x00, /* 00000000 "........" */ + 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00, /* 00000008 "........" */ + 0x03,0x00,0x08,0x00,0x04,0x56,0x00,0x00, /* 00000010 ".....V.." */ + 0x00,0x00,0x18,0x00,0xEF,0x01,0x00,0x00, /* 00000018 "........" */ + 0x89,0x67,0x45,0x23,0x01,0x00,0x00,0x00, /* 00000020 ".gE#...." */ + 0xAB,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 00000028 "........" */ + 0x03,0x00,0x08,0x00,0x04,0x56,0x00,0x00, /* 00000030 ".....V.." */ + 0x01,0x00,0x18,0x00,0x44,0x04,0x64,0x00, /* 00000038 "....D.d." */ + 0xCD,0xAB,0x89,0x67,0x45,0x23,0x01,0x00, /* 00000040 "...gE#.." */ + 0x33,0x22,0x44,0x33,0x55,0x44,0x00,0x00, /* 00000048 "3"D3UD.." */ + 0x02,0x00,0x14,0x00,0x99,0x00,0x00,0x00, /* 00000050 "........" */ + 0x00,0x00,0x00,0x00,0x78,0x56,0x34,0x12, /* 00000058 "....xV4." */ + 0x55,0x55,0x44,0x44,0x04,0x00,0x18,0x00, /* 00000060 "UUDD...." */ + 0x88,0x32,0x00,0x00,0x77,0x77,0x77,0x77, /* 00000068 ".2..wwww" */ + 0x11,0x11,0x11,0x11,0x88,0x88,0x88,0x88, /* 00000070 "........" */ + 0x22,0x22,0x22,0x22,0x05,0x00,0x20,0x00, /* 00000078 """"".. ." */ + 0x04,0x00,0x00,0x00,0x44,0x44,0x44,0x44, /* 00000080 "....DDDD" */ + 0x33,0x33,0x33,0x33,0x44,0x44,0x55,0x55, /* 00000088 "3333DDUU" */ + 0x66,0x66,0x00,0x00,0x77,0x77,0x88,0x88, /* 00000090 "ff..ww.." */ + 0x99,0x99,0x00,0x00,0x05,0x00,0x18,0x00, /* 00000098 "........" */ + 0x04,0x00,0x00,0x00,0x22,0x22,0x22,0x22, /* 000000A0 "....""""" */ + 0x11,0x11,0x11,0x11,0x34,0x12,0x56,0x78, /* 000000A8 "....4.Vx" */ + 0x11,0x11,0x00,0x00,0x05,0x00,0x30,0x00, /* 000000B0 "......0." */ + 0x08,0x00,0x00,0x00,0x66,0x66,0x66,0x66, /* 000000B8 "....ffff" */ + 0x55,0x55,0x55,0x55,0x44,0x44,0x55,0x55, /* 000000C0 "UUUUDDUU" */ + 0x66,0x66,0x00,0x00,0x77,0x77,0x88,0x88, /* 000000C8 "ff..ww.." */ + 0x99,0x99,0x00,0x00,0xAA,0xAA,0xBB,0xBB, /* 000000D0 "........" */ + 0xCC,0xCC,0x00,0x00,0x55,0x55,0x44,0x44, /* 000000D8 "....UUDD" */ + 0x33,0x33,0x00,0x00 /* 000000E0 "33.." */ +}; + const unsigned char TemplateCpep[] = { 0x43,0x50,0x45,0x50,0x34,0x00,0x00,0x00, /* 00000000 "CPEP4..." */ @@ -1430,20 +1474,27 @@ const unsigned char TemplatePdtt[] = const unsigned char TemplatePhat [] = { - 0x50,0x48,0x41,0x54,0x6F,0x00,0x00,0x00, /* 00000000 "PHATo..." */ - 0x01,0xC7,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */ + 0x50,0x48,0x41,0x54,0xA2,0x00,0x00,0x00, /* 00000000 "PHAT...." */ + 0x01,0xCA,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" */ - 0x05,0x01,0x21,0x20,0x00,0x00,0x28,0x00, /* 00000020 "..! ..(." */ + 0x31,0x03,0x22,0x20,0x00,0x00,0x28,0x00, /* 00000020 "1." ..(." */ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00, /* 00000028 "........" */ 0x30,0x05,0xAF,0x91,0x86,0x5D,0x0E,0x47, /* 00000030 "0....].G" */ 0xA6,0xB0,0x0A,0x2D,0xB9,0x40,0x82,0x49, /* 00000038 "...-.@.I" */ 0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01, /* 00000040 "........" */ - 0x0C,0x0B,0x0A,0x09,0x01,0x00,0x23,0x00, /* 00000048 "......#." */ + 0x0C,0x0B,0x0A,0x09,0x01,0x00,0x2E,0x00, /* 00000048 "........" */ 0x00,0x00,0x00,0x00,0x30,0x05,0xAF,0x91, /* 00000050 "....0..." */ 0x86,0x5D,0x0E,0x47,0xA6,0xB0,0x0A,0x2D, /* 00000058 ".].G...-" */ - 0xB9,0x40,0x82,0x49,0x00,0x00,0x00,0x00, /* 00000060 ".@.I...." */ - 0x61,0x73,0x64,0x66,0x00,0xFF,0x11 /* 00000068 "asdf..." */ + 0xB9,0x40,0x82,0x49,0x2A,0x00,0x00,0x00, /* 00000060 ".@.I*..." */ + 0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00, /* 00000068 "A.B.C.D." */ + 0x45,0x00,0x46,0x00,0x00,0x00,0x01,0x02, /* 00000070 "E.F....." */ + 0x03,0x04,0x00,0x00,0x28,0x00,0x00,0x00, /* 00000078 "....(..." */ + 0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x05, /* 00000080 "......0." */ + 0xAF,0x91,0x86,0x5D,0x0E,0x47,0xA6,0xB0, /* 00000088 "...].G.." */ + 0x0A,0x2D,0xB9,0x40,0x82,0x49,0x08,0x07, /* 00000090 ".-.@.I.." */ + 0x06,0x05,0x04,0x03,0x02,0x01,0x0C,0x0B, /* 00000098 "........" */ + 0x0A,0x09 /* 000000A0 ".." */ }; const unsigned char TemplatePmtt[] = diff --git a/src/acpica/source/compiler/dtutils.c b/src/acpica/source/compiler/dtutils.c index e950763e..45bff3df 100644 --- a/src/acpica/source/compiler/dtutils.c +++ b/src/acpica/source/compiler/dtutils.c @@ -601,6 +601,7 @@ DtGetFieldLength ( case ACPI_DMT_AEST_XFACE: case ACPI_DMT_AEST_XRUPT: case ACPI_DMT_ASF: + case ACPI_DMT_CDAT: case ACPI_DMT_HESTNTYP: case ACPI_DMT_FADTPM: case ACPI_DMT_EINJACT: @@ -800,7 +801,7 @@ DtSum ( UINT8 *Sum = ReturnValue; - Checksum = AcpiTbChecksum (Subtable->Buffer, Subtable->Length); + Checksum = AcpiUtChecksum (Subtable->Buffer, Subtable->Length); *Sum = (UINT8) (*Sum + Checksum); } diff --git a/src/acpica/source/components/events/evevent.c b/src/acpica/source/components/events/evevent.c index 8b08338a..b92646a4 100644 --- a/src/acpica/source/components/events/evevent.c +++ b/src/acpica/source/components/events/evevent.c @@ -312,7 +312,8 @@ AcpiEvFixedEventInitialize ( { Status = AcpiWriteBitRegister ( AcpiGbl_FixedEventInfo[i].EnableRegisterId, - ACPI_DISABLE_EVENT); + (i == ACPI_EVENT_PCIE_WAKE) ? + ACPI_ENABLE_EVENT : ACPI_DISABLE_EVENT); if (ACPI_FAILURE (Status)) { return (Status); @@ -361,6 +362,11 @@ AcpiEvFixedEventDetect ( return (IntStatus); } + if (FixedEnable & ACPI_BITMASK_PCIEXP_WAKE_DISABLE) + FixedEnable &= ~ACPI_BITMASK_PCIEXP_WAKE_DISABLE; + else + FixedEnable |= ACPI_BITMASK_PCIEXP_WAKE_DISABLE; + ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS, "Fixed Event Block: Enable %08X Status %08X\n", FixedEnable, FixedStatus)); @@ -431,7 +437,8 @@ AcpiEvFixedEventDispatch ( { (void) AcpiWriteBitRegister ( AcpiGbl_FixedEventInfo[Event].EnableRegisterId, - ACPI_DISABLE_EVENT); + (Event == ACPI_EVENT_PCIE_WAKE) ? + ACPI_ENABLE_EVENT : ACPI_DISABLE_EVENT); ACPI_ERROR ((AE_INFO, "No installed handler for fixed event - %s (%u), disabling", diff --git a/src/acpica/source/components/events/evregion.c b/src/acpica/source/components/events/evregion.c index 6cf77791..fb0cc436 100644 --- a/src/acpica/source/components/events/evregion.c +++ b/src/acpica/source/components/events/evregion.c @@ -329,6 +329,14 @@ AcpiEvAddressSpaceDispatch ( Ctx->SubspaceId = (UINT8) RegionObj->Region.Address; } + if (RegionObj->Region.SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE) + { + ACPI_FFH_INFO *Ctx = HandlerDesc->AddressSpace.Context; + + Ctx->Length = RegionObj->Region.Length; + Ctx->Offset = RegionObj->Region.Address; + } + /* * We must exit the interpreter because the region setup will * potentially execute control methods (for example, the _REG method diff --git a/src/acpica/source/components/executer/exconfig.c b/src/acpica/source/components/executer/exconfig.c index a87316ba..11c8ba64 100644 --- a/src/acpica/source/components/executer/exconfig.c +++ b/src/acpica/source/components/executer/exconfig.c @@ -471,7 +471,7 @@ AcpiExLoadOp ( } if (Target->Common.Type != ACPI_TYPE_INTEGER) { - fprintf (stderr, "Type not integer: %X\n", Target->Common.Type); + ACPI_ERROR ((AE_INFO, "Type not integer: %X", Target->Common.Type)); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } diff --git a/src/acpica/source/components/executer/exfield.c b/src/acpica/source/components/executer/exfield.c index 2834e7b3..4175b8ee 100644 --- a/src/acpica/source/components/executer/exfield.c +++ b/src/acpica/source/components/executer/exfield.c @@ -296,7 +296,8 @@ AcpiExReadDataFromField ( (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS || ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS || ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI || - ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT)) + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT || + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)) { /* SMBus, GSBus, IPMI serial */ @@ -469,7 +470,8 @@ AcpiExWriteDataToField ( (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS || ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_GSBUS || ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_IPMI || - ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT)) + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_PLATFORM_RT || + ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)) { /* SMBus, GSBus, IPMI serial */ diff --git a/src/acpica/source/components/executer/exserial.c b/src/acpica/source/components/executer/exserial.c index 4dfd6599..c92a895a 100644 --- a/src/acpica/source/components/executer/exserial.c +++ b/src/acpica/source/components/executer/exserial.c @@ -484,6 +484,12 @@ AcpiExWriteSerialBus ( Function = ACPI_WRITE; break; + case ACPI_ADR_SPACE_FIXED_HARDWARE: + + BufferLength = ACPI_FFH_INPUT_BUFFER_SIZE; + Function = ACPI_WRITE; + break; + default: return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID); } diff --git a/src/acpica/source/components/executer/exsystem.c b/src/acpica/source/components/executer/exsystem.c index 62768bcf..44d3a00b 100644 --- a/src/acpica/source/components/executer/exsystem.c +++ b/src/acpica/source/components/executer/exsystem.c @@ -338,18 +338,6 @@ AcpiExSystemDoSleep ( AcpiExExitInterpreter (); - /* - * Warn users about excessive sleep times, so ASL code can be improved to - * use polling or similar techniques. - */ - if (HowLongMs > 10) - { - ACPI_WARNING ((AE_INFO, - "Firmware issue: Excessive sleep time (0x%8.8X%8.8X ms > 10 ms)" - " in ACPI Control Method", - ACPI_FORMAT_UINT64 (HowLongMs))); - } - /* * For compatibility with other ACPI implementations and to prevent * accidental deep sleeps, limit the sleep time to something reasonable. diff --git a/src/acpica/source/components/hardware/hwsleep.c b/src/acpica/source/components/hardware/hwsleep.c index 45ff336a..6667c27e 100644 --- a/src/acpica/source/components/hardware/hwsleep.c +++ b/src/acpica/source/components/hardware/hwsleep.c @@ -475,6 +475,16 @@ AcpiHwLegacyWake ( AcpiGbl_FixedEventInfo[ACPI_EVENT_SLEEP_BUTTON].StatusRegisterId, ACPI_CLEAR_STATUS); + /* Enable pcie wake event if support */ + if ((AcpiGbl_FADT.Flags & ACPI_FADT_PCI_EXPRESS_WAKE)) { + (void) AcpiWriteBitRegister ( + AcpiGbl_FixedEventInfo[ACPI_EVENT_PCIE_WAKE].EnableRegisterId, + ACPI_DISABLE_EVENT); + (void) AcpiWriteBitRegister ( + AcpiGbl_FixedEventInfo[ACPI_EVENT_PCIE_WAKE].StatusRegisterId, + ACPI_CLEAR_STATUS); + } + AcpiHwExecuteSleepMethod (METHOD_PATHNAME__SST, ACPI_SST_WORKING); return_ACPI_STATUS (Status); } diff --git a/src/acpica/source/components/tables/tbdata.c b/src/acpica/source/components/tables/tbdata.c index 5e4f7ca7..d974d951 100644 --- a/src/acpica/source/components/tables/tbdata.c +++ b/src/acpica/source/components/tables/tbdata.c @@ -724,7 +724,7 @@ AcpiTbVerifyTempTable ( { /* Verify the checksum */ - Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length); + Status = AcpiUtVerifyChecksum (TableDesc->Pointer, TableDesc->Length); if (ACPI_FAILURE (Status)) { ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY, diff --git a/src/acpica/source/components/tables/tbfadt.c b/src/acpica/source/components/tables/tbfadt.c index 7ae35f19..97876614 100644 --- a/src/acpica/source/components/tables/tbfadt.c +++ b/src/acpica/source/components/tables/tbfadt.c @@ -472,7 +472,7 @@ AcpiTbParseFadt ( * Validate the FADT checksum before we copy the table. Ignore * checksum error as we want to try to get the DSDT and FACS. */ - (void) AcpiTbVerifyChecksum (Table, Length); + (void) AcpiUtVerifyChecksum (Table, Length); /* Create a local copy of the FADT in common ACPI 2.0+ format */ diff --git a/src/acpica/source/components/tables/tbprint.c b/src/acpica/source/components/tables/tbprint.c index 0b53e737..cdad69af 100644 --- a/src/acpica/source/components/tables/tbprint.c +++ b/src/acpica/source/components/tables/tbprint.c @@ -152,6 +152,8 @@ #include "acpi.h" #include "accommon.h" #include "actables.h" +#include "acdisasm.h" +#include "acutils.h" #define _COMPONENT ACPI_TABLES ACPI_MODULE_NAME ("tbprint") @@ -192,7 +194,7 @@ AcpiTbFixString ( while (Length && *String) { - if (!isprint ((int) *String)) + if (!isprint ((int) (UINT8) *String)) { *String = '?'; } @@ -293,89 +295,3 @@ AcpiTbPrintTableHeader ( } } - -/******************************************************************************* - * - * FUNCTION: AcpiTbValidateChecksum - * - * PARAMETERS: Table - ACPI table to verify - * Length - Length of entire table - * - * RETURN: Status - * - * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns - * exception on bad checksum. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiTbVerifyChecksum ( - ACPI_TABLE_HEADER *Table, - UINT32 Length) -{ - UINT8 Checksum; - - - /* - * FACS/S3PT: - * They are the odd tables, have no standard ACPI header and no checksum - */ - - if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT) || - ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) - { - return (AE_OK); - } - - /* Compute the checksum on the table */ - - Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); - - /* Checksum ok? (should be zero) */ - - if (Checksum) - { - ACPI_BIOS_WARNING ((AE_INFO, - "Incorrect checksum in table [%4.4s] - 0x%2.2X, " - "should be 0x%2.2X", - Table->Signature, Table->Checksum, - (UINT8) (Table->Checksum - Checksum))); - -#if (ACPI_CHECKSUM_ABORT) - return (AE_BAD_CHECKSUM); -#endif - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiTbChecksum - * - * PARAMETERS: Buffer - Pointer to memory region to be checked - * Length - Length of this memory region - * - * RETURN: Checksum (UINT8) - * - * DESCRIPTION: Calculates circular checksum of memory region. - * - ******************************************************************************/ - -UINT8 -AcpiTbChecksum ( - UINT8 *Buffer, - UINT32 Length) -{ - UINT8 Sum = 0; - UINT8 *End = Buffer + Length; - - - while (Buffer < End) - { - Sum = (UINT8) (Sum + *(Buffer++)); - } - - return (Sum); -} diff --git a/src/acpica/source/components/tables/tbutils.c b/src/acpica/source/components/tables/tbutils.c index d2a30dc3..5188d26d 100644 --- a/src/acpica/source/components/tables/tbutils.c +++ b/src/acpica/source/components/tables/tbutils.c @@ -471,7 +471,7 @@ AcpiTbParseRootTable ( /* Validate the root table checksum */ - Status = AcpiTbVerifyChecksum (Table, Length); + Status = AcpiUtVerifyChecksum (Table, Length); if (ACPI_FAILURE (Status)) { AcpiOsUnmapMemory (Table, Length); diff --git a/src/acpica/source/components/tables/tbxfroot.c b/src/acpica/source/components/tables/tbxfroot.c index bb90f605..97cb65c7 100644 --- a/src/acpica/source/components/tables/tbxfroot.c +++ b/src/acpica/source/components/tables/tbxfroot.c @@ -227,7 +227,7 @@ AcpiTbValidateRsdp ( /* Check the standard checksum */ - if (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) + if (AcpiUtChecksum ((UINT8 *) Rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) { return (AE_BAD_CHECKSUM); } @@ -235,7 +235,7 @@ AcpiTbValidateRsdp ( /* Check extended checksum if table version >= 2 */ if ((Rsdp->Revision >= 2) && - (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) + (AcpiUtChecksum ((UINT8 *) Rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) { return (AE_BAD_CHECKSUM); } @@ -271,6 +271,7 @@ AcpiFindRootPointer ( UINT8 *TablePtr; UINT8 *MemRover; UINT32 PhysicalAddress; + UINT32 EbdaWindowSize; ACPI_FUNCTION_TRACE (AcpiFindRootPointer); @@ -299,27 +300,40 @@ AcpiFindRootPointer ( /* EBDA present? */ - if (PhysicalAddress > 0x400) + /* + * Check that the EBDA pointer from memory is sane and does not point + * above valid low memory + */ + if (PhysicalAddress > 0x400 && + PhysicalAddress < 0xA0000) { /* - * 1b) Search EBDA paragraphs (EBDA is required to be a - * minimum of 1K length) + * Calculate the scan window size + * The EBDA is not guaranteed to be larger than a KiB and in case + * that it is smaller, the scanning function would leave the low + * memory and continue to the VGA range. + */ + EbdaWindowSize = ACPI_MIN(ACPI_EBDA_WINDOW_SIZE, + 0xA0000 - PhysicalAddress); + + /* + * 1b) Search EBDA paragraphs */ TablePtr = AcpiOsMapMemory ( (ACPI_PHYSICAL_ADDRESS) PhysicalAddress, - ACPI_EBDA_WINDOW_SIZE); + EbdaWindowSize); if (!TablePtr) { ACPI_ERROR ((AE_INFO, "Could not map memory at 0x%8.8X for length %u", - PhysicalAddress, ACPI_EBDA_WINDOW_SIZE)); + PhysicalAddress, EbdaWindowSize)); return_ACPI_STATUS (AE_NO_MEMORY); } MemRover = AcpiTbScanMemoryForRsdp ( - TablePtr, ACPI_EBDA_WINDOW_SIZE); - AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_WINDOW_SIZE); + TablePtr, EbdaWindowSize); + AcpiOsUnmapMemory (TablePtr, EbdaWindowSize); if (MemRover) { diff --git a/src/acpica/source/components/utilities/utcksum.c b/src/acpica/source/components/utilities/utcksum.c new file mode 100644 index 00000000..b8ea869b --- /dev/null +++ b/src/acpica/source/components/utilities/utcksum.c @@ -0,0 +1,335 @@ +/****************************************************************************** + * + * Module Name: utcksum - Support generating table checksums + * + *****************************************************************************/ + +/****************************************************************************** + * + * 1. Copyright Notice + * + * Some or all of this work - Copyright (c) 1999 - 2022, Intel Corp. + * All rights reserved. + * + * 2. License + * + * 2.1. This is your license from Intel Corp. under its intellectual property + * rights. You may have additional license terms from the party that provided + * you this software, covering your right to use that party's intellectual + * property rights. + * + * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a + * copy of the source code appearing in this file ("Covered Code") an + * irrevocable, perpetual, worldwide license under Intel's copyrights in the + * base code distributed originally by Intel ("Original Intel Code") to copy, + * make derivatives, distribute, use and display any portion of the Covered + * Code in any form, with the right to sublicense such rights; and + * + * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent + * license (with the right to sublicense), under only those claims of Intel + * patents that are infringed by the Original Intel Code, to make, use, sell, + * offer to sell, and import the Covered Code and derivative works thereof + * solely to the minimum extent necessary to exercise the above copyright + * license, and in no event shall the patent license extend to any additions + * to or modifications of the Original Intel Code. No other license or right + * is granted directly or by implication, estoppel or otherwise; + * + * The above copyright and patent license is granted only if the following + * conditions are met: + * + * 3. Conditions + * + * 3.1. Redistribution of Source with Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification with rights to further distribute source must include + * the above Copyright Notice, the above License, this list of Conditions, + * and the following Disclaimer and Export Compliance provision. In addition, + * Licensee must cause all Covered Code to which Licensee contributes to + * contain a file documenting the changes Licensee made to create that Covered + * Code and the date of any change. Licensee must include in that file the + * documentation of any changes made by any predecessor Licensee. Licensee + * must include a prominent statement that the modification is derived, + * directly or indirectly, from Original Intel Code. + * + * 3.2. Redistribution of Source with no Rights to Further Distribute Source. + * Redistribution of source code of any substantial portion of the Covered + * Code or modification without rights to further distribute source must + * include the following Disclaimer and Export Compliance provision in the + * documentation and/or other materials provided with distribution. In + * addition, Licensee may not authorize further sublicense of source of any + * portion of the Covered Code, and must include terms to the effect that the + * license from Licensee to its licensee is limited to the intellectual + * property embodied in the software Licensee provides to its licensee, and + * not to intellectual property embodied in modifications its licensee may + * make. + * + * 3.3. Redistribution of Executable. Redistribution in executable form of any + * substantial portion of the Covered Code or modification must reproduce the + * above Copyright Notice, and the following Disclaimer and Export Compliance + * provision in the documentation and/or other materials provided with the + * distribution. + * + * 3.4. Intel retains all right, title, and interest in and to the Original + * Intel Code. + * + * 3.5. Neither the name Intel nor any other trademark owned or controlled by + * Intel shall be used in advertising or otherwise to promote the sale, use or + * other dealings in products derived from or relating to the Covered Code + * without prior written authorization from Intel. + * + * 4. Disclaimer and Export Compliance + * + * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED + * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE + * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, + * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY + * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY + * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES + * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR + * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, + * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY + * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL + * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS + * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY + * LIMITED REMEDY. + * + * 4.3. Licensee shall not export, either directly or indirectly, any of this + * software or system incorporating such software without first obtaining any + * required license or other approval from the U. S. Department of Commerce or + * any other agency or department of the United States Government. In the + * event Licensee exports any such software from the United States or + * re-exports any such software from a foreign destination, Licensee shall + * ensure that the distribution and export/re-export of the software is in + * compliance with all laws, regulations, orders, or other restrictions of the + * U.S. Export Administration Regulations. Licensee agrees that neither it nor + * any of its subsidiaries will export/re-export any technical data, process, + * software, or service, directly or indirectly, to any country for which the + * United States government or any agency thereof requires an export license, + * other governmental approval, or letter of assurance, without first obtaining + * such license, approval or letter. + * + ***************************************************************************** + * + * Alternatively, you may choose to be licensed under the terms of the + * following license: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, you may choose to be licensed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + * + *****************************************************************************/ + +#include "acpi.h" +#include "accommon.h" +#include "acdisasm.h" +#include "acutils.h" + + +/* This module used for application-level code only */ + +#define _COMPONENT ACPI_CA_DISASSEMBLER + ACPI_MODULE_NAME ("utcksum") + + +/******************************************************************************* + * + * FUNCTION: AcpiUtVerifyChecksum + * + * PARAMETERS: Table - ACPI table to verify + * Length - Length of entire table + * + * RETURN: Status + * + * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns + * exception on bad checksum. + * Note: We don't have to check for a CDAT here, since CDAT is + * not in the RSDT/XSDT, and the CDAT table is never installed + * via ACPICA. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtVerifyChecksum ( + ACPI_TABLE_HEADER *Table, + UINT32 Length) +{ + UINT8 Checksum; + + + /* + * FACS/S3PT: + * They are the odd tables, have no standard ACPI header and no checksum + */ + if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT) || + ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS)) + { + return (AE_OK); + } + + /* Compute the checksum on the table */ + + Length = Table->Length; + Checksum = AcpiUtGenerateChecksum (ACPI_CAST_PTR (UINT8, Table), Length, Table->Checksum); + + /* Computed checksum matches table? */ + + if (Checksum != Table->Checksum) + { + ACPI_BIOS_WARNING ((AE_INFO, + "Incorrect checksum in table [%4.4s] - 0x%2.2X, " + "should be 0x%2.2X", + Table->Signature, Table->Checksum, + Table->Checksum - Checksum)); + +#if (ACPI_CHECKSUM_ABORT) + return (AE_BAD_CHECKSUM); +#endif + } + + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtVerifyCdatChecksum + * + * PARAMETERS: Table - CDAT ACPI table to verify + * Length - Length of entire table + * + * RETURN: Status + * + * DESCRIPTION: Verifies that the CDAT table checksums to zero. Optionally + * returns an exception on bad checksum. + * + ******************************************************************************/ + +ACPI_STATUS +AcpiUtVerifyCdatChecksum ( + ACPI_TABLE_CDAT *CdatTable, + UINT32 Length) +{ + UINT8 Checksum; + + + /* Compute the checksum on the table */ + + Checksum = AcpiUtGenerateChecksum (ACPI_CAST_PTR (UINT8, CdatTable), + CdatTable->Length, CdatTable->Checksum); + + /* Computed checksum matches table? */ + + if (Checksum != CdatTable->Checksum) + { + ACPI_BIOS_WARNING ((AE_INFO, + "Incorrect checksum in table [%4.4s] - 0x%2.2X, " + "should be 0x%2.2X", + AcpiGbl_CDAT, CdatTable->Checksum, Checksum)); + +#if (ACPI_CHECKSUM_ABORT) + return (AE_BAD_CHECKSUM); +#endif + } + + CdatTable->Checksum = Checksum; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtGenerateChecksum + * + * PARAMETERS: Table - Pointer to table to be checksummed + * Length - Length of the table + * OriginalChecksum - Value of the checksum field + * + * RETURN: 8 bit checksum of buffer + * + * DESCRIPTION: Computes an 8 bit checksum of the table. + * + ******************************************************************************/ + +UINT8 +AcpiUtGenerateChecksum ( + void *Table, + UINT32 Length, + UINT8 OriginalChecksum) +{ + UINT8 Checksum; + + + /* Sum the entire table as-is */ + + Checksum = AcpiUtChecksum ((UINT8 *) Table, Length); + + /* Subtract off the existing checksum value in the table */ + + Checksum = (UINT8) (Checksum - OriginalChecksum); + + /* Compute and return the final checksum */ + + Checksum = (UINT8) (0 - Checksum); + return (Checksum); +} + + +/******************************************************************************* + * + * FUNCTION: AcpiUtChecksum + * + * PARAMETERS: Buffer - Pointer to memory region to be checked + * Length - Length of this memory region + * + * RETURN: Checksum (UINT8) + * + * DESCRIPTION: Calculates circular checksum of memory region. + * + ******************************************************************************/ + +UINT8 +AcpiUtChecksum ( + UINT8 *Buffer, + UINT32 Length) +{ + UINT8 Sum = 0; + UINT8 *End = Buffer + Length; + + + while (Buffer < End) + { + Sum = (UINT8) (Sum + *(Buffer++)); + } + + return (Sum); +} diff --git a/src/acpica/source/components/utilities/utglobal.c b/src/acpica/source/components/utilities/utglobal.c index 7de4a9c3..43de5c0a 100644 --- a/src/acpica/source/components/utilities/utglobal.c +++ b/src/acpica/source/components/utilities/utglobal.c @@ -287,6 +287,7 @@ ACPI_FIXED_EVENT_INFO AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] = /* ACPI_EVENT_POWER_BUTTON */ {ACPI_BITREG_POWER_BUTTON_STATUS, ACPI_BITREG_POWER_BUTTON_ENABLE, ACPI_BITMASK_POWER_BUTTON_STATUS, ACPI_BITMASK_POWER_BUTTON_ENABLE}, /* ACPI_EVENT_SLEEP_BUTTON */ {ACPI_BITREG_SLEEP_BUTTON_STATUS, ACPI_BITREG_SLEEP_BUTTON_ENABLE, ACPI_BITMASK_SLEEP_BUTTON_STATUS, ACPI_BITMASK_SLEEP_BUTTON_ENABLE}, /* ACPI_EVENT_RTC */ {ACPI_BITREG_RT_CLOCK_STATUS, ACPI_BITREG_RT_CLOCK_ENABLE, ACPI_BITMASK_RT_CLOCK_STATUS, ACPI_BITMASK_RT_CLOCK_ENABLE}, + /* ACPI_EVENT_PCIE_WAKE */ {ACPI_BITREG_PCIEXP_WAKE_STATUS, ACPI_BITREG_PCIEXP_WAKE_DISABLE, ACPI_BITMASK_PCIEXP_WAKE_STATUS, ACPI_BITMASK_PCIEXP_WAKE_DISABLE}, }; #endif /* !ACPI_REDUCED_HARDWARE */ diff --git a/src/acpica/source/components/utilities/utstring.c b/src/acpica/source/components/utilities/utstring.c index 5af4c4d3..770f3078 100644 --- a/src/acpica/source/components/utilities/utstring.c +++ b/src/acpica/source/components/utilities/utstring.c @@ -308,7 +308,7 @@ AcpiUtRepairName ( return; } - ACPI_COPY_NAMESEG (&OriginalName, Name); + ACPI_COPY_NAMESEG (&OriginalName, &Name[0]); /* Check each character in the name */ @@ -321,10 +321,10 @@ AcpiUtRepairName ( /* * Replace a bad character with something printable, yet technically - * still invalid. This prevents any collisions with existing "good" + * "odd". This prevents any collisions with existing "good" * names in the namespace. */ - Name[i] = '*'; + Name[i] = '_'; FoundBadChar = TRUE; } @@ -335,8 +335,8 @@ AcpiUtRepairName ( if (!AcpiGbl_EnableInterpreterSlack) { ACPI_WARNING ((AE_INFO, - "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", - OriginalName, Name)); + "Invalid character(s) in name (0x%.8X) %p, repaired: [%4.4s]", + OriginalName, Name, &Name[0])); } else { diff --git a/src/acpica/source/include/acconfig.h b/src/acpica/source/include/acconfig.h index 8ba7dc28..04f7f4f0 100644 --- a/src/acpica/source/include/acconfig.h +++ b/src/acpica/source/include/acconfig.h @@ -335,6 +335,8 @@ #define ACPI_PRM_INPUT_BUFFER_SIZE 26 +#define ACPI_FFH_INPUT_BUFFER_SIZE 256 + /* _SxD and _SxW control methods */ #define ACPI_NUM_SxD_METHODS 4 diff --git a/src/acpica/source/include/acdisasm.h b/src/acpica/source/include/acdisasm.h index 352417cb..47ce0b15 100644 --- a/src/acpica/source/include/acdisasm.h +++ b/src/acpica/source/include/acdisasm.h @@ -260,6 +260,7 @@ typedef enum ACPI_DMT_AEST_XRUPT, ACPI_DMT_AGDI, ACPI_DMT_ASF, + ACPI_DMT_CDAT, ACPI_DMT_CEDT, ACPI_DMT_DMAR, ACPI_DMT_DMAR_SCOPE, @@ -402,6 +403,16 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoBdat[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoBoot[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoBert[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoBgrt[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCcel[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdatTableHdr[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdatHeader[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat0[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat1[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat2[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat3[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat4[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdat5[]; +extern ACPI_DMTABLE_INFO AcpiDmTableInfoCdatEntries[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoCedtHdr[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoCedt0[]; extern ACPI_DMTABLE_INFO AcpiDmTableInfoCedt1[]; @@ -747,6 +758,14 @@ void AcpiDmDumpAsf ( ACPI_TABLE_HEADER *Table); +void +AcpiDmDumpCcel ( + ACPI_TABLE_HEADER *Table); + +void +AcpiDmDumpCdat ( + ACPI_TABLE_HEADER *Table); + void AcpiDmDumpCedt ( ACPI_TABLE_HEADER *Table); diff --git a/src/acpica/source/include/acglobal.h b/src/acpica/source/include/acglobal.h index b8831b46..1850d94b 100644 --- a/src/acpica/source/include/acglobal.h +++ b/src/acpica/source/include/acglobal.h @@ -167,6 +167,7 @@ ACPI_GLOBAL (ACPI_TABLE_LIST, AcpiGbl_RootTableList); ACPI_GLOBAL (ACPI_TABLE_HEADER *, AcpiGbl_DSDT); ACPI_GLOBAL (ACPI_TABLE_HEADER, AcpiGbl_OriginalDsdtHeader); +ACPI_INIT_GLOBAL (char *, AcpiGbl_CDAT, NULL); ACPI_INIT_GLOBAL (UINT32, AcpiGbl_DsdtIndex, ACPI_INVALID_TABLE_INDEX); ACPI_INIT_GLOBAL (UINT32, AcpiGbl_FacsIndex, ACPI_INVALID_TABLE_INDEX); ACPI_INIT_GLOBAL (UINT32, AcpiGbl_XFacsIndex, ACPI_INVALID_TABLE_INDEX); diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h index f62c16cb..7b779375 100644 --- a/src/acpica/source/include/acpixf.h +++ b/src/acpica/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20220331 +#define ACPI_CA_VERSION 0x20221020 #include "acconfig.h" #include "actypes.h" diff --git a/src/acpica/source/include/actables.h b/src/acpica/source/include/actables.h index 40b79a47..e9b070f9 100644 --- a/src/acpica/source/include/actables.h +++ b/src/acpica/source/include/actables.h @@ -345,16 +345,6 @@ AcpiTbPrintTableHeader( ACPI_PHYSICAL_ADDRESS Address, ACPI_TABLE_HEADER *Header); -UINT8 -AcpiTbChecksum ( - UINT8 *Buffer, - UINT32 Length); - -ACPI_STATUS -AcpiTbVerifyChecksum ( - ACPI_TABLE_HEADER *Table, - UINT32 Length); - void AcpiTbCheckDsdtHeader ( void); diff --git a/src/acpica/source/include/actbinfo.h b/src/acpica/source/include/actbinfo.h index 633f7349..7ce3c21e 100644 --- a/src/acpica/source/include/actbinfo.h +++ b/src/acpica/source/include/actbinfo.h @@ -161,6 +161,7 @@ #define ACPI_BERT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_BERT,f) #define ACPI_BGRT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_BGRT,f) #define ACPI_BOOT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_BOOT,f) +#define ACPI_CCEL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_CCEL,f) #define ACPI_CPEP_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_CPEP,f) #define ACPI_DBG2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_DBG2,f) #define ACPI_DBGP_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_DBGP,f) @@ -233,6 +234,15 @@ #define ACPI_ASF2a_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_CONTROL_DATA,f) #define ACPI_ASF3_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_RMCP,f) #define ACPI_ASF4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASF_ADDRESS,f) +#define ACPI_CDAT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_CDAT,f) +#define ACPI_CDATH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_HEADER,f) +#define ACPI_CDAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSMAS,f) +#define ACPI_CDAT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSLBIS,f) +#define ACPI_CDAT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSMSCIS,f) +#define ACPI_CDAT3_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSIS,f) +#define ACPI_CDAT4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_DSEMTS,f) +#define ACPI_CDAT5_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_SSLBIS,f) +#define ACPI_CDATE_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CDAT_SSLBE,f) #define ACPI_CEDT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CEDT_HEADER, f) #define ACPI_CEDT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CEDT_CHBS, f) #define ACPI_CEDT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_CEDT_CFMWS, f) diff --git a/src/acpica/source/include/actbl1.h b/src/acpica/source/include/actbl1.h index 3de78b0d..340b636b 100644 --- a/src/acpica/source/include/actbl1.h +++ b/src/acpica/source/include/actbl1.h @@ -189,6 +189,7 @@ #define ACPI_SIG_HMAT "HMAT" /* Heterogeneous Memory Attributes Table */ #define ACPI_SIG_HPET "HPET" /* High Precision Event Timer table */ #define ACPI_SIG_IBFT "IBFT" /* iSCSI Boot Firmware Table */ +#define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table*/ #define ACPI_SIG_S3PT "S3PT" /* S3 Performance (sub)Table */ #define ACPI_SIG_PCCS "PCC" /* PCC Shared Memory Region */ @@ -494,12 +495,154 @@ typedef struct acpi_table_boot } ACPI_TABLE_BOOT; + +/******************************************************************************* + * + * CDAT - Coherent Device Attribute Table + * Version 1 + * + * Conforms to the "Coherent Device Attribute Table (CDAT) Specification + " (Revision 1.01, October 2020.) + * + ******************************************************************************/ + +typedef struct acpi_table_cdat +{ + UINT32 Length; /* Length of table in bytes, including this header */ + UINT8 Revision; /* ACPI Specification minor version number */ + UINT8 Checksum; /* To make sum of entire table == 0 */ + UINT8 Reserved[6]; + UINT32 Sequence; /* Used to detect runtime CDAT table changes */ + +} ACPI_TABLE_CDAT; + + +/* CDAT common subtable header */ + +typedef struct acpi_cdat_header +{ + UINT8 Type; + UINT8 Reserved; + UINT16 Length; + +} ACPI_CDAT_HEADER; + +/* Values for Type field above */ + +enum AcpiCdatType +{ + ACPI_CDAT_TYPE_DSMAS = 0, + ACPI_CDAT_TYPE_DSLBIS = 1, + ACPI_CDAT_TYPE_DSMSCIS = 2, + ACPI_CDAT_TYPE_DSIS = 3, + ACPI_CDAT_TYPE_DSEMTS = 4, + ACPI_CDAT_TYPE_SSLBIS = 5, + ACPI_CDAT_TYPE_RESERVED = 6 /* 6 through 0xFF are reserved */ +}; + + +/* Subtable 0: Device Scoped Memory Affinity Structure (DSMAS) */ + +typedef struct acpi_cadt_dsmas +{ + UINT8 DsmadHandle; + UINT8 Flags; + UINT16 Reserved; + UINT64 DpaBaseAddress; + UINT64 DpaLength; + +} ACPI_CDAT_DSMAS; + +/* Flags for subtable above */ + +#define ACPI_CEDT_DSMAS_NON_VOLATILE (1 << 2) + + +/* Subtable 1: Device scoped Latency and Bandwidth Information Structure (DSLBIS) */ + +typedef struct acpi_cdat_dslbis +{ + UINT8 Handle; + UINT8 Flags; /* If Handle matches a DSMAS handle, the definition of this field matches + * Flags field in HMAT System Locality Latency */ + UINT8 DataType; + UINT8 Reserved; + UINT64 EntryBaseUnit; + UINT16 Entry[3]; + UINT16 Reserved2; + +} ACPI_CDAT_DSLBIS; + + +/* Subtable 2: Device Scoped Memory Side Cache Information Structure (DSMSCIS) */ + +typedef struct acpi_cdat_dsmscis +{ + UINT8 DsmasHandle; + UINT8 Reserved[3]; + UINT64 SideCacheSize; + UINT32 CacheAttributes; + +} ACPI_CDAT_DSMSCIS; + + +/* Subtable 3: Device Scoped Initiator Structure (DSIS) */ + +typedef struct acpi_cdat_dsis +{ + UINT8 Flags; + UINT8 Handle; + UINT16 Reserved; + +} ACPI_CDAT_DSIS; + +/* Flags for above subtable */ + +#define ACPI_CDAT_DSIS_MEM_ATTACHED (1 << 0) + + +/* Subtable 4: Device Scoped EFI Memory Type Structure (DSEMTS) */ + +typedef struct acpi_cdat_dsemts +{ + UINT8 DsmasHandle; + UINT8 MemoryType; + UINT16 Reserved; + UINT64 DpaOffset; + UINT64 RangeLength; + +} ACPI_CDAT_DSEMTS; + + +/* Subtable 5: Switch Scoped Latency and Bandwidth Information Structure (SSLBIS) */ + +typedef struct acpi_cdat_sslbis +{ + UINT8 DataType; + UINT8 Reserved[3]; + UINT64 EntryBaseUnit; + +} ACPI_CDAT_SSLBIS; + + +/* Sub-subtable for above, SslbeEntries field */ + +typedef struct acpi_cdat_sslbe +{ + UINT16 PortxId; + UINT16 PortyId; + UINT16 LatencyOrBandwidth; + UINT16 Reserved; + +} ACPI_CDAT_SSLBE; + + /******************************************************************************* * * CEDT - CXL Early Discovery Table * Version 1 * - * Conforms to the "CXL Early Discovery Table" (CXL 2.0) + * Conforms to the "CXL Early Discovery Table" (CXL 2.0, October 2020) * ******************************************************************************/ @@ -525,7 +668,9 @@ enum AcpiCedtType { ACPI_CEDT_TYPE_CHBS = 0, ACPI_CEDT_TYPE_CFMWS = 1, - ACPI_CEDT_TYPE_RESERVED = 2, + ACPI_CEDT_TYPE_CXIMS = 2, + ACPI_CEDT_TYPE_RDPAS = 3, + ACPI_CEDT_TYPE_RESERVED = 4, }; /* Values for version field above */ @@ -583,6 +728,7 @@ typedef struct acpi_cedt_cfmws_target_element /* Values for Interleave Arithmetic field above */ #define ACPI_CEDT_CFMWS_ARITHMETIC_MODULO (0) +#define ACPI_CEDT_CFMWS_ARITHMETIC_XOR (1) /* Values for Restrictions field above */ @@ -592,6 +738,35 @@ typedef struct acpi_cedt_cfmws_target_element #define ACPI_CEDT_CFMWS_RESTRICT_PMEM (1<<3) #define ACPI_CEDT_CFMWS_RESTRICT_FIXED (1<<4) +/* 2: CXL XOR Interleave Math Structure */ + +struct acpi_cedt_cxims { + ACPI_CEDT_HEADER Header; + UINT16 Reserved1; + UINT8 Hbig; + UINT8 NrXormaps; + UINT64 XormapList[]; +}; + +/* 3: CXL RCEC Downstream Port Association Structure */ + +struct acpi_cedt_rdpas { + ACPI_CEDT_HEADER Header; + UINT8 Reserved1; + UINT16 Length; + UINT16 Segment; + UINT16 Bdf; + UINT8 Protocol; + UINT64 Address; +}; + +/* Masks for bdf field above */ +#define ACPI_CEDT_RDPAS_BUS_MASK 0xff00 +#define ACPI_CEDT_RDPAS_DEVICE_MASK 0x00f8 +#define ACPI_CEDT_RDPAS_FUNCTION_MASK 0x0007 + +#define ACPI_CEDT_RDPAS_PROTOCOL_IO (0) +#define ACPI_CEDT_RDPAS_PROTOCOL_CACHEMEM (1) /******************************************************************************* * diff --git a/src/acpica/source/include/actbl2.h b/src/acpica/source/include/actbl2.h index 3032c5e2..4be5f0fc 100644 --- a/src/acpica/source/include/actbl2.h +++ b/src/acpica/source/include/actbl2.h @@ -171,6 +171,8 @@ #define ACPI_SIG_AGDI "AGDI" /* Arm Generic Diagnostic Dump and Reset Device Interface */ #define ACPI_SIG_APMT "APMT" /* Arm Performance Monitoring Unit table */ #define ACPI_SIG_BDAT "BDAT" /* BIOS Data ACPI Table */ +#define ACPI_SIG_CCEL "CCEL" /* CC Event Log Table */ +#define ACPI_SIG_CDAT "CDAT" /* Coherent Device Attribute Table */ #define ACPI_SIG_IORT "IORT" /* IO Remapping Table */ #define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */ #define ACPI_SIG_LPIT "LPIT" /* Low Power Idle Table */ @@ -178,7 +180,6 @@ #define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */ #define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */ #define ACPI_SIG_MPST "MPST" /* Memory Power State Table */ -#define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */ #define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */ #define ACPI_SIG_NFIT "NFIT" /* NVDIMM Firmware Interface Table */ #define ACPI_SIG_NHLT "NHLT" /* Non HD Audio Link Table */ @@ -521,13 +522,31 @@ typedef struct acpi_table_bdat } ACPI_TABLE_BDAT; +/******************************************************************************* + * + * CCEL - CC-Event Log + * From: "Guest-Host-Communication Interface (GHCI) for Intel + * Trust Domain Extensions (Intel TDX)". Feb 2022 + * + ******************************************************************************/ + +typedef struct acpi_table_ccel +{ + ACPI_TABLE_HEADER Header; /* Common ACPI table header */ + UINT8 CCType; + UINT8 CCSubType; + UINT16 Reserved; + UINT64 LogAreaMinimumLength; + UINT64 LogAreaStartAddress; + +} ACPI_TABLE_CCEL; /******************************************************************************* * * IORT - IO Remapping Table * * Conforms to "IO Remapping Table System Software on ARM Platforms", - * Document number: ARM DEN 0049E.d, Feb 2022 + * Document number: ARM DEN 0049E.e, Sep 2022 * ******************************************************************************/ @@ -725,6 +744,7 @@ typedef struct acpi_iort_smmu_v3 #define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1) #define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (3<<1) #define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3) +#define ACPI_IORT_SMMU_V3_DEVICEID_VALID (1<<4) typedef struct acpi_iort_pmcg { @@ -1107,7 +1127,14 @@ enum AcpiMadtType ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14, ACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15, ACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16, - ACPI_MADT_TYPE_RESERVED = 17, /* 17 to 0x7F are reserved */ + ACPI_MADT_TYPE_CORE_PIC = 17, + ACPI_MADT_TYPE_LIO_PIC = 18, + ACPI_MADT_TYPE_HT_PIC = 19, + ACPI_MADT_TYPE_EIO_PIC = 20, + ACPI_MADT_TYPE_MSI_PIC = 21, + ACPI_MADT_TYPE_BIO_PIC = 22, + ACPI_MADT_TYPE_LPC_PIC = 23, + ACPI_MADT_TYPE_RESERVED = 24, /* 24 to 0x7F are reserved */ ACPI_MADT_TYPE_OEM_RESERVED = 0x80 /* 0x80 to 0xFF are reserved for OEM use */ }; @@ -1391,7 +1418,135 @@ typedef struct acpi_madt_multiproc_wakeup_mailbox #define ACPI_MP_WAKE_COMMAND_WAKEUP 1 -/* 17: OEM data */ +/* 17: CPU Core Interrupt Controller (ACPI 6.5) */ + +typedef struct acpi_madt_core_pic { + ACPI_SUBTABLE_HEADER Header; + UINT8 Version; + UINT32 ProcessorId; + UINT32 CoreId; + UINT32 Flags; +} ACPI_MADT_CORE_PIC; + +/* Values for Version field above */ + +enum AcpiMadtCorePicVersion { + ACPI_MADT_CORE_PIC_VERSION_NONE = 0, + ACPI_MADT_CORE_PIC_VERSION_V1 = 1, + ACPI_MADT_CORE_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* 18: Legacy I/O Interrupt Controller (ACPI 6.5) */ + +typedef struct acpi_madt_lio_pic { + ACPI_SUBTABLE_HEADER Header; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT8 Cascade[2]; + UINT32 CascadeMap[2]; +} ACPI_MADT_LIO_PIC; + +/* Values for Version field above */ + +enum AcpiMadtLioPicVersion { + ACPI_MADT_LIO_PIC_VERSION_NONE = 0, + ACPI_MADT_LIO_PIC_VERSION_V1 = 1, + ACPI_MADT_LIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* 19: HT Interrupt Controller (ACPI 6.5) */ + +typedef struct acpi_madt_ht_pic { + ACPI_SUBTABLE_HEADER Header; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT8 Cascade[8]; +} ACPI_MADT_HT_PIC; + +/* Values for Version field above */ + +enum AcpiMadtHtPicVersion { + ACPI_MADT_HT_PIC_VERSION_NONE = 0, + ACPI_MADT_HT_PIC_VERSION_V1 = 1, + ACPI_MADT_HT_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* 20: Extend I/O Interrupt Controller (ACPI 6.5) */ + +typedef struct acpi_madt_eio_pic { + ACPI_SUBTABLE_HEADER Header; + UINT8 Version; + UINT8 Cascade; + UINT8 Node; + UINT64 NodeMap; +} ACPI_MADT_EIO_PIC; + +/* Values for Version field above */ + +enum AcpiMadtEioPicVersion { + ACPI_MADT_EIO_PIC_VERSION_NONE = 0, + ACPI_MADT_EIO_PIC_VERSION_V1 = 1, + ACPI_MADT_EIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* 21: MSI Interrupt Controller (ACPI 6.5) */ + +typedef struct acpi_madt_msi_pic { + ACPI_SUBTABLE_HEADER Header; + UINT8 Version; + UINT64 MsgAddress; + UINT32 Start; + UINT32 Count; +} ACPI_MADT_MSI_PIC; + +/* Values for Version field above */ + +enum AcpiMadtMsiPicVersion { + ACPI_MADT_MSI_PIC_VERSION_NONE = 0, + ACPI_MADT_MSI_PIC_VERSION_V1 = 1, + ACPI_MADT_MSI_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* 22: Bridge I/O Interrupt Controller (ACPI 6.5) */ + +typedef struct acpi_madt_bio_pic { + ACPI_SUBTABLE_HEADER Header; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT16 Id; + UINT16 GsiBase; +} ACPI_MADT_BIO_PIC; + +/* Values for Version field above */ + +enum AcpiMadtBioPicVersion { + ACPI_MADT_BIO_PIC_VERSION_NONE = 0, + ACPI_MADT_BIO_PIC_VERSION_V1 = 1, + ACPI_MADT_BIO_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* 23: LPC Interrupt Controller (ACPI 6.5) */ + +typedef struct acpi_madt_lpc_pic { + ACPI_SUBTABLE_HEADER Header; + UINT8 Version; + UINT64 Address; + UINT16 Size; + UINT8 Cascade; +} ACPI_MADT_LPC_PIC; + +/* Values for Version field above */ + +enum AcpiMadtLpcPicVersion { + ACPI_MADT_LPC_PIC_VERSION_NONE = 0, + ACPI_MADT_LPC_PIC_VERSION_V1 = 1, + ACPI_MADT_LPC_PIC_VERSION_RESERVED = 2 /* 2 and greater are reserved */ +}; + +/* 80: OEM data */ typedef struct acpi_madt_oem_data { diff --git a/src/acpica/source/include/actypes.h b/src/acpica/source/include/actypes.h index 99588f67..92da002a 100644 --- a/src/acpica/source/include/actypes.h +++ b/src/acpica/source/include/actypes.h @@ -873,7 +873,8 @@ typedef UINT32 ACPI_EVENT_TYPE; #define ACPI_EVENT_POWER_BUTTON 2 #define ACPI_EVENT_SLEEP_BUTTON 3 #define ACPI_EVENT_RTC 4 -#define ACPI_EVENT_MAX 4 +#define ACPI_EVENT_PCIE_WAKE 5 +#define ACPI_EVENT_MAX 5 #define ACPI_NUM_FIXED_EVENTS ACPI_EVENT_MAX + 1 /* @@ -1335,6 +1336,12 @@ typedef struct acpi_pcc_info { UINT8 *InternalBuffer; } ACPI_PCC_INFO; +/* Special Context data for FFH Opregion (ACPI 6.5) */ + +typedef struct acpi_ffh_info { + UINT64 Offset; + UINT64 Length; +} ACPI_FFH_INFO; typedef ACPI_STATUS (*ACPI_ADR_SPACE_SETUP) ( diff --git a/src/acpica/source/include/acutils.h b/src/acpica/source/include/acutils.h index f23ee559..a0e7953b 100644 --- a/src/acpica/source/include/acutils.h +++ b/src/acpica/source/include/acutils.h @@ -317,6 +317,31 @@ AcpiUtCheckAndRepairAscii ( UINT32 Count); +/* + * utcksum - Checksum utilities + */ +UINT8 +AcpiUtGenerateChecksum ( + void *Table, + UINT32 Length, + UINT8 OriginalChecksum); + +UINT8 +AcpiUtChecksum ( + UINT8 *Buffer, + UINT32 Length); + +ACPI_STATUS +AcpiUtVerifyCdatChecksum ( + ACPI_TABLE_CDAT *CdatTable, + UINT32 Length); + +ACPI_STATUS +AcpiUtVerifyChecksum ( + ACPI_TABLE_HEADER *Table, + UINT32 Length); + + /* * utnonansi - Non-ANSI C library functions */ diff --git a/src/acpica/source/include/acuuid.h b/src/acpica/source/include/acuuid.h index bc41fa40..2ab07bb3 100644 --- a/src/acpica/source/include/acuuid.h +++ b/src/acpica/source/include/acuuid.h @@ -211,5 +211,6 @@ #define UUID_HIERARCHICAL_DATA_EXTENSION "dbb8e3e6-5886-4ba6-8795-1319f52a966b" #define UUID_CORESIGHT_GRAPH "3ecbc8b6-1d0e-4fb3-8107-e627f805c6cd" #define UUID_USB4_CAPABILITIES "23a0d13a-26ab-486c-9c5f-0ffa525a575a" - +#define UUID_1ST_FUNCTION_ID "893f00a6-660c-494e-bcfd-3043f4fb67c0" +#define UUID_2ND_FUNCTION_ID "107ededd-d381-4fd7-8da9-08e9a6c79644" #endif /* __ACUUID_H__ */ diff --git a/src/libfwtsacpica/Makefile.am b/src/libfwtsacpica/Makefile.am index 57cd7b82..ee515597 100644 --- a/src/libfwtsacpica/Makefile.am +++ b/src/libfwtsacpica/Makefile.am @@ -236,6 +236,7 @@ libfwtsacpica_la_SOURCES = \ ../../src/acpica/source/components/utilities/utalloc.c \ ../../src/acpica/source/components/utilities/utascii.c \ ../../src/acpica/source/components/utilities/utcache.c \ + ../../src/acpica/source/components/utilities/utcksum.c \ ../../src/acpica/source/components/utilities/utcopy.c \ ../../src/acpica/source/components/utilities/utdebug.c \ ../../src/acpica/source/components/utilities/utdelete.c \ diff --git a/src/libfwtsacpica/fwts_acpica.c b/src/libfwtsacpica/fwts_acpica.c index 50231464..35e26c05 100644 --- a/src/libfwtsacpica/fwts_acpica.c +++ b/src/libfwtsacpica/fwts_acpica.c @@ -1104,7 +1104,7 @@ int fwts_acpica_init(fwts_framework *fw) } fwts_acpica_FADT->Header.Checksum = 0; - fwts_acpica_FADT->Header.Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_FADT, table->length); + fwts_acpica_FADT->Header.Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_FADT, table->length); } else { fwts_acpica_FADT = NULL; } @@ -1144,7 +1144,7 @@ int fwts_acpica_init(fwts_framework *fw) } } fwts_acpica_XSDT->Header.Checksum = 0; - fwts_acpica_XSDT->Header.Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_XSDT, table->length); + fwts_acpica_XSDT->Header.Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_XSDT, table->length); } else { fwts_acpica_XSDT = NULL; } @@ -1180,7 +1180,7 @@ int fwts_acpica_init(fwts_framework *fw) } } fwts_acpica_RSDT->Header.Checksum = 0; - fwts_acpica_RSDT->Header.Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_RSDT, table->length); + fwts_acpica_RSDT->Header.Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_RSDT, table->length); } else { fwts_acpica_RSDT = NULL; } @@ -1199,7 +1199,7 @@ int fwts_acpica_init(fwts_framework *fw) if (table->length > 20) fwts_acpica_RSDP->XsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR(fwts_acpica_XSDT); fwts_acpica_RSDP->RsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR(fwts_acpica_RSDT); - fwts_acpica_RSDP->Checksum = (UINT8)-AcpiTbChecksum ((void*)fwts_acpica_RSDP, ACPI_RSDP_CHECKSUM_LENGTH); + fwts_acpica_RSDP->Checksum = (UINT8)-AcpiUtChecksum ((void*)fwts_acpica_RSDP, ACPI_RSDP_CHECKSUM_LENGTH); } else { fwts_acpica_RSDP = NULL; }
Changes in this release of ACPICA are detailed on the ACPICA developer mailing list for ACPICA 20221020 Signed-off-by: Colin Ian King <colin.i.king@gmail.com> --- src/acpica/source/common/acfileio.c | 131 +++++-- src/acpica/source/common/adisasm.c | 4 +- src/acpica/source/common/ahtable.c | 2 + src/acpica/source/common/ahuuids.c | 3 + src/acpica/source/common/dmtable.c | 116 +++--- src/acpica/source/common/dmtables.c | 2 +- src/acpica/source/common/dmtbdump.c | 4 +- src/acpica/source/common/dmtbdump1.c | 205 ++++++++++- src/acpica/source/common/dmtbdump2.c | 100 +++++- src/acpica/source/common/dmtbinfo1.c | 110 ++++++ src/acpica/source/common/dmtbinfo2.c | 33 +- src/acpica/source/common/dmtbinfo3.c | 17 + src/acpica/source/compiler/aslcodegen.c | 75 +++- src/acpica/source/compiler/aslcompile.c | 12 +- src/acpica/source/compiler/aslerror.c | 1 - src/acpica/source/compiler/aslhelp.c | 1 + src/acpica/source/compiler/asloptions.c | 30 +- src/acpica/source/compiler/aslpredef.c | 2 +- src/acpica/source/compiler/aslstartup.c | 2 +- src/acpica/source/compiler/dtcompile.c | 42 +++ src/acpica/source/compiler/dtcompiler.h | 8 +- src/acpica/source/compiler/dtio.c | 2 +- src/acpica/source/compiler/dttable1.c | 128 ++++++- src/acpica/source/compiler/dttable2.c | 169 +++++++-- src/acpica/source/compiler/dttemplate.h | 63 +++- src/acpica/source/compiler/dtutils.c | 3 +- src/acpica/source/components/events/evevent.c | 11 +- .../source/components/events/evregion.c | 8 + .../source/components/executer/exconfig.c | 2 +- .../source/components/executer/exfield.c | 6 +- .../source/components/executer/exserial.c | 6 + .../source/components/executer/exsystem.c | 12 - .../source/components/hardware/hwsleep.c | 10 + src/acpica/source/components/tables/tbdata.c | 2 +- src/acpica/source/components/tables/tbfadt.c | 2 +- src/acpica/source/components/tables/tbprint.c | 90 +---- src/acpica/source/components/tables/tbutils.c | 2 +- .../source/components/tables/tbxfroot.c | 32 +- .../source/components/utilities/utcksum.c | 335 ++++++++++++++++++ .../source/components/utilities/utglobal.c | 1 + .../source/components/utilities/utstring.c | 10 +- src/acpica/source/include/acconfig.h | 2 + src/acpica/source/include/acdisasm.h | 19 + src/acpica/source/include/acglobal.h | 1 + src/acpica/source/include/acpixf.h | 2 +- src/acpica/source/include/actables.h | 10 - src/acpica/source/include/actbinfo.h | 10 + src/acpica/source/include/actbl1.h | 179 +++++++++- src/acpica/source/include/actbl2.h | 163 ++++++++- src/acpica/source/include/actypes.h | 9 +- src/acpica/source/include/acutils.h | 25 ++ src/acpica/source/include/acuuid.h | 3 +- src/libfwtsacpica/Makefile.am | 1 + src/libfwtsacpica/fwts_acpica.c | 8 +- 54 files changed, 1924 insertions(+), 302 deletions(-) create mode 100644 src/acpica/source/components/utilities/utcksum.c