mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-24 10:14:55 +00:00
It turned out that shared verified boot library fails to work properly when compiled by msc in BIOS environment. The culprit was identified as failing 64 bit logical operations by preprocessor. It is probably possible to come up with a certain compile flag set to fix the operations, but it is not easy to modify and control the BIOS compilation environment. The alternative solution is to limit the size of the field in question to 16 bits (especially since this is the only part of the attributes field which is supposed to be altered by firmware. A union is being introduced in firmware/lib/cgptlib/include/gpt.h:GptEntry to allow accessing the field both as a 64 bit entity and a top 16 bit field. All places where this field is used are being modified appropriately. tests/Makefile is being fixed to allow controlling test run from the top level directory. Tested by building everything and running tests. All tests pass. Review URL: http://codereview.chromium.org/2799019
116 lines
3.7 KiB
C
116 lines
3.7 KiB
C
/* Copyright (c) 2010 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 "sysincludes.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-2 -- UEFI: reserved for future use
|
|
* 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)
|
|
|
|
/* 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 32
|
|
#define MAX_NUMBER_OF_ENTRIES 512
|
|
|
|
/* Defines GPT sizes */
|
|
#define GPT_PMBR_SECTOR 1 /* size (in sectors) of PMBR */
|
|
#define GPT_HEADER_SECTOR 1
|
|
#define GPT_ENTRIES_SECTORS 32 /* assume sector size if 512 bytes, then
|
|
* (TOTAL_ENTRIES_SIZE / 512) = 32 */
|
|
|
|
/* alias name of index in internal array for primary and secondary header and
|
|
* entries. */
|
|
enum {
|
|
PRIMARY = 0,
|
|
SECONDARY = 1,
|
|
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 drive_sectors);
|
|
|
|
/* 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, uint64_t drive_sectors);
|
|
|
|
/* 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 GptSanityCheck(GptData* gpt);
|
|
|
|
/* Repairs GPT data by copying from one set of valid headers/entries to the
|
|
* other. Assumes GptSanityCheck() has been run to determine which headers
|
|
* and/or entries are already valid. */
|
|
void GptRepair(GptData* gpt);
|
|
|
|
/* Getters and setters for partition attribute fields. */
|
|
int GetEntrySuccessful(const GptEntry* e);
|
|
int GetEntryPriority(const GptEntry* e);
|
|
int GetEntryTries(const GptEntry* e);
|
|
void SetEntrySuccessful(GptEntry* e, int successful);
|
|
void SetEntryPriority(GptEntry* e, int priority);
|
|
void SetEntryTries(GptEntry* e, int tries);
|
|
|
|
/* Return 1 if the entry is unused, 0 if it is used. */
|
|
int IsUnusedEntry(const GptEntry* e);
|
|
|
|
/* Returns 1 if the entry is a Chrome OS kernel partition, else 0. */
|
|
int IsKernelEntry(const GptEntry* e);
|
|
|
|
#endif /* VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_ */
|