summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremi Piotrowski <jpiotrowski@linux.microsoft.com>2023-01-24 10:43:11 +0000
committerJeremi Piotrowski <jpiotrowski@linux.microsoft.com>2023-01-24 15:11:41 +0000
commit6771f8b758299bd383bab145d5fd36ec229b2d70 (patch)
tree08525b4e6e5500afa87fcbbe57312897224aa36f
parentd9a0d78fb737445fd69ecf752ea219eda86ce6b9 (diff)
downloadacpica-6771f8b758299bd383bab145d5fd36ec229b2d70.tar.gz
Add support for ASPT table in disassembler
ASPT is the AMD Secure Processor table, found in Hyper-V VMs when SNP isolation is exposed to the VM and in some high-end AMD servers. This commit adds support for rev 1 of the ASPT spec in the disassembler.
-rw-r--r--source/common/ahtable.c1
-rw-r--r--source/common/dmtable.c21
-rw-r--r--source/common/dmtbdump1.c89
-rw-r--r--source/common/dmtbinfo1.c51
-rw-r--r--source/compiler/dtutils.c1
-rw-r--r--source/include/acdisasm.h10
-rw-r--r--source/include/actbinfo.h5
-rw-r--r--source/include/actbl1.h81
8 files changed, 259 insertions, 0 deletions
diff --git a/source/common/ahtable.c b/source/common/ahtable.c
index 418621b66..5d6a55f62 100644
--- a/source/common/ahtable.c
+++ b/source/common/ahtable.c
@@ -202,6 +202,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] =
{ACPI_SIG_AEST, "Arm Error Source Table"},
{ACPI_SIG_AGDI, "Arm Generic Diagnostic Dump and Reset Device Interface Table"},
{ACPI_SIG_ASF, "Alert Standard Format Table"},
+ {ACPI_SIG_ASPT, "AMD Secure Processor Table"},
{ACPI_SIG_BDAT, "BIOS Data ACPI Table"},
{ACPI_SIG_BERT, "Boot Error Record Table"},
{ACPI_SIG_BGRT, "Boot Graphics Resource Table"},
diff --git a/source/common/dmtable.c b/source/common/dmtable.c
index 9b95ecc74..f99f79314 100644
--- a/source/common/dmtable.c
+++ b/source/common/dmtable.c
@@ -234,6 +234,14 @@ static const char *AcpiDmAsfSubnames[] =
"Unknown Subtable Type" /* Reserved */
};
+static const char *AcpiDmAsptSubnames[] =
+{
+ "ASPT Global Registers",
+ "ASPT SEV Mailbox Registers",
+ "ASPT ACPI Mailbox Registers",
+ "Unknown Subtable Type" /* Reserved */
+};
+
static const char *AcpiDmCdatSubnames[] =
{
"Device Scoped Memory Affinity Structure (DSMAS)",
@@ -672,6 +680,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] =
{ACPI_SIG_AGDI, AcpiDmTableInfoAgdi, NULL, NULL, TemplateAgdi},
{ACPI_SIG_APMT, NULL, AcpiDmDumpApmt, DtCompileApmt, TemplateApmt},
{ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf},
+ {ACPI_SIG_ASPT, NULL, AcpiDmDumpAspt, NULL, NULL},
{ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat},
{ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert},
{ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt},
@@ -1158,6 +1167,7 @@ AcpiDmDumpTable (
ByteLength = 1;
break;
+ case ACPI_DMT_ASPT:
case ACPI_DMT_UINT16:
case ACPI_DMT_DMAR:
case ACPI_DMT_HEST:
@@ -1661,6 +1671,17 @@ AcpiDmDumpTable (
AcpiDmAestXruptNames[Temp8]);
break;
+ case ACPI_DMT_ASPT:
+ /* ASPT subtable types */
+ Temp16 = ACPI_GET16(Target);
+ if (Temp16 > ACPI_ASPT_TYPE_UNKNOWN)
+ {
+ Temp16 = ACPI_ASPT_TYPE_UNKNOWN;
+ }
+
+ AcpiOsPrintf(UINT16_FORMAT, Temp16, AcpiDmAsptSubnames[Temp16]);
+ break;
+
case ACPI_DMT_ASF:
/* ASF subtable types */
diff --git a/source/common/dmtbdump1.c b/source/common/dmtbdump1.c
index 76fe3e5b0..4f639dbc1 100644
--- a/source/common/dmtbdump1.c
+++ b/source/common/dmtbdump1.c
@@ -609,6 +609,95 @@ AcpiDmDumpAsf (
}
}
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpAspt
+ *
+ * PARAMETERS: Table - A ASPT table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a ASPT table
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpAspt (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_STATUS Status;
+ UINT32 Offset = sizeof (ACPI_TABLE_ASPT);
+ UINT32 Length = Table->Length;
+ ACPI_ASPT_HEADER *Subtable;
+ ACPI_DMTABLE_INFO *InfoTable;
+ UINT16 Type;
+
+ /* Main table */
+ Status = AcpiDmDumpTable(Length, 0, Table, 0, AcpiDmTableInfoAspt);
+
+ /* Subtables */
+
+ Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ AcpiOsPrintf ("\n");
+
+ /* Common subtable header */
+ Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+ Subtable->Length, AcpiDmTableInfoAsptHdr);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ Type = Subtable->Type;
+
+ switch (Type)
+ {
+ case ACPI_ASPT_TYPE_GLOBAL_REGS:
+
+ InfoTable = AcpiDmTableInfoAspt0;
+ break;
+
+ case ACPI_ASPT_TYPE_SEV_MBOX_REGS:
+
+ InfoTable = AcpiDmTableInfoAspt1;
+ break;
+
+ case ACPI_ASPT_TYPE_ACPI_MBOX_REGS:
+
+ InfoTable = AcpiDmTableInfoAspt2;
+ break;
+
+ default:
+
+ AcpiOsPrintf ("\n**** Unknown ASPT subtable type 0x%X\n",
+ Subtable->Type);
+ return;
+ }
+
+ Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
+ Subtable->Length, InfoTable);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ AcpiOsPrintf ("\n");
+
+ /* Point to next subtable */
+ if (!Subtable->Length)
+ {
+ AcpiOsPrintf ("Invalid zero subtable header length\n");
+ return;
+ }
+
+ Offset += Subtable->Length;
+ Subtable = ACPI_ADD_PTR (ACPI_ASPT_HEADER, Subtable,
+ Subtable->Length);
+ }
+}
+
/*******************************************************************************
*
diff --git a/source/common/dmtbinfo1.c b/source/common/dmtbinfo1.c
index 9afed4d6a..4f470fec5 100644
--- a/source/common/dmtbinfo1.c
+++ b/source/common/dmtbinfo1.c
@@ -435,6 +435,57 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoAsf4[] =
/*******************************************************************************
*
+ * ASPT - AMD Secure Processor table (Signature "ASPT")
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAspt[] =
+{
+ {ACPI_DMT_UINT32, ACPI_ASPT_OFFSET(NumEntries), "Number of Subtables", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* Common Subtable header (one per Subtable) */
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsptHdr[] =
+{
+ {ACPI_DMT_ASPT, ACPI_ASPTH_OFFSET(Type), "Type", 0},
+ {ACPI_DMT_UINT16, ACPI_ASPTH_OFFSET(Length), "Length", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* 0: ASPT Global Registers */
+ACPI_DMTABLE_INFO AcpiDmTableInfoAspt0[] =
+{
+ {ACPI_DMT_UINT32, ACPI_ASPT0_OFFSET(Reserved), "Reserved", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT0_OFFSET(FeatureRegAddr), "Feature Register Address", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT0_OFFSET(IrqEnRegAddr), "Interrupt Enable Register Address", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT0_OFFSET(IrqStRegAddr), "Interrupt Status Register Address", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* 1: ASPT SEV Mailbox Registers */
+ACPI_DMTABLE_INFO AcpiDmTableInfoAspt1[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASPT1_OFFSET(MboxIrqId), "Mailbox Interrupt ID", 0},
+ {ACPI_DMT_UINT24, ACPI_ASPT1_OFFSET(Reserved[0]), "Reserved", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT1_OFFSET(CmdRespRegAddr), "CmdResp Register Address", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT1_OFFSET(CmdBufLoRegAddr), "CmdBufAddr_Lo Register Address", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT1_OFFSET(CmdBufHiRegAddr), "CmdBufAddr_Hi Register Address", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/* 2: ASPT ACPI Maiblox Registers */
+ACPI_DMTABLE_INFO AcpiDmTableInfoAspt2[] =
+{
+ {ACPI_DMT_UINT32, ACPI_ASPT2_OFFSET(Reserved1), "Reserved", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT2_OFFSET(CmdRespRegAddr), "CmdResp Register Address", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT2_OFFSET(Reserved2[0]), "Reserved", 0},
+ {ACPI_DMT_UINT64, ACPI_ASPT2_OFFSET(Reserved2[1]), "Reserved", 0},
+ ACPI_DMT_TERMINATOR
+};
+
+/*******************************************************************************
+ *
* BDAT - BIOS Data ACPI Table
*
******************************************************************************/
diff --git a/source/compiler/dtutils.c b/source/compiler/dtutils.c
index 45bff3df5..8fca81b22 100644
--- a/source/compiler/dtutils.c
+++ b/source/compiler/dtutils.c
@@ -614,6 +614,7 @@ DtGetFieldLength (
ByteLength = 1;
break;
+ case ACPI_DMT_ASPT:
case ACPI_DMT_UINT16:
case ACPI_DMT_DMAR:
case ACPI_DMT_HEST:
diff --git a/source/include/acdisasm.h b/source/include/acdisasm.h
index 47ce0b15b..7cbbe82f2 100644
--- a/source/include/acdisasm.h
+++ b/source/include/acdisasm.h
@@ -260,6 +260,7 @@ typedef enum
ACPI_DMT_AEST_XRUPT,
ACPI_DMT_AGDI,
ACPI_DMT_ASF,
+ ACPI_DMT_ASPT,
ACPI_DMT_CDAT,
ACPI_DMT_CEDT,
ACPI_DMT_DMAR,
@@ -399,6 +400,11 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf2a[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf3[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf4[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsfHdr[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAspt[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsptHdr[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAspt0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAspt1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAspt2[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoBdat[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoBoot[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoBert[];
@@ -759,6 +765,10 @@ AcpiDmDumpAsf (
ACPI_TABLE_HEADER *Table);
void
+AcpiDmDumpAspt (
+ ACPI_TABLE_HEADER *Table);
+
+void
AcpiDmDumpCcel (
ACPI_TABLE_HEADER *Table);
diff --git a/source/include/actbinfo.h b/source/include/actbinfo.h
index 7ce3c21e5..3fc6da378 100644
--- a/source/include/actbinfo.h
+++ b/source/include/actbinfo.h
@@ -153,6 +153,7 @@
* Macros used to generate offsets to specific table fields
*/
#define ACPI_AGDI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_AGDI,f)
+#define ACPI_ASPT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_ASPT,f)
#define ACPI_FACS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_FACS,f)
#define ACPI_GAS_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_GENERIC_ADDRESS,f)
#define ACPI_HDR_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_HEADER,f)
@@ -234,6 +235,10 @@
#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_ASPTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASPT_HEADER,f)
+#define ACPI_ASPT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASPT_GLOBAL_REGS,f)
+#define ACPI_ASPT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASPT_SEV_MBOX_REGS,f)
+#define ACPI_ASPT2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_ASPT_ACPI_MBOX_REGS,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)
diff --git a/source/include/actbl1.h b/source/include/actbl1.h
index 340b636b5..23ba1f18d 100644
--- a/source/include/actbl1.h
+++ b/source/include/actbl1.h
@@ -170,6 +170,7 @@
*/
#define ACPI_SIG_AEST "AEST" /* Arm Error Source Table */
#define ACPI_SIG_ASF "ASF!" /* Alert Standard Format table */
+#define ACPI_SIG_ASPT "ASPT" /* AMD Secure Processor Table */
#define ACPI_SIG_BERT "BERT" /* Boot Error Record Table */
#define ACPI_SIG_BGRT "BGRT" /* Boot Graphics Resource Table */
#define ACPI_SIG_BOOT "BOOT" /* Simple Boot Flag Table */
@@ -398,6 +399,86 @@ typedef struct acpi_asf_address
} ACPI_ASF_ADDRESS;
+/*******************************************************************************
+ *
+ * ASPT - AMD Secure Processor Table (Signature "ASPT")
+ * Revision 0x1
+ *
+ * Conforms to AMD Socket SP5/SP6 Platform ASPT Rev1 Specification,
+ * 12 September 2022
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_aspt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 NumEntries;
+
+} ACPI_TABLE_ASPT;
+
+
+/* ASPT subtable header */
+
+typedef struct acpi_aspt_header
+{
+ UINT16 Type;
+ UINT16 Length;
+
+} ACPI_ASPT_HEADER;
+
+
+/* Values for Type field above */
+
+enum AcpiAsptType
+{
+ ACPI_ASPT_TYPE_GLOBAL_REGS = 0,
+ ACPI_ASPT_TYPE_SEV_MBOX_REGS = 1,
+ ACPI_ASPT_TYPE_ACPI_MBOX_REGS = 2,
+ ACPI_ASPT_TYPE_UNKNOWN = 3,
+};
+
+/*
+ * ASPT subtables
+ */
+
+/* 0: ASPT Global Registers */
+
+typedef struct acpi_aspt_global_regs
+{
+ ACPI_ASPT_HEADER Header;
+ UINT32 Reserved;
+ UINT64 FeatureRegAddr;
+ UINT64 IrqEnRegAddr;
+ UINT64 IrqStRegAddr;
+
+} ACPI_ASPT_GLOBAL_REGS;
+
+
+/* 1: ASPT SEV Mailbox Registers */
+
+typedef struct acpi_aspt_sev_mbox_regs
+{
+ ACPI_ASPT_HEADER Header;
+ UINT8 MboxIrqId;
+ UINT8 Reserved[3];
+ UINT64 CmdRespRegAddr;
+ UINT64 CmdBufLoRegAddr;
+ UINT64 CmdBufHiRegAddr;
+
+} ACPI_ASPT_SEV_MBOX_REGS;
+
+
+/* 2: ASPT ACPI Mailbox Registers */
+
+typedef struct acpi_aspt_acpi_mbox_regs
+{
+ ACPI_ASPT_HEADER Header;
+ UINT32 Reserved1;
+ UINT64 CmdRespRegAddr;
+ UINT64 Reserved2[2];
+
+} ACPI_ASPT_ACPI_MBOX_REGS;
+
/*******************************************************************************
*