mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	With TPM 2.0 specification, the event logs may only be accessible by
calling an EFI Boot Service. Modify the EFI stub to copy the log area to
a new Linux-specific EFI configuration table so it remains accessible
once booted.
When calling this service, it is possible to specify the expected format
of the logs: TPM 1.2 (SHA1) or TPM 2.0 ("Crypto Agile"). For now, only the
first format is retrieved.
Signed-off-by: Thiebaud Weksteen <tweek@google.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Tested-by: Javier Martinez Canillas <javierm@redhat.com>
Tested-by: Jarkko Sakkinen  <jarkko.sakkinen@linux.intel.com>
Reviewed-by: Jarkko Sakkinen  <jarkko.sakkinen@linux.intel.com>
Signed-off-by: Jarkko Sakkinen  <jarkko.sakkinen@linux.intel.com>
		
	
			
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			989 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			989 B
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2017 Google, Inc.
 | 
						|
 *     Thiebaud Weksteen <tweek@google.com>
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License version 2 as
 | 
						|
 * published by the Free Software Foundation.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/efi.h>
 | 
						|
#include <linux/init.h>
 | 
						|
#include <linux/memblock.h>
 | 
						|
 | 
						|
#include <asm/early_ioremap.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * Reserve the memory associated with the TPM Event Log configuration table.
 | 
						|
 */
 | 
						|
int __init efi_tpm_eventlog_init(void)
 | 
						|
{
 | 
						|
	struct linux_efi_tpm_eventlog *log_tbl;
 | 
						|
	unsigned int tbl_size;
 | 
						|
 | 
						|
	if (efi.tpm_log == EFI_INVALID_TABLE_ADDR)
 | 
						|
		return 0;
 | 
						|
 | 
						|
	log_tbl = early_memremap(efi.tpm_log, sizeof(*log_tbl));
 | 
						|
	if (!log_tbl) {
 | 
						|
		pr_err("Failed to map TPM Event Log table @ 0x%lx\n",
 | 
						|
			efi.tpm_log);
 | 
						|
		efi.tpm_log = EFI_INVALID_TABLE_ADDR;
 | 
						|
		return -ENOMEM;
 | 
						|
	}
 | 
						|
 | 
						|
	tbl_size = sizeof(*log_tbl) + log_tbl->size;
 | 
						|
	memblock_reserve(efi.tpm_log, tbl_size);
 | 
						|
	early_memunmap(log_tbl, sizeof(*log_tbl));
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 |