extern int ima_extra_slots __ro_after_init;
 extern int ima_appraise;
 extern struct tpm_chip *ima_tpm_chip;
+extern const char boot_aggregate_name[];
 
 /* IMA event related data */
 struct ima_event_data {
                         struct ima_digest_data *hash);
 int ima_calc_field_array_hash(struct ima_field_data *field_data,
                              struct ima_template_entry *entry);
-int __init ima_calc_boot_aggregate(struct ima_digest_data *hash);
+int ima_calc_boot_aggregate(struct ima_digest_data *hash);
 void ima_add_violation(struct file *file, const unsigned char *filename,
                       struct integrity_iint_cache *iint,
                       const char *op, const char *cause);
 
  * hash algorithm for reading the TPM PCRs as for calculating the boot
  * aggregate digest as stored in the measurement list.
  */
-static int __init ima_calc_boot_aggregate_tfm(char *digest, u16 alg_id,
-                                             struct crypto_shash *tfm)
+static int ima_calc_boot_aggregate_tfm(char *digest, u16 alg_id,
+                                      struct crypto_shash *tfm)
 {
        struct tpm_digest d = { .alg_id = alg_id, .digest = {0} };
        int rc;
        return rc;
 }
 
-int __init ima_calc_boot_aggregate(struct ima_digest_data *hash)
+int ima_calc_boot_aggregate(struct ima_digest_data *hash)
 {
        struct crypto_shash *tfm;
        u16 crypto_id, alg_id;
 
 #include "ima.h"
 
 /* name for boot aggregate entry */
-static const char boot_aggregate_name[] = "boot_aggregate";
+const char boot_aggregate_name[] = "boot_aggregate";
 struct tpm_chip *ima_tpm_chip;
 
 /* Add the boot aggregate to the IMA measurement list and extend
 
                goto out;
        }
 
+       if ((const char *)event_data->filename == boot_aggregate_name) {
+               if (ima_tpm_chip) {
+                       hash.hdr.algo = HASH_ALGO_SHA1;
+                       result = ima_calc_boot_aggregate(&hash.hdr);
+
+                       /* algo can change depending on available PCR banks */
+                       if (!result && hash.hdr.algo != HASH_ALGO_SHA1)
+                               result = -EINVAL;
+
+                       if (result < 0)
+                               memset(&hash, 0, sizeof(hash));
+               }
+
+               cur_digest = hash.hdr.digest;
+               cur_digestsize = hash_digest_size[HASH_ALGO_SHA1];
+               goto out;
+       }
+
        if (!event_data->file)  /* missing info to re-calculate the digest */
                return -EINVAL;