Signed-off-by: Prakhar Srivastava <prsriva@xxxxxxxxxxxxxxxxxxx> --- arch/powerpc/kexec/ima.c | 63 ++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/arch/powerpc/kexec/ima.c b/arch/powerpc/kexec/ima.c index 563313703756..a9e4e9f04273 100644 --- a/arch/powerpc/kexec/ima.c +++ b/arch/powerpc/kexec/ima.c @@ -12,40 +12,6 @@ #include <linux/memblock.h> #include <linux/libfdt.h> -static int get_addr_size_cells(int *addr_cells, int *size_cells) -{ - struct device_node *root; - - root = of_find_node_by_path("/"); - if (!root) - return -EINVAL; - - *addr_cells = of_n_addr_cells(root); - *size_cells = of_n_size_cells(root); - - of_node_put(root); - - return 0; -} - -static int do_get_kexec_buffer(const void *prop, int len, unsigned long *addr, - size_t *size) -{ - int ret, addr_cells, size_cells; - - ret = get_addr_size_cells(&addr_cells, &size_cells); - if (ret) - return ret; - - if (len < 4 * (addr_cells + size_cells)) - return -ENOENT; - - *addr = of_read_number(prop, addr_cells); - *size = of_read_number(prop + 4 * addr_cells, size_cells); - - return 0; -} - /** * remove_ima_buffer - remove the IMA buffer property and reservation from @fdt * @@ -54,7 +20,7 @@ static int do_get_kexec_buffer(const void *prop, int len, unsigned long *addr, */ void remove_ima_buffer(void *fdt, int chosen_node) { - int ret, len; + int ret, len, addr_cells, size_cells; unsigned long addr; size_t size; const void *prop; @@ -63,7 +29,22 @@ void remove_ima_buffer(void *fdt, int chosen_node) if (!prop) return; - ret = do_get_kexec_buffer(prop, len, &addr, &size); + ret = fdt_address_cells(fdt, chosen_node); + if (ret < 0) + return; + addr_cells = ret; + + ret = fdt_size_cells(fdt, chosen_node); + if (ret < 0) + return; + size_cells = ret; + + if (len < 4 * (addr_cells + size_cells)) + return; + + addr = of_read_number(prop, addr_cells); + size = of_read_number(prop + 4 * addr_cells, size_cells); + fdt_delprop(fdt, chosen_node, "linux,ima-kexec-buffer"); if (ret) return; @@ -129,9 +110,15 @@ int setup_ima_buffer(const struct kimage *image, void *fdt, int chosen_node) if (!image->arch.ima_buffer_size) return 0; - ret = get_addr_size_cells(&addr_cells, &size_cells); - if (ret) + ret = fdt_address_cells(fdt, chosen_node); + if (ret < 0) + return ret; + addr_cells = ret; + + ret = fdt_size_cells(fdt, chosen_node); + if (ret < 0) return ret; + size_cells = ret; entry_size = 4 * (addr_cells + size_cells); -- 2.25.1