blob: 949dce0e2c36173961c0d794f8db7c31c9bd910f [file] [log] [blame]
/* Copyright 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __DCDIR_STRUCTS_H__
#define __DCDIR_STRUCTS_H__
#include <stdint.h>
typedef struct __attribute__((packed))
{
// Signature field which should be set to "DC DIR".
uint8_t signature[6];
// Major version which must change when non-backwards compatible
// changes are made to these structures or their usage. The current
// major version number is 1.
uint8_t major_version;
// Changes which can be consumed transparently as older versions of
// this structure within the same major version but which are
// different and consumed differently for code that's aware of them
// should increment the minor version number.
uint8_t minor_version;
// The offset of the anchor structure in the image, used to verify
// that the signature above is actually part of an anchor and not just
// that string in the image for unrelated reasons.
uint32_t anchor_offset;
// The "base" value for the root directory. Used to work back from the
// directory table which comes immediately after this structure back
// to the offset of the directory itself.
uint32_t root_base;
} DcDirAnchor;
// This has a prefixed name to prevent it from colliding with any ARRAY_SIZE
// macro which has already been defined.
#define DCDIR_ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
static const uint8_t DcDirAnchorSignature[] = { 'D', 'C', ' ', 'D', 'I', 'R' };
static const size_t DcDirAnchorSignatureSize =
DCDIR_ARRAY_SIZE(DcDirAnchorSignature);
typedef struct __attribute__((packed))
{
// Signature field of a directory which should be set to "DCDR".
uint8_t signature[4];
// Reserved, should be set to 0.
uint8_t reserved;
// The size of the directory structure, including labels and pointers,
// divided by 8 and minus 1.
uint8_t size[3];
} DcDirDirectoryHeader;
static const uint8_t DcDirDirectorySignature[] = { 'D', 'C', 'D', 'R' };
static const size_t DcDirDirectorySignatureSize =
DCDIR_ARRAY_SIZE(DcDirDirectorySignature);
typedef enum
{
DcDirUndefined_0 = 0x00,
DcDirOffset24Length24 = 0x01,
DcDirBase32Offset32Length32 = 0x02,
DcDirUndefined_7f = 0x7f
} DcDirType;
typedef struct __attribute__((packed))
{
// The least significant bit of this field says whether the region
// pointed to is a directory. The other 7 bits specify what type of
// pointer it is, and what the rest of the structure holds.
uint8_t type;
// The size of the pointer structure, divided by 8 and minus 1.
uint8_t size;
} DcDirPointer;
typedef struct __attribute__((packed))
{
// The type and size fields below are shared/overlaid with the basic
// pointer type above.
uint8_t type; // DcDirOffset24Length24
uint8_t size;
// The offset of the region pointed to relative to its parent region.
uint8_t offset[3];
// The length of the region in bytes, minus 1.
uint8_t length[3];
} DcDirPointerOffset24Length24;
typedef struct __attribute__((packed))
{
// The type and size fields below are shared/overlaid with the basic
// pointer type above.
uint8_t type; // DcDirBase32Offset32Length32
uint8_t size;
// An unused padding value.
uint16_t pad;
// The offset of the directory table within the region itself, if the
// region is a directory.
uint32_t base;
// The offset of the region, relative to its parent region.
uint32_t offset;
// The length of the region in bytes, minus 1.
uint32_t length;
} DcDirPointerBase32Offset32Length32;
#endif // __DCDIR_STRUCTS_H__