diff options
author | James Morris <james.l.morris@oracle.com> | 2015-11-12 04:38:04 -0500 |
---|---|---|
committer | James Morris <james.l.morris@oracle.com> | 2015-11-12 04:38:04 -0500 |
commit | 5ca9d3a4286a1a4aaa46acc7c1c29a15d8d0fea2 (patch) | |
tree | 9976cdcae28e0e6d189cbe831696415429fbe3e9 | |
parent | 5d50ac70fe98518dbf620bfba8184254663125eb (diff) | |
parent | d56e4f75346933dd2cb11533a668ce883908c859 (diff) |
Merge tag 'tpmdd-next-20151110' of https://github.com/jsakkine/linux-tpmdd into for-linus
-rw-r--r-- | drivers/char/tpm/tpm-chip.c | 20 | ||||
-rw-r--r-- | drivers/char/tpm/tpm2-cmd.c | 15 | ||||
-rw-r--r-- | drivers/char/tpm/tpm_of.c | 3 | ||||
-rw-r--r-- | drivers/char/tpm/tpm_tis.c | 8 |
4 files changed, 30 insertions, 16 deletions
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index f26b0ae23bea..45cc39aabeee 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c | |||
@@ -226,21 +226,23 @@ int tpm_chip_register(struct tpm_chip *chip) | |||
226 | if (rc) | 226 | if (rc) |
227 | goto out_err; | 227 | goto out_err; |
228 | 228 | ||
229 | if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) { | ||
230 | rc = __compat_only_sysfs_link_entry_to_kobj(&chip->pdev->kobj, | ||
231 | &chip->dev.kobj, | ||
232 | "ppi"); | ||
233 | if (rc) | ||
234 | goto out_err; | ||
235 | } | ||
236 | |||
237 | /* Make the chip available. */ | 229 | /* Make the chip available. */ |
238 | spin_lock(&driver_lock); | 230 | spin_lock(&driver_lock); |
239 | list_add_rcu(&chip->list, &tpm_chip_list); | 231 | list_add_tail_rcu(&chip->list, &tpm_chip_list); |
240 | spin_unlock(&driver_lock); | 232 | spin_unlock(&driver_lock); |
241 | 233 | ||
242 | chip->flags |= TPM_CHIP_FLAG_REGISTERED; | 234 | chip->flags |= TPM_CHIP_FLAG_REGISTERED; |
243 | 235 | ||
236 | if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) { | ||
237 | rc = __compat_only_sysfs_link_entry_to_kobj(&chip->pdev->kobj, | ||
238 | &chip->dev.kobj, | ||
239 | "ppi"); | ||
240 | if (rc && rc != -ENOENT) { | ||
241 | tpm_chip_unregister(chip); | ||
242 | return rc; | ||
243 | } | ||
244 | } | ||
245 | |||
244 | return 0; | 246 | return 0; |
245 | out_err: | 247 | out_err: |
246 | tpm1_chip_unregister(chip); | 248 | tpm1_chip_unregister(chip); |
diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c index bd7039fafa8a..c12130485fc1 100644 --- a/drivers/char/tpm/tpm2-cmd.c +++ b/drivers/char/tpm/tpm2-cmd.c | |||
@@ -443,12 +443,13 @@ int tpm2_seal_trusted(struct tpm_chip *chip, | |||
443 | TPM_DIGEST_SIZE); | 443 | TPM_DIGEST_SIZE); |
444 | 444 | ||
445 | /* sensitive */ | 445 | /* sensitive */ |
446 | tpm_buf_append_u16(&buf, 4 + TPM_DIGEST_SIZE + payload->key_len); | 446 | tpm_buf_append_u16(&buf, 4 + TPM_DIGEST_SIZE + payload->key_len + 1); |
447 | 447 | ||
448 | tpm_buf_append_u16(&buf, TPM_DIGEST_SIZE); | 448 | tpm_buf_append_u16(&buf, TPM_DIGEST_SIZE); |
449 | tpm_buf_append(&buf, options->blobauth, TPM_DIGEST_SIZE); | 449 | tpm_buf_append(&buf, options->blobauth, TPM_DIGEST_SIZE); |
450 | tpm_buf_append_u16(&buf, payload->key_len); | 450 | tpm_buf_append_u16(&buf, payload->key_len + 1); |
451 | tpm_buf_append(&buf, payload->key, payload->key_len); | 451 | tpm_buf_append(&buf, payload->key, payload->key_len); |
452 | tpm_buf_append_u8(&buf, payload->migratable); | ||
452 | 453 | ||
453 | /* public */ | 454 | /* public */ |
454 | tpm_buf_append_u16(&buf, 14); | 455 | tpm_buf_append_u16(&buf, 14); |
@@ -573,6 +574,8 @@ static int tpm2_unseal(struct tpm_chip *chip, | |||
573 | u32 blob_handle) | 574 | u32 blob_handle) |
574 | { | 575 | { |
575 | struct tpm_buf buf; | 576 | struct tpm_buf buf; |
577 | u16 data_len; | ||
578 | u8 *data; | ||
576 | int rc; | 579 | int rc; |
577 | 580 | ||
578 | rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL); | 581 | rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL); |
@@ -591,11 +594,13 @@ static int tpm2_unseal(struct tpm_chip *chip, | |||
591 | rc = -EPERM; | 594 | rc = -EPERM; |
592 | 595 | ||
593 | if (!rc) { | 596 | if (!rc) { |
594 | payload->key_len = be16_to_cpup( | 597 | data_len = be16_to_cpup( |
595 | (__be16 *) &buf.data[TPM_HEADER_SIZE + 4]); | 598 | (__be16 *) &buf.data[TPM_HEADER_SIZE + 4]); |
599 | data = &buf.data[TPM_HEADER_SIZE + 6]; | ||
596 | 600 | ||
597 | memcpy(payload->key, &buf.data[TPM_HEADER_SIZE + 6], | 601 | memcpy(payload->key, data, data_len - 1); |
598 | payload->key_len); | 602 | payload->key_len = data_len - 1; |
603 | payload->migratable = data[data_len - 1]; | ||
599 | } | 604 | } |
600 | 605 | ||
601 | tpm_buf_destroy(&buf); | 606 | tpm_buf_destroy(&buf); |
diff --git a/drivers/char/tpm/tpm_of.c b/drivers/char/tpm/tpm_of.c index 1141456a4b1f..570f30c5c5f4 100644 --- a/drivers/char/tpm/tpm_of.c +++ b/drivers/char/tpm/tpm_of.c | |||
@@ -53,17 +53,18 @@ int read_log(struct tpm_bios_log *log) | |||
53 | goto cleanup_eio; | 53 | goto cleanup_eio; |
54 | } | 54 | } |
55 | 55 | ||
56 | of_node_put(np); | ||
57 | log->bios_event_log = kmalloc(*sizep, GFP_KERNEL); | 56 | log->bios_event_log = kmalloc(*sizep, GFP_KERNEL); |
58 | if (!log->bios_event_log) { | 57 | if (!log->bios_event_log) { |
59 | pr_err("%s: ERROR - Not enough memory for BIOS measurements\n", | 58 | pr_err("%s: ERROR - Not enough memory for BIOS measurements\n", |
60 | __func__); | 59 | __func__); |
60 | of_node_put(np); | ||
61 | return -ENOMEM; | 61 | return -ENOMEM; |
62 | } | 62 | } |
63 | 63 | ||
64 | log->bios_event_log_end = log->bios_event_log + *sizep; | 64 | log->bios_event_log_end = log->bios_event_log + *sizep; |
65 | 65 | ||
66 | memcpy(log->bios_event_log, __va(*basep), *sizep); | 66 | memcpy(log->bios_event_log, __va(*basep), *sizep); |
67 | of_node_put(np); | ||
67 | 68 | ||
68 | return 0; | 69 | return 0; |
69 | 70 | ||
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c index 696ef1d56b4f..65f7eecc45b0 100644 --- a/drivers/char/tpm/tpm_tis.c +++ b/drivers/char/tpm/tpm_tis.c | |||
@@ -645,6 +645,7 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info, | |||
645 | { | 645 | { |
646 | u32 vendor, intfcaps, intmask; | 646 | u32 vendor, intfcaps, intmask; |
647 | int rc, i, irq_s, irq_e, probe; | 647 | int rc, i, irq_s, irq_e, probe; |
648 | int irq_r = -1; | ||
648 | struct tpm_chip *chip; | 649 | struct tpm_chip *chip; |
649 | struct priv_data *priv; | 650 | struct priv_data *priv; |
650 | 651 | ||
@@ -751,6 +752,7 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info, | |||
751 | irq_s = | 752 | irq_s = |
752 | ioread8(chip->vendor.iobase + | 753 | ioread8(chip->vendor.iobase + |
753 | TPM_INT_VECTOR(chip->vendor.locality)); | 754 | TPM_INT_VECTOR(chip->vendor.locality)); |
755 | irq_r = irq_s; | ||
754 | if (irq_s) { | 756 | if (irq_s) { |
755 | irq_e = irq_s; | 757 | irq_e = irq_s; |
756 | } else { | 758 | } else { |
@@ -805,6 +807,8 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info, | |||
805 | iowrite32(intmask, | 807 | iowrite32(intmask, |
806 | chip->vendor.iobase + | 808 | chip->vendor.iobase + |
807 | TPM_INT_ENABLE(chip->vendor.locality)); | 809 | TPM_INT_ENABLE(chip->vendor.locality)); |
810 | |||
811 | devm_free_irq(dev, i, chip); | ||
808 | } | 812 | } |
809 | } | 813 | } |
810 | if (chip->vendor.irq) { | 814 | if (chip->vendor.irq) { |
@@ -831,7 +835,9 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info, | |||
831 | chip->vendor.iobase + | 835 | chip->vendor.iobase + |
832 | TPM_INT_ENABLE(chip->vendor.locality)); | 836 | TPM_INT_ENABLE(chip->vendor.locality)); |
833 | } | 837 | } |
834 | } | 838 | } else if (irq_r != -1) |
839 | iowrite8(irq_r, chip->vendor.iobase + | ||
840 | TPM_INT_VECTOR(chip->vendor.locality)); | ||
835 | 841 | ||
836 | if (chip->flags & TPM_CHIP_FLAG_TPM2) { | 842 | if (chip->flags & TPM_CHIP_FLAG_TPM2) { |
837 | chip->vendor.timeout_a = msecs_to_jiffies(TPM2_TIMEOUT_A); | 843 | chip->vendor.timeout_a = msecs_to_jiffies(TPM2_TIMEOUT_A); |