| // Copyright 2017 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 SRC_STORAGE_FVM_FVM_SPARSE_H_ |
| #define SRC_STORAGE_FVM_FVM_SPARSE_H_ |
| |
| #include <stdlib.h> |
| |
| #include "format.h" |
| |
| namespace fvm { |
| |
| // This file describes the format for a "sparse FVM format", |
| // which attempts to densely pack an FVM-formatted partition |
| // onto a contiguous image. This format is intended to be used |
| // to stream FVM images between devices. |
| // |
| // The format of a sparse FVM image is as follows: |
| // HEADER: |
| // - sparse_image_t, followed by |partition_count| entries of... |
| // - partition_descriptor_t, followed by |extent_count| entries of... |
| // - extent_descriptor_t |
| // DATA: |
| // - All the previously mentioned extents, in order. |
| // |
| // For example, |
| // |
| // HEADER: |
| // sparse_image_t |
| // Partition descriptor 0 |
| // Extent descriptor 0 |
| // Extent descriptor 1 |
| // Extent descriptor 2 |
| // Partition descriptor 1 |
| // Extent descriptor 0 |
| // Partition descriptor 2 |
| // Extent descriptor 0 |
| // DATA: |
| // P0, Extent 0 |
| // P0, Extent 1 |
| // P0, Extent 2 |
| // P1, Extent 0 |
| // P2, Extent 0 |
| |
| constexpr uint64_t kSparseFormatMagic = 0x53525053204d5646ull; // 'FVM SPRS' |
| constexpr uint64_t kSparseFormatVersion = 0x3; |
| |
| enum SparseFlags { |
| kSparseFlagLz4 = 0x1, |
| kSparseFlagZxcrypt = 0x2, |
| // Marks a partition as intentionaly corrupted. |
| kSparseFlagCorrupted = 0x4, |
| // If set, indicates zero filling is not required which is otherwise expected for extents where |
| // extent_length < slice_count. |
| kSparseFlagZeroFillNotRequired = 0x8, |
| // No-op. |
| kDeprecated0 = 0x10, |
| // The final value is the bitwise-OR of all other flags |
| kSparseFlagAllValid = kSparseFlagLz4 | kSparseFlagZxcrypt | kSparseFlagCorrupted | |
| kSparseFlagZeroFillNotRequired | kDeprecated0, |
| }; |
| |
| struct __attribute__((packed)) SparseImage { |
| uint64_t magic; |
| uint64_t version; |
| uint64_t header_length; |
| uint64_t slice_size; // Unit: Bytes |
| uint64_t partition_count; |
| // Size in bytes for the maximum disk size this fvm image will reference. |
| // If set to 0, will use the disk size at format time as the maximum size. |
| // The initial size is always the size of the block device being formatted. |
| uint64_t maximum_disk_size; |
| uint32_t flags; |
| }; |
| |
| constexpr uint64_t kPartitionDescriptorMagic = 0x0bde4df7cf5c4c5dull; |
| |
| struct __attribute__((packed)) PartitionDescriptor { |
| uint64_t magic; |
| uint8_t type[fvm::kGuidSize]; |
| uint8_t name[fvm::kMaxVPartitionNameLength]; |
| uint32_t flags; |
| uint32_t extent_count; |
| }; |
| |
| constexpr uint64_t kExtentDescriptorMagic = 0xa5b8742906e8382eull; |
| |
| struct __attribute__((packed)) ExtentDescriptor { |
| uint64_t magic; |
| uint64_t slice_start; // Unit: slice |
| uint64_t slice_count; // Unit: slice |
| uint64_t extent_length; // Unit: bytes. Must be <= slice_count * slice_size. |
| }; |
| |
| } // namespace fvm |
| |
| #endif // SRC_STORAGE_FVM_FVM_SPARSE_H_ |