struct evm_ima_xattr_data *xattr_value,
                           int xattr_len, const struct modsig *modsig, int pcr,
                           struct ima_template_desc *template_desc);
+void process_buffer_measurement(const void *buf, int size,
+                               const char *eventname, enum ima_hooks func,
+                               int pcr);
 void ima_audit_measurement(struct integrity_iint_cache *iint,
                           const unsigned char *filename);
 int ima_alloc_init_template(struct ima_event_data *event_data,
 
  * @buf: pointer to the buffer that needs to be added to the log.
  * @size: size of buffer(in bytes).
  * @eventname: event name to be used for the buffer entry.
- * @cred: a pointer to a credentials structure for user validation.
- * @secid: the secid of the task to be validated.
+ * @func: IMA hook
+ * @pcr: pcr to extend the measurement
  *
  * Based on policy, the buffer is measured into the ima log.
  */
-static void process_buffer_measurement(const void *buf, int size,
-                                      const char *eventname,
-                                      const struct cred *cred, u32 secid)
+void process_buffer_measurement(const void *buf, int size,
+                               const char *eventname, enum ima_hooks func,
+                               int pcr)
 {
        int ret = 0;
        struct ima_template_entry *entry = NULL;
                                            .filename = eventname,
                                            .buf = buf,
                                            .buf_len = size};
-       struct ima_template_desc *template_desc = NULL;
+       struct ima_template_desc *template = NULL;
        struct {
                struct ima_digest_data hdr;
                char digest[IMA_MAX_DIGEST_SIZE];
        } hash = {};
        int violation = 0;
-       int pcr = CONFIG_IMA_MEASURE_PCR_IDX;
        int action = 0;
+       u32 secid;
 
-       action = ima_get_action(NULL, cred, secid, 0, KEXEC_CMDLINE, &pcr,
-                               &template_desc);
-       if (!(action & IMA_MEASURE))
-               return;
+       /*
+        * Both LSM hooks and auxilary based buffer measurements are
+        * based on policy.  To avoid code duplication, differentiate
+        * between the LSM hooks and auxilary buffer measurements,
+        * retrieving the policy rule information only for the LSM hook
+        * buffer measurements.
+        */
+       if (func) {
+               security_task_getsecid(current, &secid);
+               action = ima_get_action(NULL, current_cred(), secid, 0, func,
+                                       &pcr, &template);
+               if (!(action & IMA_MEASURE))
+                       return;
+       }
+
+       if (!pcr)
+               pcr = CONFIG_IMA_MEASURE_PCR_IDX;
+
+       if (!template) {
+               template = lookup_template_desc("ima-buf");
+               ret = template_desc_init_fields(template->fmt,
+                                               &(template->fields),
+                                               &(template->num_fields));
+               if (ret < 0) {
+                       pr_err("template %s init failed, result: %d\n",
+                              (strlen(template->name) ?
+                               template->name : template->fmt), ret);
+                       return;
+               }
+       }
 
        iint.ima_hash = &hash.hdr;
        iint.ima_hash->algo = ima_hash_algo;
        if (ret < 0)
                goto out;
 
-       ret = ima_alloc_init_template(&event_data, &entry, template_desc);
+       ret = ima_alloc_init_template(&event_data, &entry, template);
        if (ret < 0)
                goto out;
 
  */
 void ima_kexec_cmdline(const void *buf, int size)
 {
-       u32 secid;
-
-       if (buf && size != 0) {
-               security_task_getsecid(current, &secid);
+       if (buf && size != 0)
                process_buffer_measurement(buf, size, "kexec-cmdline",
-                                          current_cred(), secid);
-       }
+                                          KEXEC_CMDLINE, 0);
 }
 
 static int __init init_ima(void)