diff mbox series

[v3] tpm: Add support for event log pointer found in TPM2 ACPI table

Message ID 20200331215100.883860-1-stefanb@linux.vnet.ibm.com (mailing list archive)
State New, archived
Headers show
Series [v3] tpm: Add support for event log pointer found in TPM2 ACPI table | expand

Commit Message

Stefan Berger March 31, 2020, 9:51 p.m. UTC
From: Stefan Berger <stefanb@linux.ibm.com>

In case a TPM2 is attached, search for a TPM2 ACPI table when trying
to get the event log from ACPI. If one is found, use it to get the
start and length of the log area. This allows non-UEFI systems, such
as SeaBIOS, to pass an event log when using a TPM2.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
---
 drivers/char/tpm/eventlog/acpi.c | 56 +++++++++++++++++++++++++---------------
 1 file changed, 35 insertions(+), 21 deletions(-)

Comments

kernel test robot April 1, 2020, 5:07 a.m. UTC | #1
Hi Stefan,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on char-misc/char-misc-testing]
[also build test ERROR on v5.6 next-20200331]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Stefan-Berger/tpm-Add-support-for-event-log-pointer-found-in-TPM2-ACPI-table/20200401-055303
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 5caf6102e32ead7ed5d21b5309c1a4a7d70e6a9f
config: x86_64-randconfig-s1-20200401 (attached as .config)
compiler: gcc-7 (Debian 7.4.0-6) 7.4.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/char/tpm/eventlog/acpi.c: In function 'tpm_read_log_acpi':
>> drivers/char/tpm/eventlog/acpi.c:70:12: error: 'struct acpi_table_tpm2' has no member named 'log_area_minimum_length'
      len = tbl->log_area_minimum_length;
               ^~
>> drivers/char/tpm/eventlog/acpi.c:71:14: error: 'struct acpi_table_tpm2' has no member named 'log_area_start_address'
      start = tbl->log_area_start_address;
                 ^~

vim +70 drivers/char/tpm/eventlog/acpi.c

    43	
    44	/* read binary bios log */
    45	int tpm_read_log_acpi(struct tpm_chip *chip)
    46	{
    47		struct acpi_tcpa *buff;
    48		acpi_status status;
    49		void __iomem *virt;
    50		u64 len, start;
    51		struct tpm_bios_log *log;
    52		struct acpi_table_tpm2 *tbl;
    53		int format;
    54	
    55		log = &chip->log;
    56	
    57		/* Unfortuntely ACPI does not associate the event log with a specific
    58		 * TPM, like PPI. Thus all ACPI TPMs will read the same log.
    59		 */
    60		if (!chip->acpi_dev_handle)
    61			return -ENODEV;
    62	
    63		if (chip->flags & TPM_CHIP_FLAG_TPM2) {
    64			status = acpi_get_table("TPM2", 1,
    65						(struct acpi_table_header **)&tbl);
    66			if (ACPI_FAILURE(status))
    67				return -ENODEV;
    68			if (tbl->header.length < sizeof(*tbl))
    69				return -ENODEV;
  > 70			len = tbl->log_area_minimum_length;
  > 71			start = tbl->log_area_start_address;
    72			if (!start || !len)
    73				return -ENODEV;
    74			format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_2;
    75		} else {
    76			/* Find TCPA entry in RSDT (ACPI_LOGICAL_ADDRESSING) */
    77			status = acpi_get_table(ACPI_SIG_TCPA, 1,
    78						(struct acpi_table_header **)&buff);
    79	
    80			if (ACPI_FAILURE(status))
    81				return -ENODEV;
    82	
    83			switch (buff->platform_class) {
    84			case BIOS_SERVER:
    85				len = buff->server.log_max_len;
    86				start = buff->server.log_start_addr;
    87				break;
    88			case BIOS_CLIENT:
    89			default:
    90				len = buff->client.log_max_len;
    91				start = buff->client.log_start_addr;
    92				break;
    93			}
    94			format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
    95		}
    96		if (!len) {
    97			dev_warn(&chip->dev, "%s: TCPA log area empty\n", __func__);
    98			return -EIO;
    99		}
   100	
   101		/* malloc EventLog space */
   102		log->bios_event_log = kmalloc(len, GFP_KERNEL);
   103		if (!log->bios_event_log)
   104			return -ENOMEM;
   105	
   106		log->bios_event_log_end = log->bios_event_log + len;
   107	
   108		virt = acpi_os_map_iomem(start, len);
   109		if (!virt)
   110			goto err;
   111	
   112		memcpy_fromio(log->bios_event_log, virt, len);
   113	
   114		acpi_os_unmap_iomem(virt, len);
   115		return format;
   116	
   117	err:
   118		kfree(log->bios_event_log);
   119		log->bios_event_log = NULL;
   120		return -EIO;
   121	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Jarkko Sakkinen April 1, 2020, 8:49 a.m. UTC | #2
On Tue, Mar 31, 2020 at 05:51:00PM -0400, Stefan Berger wrote:
> From: Stefan Berger <stefanb@linux.ibm.com>
> 
> In case a TPM2 is attached, search for a TPM2 ACPI table when trying
> to get the event log from ACPI. If one is found, use it to get the
> start and length of the log area. This allows non-UEFI systems, such
> as SeaBIOS, to pass an event log when using a TPM2.
> 
> Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>

Check the kbuild bot complain. I think otherwise this is sustainable.
Thank you.

Does stock QEMU have all the support to test this?

/Jarkko
Stefan Berger April 1, 2020, 12:20 p.m. UTC | #3
On 4/1/20 4:49 AM, Jarkko Sakkinen wrote:
> On Tue, Mar 31, 2020 at 05:51:00PM -0400, Stefan Berger wrote:
>> From: Stefan Berger <stefanb@linux.ibm.com>
>>
>> In case a TPM2 is attached, search for a TPM2 ACPI table when trying
>> to get the event log from ACPI. If one is found, use it to get the
>> start and length of the log area. This allows non-UEFI systems, such
>> as SeaBIOS, to pass an event log when using a TPM2.
>>
>> Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
> Check the kbuild bot complain. I think otherwise this is sustainable.
> Thank you.
The kbuild bot did this due to the split of the patch series...
>
> Does stock QEMU have all the support to test this?


Yes. You need SeaBIOS.


    Stefan


>
> /Jarkko
Jarkko Sakkinen April 2, 2020, 7:46 p.m. UTC | #4
On Wed, Apr 01, 2020 at 08:20:28AM -0400, Stefan Berger wrote:
> On 4/1/20 4:49 AM, Jarkko Sakkinen wrote:
> > On Tue, Mar 31, 2020 at 05:51:00PM -0400, Stefan Berger wrote:
> > > From: Stefan Berger <stefanb@linux.ibm.com>
> > > 
> > > In case a TPM2 is attached, search for a TPM2 ACPI table when trying
> > > to get the event log from ACPI. If one is found, use it to get the
> > > start and length of the log area. This allows non-UEFI systems, such
> > > as SeaBIOS, to pass an event log when using a TPM2.
> > > 
> > > Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
> > Check the kbuild bot complain. I think otherwise this is sustainable.
> > Thank you.
> The kbuild bot did this due to the split of the patch series...

Please resend them two patch series.

/Jarkko
diff mbox series

Patch

diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c
index 63ada5e53f13..e714a2bd0423 100644
--- a/drivers/char/tpm/eventlog/acpi.c
+++ b/drivers/char/tpm/eventlog/acpi.c
@@ -49,9 +49,8 @@  int tpm_read_log_acpi(struct tpm_chip *chip)
 	void __iomem *virt;
 	u64 len, start;
 	struct tpm_bios_log *log;
-
-	if (chip->flags & TPM_CHIP_FLAG_TPM2)
-		return -ENODEV;
+	struct acpi_table_tpm2 *tbl;
+	int format;
 
 	log = &chip->log;
 
@@ -61,23 +60,38 @@  int tpm_read_log_acpi(struct tpm_chip *chip)
 	if (!chip->acpi_dev_handle)
 		return -ENODEV;
 
-	/* 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))
-		return -ENODEV;
-
-	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 (chip->flags & TPM_CHIP_FLAG_TPM2) {
+		status = acpi_get_table("TPM2", 1,
+					(struct acpi_table_header **)&tbl);
+		if (ACPI_FAILURE(status))
+			return -ENODEV;
+		if (tbl->header.length < sizeof(*tbl))
+			return -ENODEV;
+		len = tbl->log_area_minimum_length;
+		start = tbl->log_area_start_address;
+		if (!start || !len)
+			return -ENODEV;
+		format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_2;
+	} else {
+		/* 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))
+			return -ENODEV;
+
+		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;
+		}
+		format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
 	}
 	if (!len) {
 		dev_warn(&chip->dev, "%s: TCPA log area empty\n", __func__);
@@ -98,7 +112,7 @@  int tpm_read_log_acpi(struct tpm_chip *chip)
 	memcpy_fromio(log->bios_event_log, virt, len);
 
 	acpi_os_unmap_iomem(virt, len);
-	return EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
+	return format;
 
 err:
 	kfree(log->bios_event_log);