-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tpm: modularize event log collection
Break ACPI-specific pieces of the event log handling into their own file and create tpm_eventlog.[ch] to store common event log handling code. This will be required to integrate future event log sources on platforms without ACPI tables. Signed-off-by: Kent Yoder <key@linux.vnet.ibm.com>
- Loading branch information
Kent Yoder
committed
Aug 22, 2012
1 parent
aad628c
commit e5dcd87
Showing
5 changed files
with
182 additions
and
142 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
/* | ||
* Copyright (C) 2005 IBM Corporation | ||
* | ||
* Authors: | ||
* Seiji Munetoh <munetoh@jp.ibm.com> | ||
* Stefan Berger <stefanb@us.ibm.com> | ||
* Reiner Sailer <sailer@watson.ibm.com> | ||
* Kylene Hall <kjhall@us.ibm.com> | ||
* | ||
* Maintained by: <tpmdd-devel@lists.sourceforge.net> | ||
* | ||
* Access to the eventlog extended by the TCG BIOS of PC platform | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
* | ||
*/ | ||
|
||
#include <linux/seq_file.h> | ||
#include <linux/fs.h> | ||
#include <linux/security.h> | ||
#include <linux/module.h> | ||
#include <linux/slab.h> | ||
#include <acpi/acpi.h> | ||
|
||
#include "tpm.h" | ||
#include "tpm_eventlog.h" | ||
|
||
struct acpi_tcpa { | ||
struct acpi_table_header hdr; | ||
u16 platform_class; | ||
union { | ||
struct client_hdr { | ||
u32 log_max_len __attribute__ ((packed)); | ||
u64 log_start_addr __attribute__ ((packed)); | ||
} client; | ||
struct server_hdr { | ||
u16 reserved; | ||
u64 log_max_len __attribute__ ((packed)); | ||
u64 log_start_addr __attribute__ ((packed)); | ||
} server; | ||
}; | ||
}; | ||
|
||
/* read binary bios log */ | ||
int read_log(struct tpm_bios_log *log) | ||
{ | ||
struct acpi_tcpa *buff; | ||
acpi_status status; | ||
struct acpi_table_header *virt; | ||
u64 len, start; | ||
|
||
if (log->bios_event_log != NULL) { | ||
printk(KERN_ERR | ||
"%s: ERROR - Eventlog already initialized\n", | ||
__func__); | ||
return -EFAULT; | ||
} | ||
|
||
/* Find TCPA entry in RSDT (ACPI_LOGICAL_ADDRESSING) */ | ||
status = acpi_get_table(ACPI_SIG_TCPA, 1, | ||
(struct acpi_table_header **)&buff); | ||
|
||
if (ACPI_FAILURE(status)) { | ||
printk(KERN_ERR "%s: ERROR - Could not get TCPA table\n", | ||
__func__); | ||
return -EIO; | ||
} | ||
|
||
switch(buff->platform_class) { | ||
case BIOS_SERVER: | ||
len = buff->server.log_max_len; | ||
start = buff->server.log_start_addr; | ||
break; | ||
case BIOS_CLIENT: | ||
default: | ||
len = buff->client.log_max_len; | ||
start = buff->client.log_start_addr; | ||
break; | ||
} | ||
if (!len) { | ||
printk(KERN_ERR "%s: ERROR - TCPA log area empty\n", __func__); | ||
return -EIO; | ||
} | ||
|
||
/* malloc EventLog space */ | ||
log->bios_event_log = kmalloc(len, GFP_KERNEL); | ||
if (!log->bios_event_log) { | ||
printk("%s: ERROR - Not enough Memory for BIOS measurements\n", | ||
__func__); | ||
return -ENOMEM; | ||
} | ||
|
||
log->bios_event_log_end = log->bios_event_log + len; | ||
|
||
virt = acpi_os_map_memory(start, len); | ||
|
||
memcpy(log->bios_event_log, virt, len); | ||
|
||
acpi_os_unmap_memory(virt, len); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
|
||
#ifndef __TPM_EVENTLOG_H__ | ||
#define __TPM_EVENTLOG_H__ | ||
|
||
#define TCG_EVENT_NAME_LEN_MAX 255 | ||
#define MAX_TEXT_EVENT 1000 /* Max event string length */ | ||
#define ACPI_TCPA_SIG "TCPA" /* 0x41504354 /'TCPA' */ | ||
|
||
enum bios_platform_class { | ||
BIOS_CLIENT = 0x00, | ||
BIOS_SERVER = 0x01, | ||
}; | ||
|
||
struct tpm_bios_log { | ||
void *bios_event_log; | ||
void *bios_event_log_end; | ||
}; | ||
|
||
struct tcpa_event { | ||
u32 pcr_index; | ||
u32 event_type; | ||
u8 pcr_value[20]; /* SHA1 */ | ||
u32 event_size; | ||
u8 event_data[0]; | ||
}; | ||
|
||
enum tcpa_event_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, | ||
}; | ||
|
||
struct tcpa_pc_event { | ||
u32 event_id; | ||
u32 event_size; | ||
u8 event_data[0]; | ||
}; | ||
|
||
enum tcpa_pc_event_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, | ||
}; | ||
|
||
int read_log(struct tpm_bios_log *log); | ||
#endif |