blob: e774d07065d9a56eef76dcd468f380fccef073f5 [file] [log] [blame]
/*
* Copyright (c) 2018 The Fuchsia Authors
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <image.h>
#include <zircon/image.h>
void zircon_append_boot_item(zbi_header_t* container, uint32_t type, uint32_t extra,
const void* payload, uint32_t length) {
zbi_header_t* dest = (zbi_header_t*)((uintptr_t)container + container->length + sizeof(zbi_header_t));
dest->type = type;
dest->length = length;
dest->extra = extra;
dest->flags = ZBI_FLAG_VERSION;
dest->reserved0 = 0;
dest->reserved1 = 0;
dest->magic = ZBI_ITEM_MAGIC;
dest->crc32 = ZBI_ITEM_NO_CRC32;
if (length) {
memcpy(dest + 1, payload, length);
}
length = ZBI_ALIGN(length + sizeof(zbi_header_t));
container->length += length;
}
int zircon_image_check_header(const void *hdr)
{
const zbi_header_t* zbi = hdr;
return (zbi[0].type == ZBI_TYPE_CONTAINER &&
zbi[0].extra == ZBI_CONTAINER_MAGIC &&
zbi[0].magic == ZBI_ITEM_MAGIC &&
zbi[1].type == ZBI_TYPE_KERNEL_ARM64 &&
zbi[1].magic == ZBI_ITEM_MAGIC) ? 0 : -1;
}
/**
* zircon_image_get_kernel() - processes kernel part of Zircon bootdata
* @bootdata: Pointer to ZBI image.
* @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 (zircon_image_check_header(hdr))
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 CONFIG_LOADADDR;
}
ulong zircon_image_get_comp(const void *hdr)
{
return IH_COMP_NONE;
}