blob: a331f0ca9b6c3f98ca15ce4e161250716f52c109 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* 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.
*/
#pragma once
#include <stdint.h>
#include <memory>
#include <string>
#include "common/libs/fs/shared_fd.h"
namespace cvd {
// Unpacks the boot image and extracts kernel, ramdisk and kernel arguments
class BootImageUnpacker {
public:
// Reads header section of boot image at path and returns a BootImageUnpacker
// preloaded with all the metadata.
static std::unique_ptr<BootImageUnpacker> FromImages(
const std::string& boot_image_path,
const std::string& vendor_boot_image_path);
~BootImageUnpacker() = default;
std::string kernel_cmdline() const;
bool HasKernelImage() const { return kernel_image_size_ > 0; }
bool HasRamdiskImage() const { return ramdisk_image_size_ > 0; }
bool HasVendorRamdiskImage() const { return vendor_ramdisk_image_size_ > 0; }
bool Unpack(const std::string& ramdisk_image_path,
const std::string& vendor_ramdisk_image_path,
const std::string& kernel_image_path);
private:
BootImageUnpacker(SharedFD boot_image, const std::string& cmdline,
uint32_t kernel_image_size, uint32_t kernel_image_offset,
uint32_t ramdisk_image_size, uint32_t ramdisk_image_offset,
SharedFD vendor_boot_image,
uint32_t vendor_ramdisk_image_size,
uint32_t vendor_ramdisk_image_offset)
: boot_image_(boot_image),
vendor_boot_image_(vendor_boot_image),
kernel_cmdline_(cmdline),
kernel_image_size_(kernel_image_size),
kernel_image_offset_(kernel_image_offset),
ramdisk_image_size_(ramdisk_image_size),
ramdisk_image_offset_(ramdisk_image_offset),
vendor_ramdisk_image_size_(vendor_ramdisk_image_size),
vendor_ramdisk_image_offset_(vendor_ramdisk_image_offset) {}
// Mutable because we only read from the fd, but do not modify its contents
mutable SharedFD boot_image_;
mutable SharedFD vendor_boot_image_;
std::string kernel_cmdline_;
// When buidling the boot image a particular page size is assumed, which may
// not match the actual page size of the system.
uint32_t kernel_image_size_;
uint32_t kernel_image_offset_;
uint32_t ramdisk_image_size_;
uint32_t ramdisk_image_offset_;
uint32_t vendor_ramdisk_image_size_;
uint32_t vendor_ramdisk_image_offset_;
// Extracts the kernel image to the given path
bool ExtractKernelImage(const std::string& path) const;
// Extracts the ramdisk image to the given path. It may return false if the
// boot image does not contain a ramdisk, which is the case when having system
// as root.
bool ExtractRamdiskImage(const std::string& path) const;
// Extracts the vendor ramdisk image to the given path
bool ExtractVendorRamdiskImage(const std::string& path) const;
};
} // namespace cvd