root/drivers/firmware/efi/tpm.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. tpm2_calc_event_log_size
  2. efi_tpm_eventlog_init

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright (C) 2017 Google, Inc.
   4  *     Thiebaud Weksteen <tweek@google.com>
   5  */
   6 
   7 #define TPM_MEMREMAP(start, size) early_memremap(start, size)
   8 #define TPM_MEMUNMAP(start, size) early_memunmap(start, size)
   9 
  10 #include <asm/early_ioremap.h>
  11 #include <linux/efi.h>
  12 #include <linux/init.h>
  13 #include <linux/memblock.h>
  14 #include <linux/tpm_eventlog.h>
  15 
  16 int efi_tpm_final_log_size;
  17 EXPORT_SYMBOL(efi_tpm_final_log_size);
  18 
  19 static int __init tpm2_calc_event_log_size(void *data, int count, void *size_info)
  20 {
  21         struct tcg_pcr_event2_head *header;
  22         int event_size, size = 0;
  23 
  24         while (count > 0) {
  25                 header = data + size;
  26                 event_size = __calc_tpm2_event_size(header, size_info, true);
  27                 if (event_size == 0)
  28                         return -1;
  29                 size += event_size;
  30                 count--;
  31         }
  32 
  33         return size;
  34 }
  35 
  36 /*
  37  * Reserve the memory associated with the TPM Event Log configuration table.
  38  */
  39 int __init efi_tpm_eventlog_init(void)
  40 {
  41         struct linux_efi_tpm_eventlog *log_tbl;
  42         struct efi_tcg2_final_events_table *final_tbl;
  43         int tbl_size;
  44         int ret = 0;
  45 
  46         if (efi.tpm_log == EFI_INVALID_TABLE_ADDR) {
  47                 /*
  48                  * We can't calculate the size of the final events without the
  49                  * first entry in the TPM log, so bail here.
  50                  */
  51                 return 0;
  52         }
  53 
  54         log_tbl = early_memremap(efi.tpm_log, sizeof(*log_tbl));
  55         if (!log_tbl) {
  56                 pr_err("Failed to map TPM Event Log table @ 0x%lx\n",
  57                        efi.tpm_log);
  58                 efi.tpm_log = EFI_INVALID_TABLE_ADDR;
  59                 return -ENOMEM;
  60         }
  61 
  62         tbl_size = sizeof(*log_tbl) + log_tbl->size;
  63         memblock_reserve(efi.tpm_log, tbl_size);
  64 
  65         if (efi.tpm_final_log == EFI_INVALID_TABLE_ADDR ||
  66             log_tbl->version != EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) {
  67                 pr_warn(FW_BUG "TPM Final Events table missing or invalid\n");
  68                 goto out;
  69         }
  70 
  71         final_tbl = early_memremap(efi.tpm_final_log, sizeof(*final_tbl));
  72 
  73         if (!final_tbl) {
  74                 pr_err("Failed to map TPM Final Event Log table @ 0x%lx\n",
  75                        efi.tpm_final_log);
  76                 efi.tpm_final_log = EFI_INVALID_TABLE_ADDR;
  77                 ret = -ENOMEM;
  78                 goto out;
  79         }
  80 
  81         tbl_size = 0;
  82         if (final_tbl->nr_events != 0) {
  83                 void *events = (void *)efi.tpm_final_log
  84                                 + sizeof(final_tbl->version)
  85                                 + sizeof(final_tbl->nr_events);
  86 
  87                 tbl_size = tpm2_calc_event_log_size(events,
  88                                                     final_tbl->nr_events,
  89                                                     log_tbl->log);
  90         }
  91 
  92         if (tbl_size < 0) {
  93                 pr_err(FW_BUG "Failed to parse event in TPM Final Events Log\n");
  94                 ret = -EINVAL;
  95                 goto out_calc;
  96         }
  97 
  98         memblock_reserve((unsigned long)final_tbl,
  99                          tbl_size + sizeof(*final_tbl));
 100         efi_tpm_final_log_size = tbl_size;
 101 
 102 out_calc:
 103         early_memunmap(final_tbl, sizeof(*final_tbl));
 104 out:
 105         early_memunmap(log_tbl, sizeof(*log_tbl));
 106         return ret;
 107 }
 108 

/* [<][>][^][v][top][bottom][index][help] */