// 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.

#ifndef _ZIRCON_BOOTIMG_H_
#define _ZIRCON_BOOTIMG_H_

#define BOOT_MAGIC "ANDROID!"
#define BOOT_MAGIC_SIZE 8
#define BOOT_NAME_SIZE 16
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024

#include <common.h>

// See https://android.googlesource.com/platform/system/tools/mkbootimg/+/refs/heads/master/include/bootimg/bootimg.h
// for a full explanation of these structs and their fields.

typedef struct {
	uint8_t magic[BOOT_MAGIC_SIZE];
	uint32_t kernel_size;
	uint32_t kernel_addr;
	uint32_t ramdisk_size;
	uint32_t ramdisk_addr;
	uint32_t second_size;
	uint32_t second_addr;
	uint32_t tags_addr;
	uint32_t page_size;
	uint32_t header_version;
	uint32_t os_version;
	uint8_t name[BOOT_NAME_SIZE];
	uint8_t cmdline[BOOT_ARGS_SIZE];
	uint32_t id[8];
	uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
} __attribute((packed)) boot_img_hdr_v0;

typedef struct {
	uint8_t magic[BOOT_MAGIC_SIZE];
	uint32_t kernel_size;
	uint32_t kernel_addr;
	uint32_t ramdisk_size;
	uint32_t ramdisk_addr;
	uint32_t second_size;
	uint32_t second_addr;
	uint32_t tags_addr;
	uint32_t page_size;
	uint32_t header_version;
	uint32_t os_version;
	uint8_t name[BOOT_NAME_SIZE];
	uint8_t cmdline[BOOT_ARGS_SIZE];
	uint32_t id[8];
	uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];

	uint32_t recovery_dtbo_size;
	uint64_t recovery_dtbo_offset;
	uint32_t header_size;
} __attribute((packed)) boot_img_hdr_v1;

typedef struct {
	uint8_t magic[BOOT_MAGIC_SIZE];
	uint32_t kernel_size;
	uint32_t kernel_addr;
	uint32_t ramdisk_size;
	uint32_t ramdisk_addr;
	uint32_t second_size;
	uint32_t second_addr;
	uint32_t tags_addr;
	uint32_t page_size;
	uint32_t header_version;
	uint32_t os_version;
	uint8_t name[BOOT_NAME_SIZE];
	uint8_t cmdline[BOOT_ARGS_SIZE];
	uint32_t id[8];
	uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];

	uint32_t recovery_dtbo_size;
	uint64_t recovery_dtbo_offset;
	uint32_t header_size;

	uint32_t dtb_size;
	uint64_t dtb_addr;
} __attribute((packed)) boot_img_hdr_v2;

typedef struct {
	uint8_t magic[BOOT_MAGIC_SIZE];
	uint32_t kernel_size;
	uint32_t ramdisk_size;
	uint32_t os_version;
	uint32_t header_size;
	uint32_t reserved[4];
	uint32_t header_version;
	uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
} __attribute((packed)) boot_img_hdr_v3;

typedef struct {
	uint8_t magic[BOOT_MAGIC_SIZE];
	uint32_t kernel_size;
	uint32_t ramdisk_size;
	uint32_t os_version;
	uint32_t header_size;
	uint32_t reserved[4];
	uint32_t header_version;
	uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];

	uint32_t signature_size;
} __attribute((packed)) boot_img_hdr_v4;

/**
 * Validates fastboot boot image.
 *
 * @bootimg: Address of the boot image to validate.
 *
 * Return: boot image version if successful (uint32_t)(-1) if not.
 */
uint32_t validate_bootimg(void *bootimg);

/**
 * Gets kernel size of fastboot boot image.
 *
 * @bootimg: address of the boot image.
 * @hdr_version: android boot header version.
 *
 * Return: kernel_size in bytes if successful, (uint32_t)(-1) on failure.
 */
uint32_t get_kernel_size(void *bootimg, uint32_t hdr_version);

/**
 * Gets kernel offset relative to the start of the fastboot boot image.
 *
 * @bootimg: address of the boot image.
 * @hdr_version: android boot header version.
 *
 * Return: offset in bytes if successful, (uint32_t)(-1) on failure.
 */
uint32_t get_kernel_offset(void *bootimg, uint32_t hdr_version);


#endif //_ZIRCON_BOOTIMG_H_
