/* Copyright (c) 2013 The Chromium OS 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 VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_
#define VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_

#include "2sysincludes.h"
#include "cgptlib.h"
#include "gpt.h"

/*
 * If gpt->current_kernel is this value, means either:
 *   1. an initial value before scanning GPT entries,
 *   2. after scanning, no any valid kernel is found.
 */
#define CGPT_KERNEL_ENTRY_NOT_FOUND (-1)

/*
 * Bit definitions and masks for GPT attributes.
 *
 *  63-61  -- (reserved)
 *     60  -- read-only
 *  59-57  -- (reserved)
 *     56  -- success
 *  55-52  -- tries
 *  51-48  -- priority
 *   47-3  -- UEFI: reserved for future use
 *      2  -- UEFI: Legacy BIOS bootable
 *      1  -- UEFI: partition is not mapped
 *      0  -- UEFI: partition is required
 */
#define CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET (56 - 48)
#define CGPT_ATTRIBUTE_MAX_SUCCESSFUL (1ULL)
#define CGPT_ATTRIBUTE_SUCCESSFUL_MASK (CGPT_ATTRIBUTE_MAX_SUCCESSFUL << \
					CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET)

#define CGPT_ATTRIBUTE_TRIES_OFFSET (52 - 48)
#define CGPT_ATTRIBUTE_MAX_TRIES (15ULL)
#define CGPT_ATTRIBUTE_TRIES_MASK (CGPT_ATTRIBUTE_MAX_TRIES << \
				   CGPT_ATTRIBUTE_TRIES_OFFSET)

#define CGPT_ATTRIBUTE_PRIORITY_OFFSET (48 - 48)
#define CGPT_ATTRIBUTE_MAX_PRIORITY (15ULL)
#define CGPT_ATTRIBUTE_PRIORITY_MASK (CGPT_ATTRIBUTE_MAX_PRIORITY << \
				      CGPT_ATTRIBUTE_PRIORITY_OFFSET)

#define CGPT_ATTRIBUTE_REQUIRED_OFFSET (0)
#define CGPT_ATTRIBUTE_MAX_REQUIRED (1ULL)
#define CGPT_ATTRIBUTE_LEGACY_BOOT_OFFSET (2)
#define CGPT_ATTRIBUTE_MAX_LEGACY_BOOT (1ULL)

/* Defines ChromeOS-specific limitation on GPT */
#define MIN_SIZE_OF_HEADER 92
#define MAX_SIZE_OF_HEADER 512
#define MIN_SIZE_OF_ENTRY 128
#define MAX_SIZE_OF_ENTRY 512
#define SIZE_OF_ENTRY_MULTIPLE 8
#define MIN_NUMBER_OF_ENTRIES 16
#define MAX_NUMBER_OF_ENTRIES 128

/* All GptData.(primary|secondary)_entries must be allocated to this size! */
#define GPT_ENTRIES_ALLOC_SIZE (MAX_NUMBER_OF_ENTRIES * sizeof(GptEntry))

/* Defines GPT sizes */
#define GPT_PMBR_SECTORS 1  /* size (in sectors) of PMBR */
#define GPT_HEADER_SECTORS 1

/*
 * Alias name of index in internal array for primary and secondary header and
 * entries.
 */
enum {
	/* constants for index */
	PRIMARY = 0,
	SECONDARY = 1,
	ANY_VALID = 9999,  /* accept any between primary and secondary */

	/* constants for bit mask */
	MASK_NONE = 0,
	MASK_PRIMARY = 1,
	MASK_SECONDARY = 2,
	MASK_BOTH = 3,
};

/**
 * Verify GptData parameters are sane.
 */
int CheckParameters(GptData* gpt);

/**
 * Check header fields.
 *
 * Returns 0 if header is valid, 1 if invalid.
 */
int CheckHeader(GptHeader *h, int is_secondary,
		uint64_t streaming_drive_sectors,
		uint64_t gpt_drive_sectors, uint32_t flags,
		uint32_t sector_bytes);

/**
 * Calculate and return the header CRC.
 */
uint32_t HeaderCrc(GptHeader *h);

/**
 * Check entries.
 *
 * Returns 0 if entries are valid, 1 if invalid.
 */
int CheckEntries(GptEntry *entries, GptHeader *h);

/**
 * Return 0 if the GptHeaders are the same for all fields which don't differ
 * between the primary and secondary headers - that is, all fields other than:
 *
 * my_lba
 * alternate_lba
 * entries_lba
 */
int HeaderFieldsSame(GptHeader *h1, GptHeader *h2);

/**
 * Check GptData, headers, entries.
 *
 * If successful, sets gpt->valid_headers and gpt->valid_entries and returns
 * GPT_SUCCESS.
 *
 * On error, returns a GPT_ERROR_* return code.
 */
int GptValidityCheck(GptData *gpt);

/**
 * Repair GPT data by copying from one set of valid headers/entries to the
 * other.  Assumes GptValidityCheck() has been run to determine which headers
 * and/or entries are already valid.
 *
 * The caller must make sure that even if one of the entries table is invalid
 * then corresponding buffer is allocated and big enough to accommodate entries
 * from the other (good) table.
 */
void GptRepair(GptData *gpt);

/**
 * Called when the primary entries are modified and the CRCs need to be
 * recalculated and propagated to the secondary entries
 */
void GptModified(GptData *gpt);

/**
 * Return 1 if the entry is a Chrome OS kernel partition, else 0.
 */
int IsKernelEntry(const GptEntry *e);

/**
 * Copy the current kernel partition's UniquePartitionGuid to the dest.
 */
void GetCurrentKernelUniqueGuid(GptData *gpt, void *dest);

/**
 * Return a pointer to text describing the passed in error.
 */
const char *GptErrorText(int error_code);

/**
 * Return number of sectors required to store the entries table. Where
 * a sector has size sector_bytes.
 */
size_t CalculateEntriesSectors(GptHeader* h, uint32_t sector_bytes);

#endif  /* VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_ */
