[Skiboot] [RFC PATCH 4/7] skiboot: Fetch the IMA dtb
Madhavan Srinivasan
maddy at linux.vnet.ibm.com
Wed Nov 2 18:03:37 AEDT 2016
On Tuesday 25 October 2016 06:15 PM, Hemant Kumar wrote:
> The sub-partition that we obtain from the IMA_CATALOG partition is a
> compressed device tree binary. We uncompress it using the libxz's
> functions. After uncompressing it, we link the device tree binary to the
> system's device tree. The kernel can now access the device tree and get
> the IMA PMUs and their events' information.
Reviewed-By: Madhavan Srinivasan <maddy at linux.vnet.ibm.com>
> Signed-off-by: Hemant Kumar <hemant at linux.vnet.ibm.com>
> ---
> hw/ima.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 80 insertions(+)
>
> diff --git a/hw/ima.c b/hw/ima.c
> index 6f447a5..7dd8d8c 100644
> --- a/hw/ima.c
> +++ b/hw/ima.c
> @@ -18,10 +18,71 @@
> #include <xscom.h>
> #include <ima.h>
> #include <chip.h>
> +#include <libxz/xz.h>
> +
> +/*
> + * Decompresses the blob obtained from the IMA catalog sub-partition
> + * in "buf" of size "size", assigns the uncompressed device tree
> + * binary to "fdt" and returns.
> + * Returns 0 on success and -1 on error.
> + */
> +static int decompress_subpartition(char *buf, size_t size, void **fdt)
> +{
> + struct xz_dec *s;
> + struct xz_buf b;
> + void *data;
> + int ret = 0;
> +
> + /* Initialize the xz library first */
> + xz_crc32_init();
> + s = xz_dec_init(XZ_SINGLE, 0);
> + if (s == NULL)
> + {
> + prerror("IMA: initialization error for xz\n");
> + return -1;
> + }
> +
> + /* Allocate memory for the uncompressed data */
> + data = malloc(IMA_DTB_SIZE);
> + if (!data) {
> + prerror("IMA: memory allocation error\n");
> + ret = -1;
> + goto err;
> + }
> +
> + /*
> + * Source address : buf
> + * Source size : size
> + * Destination address : data
> + * Destination size : IMA_DTB_SIZE
> + */
> + b.in = buf;
> + b.in_pos = 0;
> + b.in_size = size;
> + b.out = data;
> + b.out_pos = 0;
> + b.out_size = IMA_DTB_SIZE;
> +
> + /* Start decompressing */
> + ret = xz_dec_run(s, &b);
> + if (ret != XZ_STREAM_END) {
> + prerror("IMA: failed to decompress subpartition\n");
> + free(data);
> + ret = -1;
> + }
> + *fdt = data;
> +
> +err:
> + /* Clean up memory */
> + xz_dec_end(s);
> + return ret;
> +}
>
> /*
> * Fetch the IMA Catalog partition and find the appropriate sub-partition
> * based on the platform's PVR.
> + * Decompress the sub-partition and link the ima device tree to the
> + * existing device tree.
> */
> void ima_init(void)
> {
> @@ -30,6 +91,8 @@ void ima_init(void)
> uint32_t pvr = mfspr(SPR_PVR);
> int ret;
> struct proc_chip *chip;
> + struct dt_node *dev;
> + void *fdt = NULL;
>
> /* Disable this for power 8 */
> chip = get_chip(this_cpu()->chip_id);
> @@ -56,6 +119,23 @@ void ima_init(void)
> goto err;
> }
>
> + /* Decompress the subpartition now */
> + ret = decompress_subpartition(buf, size, &fdt);
> + if (ret < 0) {
> + goto err;
> + }
> +
> + /* Create a device tree entry for ima counters */
> + dev = dt_new(dt_root, "ima-counters");
> + if (!dev) {
> + prerror("IMA: Unable to create device node\n");
> + goto err;
> + }
> +
> + /* Attach the new fdt to the ima-counters node */
> + ret = dt_expand_node(dev, fdt, 0);
> + if (ret < 0)
> + prerror("IMA: device tree couldn't be linked\n");
> err:
> free(buf);
> }
More information about the Skiboot
mailing list