// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <zircon-estelle/bootimg.h>
#include <common.h>

uint32_t validate_bootimg(void *bootimg)
{
	boot_img_hdr_v0 *hdr = (boot_img_hdr_v0 *)bootimg;
	if (!strncmp((char *)(hdr->magic), BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
		return hdr->header_version;
	}
	return (uint32_t)(-1);
}

uint32_t get_kernel_size(void *bootimg, uint32_t hdr_version)
{
	switch (hdr_version) {
	case 0:
		return ((boot_img_hdr_v0 *)bootimg)->kernel_size;
	case 1:
		return ((boot_img_hdr_v1 *)bootimg)->kernel_size;
	case 2:
		return ((boot_img_hdr_v2 *)bootimg)->kernel_size;
	case 3:
		return ((boot_img_hdr_v3 *)bootimg)->kernel_size;
	case 4:
		return ((boot_img_hdr_v4 *)bootimg)->kernel_size;
	default:
		return (uint32_t)(-1);
	}
}

uint32_t get_kernel_offset(void *bootimg, uint32_t hdr_version)
{
	switch (hdr_version) {
	case 0:
		return ((boot_img_hdr_v0 *)bootimg)->page_size;
	case 1:
		return ((boot_img_hdr_v1 *)bootimg)->page_size;
	case 2:
		return ((boot_img_hdr_v2 *)bootimg)->page_size;
	case 3:
	case 4:
		// Versions 3 and 4 fix the page size at 4096, see:
		// https://android.googlesource.com/platform/system/tools/mkbootimg/+/refs/heads/master/include/bootimg/bootimg.h#219
		return 4096;
	default:
		return (uint32_t)(-1);
	}
}
