mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-30 16:51:41 +00:00
Add TCG ACPI spec table (TCPA) support.
Submitted by: Hans-Joerg_Hoexer@genua.de
This commit is contained in:
parent
e3813573bd
commit
c031c93b5d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=211196
@ -68,6 +68,7 @@ static void acpi_print_srat_cpu(uint32_t apic_id, uint32_t proximity_domain,
|
|||||||
static void acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp);
|
static void acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp);
|
||||||
static void acpi_print_srat(ACPI_SUBTABLE_HEADER *srat);
|
static void acpi_print_srat(ACPI_SUBTABLE_HEADER *srat);
|
||||||
static void acpi_handle_srat(ACPI_TABLE_HEADER *sdp);
|
static void acpi_handle_srat(ACPI_TABLE_HEADER *sdp);
|
||||||
|
static void acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp);
|
||||||
static void acpi_print_sdt(ACPI_TABLE_HEADER *sdp);
|
static void acpi_print_sdt(ACPI_TABLE_HEADER *sdp);
|
||||||
static void acpi_print_fadt(ACPI_TABLE_HEADER *sdp);
|
static void acpi_print_fadt(ACPI_TABLE_HEADER *sdp);
|
||||||
static void acpi_print_facs(ACPI_TABLE_FACS *facs);
|
static void acpi_print_facs(ACPI_TABLE_FACS *facs);
|
||||||
@ -81,6 +82,46 @@ static void acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
|
|||||||
/* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */
|
/* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */
|
||||||
static int addr_size;
|
static int addr_size;
|
||||||
|
|
||||||
|
/* Strings used in the TCPA table */
|
||||||
|
static const char *tcpa_event_type_strings[] = {
|
||||||
|
"PREBOOT Certificate",
|
||||||
|
"POST Code",
|
||||||
|
"Unused",
|
||||||
|
"No Action",
|
||||||
|
"Separator",
|
||||||
|
"Action",
|
||||||
|
"Event Tag",
|
||||||
|
"S-CRTM Contents",
|
||||||
|
"S-CRTM Version",
|
||||||
|
"CPU Microcode",
|
||||||
|
"Platform Config Flags",
|
||||||
|
"Table of Devices",
|
||||||
|
"Compact Hash",
|
||||||
|
"IPL",
|
||||||
|
"IPL Partition Data",
|
||||||
|
"Non-Host Code",
|
||||||
|
"Non-Host Config",
|
||||||
|
"Non-Host Info"
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *TCPA_pcclient_strings[] = {
|
||||||
|
"<undefined>",
|
||||||
|
"SMBIOS",
|
||||||
|
"BIS Certificate",
|
||||||
|
"POST BIOS ROM Strings",
|
||||||
|
"ESCD",
|
||||||
|
"CMOS",
|
||||||
|
"NVRAM",
|
||||||
|
"Option ROM Execute",
|
||||||
|
"Option ROM Configurateion",
|
||||||
|
"<undefined>",
|
||||||
|
"Option ROM Microcode Update ",
|
||||||
|
"S-CRTM Version String",
|
||||||
|
"S-CRTM Contents",
|
||||||
|
"POST Contents",
|
||||||
|
"Table of Devices",
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
acpi_print_string(char *s, size_t length)
|
acpi_print_string(char *s, size_t length)
|
||||||
{
|
{
|
||||||
@ -492,6 +533,165 @@ acpi_print_srat_cpu(uint32_t apic_id, uint32_t proximity_domain,
|
|||||||
printf("\tProximity Domain=%d\n", proximity_domain);
|
printf("\tProximity Domain=%d\n", proximity_domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
acpi_tcpa_evname(struct TCPAevent *event)
|
||||||
|
{
|
||||||
|
struct TCPApc_event *pc_event;
|
||||||
|
char *eventname = NULL;
|
||||||
|
|
||||||
|
pc_event = (struct TCPApc_event *)(event + 1);
|
||||||
|
|
||||||
|
switch(event->event_type) {
|
||||||
|
case PREBOOT:
|
||||||
|
case POST_CODE:
|
||||||
|
case UNUSED:
|
||||||
|
case NO_ACTION:
|
||||||
|
case SEPARATOR:
|
||||||
|
case SCRTM_CONTENTS:
|
||||||
|
case SCRTM_VERSION:
|
||||||
|
case CPU_MICROCODE:
|
||||||
|
case PLATFORM_CONFIG_FLAGS:
|
||||||
|
case TABLE_OF_DEVICES:
|
||||||
|
case COMPACT_HASH:
|
||||||
|
case IPL:
|
||||||
|
case IPL_PARTITION_DATA:
|
||||||
|
case NONHOST_CODE:
|
||||||
|
case NONHOST_CONFIG:
|
||||||
|
case NONHOST_INFO:
|
||||||
|
asprintf(&eventname, "%s",
|
||||||
|
tcpa_event_type_strings[event->event_type]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACTION:
|
||||||
|
eventname = calloc(event->event_size + 1, sizeof(char));
|
||||||
|
memcpy(eventname, pc_event, event->event_size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EVENT_TAG:
|
||||||
|
switch (pc_event->event_id) {
|
||||||
|
case SMBIOS:
|
||||||
|
case BIS_CERT:
|
||||||
|
case CMOS:
|
||||||
|
case NVRAM:
|
||||||
|
case OPTION_ROM_EXEC:
|
||||||
|
case OPTION_ROM_CONFIG:
|
||||||
|
case S_CRTM_VERSION:
|
||||||
|
case POST_BIOS_ROM:
|
||||||
|
case ESCD:
|
||||||
|
case OPTION_ROM_MICROCODE:
|
||||||
|
case S_CRTM_CONTENTS:
|
||||||
|
case POST_CONTENTS:
|
||||||
|
asprintf(&eventname, "%s",
|
||||||
|
TCPA_pcclient_strings[pc_event->event_id]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
asprintf(&eventname, "<unknown tag 0x%02x>",
|
||||||
|
pc_event->event_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
asprintf(&eventname, "<unknown 0x%02x>", event->event_type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return eventname;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
acpi_print_tcpa(struct TCPAevent *event)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *eventname;
|
||||||
|
|
||||||
|
eventname = acpi_tcpa_evname(event);
|
||||||
|
|
||||||
|
printf("\t%d", event->pcr_index);
|
||||||
|
printf(" 0x");
|
||||||
|
for (i = 0; i < 20; i++)
|
||||||
|
printf("%02x", event->pcr_value[i]);
|
||||||
|
printf(" [%s]\n", eventname ? eventname : "<unknown>");
|
||||||
|
|
||||||
|
free(eventname);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp)
|
||||||
|
{
|
||||||
|
struct TCPAbody *tcpa;
|
||||||
|
struct TCPAevent *event;
|
||||||
|
u_int64_t len, paddr;
|
||||||
|
unsigned char *vaddr = NULL;
|
||||||
|
unsigned char *vend = NULL;
|
||||||
|
|
||||||
|
printf(BEGIN_COMMENT);
|
||||||
|
acpi_print_sdt(sdp);
|
||||||
|
tcpa = (struct TCPAbody *) sdp;
|
||||||
|
|
||||||
|
switch (tcpa->platform_class) {
|
||||||
|
case ACPI_TCPA_BIOS_CLIENT:
|
||||||
|
len = tcpa->client.log_max_len;
|
||||||
|
paddr = tcpa->client.log_start_addr;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ACPI_TCPA_BIOS_SERVER:
|
||||||
|
len = tcpa->server.log_max_len;
|
||||||
|
paddr = tcpa->server.log_start_addr;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("XXX");
|
||||||
|
printf(END_COMMENT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
printf("\tClass %d Base Address 0x%jx Length %lld\n\n",
|
||||||
|
tcpa->platform_class, paddr, len);
|
||||||
|
|
||||||
|
if (len == 0) {
|
||||||
|
printf("\tEmpty TCPA table\n");
|
||||||
|
printf(END_COMMENT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vaddr = (unsigned char *)acpi_map_physical(paddr, len);
|
||||||
|
vend = vaddr + len;
|
||||||
|
|
||||||
|
while (vaddr != NULL) {
|
||||||
|
if (vaddr + sizeof(struct TCPAevent) >= vend)
|
||||||
|
break;
|
||||||
|
event = (struct TCPAevent *)vaddr;
|
||||||
|
if (vaddr + event->event_size >= vend)
|
||||||
|
break;
|
||||||
|
if (event->event_type == 0 && event->event_size == 0)
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
unsigned int i, j, k;
|
||||||
|
|
||||||
|
printf("\n\tsize %d\n\t\t%p ", event->event_size, vaddr);
|
||||||
|
for (j = 0, i = 0; i <
|
||||||
|
sizeof(struct TCPAevent) + event->event_size; i++) {
|
||||||
|
printf("%02x ", vaddr[i]);
|
||||||
|
if ((i+1) % 8 == 0) {
|
||||||
|
for (k = 0; k < 8; k++)
|
||||||
|
printf("%c", isprint(vaddr[j+k]) ?
|
||||||
|
vaddr[j+k] : '.');
|
||||||
|
printf("\n\t\t%p ", &vaddr[i + 1]);
|
||||||
|
j = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n"); }
|
||||||
|
#endif
|
||||||
|
acpi_print_tcpa(event);
|
||||||
|
|
||||||
|
vaddr += sizeof(struct TCPAevent) + event->event_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(END_COMMENT);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp)
|
acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp)
|
||||||
{
|
{
|
||||||
@ -886,6 +1086,8 @@ acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp)
|
|||||||
acpi_handle_mcfg(sdp);
|
acpi_handle_mcfg(sdp);
|
||||||
else if (!memcmp(sdp->Signature, ACPI_SIG_SRAT, 4))
|
else if (!memcmp(sdp->Signature, ACPI_SIG_SRAT, 4))
|
||||||
acpi_handle_srat(sdp);
|
acpi_handle_srat(sdp);
|
||||||
|
else if (!memcmp(sdp->Signature, ACPI_SIG_TCPA, 4))
|
||||||
|
acpi_handle_tcpa(sdp);
|
||||||
else {
|
else {
|
||||||
printf(BEGIN_COMMENT);
|
printf(BEGIN_COMMENT);
|
||||||
acpi_print_sdt(sdp);
|
acpi_print_sdt(sdp);
|
||||||
|
@ -55,6 +55,78 @@
|
|||||||
/* Find and map the RSD PTR structure and return it for parsing */
|
/* Find and map the RSD PTR structure and return it for parsing */
|
||||||
ACPI_TABLE_HEADER *sdt_load_devmem(void);
|
ACPI_TABLE_HEADER *sdt_load_devmem(void);
|
||||||
|
|
||||||
|
/* TCPA */
|
||||||
|
struct TCPAbody {
|
||||||
|
ACPI_TABLE_HEADER header;
|
||||||
|
uint16_t platform_class;
|
||||||
|
#define ACPI_TCPA_BIOS_CLIENT 0x00
|
||||||
|
#define ACPI_TCPA_BIOS_SERVER 0x01
|
||||||
|
union {
|
||||||
|
struct client_hdr {
|
||||||
|
uint32_t log_max_len __packed;
|
||||||
|
uint64_t log_start_addr __packed;
|
||||||
|
} client;
|
||||||
|
struct server_hdr {
|
||||||
|
uint16_t reserved;
|
||||||
|
uint64_t log_max_len __packed;
|
||||||
|
uint64_t log_start_addr __packed;
|
||||||
|
} server;
|
||||||
|
};
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct TCPAevent {
|
||||||
|
u_int32_t pcr_index;
|
||||||
|
u_int32_t event_type;
|
||||||
|
u_int8_t pcr_value[20];
|
||||||
|
u_int32_t event_size;
|
||||||
|
u_int8_t event_data[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TCPApc_event {
|
||||||
|
u_int32_t event_id;
|
||||||
|
u_int32_t event_size;
|
||||||
|
u_int8_t event_data[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
enum TCPAevent_types {
|
||||||
|
PREBOOT = 0,
|
||||||
|
POST_CODE,
|
||||||
|
UNUSED,
|
||||||
|
NO_ACTION,
|
||||||
|
SEPARATOR,
|
||||||
|
ACTION,
|
||||||
|
EVENT_TAG,
|
||||||
|
SCRTM_CONTENTS,
|
||||||
|
SCRTM_VERSION,
|
||||||
|
CPU_MICROCODE,
|
||||||
|
PLATFORM_CONFIG_FLAGS,
|
||||||
|
TABLE_OF_DEVICES,
|
||||||
|
COMPACT_HASH,
|
||||||
|
IPL,
|
||||||
|
IPL_PARTITION_DATA,
|
||||||
|
NONHOST_CODE,
|
||||||
|
NONHOST_CONFIG,
|
||||||
|
NONHOST_INFO,
|
||||||
|
EVENT_TYPE_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum TCPApcclient_ids {
|
||||||
|
SMBIOS = 1,
|
||||||
|
BIS_CERT,
|
||||||
|
POST_BIOS_ROM,
|
||||||
|
ESCD,
|
||||||
|
CMOS,
|
||||||
|
NVRAM,
|
||||||
|
OPTION_ROM_EXEC,
|
||||||
|
OPTION_ROM_CONFIG,
|
||||||
|
OPTION_ROM_MICROCODE = 10,
|
||||||
|
S_CRTM_VERSION,
|
||||||
|
S_CRTM_CONTENTS,
|
||||||
|
POST_CONTENTS,
|
||||||
|
HOST_TABLE_OF_DEVICES,
|
||||||
|
PCCLIENT_ID_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load the DSDT from a previous save file. Note that other tables are
|
* Load the DSDT from a previous save file. Note that other tables are
|
||||||
* not saved (i.e. FADT)
|
* not saved (i.e. FADT)
|
||||||
|
Loading…
Reference in New Issue
Block a user