mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-27 11:44:02 +00:00
The existing library had a bunch of dependencies which are too many to build for the 32-bit platform. So this checkin prunes the dependency list by building only things that are absolutely required for the functionality used in 32-bit Post-Installer. Made the use of libuuid restricted only to cgpt and unit tests so that libcgpt-cc.a doesn't depend on it. BUG=chromium-os:25374 TEST=Built 32-bit and 64-bit. Tested 32-bit post-install. Change-Id: Idd0826fdf507a95728fee8adac9520e26f05d469 Reviewed-on: https://gerrit.chromium.org/gerrit/16433 Reviewed-by: Don Garrett <dgarrett@chromium.org> Reviewed-by: Sonny Rao <sonnyrao@chromium.org> Commit-Ready: Jay Srinivasan <jaysri@chromium.org> Tested-by: Jay Srinivasan <jaysri@chromium.org>
173 lines
7.6 KiB
C++
173 lines
7.6 KiB
C++
// Copyright (c) 2012 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_CGPT_CGPTMANAGER_H_
|
|
#define VBOOT_REFERENCE_CGPT_CGPTMANAGER_H_
|
|
|
|
#include <string>
|
|
#include "gpt.h"
|
|
|
|
// This file defines a simple C++ wrapper class interface for the cgpt methods.
|
|
|
|
// These are the possible error codes that can be returned by the CgptManager.
|
|
typedef enum CgptErrorCode
|
|
{
|
|
kCgptSuccess = 0,
|
|
kCgptNotInitialized = 1,
|
|
kCgptUnknownError = 2,
|
|
kCgptInvalidArgument = 3,
|
|
} CgptErrorCode;
|
|
|
|
|
|
// CgptManager exposes methods to manipulate the Guid Partition Table as needed
|
|
// for ChromeOS scenarios.
|
|
class CgptManager {
|
|
public:
|
|
// Default constructor. The Initialize method must be called before
|
|
// any other method can be called on this class.
|
|
CgptManager();
|
|
|
|
// Destructor. Automatically closes any opened device.
|
|
~CgptManager();
|
|
|
|
// Opens the given device_name (e.g. "/dev/sdc") and initializes
|
|
// with the Guid Partition Table of that device. This is the first method
|
|
// that should be called on this class. Otherwise those methods will
|
|
// return kCgptNotInitialized.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
// This device is automatically closed when this object is destructed.
|
|
CgptErrorCode Initialize(const std::string& device_name);
|
|
|
|
// Clears all the existing contents of the GPT and PMBR on the current
|
|
// device.
|
|
CgptErrorCode ClearAll();
|
|
|
|
// Adds a new partition at the end of the existing partitions
|
|
// with the new label, type, unique Id, offset and size.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode AddPartition(const std::string& label,
|
|
const Guid& partition_type_guid,
|
|
const Guid& unique_id,
|
|
uint64_t beginning_offset,
|
|
uint64_t num_sectors);
|
|
|
|
// Populates num_partitions parameter with the number of partitions
|
|
// that are currently on this device and not empty.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetNumNonEmptyPartitions(uint8_t* num_partitions) const;
|
|
|
|
// Sets the Protective Master Boot Record on this device with the given
|
|
// boot_partition number after populating the MBR with the contents of the
|
|
// given boot_file_name. It also creates a legacy partition if
|
|
// should_create_legacy_partition is true.
|
|
// Note: Strictly speaking, the PMBR is not part of the GPT, but it is
|
|
// included here for ease of use.
|
|
CgptErrorCode SetPmbr(uint32_t boot_partition_number,
|
|
const std::string& boot_file_name,
|
|
bool should_create_legacy_partition);
|
|
|
|
// Populates boot_partition with the partition number that's set to
|
|
// boot in the PMBR.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetPmbrBootPartitionNumber(uint32_t* boot_partition) const;
|
|
|
|
// Sets the "successful" attribute of the given kernelPartition to 0 or 1
|
|
// based on the value of is_successful being true (1) or false(0)
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode SetSuccessful(uint32_t partition_number, bool is_successful);
|
|
|
|
// Populates is_successful to true if the successful attribute in the
|
|
// given kernelPartition is non-zero, or to false if it's zero.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetSuccessful(uint32_t partition_number,
|
|
bool* is_successful) const;
|
|
|
|
// Sets the "NumTriesLeft" attribute of the given kernelPartition to
|
|
// the given num_tries_left value.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode SetNumTriesLeft(uint32_t partition_number,
|
|
int num_tries_left);
|
|
|
|
// Populates the num_tries_left parameter with the value of the
|
|
// NumTriesLeft attribute of the given kernelPartition.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetNumTriesLeft(uint32_t partition_number,
|
|
int* num_tries_left) const;
|
|
|
|
// Sets the "Priority" attribute of the given kernelPartition to
|
|
// the given priority value.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode SetPriority(uint32_t partition_number,
|
|
uint8_t priority);
|
|
|
|
// Populates the priority parameter with the value of the Priority
|
|
// attribute of the given kernelPartition.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetPriority(uint32_t partition_number,
|
|
uint8_t* priority) const;
|
|
|
|
// Populates the offset parameter with the beginning offset of the
|
|
// given partition.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetBeginningOffset(uint32_t partition_number,
|
|
uint64_t* offset) const;
|
|
|
|
// Populates the number of sectors in the given partition.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetNumSectors(uint32_t partition_number,
|
|
uint64_t* num_sectors) const;
|
|
|
|
// Populates the type_id parameter with the partition type id
|
|
// (these are the standard ids for kernel, rootfs, etc.)
|
|
// of the partition corresponding to the given partition_number.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetPartitionTypeId(uint32_t partition_number,
|
|
Guid* type_id) const;
|
|
|
|
// Populates the unique_id parameter with the Guid that uniquely identifies
|
|
// the given partition_number.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetPartitionUniqueId(uint32_t partition_number,
|
|
Guid* unique_id) const;
|
|
|
|
// Populates the partition_number parameter with the partition number of
|
|
// the partition which is uniquely identified by the given unique_id.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode GetPartitionNumberByUniqueId(
|
|
const Guid& unique_id,
|
|
uint32_t* partition_number) const;
|
|
|
|
// Sets the "Priority" attribute of given kernelPartition to the value
|
|
// specified in higestPriority parameter. In addition, also reduces the
|
|
// priorities of all the other kernel partitions, if necessary, to ensure
|
|
// no other partition has a higher priority. It does preserve the relative
|
|
// ordering among the remaining partitions and doesn't touch the partitions
|
|
// whose priorities are zero.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode SetHighestPriority(uint32_t partition_number,
|
|
uint8_t highest_priority);
|
|
|
|
// Same as SetHighestPriority above but works without having to explicitly
|
|
// give a value for highest_priority. The internal implementation figures
|
|
// out the best highest number that needs to be given depending on the
|
|
// existing priorities.
|
|
// Returns kCgptSuccess or an appropriate error code.
|
|
CgptErrorCode SetHighestPriority(uint32_t partition_number);
|
|
|
|
// Runs the sanity checks on the CGPT and MBR and
|
|
// Returns kCgptSuccess if everything is valid or an appropriate error code
|
|
// if there's anything invalid or if there's any error encountered during
|
|
// the validation.
|
|
CgptErrorCode Validate();
|
|
|
|
private:
|
|
std::string device_name_;
|
|
bool is_initialized_;
|
|
|
|
CgptManager(const CgptManager &);
|
|
void operator=(const CgptManager &);
|
|
};
|
|
|
|
#endif // VBOOT_REFERENCE_CGPT_CGPTMANAGER_H_
|