blob: b29b143568744e2e94f3ec17cd11d7cd573a15bd [file] [log] [blame]
// Copyright 2016 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 MBR_MBR_H_
#define MBR_MBR_H_
#include <zircon/compiler.h>
#include <cinttypes>
#include <cstddef>
namespace mbr {
static constexpr size_t kMbrSize = 512;
static constexpr size_t kMbrPartitionEntrySize = 16;
static constexpr size_t kMbrNumPartitions = 4;
static constexpr uint16_t kMbrBootSignature = 0xAA55;
static constexpr uint8_t kPartitionTypeNone = 0x00;
static constexpr uint8_t kPartitionTypeFat12 = 0x01;
static constexpr uint8_t kPartitionTypeFat16 = 0x04;
static constexpr uint8_t kPartitionTypeFat16B = 0x06;
static constexpr uint8_t kPartitionTypeFat32 = 0x0B;
static constexpr uint8_t kPartitionTypeFat32LBA = 0x0C;
static constexpr uint8_t kPartitionTypeFat16LBA = 0x0E;
static constexpr uint8_t kPartitionTypeFuchsiaData = 0xE9;
static constexpr uint8_t kPartitionTypeFuchsiaSys = 0xEA;
static constexpr uint8_t kPartitionTypeGptProtective = 0xEE;
struct MbrPartitionEntry {
// 0x80 indicates active/bootable. 0x00 indicates inactive. All other values
// indicate an invalid partition.
uint8_t status;
// Cylinder-Head-Sector address of first sector in partition. Generally
// unused in favor of |start_sector_lba|.
uint8_t chs_address_start[3];
// Partition type.
uint8_t type;
// Cylinder-Head-Sector address of last sector in partition. Generally
// unused in favor of |start_sector_lba| and |sector_partition_length|.
uint8_t chs_address_end[3];
// Logical Block Address of the first sector in the partition.
uint32_t start_sector_lba;
// Number of sectors in the partition.
uint32_t num_sectors;
} __PACKED;
struct Mbr {
uint8_t bootstrap_code[446];
MbrPartitionEntry partitions[kMbrNumPartitions];
uint16_t boot_signature = kMbrBootSignature;
} __PACKED;
static_assert(sizeof(Mbr) == kMbrSize, "mbr::Mbr is the wrong size");
static_assert(sizeof(MbrPartitionEntry) == kMbrPartitionEntrySize,
"mbr::MbrPartitionEntry is the wrong size");
} // namespace mbr
#endif // MBR_MBR_H_