Skip to content

Commit

Permalink
powerpc: Move ima buffer fields to struct kimage
Browse files Browse the repository at this point in the history
The fields ima_buffer_addr and ima_buffer_size in "struct kimage_arch"
for powerpc are used to carry forward the IMA measurement list across
kexec system call.  These fields are not architecture specific, but are
currently limited to powerpc.

arch_ima_add_kexec_buffer() defined in "arch/powerpc/kexec/ima.c"
sets ima_buffer_addr and ima_buffer_size for the kexec system call.
This function does not have architecture specific code, but is
currently limited to powerpc.

Move ima_buffer_addr and ima_buffer_size to "struct kimage".
Set ima_buffer_addr and ima_buffer_size in ima_add_kexec_buffer()
in security/integrity/ima/ima_kexec.c.

Co-developed-by: Prakhar Srivastava <prsriva@linux.microsoft.com>
Signed-off-by: Prakhar Srivastava <prsriva@linux.microsoft.com>
Signed-off-by: Lakshmi Ramasubramanian <nramas@linux.microsoft.com>
Suggested-by: Will Deacon <will@kernel.org>
Reviewed-by: Thiago Jung Bauermann <bauerman@linux.ibm.com>
Signed-off-by: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20210221174930.27324-9-nramas@linux.microsoft.com
  • Loading branch information
Lakshmi Ramasubramanian authored and Rob Herring committed Mar 8, 2021
1 parent 3c985d3 commit 0c60515
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 37 deletions.
3 changes: 0 additions & 3 deletions arch/powerpc/include/asm/ima.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@ static inline void remove_ima_buffer(void *fdt, int chosen_node) {}
#endif

#ifdef CONFIG_IMA_KEXEC
int arch_ima_add_kexec_buffer(struct kimage *image, unsigned long load_addr,
size_t size);

int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node);
#else
static inline int setup_ima_buffer(const struct kimage *image, void *fdt,
Expand Down
5 changes: 0 additions & 5 deletions arch/powerpc/include/asm/kexec.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,6 @@ struct kimage_arch {
unsigned long backup_start;
void *backup_buf;
void *fdt;

#ifdef CONFIG_IMA_KEXEC
phys_addr_t ima_buffer_addr;
size_t ima_buffer_size;
#endif
};

char *setup_kdump_cmdline(struct kimage *image, char *cmdline,
Expand Down
29 changes: 6 additions & 23 deletions arch/powerpc/kexec/ima.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,23 +128,6 @@ void remove_ima_buffer(void *fdt, int chosen_node)
}

#ifdef CONFIG_IMA_KEXEC
/**
* arch_ima_add_kexec_buffer - do arch-specific steps to add the IMA buffer
*
* Architectures should use this function to pass on the IMA buffer
* information to the next kernel.
*
* Return: 0 on success, negative errno on error.
*/
int arch_ima_add_kexec_buffer(struct kimage *image, unsigned long load_addr,
size_t size)
{
image->arch.ima_buffer_addr = load_addr;
image->arch.ima_buffer_size = size;

return 0;
}

static int write_number(void *p, u64 value, int cells)
{
if (cells == 1) {
Expand Down Expand Up @@ -180,7 +163,7 @@ int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node)
u8 value[16];

remove_ima_buffer(fdt, chosen_node);
if (!image->arch.ima_buffer_size)
if (!image->ima_buffer_size)
return 0;

ret = get_addr_size_cells(&addr_cells, &size_cells);
Expand All @@ -192,11 +175,11 @@ int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node)
if (entry_size > sizeof(value))
return -EINVAL;

ret = write_number(value, image->arch.ima_buffer_addr, addr_cells);
ret = write_number(value, image->ima_buffer_addr, addr_cells);
if (ret)
return ret;

ret = write_number(value + 4 * addr_cells, image->arch.ima_buffer_size,
ret = write_number(value + 4 * addr_cells, image->ima_buffer_size,
size_cells);
if (ret)
return ret;
Expand All @@ -206,13 +189,13 @@ int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node)
if (ret < 0)
return -EINVAL;

ret = fdt_add_mem_rsv(fdt, image->arch.ima_buffer_addr,
image->arch.ima_buffer_size);
ret = fdt_add_mem_rsv(fdt, image->ima_buffer_addr,
image->ima_buffer_size);
if (ret)
return -EINVAL;

pr_debug("IMA buffer at 0x%llx, size = 0x%zx\n",
image->arch.ima_buffer_addr, image->arch.ima_buffer_size);
image->ima_buffer_addr, image->ima_buffer_size);

return 0;
}
Expand Down
3 changes: 3 additions & 0 deletions include/linux/kexec.h
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,9 @@ struct kimage {
#ifdef CONFIG_IMA_KEXEC
/* Virtual address of IMA measurement buffer for kexec syscall */
void *ima_buffer;

phys_addr_t ima_buffer_addr;
size_t ima_buffer_size;
#endif

/* Core ELF header buffer */
Expand Down
8 changes: 2 additions & 6 deletions security/integrity/ima/ima_kexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,8 @@ void ima_add_kexec_buffer(struct kimage *image)
return;
}

ret = arch_ima_add_kexec_buffer(image, kbuf.mem, kexec_segment_size);
if (ret) {
pr_err("Error passing over kexec measurement buffer.\n");
return;
}

image->ima_buffer_addr = kbuf.mem;
image->ima_buffer_size = kexec_segment_size;
image->ima_buffer = kexec_buffer;

pr_debug("kexec measurement buffer for the loaded kernel at 0x%lx.\n",
Expand Down

0 comments on commit 0c60515

Please sign in to comment.