/*
 * Copyright (c) 2018 The Fuchsia Authors
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <image.h>
#include <zbi/zbi.h>
#include <zircon/boot/image.h>

/**
 * zircon_image_get_kernel() - processes kernel part of Zircon bootdata
 * @bootdata:	Pointer to bootdata.
 * @verify:		Checksum verification flag. Currently unimplemented.
 * @os_data:	Pointer to a ulong variable, will hold os data start
 *			address.
 * @os_len:	Pointer to a ulong variable, will hold os data length.
 *
 * This function returns the os image's start address and length. Also,
 * it appends the kernel command line to the bootargs env variable.
 *
 * Return: Zero, os start address and length on success,
 *		otherwise on failure.
 */
int zircon_image_get_kernel(const void *hdr, int verify, ulong *os_data,
			    ulong *os_len)
{
	if (zbi_check_complete(hdr, NULL) != ZBI_RESULT_OK) {
		return -1;
	}

	const zbi_header_t *zbi = hdr;

	*os_data = (ulong)zbi;
	*os_len = zbi->length + sizeof(*zbi);
	return 0;
}

ulong zircon_image_get_end(const void *hdr)
{
	const zbi_header_t *zbi = hdr;
	return (ulong)hdr + zbi->length + sizeof(*zbi);
}

ulong zircon_image_get_kload(const void *hdr)
{
	return simple_strtoul(getenv("loadaddr"), NULL, 16);
}

ulong zircon_image_get_comp(const void *hdr)
{
	return IH_COMP_NONE;
}
