Skip to content

Commit

Permalink
iASL: Add support for the SVKL table
Browse files Browse the repository at this point in the history
Includes the table compiler, the disassembler and the template
generator.
  • Loading branch information
acpibob committed May 12, 2021
1 parent 607fcd3 commit 27a4343
Show file tree
Hide file tree
Showing 12 changed files with 177 additions and 5 deletions.
1 change: 1 addition & 0 deletions source/common/ahtable.c
Expand Up @@ -250,6 +250,7 @@ const AH_TABLE AcpiGbl_SupportedTables[] =
{ACPI_SIG_SRAT, "System Resource Affinity Table"},
{ACPI_SIG_SSDT, "Secondary System Description Table (AML table)"},
{ACPI_SIG_STAO, "Status Override table"},
{ACPI_SIG_SVKL, "Storage Volume Key Location Table"},
{ACPI_SIG_TCPA, "Trusted Computing Platform Alliance table"},
{ACPI_SIG_TPM2, "Trusted Platform Module hardware interface table"},
{ACPI_SIG_UEFI, "UEFI Boot Optimization Table"},
Expand Down
1 change: 1 addition & 0 deletions source/common/dmtable.c
Expand Up @@ -572,6 +572,7 @@ const ACPI_DMTABLE_DATA AcpiDmTableData[] =
{ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi},
{ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat},
{ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao},
{ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl},
{ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa},
{ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2},
{ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi},
Expand Down
60 changes: 60 additions & 0 deletions source/common/dmtbdump3.c
Expand Up @@ -420,6 +420,65 @@ AcpiDmDumpStao (
}


/*******************************************************************************
*
* FUNCTION: AcpiDmDumpSvkl
*
* PARAMETERS: Table - A SVKL table
*
* RETURN: None
*
* DESCRIPTION: Format the contents of a SVKL. This is a variable-length
* table that contains an open-ended number of key subtables at
* the end of the header.
*
* NOTES: SVKL is essentially a flat table, with a small main table and
* a variable number of a single type of subtable.
*
******************************************************************************/

void
AcpiDmDumpSvkl (
ACPI_TABLE_HEADER *Table)
{
ACPI_STATUS Status;
UINT32 Length = Table->Length;
UINT32 Offset = sizeof (ACPI_TABLE_SVKL);
ACPI_SVKL_KEY *Subtable;


/* Main table */

Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSvkl);
if (ACPI_FAILURE (Status))
{
return;
}

/* The rest of the table consists of subtables (single type) */

Subtable = ACPI_ADD_PTR (ACPI_SVKL_KEY, Table, Offset);
while (Offset < Table->Length)
{
/* Dump the subtable */

AcpiOsPrintf ("\n");
Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
sizeof (ACPI_SVKL_KEY), AcpiDmTableInfoSvkl0);
if (ACPI_FAILURE (Status))
{
return;
}

/* Point to next subtable */

Offset += sizeof (ACPI_SVKL_KEY);
Subtable = ACPI_ADD_PTR (ACPI_SVKL_KEY, Subtable,
sizeof (ACPI_SVKL_KEY));
}
}


/*******************************************************************************
*
* FUNCTION: AcpiDmDumpTcpa
Expand Down Expand Up @@ -502,6 +561,7 @@ AcpiDmDumpTcpa (
* DESCRIPTION: Format the contents of a TPM2.
*
******************************************************************************/

static void
AcpiDmDumpTpm2Rev3 (
ACPI_TABLE_HEADER *Table)
Expand Down
1 change: 1 addition & 0 deletions source/common/dmtbinfo2.c
Expand Up @@ -1791,4 +1791,5 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoSdev1b[] =
{ACPI_DMT_RAW_BUFFER, 0, "Vendor Data", 0}, /*, DT_OPTIONAL}, */
ACPI_DMT_TERMINATOR
};

/*! [End] no source code translation !*/
24 changes: 24 additions & 0 deletions source/common/dmtbinfo3.c
Expand Up @@ -403,6 +403,30 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoStaoStr[] =
};


/*******************************************************************************
*
* SVKL - Storage Volume Key Location table
*
******************************************************************************/

ACPI_DMTABLE_INFO AcpiDmTableInfoSvkl[] =
{
{ACPI_DMT_UINT32, ACPI_SVKL_OFFSET (Count), "Key Count", 0},
ACPI_DMT_TERMINATOR
};

/* SVKL subtables */

ACPI_DMTABLE_INFO AcpiDmTableInfoSvkl0[] =
{
{ACPI_DMT_UINT16, ACPI_SVKL0_OFFSET (Type), "Key Type", 0},
{ACPI_DMT_UINT16, ACPI_SVKL0_OFFSET (Format), "Key Format", 0},
{ACPI_DMT_UINT32, ACPI_SVKL0_OFFSET (Size), "Key Size", 0},
{ACPI_DMT_UINT64, ACPI_SVKL0_OFFSET (Address), "Key Address", 0},
ACPI_DMT_TERMINATOR
};


/*******************************************************************************
*
* TCPA - Trusted Computing Platform Alliance table (Client)
Expand Down
5 changes: 5 additions & 0 deletions source/compiler/dtcompiler.h
Expand Up @@ -701,6 +701,10 @@ ACPI_STATUS
DtCompileStao (
void **PFieldList);

ACPI_STATUS
DtCompileSvkl (
void **PFieldList);

ACPI_STATUS
DtCompileTcpa (
void **PFieldList);
Expand Down Expand Up @@ -788,6 +792,7 @@ extern const unsigned char TemplateSpcr[];
extern const unsigned char TemplateSpmi[];
extern const unsigned char TemplateSrat[];
extern const unsigned char TemplateStao[];
extern const unsigned char TemplateSvkl[];
extern const unsigned char TemplateTcpa[];
extern const unsigned char TemplateTpm2[];
extern const unsigned char TemplateUefi[];
Expand Down
57 changes: 57 additions & 0 deletions source/compiler/dttable2.c
Expand Up @@ -2024,6 +2024,63 @@ DtCompileStao (
}



/******************************************************************************
*
* FUNCTION: DtCompileSvkl
*
* PARAMETERS: PFieldList - Current field list pointer
*
* RETURN: Status
*
* DESCRIPTION: Compile SVKL.
*
* NOTES: SVKL is essentially a flat table, with a small main table and
* a variable number of a single type of subtable.
*
*****************************************************************************/

ACPI_STATUS
DtCompileSvkl (
void **List)
{
DT_FIELD **PFieldList = (DT_FIELD **) List;
DT_SUBTABLE *Subtable;
DT_SUBTABLE *ParentTable;
ACPI_STATUS Status;


/* Compile the main table */

Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl,
&Subtable);
if (ACPI_FAILURE (Status))
{
return (Status);
}

ParentTable = DtPeekSubtable ();
DtInsertSubtable (ParentTable, Subtable);

/* Compile each subtable */

while (*PFieldList)
{
Status = DtCompileTable (PFieldList, AcpiDmTableInfoSvkl0,
&Subtable);
if (ACPI_FAILURE (Status))
{
return (Status);
}

ParentTable = DtPeekSubtable ();
DtInsertSubtable (ParentTable, Subtable);
}

return (AE_OK);
}


/******************************************************************************
*
* FUNCTION: DtCompileTcpa
Expand Down
13 changes: 13 additions & 0 deletions source/compiler/dttemplate.h
Expand Up @@ -1517,6 +1517,19 @@ const unsigned char TemplateStao[] =
0x31,0x2E,0x50,0x54,0x31,0x00 /* 00000078 "1.PT1." */
};

const unsigned char TemplateSvkl[] =
{
0x53,0x56,0x4B,0x4C,0x48,0x00,0x00,0x00, /* 00000000 "SVKLH..." */
0x04,0xDB,0x49,0x4E,0x54,0x45,0x4C,0x20, /* 00000008 "..INTEL " */
0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */
0x01,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
0x31,0x03,0x21,0x20,0x02,0x00,0x00,0x00, /* 00000020 "1.! ...." */
0x00,0x00,0x00,0x00,0x21,0x43,0xAA,0xAA, /* 00000028 "....!C.." */
0xEF,0xCD,0xAB,0x89,0x67,0x45,0x23,0x01, /* 00000030 "....gE#." */
0x00,0x00,0x00,0x00,0x21,0x43,0xBB,0xBB, /* 00000038 "....!C.." */
0xEF,0xCD,0xAB,0x89,0x67,0x45,0x23,0x01 /* 00000040 "....gE#." */
};

const unsigned char TemplateTcpa[] =
{
0x54,0x43,0x50,0x41,0x64,0x00,0x00,0x00, /* 00000000 "TCPAd..." */
Expand Down
6 changes: 6 additions & 0 deletions source/include/acdisasm.h
Expand Up @@ -586,6 +586,8 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoSrat4[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSrat5[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoStao[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoStaoStr[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSvkl[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSvkl0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaHdr[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaClient[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpaServer[];
Expand Down Expand Up @@ -812,6 +814,10 @@ void
AcpiDmDumpStao (
ACPI_TABLE_HEADER *Table);

void
AcpiDmDumpSvkl (
ACPI_TABLE_HEADER *Table);

void
AcpiDmDumpTcpa (
ACPI_TABLE_HEADER *Table);
Expand Down
2 changes: 2 additions & 0 deletions source/include/actbinfo.h
Expand Up @@ -192,6 +192,7 @@
#define ACPI_SPMI_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SPMI,f)
#define ACPI_SRAT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SRAT,f)
#define ACPI_STAO_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_STAO,f)
#define ACPI_SVKL_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SVKL,f)
#define ACPI_TCPA_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_HDR,f)
#define ACPI_TPM2_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM2,f)
#define ACPI_TPM23_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TPM23,f)
Expand Down Expand Up @@ -353,6 +354,7 @@
#define ACPI_SRAT3_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SRAT_GICC_AFFINITY,f)
#define ACPI_SRAT4_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SRAT_GIC_ITS_AFFINITY,f)
#define ACPI_SRAT5_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SRAT_GENERIC_AFFINITY,f)
#define ACPI_SVKL0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SVKL_KEY,f)
#define ACPI_TCPA_CLIENT_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_CLIENT,f)
#define ACPI_TCPA_SERVER_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_TCPA_SERVER,f)
#define ACPI_TPM2A_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TPM2_TRAILER,f)
Expand Down
10 changes: 6 additions & 4 deletions source/include/actbl2.h
Expand Up @@ -2396,6 +2396,8 @@ typedef struct acpi_sdev_pcie_path
/*******************************************************************************
*
* SVKL - Storage Volume Key Location Table (ACPI 6.4)
* From: "Guest-Host-Communication Interface (GHCI) for Intel
* Trust Domain Extensions (Intel TDX)".
* Version 1
*
******************************************************************************/
Expand All @@ -2407,25 +2409,25 @@ typedef struct acpi_table_svkl

} ACPI_TABLE_SVKL;

typedef struct acpi_svkl_header
typedef struct acpi_svkl_key
{
UINT16 Type;
UINT16 Format;
UINT32 Size;
UINT64 Address;

} ACPI_SVKL_HEADER;
} ACPI_SVKL_KEY;

enum acpi_svkl_type
{
ACPI_SVKL_TYPE_MAIN_STORAGE = 0,
ACPI_SVKL_TYPE_RESERVED = 1 /* 1 and greater are reserved */
ACPI_SVKL_TYPE_RESERVED = 1 /* 1 and greater are reserved */
};

enum acpi_svkl_format
{
ACPI_SVKL_FORMAT_RAW_BINARY = 0,
ACPI_SVKL_FORMAT_RESERVED = 1 /* 1 and greater are reserved */
ACPI_SVKL_FORMAT_RESERVED = 1 /* 1 and greater are reserved */
};


Expand Down
2 changes: 1 addition & 1 deletion source/tools/acpisrc/astable.c
Expand Up @@ -855,7 +855,7 @@ ACPI_TYPED_IDENTIFIER_TABLE AcpiIdentifiers[] = {
{"ACPI_SDEV_NAMESPACE", SRC_TYPE_STRUCT},
{"ACPI_SDEV_PCIE", SRC_TYPE_STRUCT},
{"ACPI_SDEV_PCIE_PATH", SRC_TYPE_STRUCT},
{"ACPI_SVKL_HEADER", SRC_TYPE_STRUCT},
{"ACPI_SVKL_KEY", SRC_TYPE_STRUCT},
{"ACPI_SRAT_CPU_AFFINITY", SRC_TYPE_STRUCT},
{"ACPI_SRAT_HEADER", SRC_TYPE_STRUCT},
{"ACPI_SRAT_GIC_ITS_AFFINITY", SRC_TYPE_STRUCT},
Expand Down

0 comments on commit 27a4343

Please sign in to comment.