mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-24 02:05:01 +00:00
At present reading data from storage in Vboot is a little fragmented. For the firmware image, we expect the boot loader to handle this. For the disk we have a block-level API. For the GBB (which also sits in the firmware image) we expect the entire thing to be read before Vboot is called. Add the concept of a region, and an API to read from a region. At present, and most pressing, is reading from a GBB region. In the future this could be extended to other parts of the firmware or even the disk. Move all access to the GBB into this API so that the boot loader can provide either a GBB region in one large contiguous chunk, or a function to deal with read requests from vboot. The call to VbExRegionRead() is behind a flag since not all boot loaders support it yet. The main change for boot loaders which don't support this new API is that vboot will do more behind the scenes. For example, it will allocate memory for chunks of data that it reads from the GBB, rather than just accessing it directly. This approach is considerably simpler than trying to pass char ** everywhere and have vboot decide whether something needs to be allocated or not. The tests are updated, mainly to include setting up a GBB structure accessible from VbCommonParams, which is now required by the firmware and kernel functions. In normal operation this is set up at the start of VbLoadFIrmware() and VbSelectAndLoadKernel() but for tests which call children of these functions directly, the GBB structure must be set up manually by the test. BUG=chrome-os-partner:21115 BRANCH=none TEST=manual FEATURES=test sudo -E emerge vboot_reference Change-Id: If2b8bbe467fdbd643239d8d9b5d7aa98df4d286f Signed-off-by: Simon Glass <sjg@chromium.org> Signed-off-by: David Hendricks <dhendrix@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/63336 Reviewed-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/167361
101 lines
3.0 KiB
C
101 lines
3.0 KiB
C
/* Copyright (c) 2013 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.
|
|
*
|
|
* High-level firmware API for loading and verifying kernel.
|
|
* (Firmware Portion)
|
|
*/
|
|
|
|
#ifndef VBOOT_REFERENCE_LOAD_KERNEL_FW_H_
|
|
#define VBOOT_REFERENCE_LOAD_KERNEL_FW_H_
|
|
|
|
#include "vboot_api.h"
|
|
#include "vboot_nvstorage.h"
|
|
|
|
/* Interface provided by verified boot library to BDS */
|
|
|
|
/* Boot flags for LoadKernel().boot_flags */
|
|
/* Developer switch is on */
|
|
#define BOOT_FLAG_DEVELOPER (0x01ULL)
|
|
/* In recovery mode */
|
|
#define BOOT_FLAG_RECOVERY (0x02ULL)
|
|
|
|
typedef struct LoadKernelParams {
|
|
/* Inputs to LoadKernel() */
|
|
/*
|
|
* Buffer for data shared between LoadFirmware() and LoadKernel().
|
|
* Pass the same buffer which was passed to LoadFirmware().
|
|
*/
|
|
void *shared_data_blob;
|
|
/*
|
|
* Size of shared data blob buffer, in bytes. On output, this will
|
|
* contain the actual data size placed into the buffer.
|
|
*/
|
|
uint64_t shared_data_size;
|
|
/* Pointer to GBB data */
|
|
void *gbb_data;
|
|
/* Size of GBB data in bytes */
|
|
uint64_t gbb_size;
|
|
/* Disk handle for current device */
|
|
VbExDiskHandle_t disk_handle;
|
|
/* Bytes per lba sector on current device */
|
|
uint64_t bytes_per_lba;
|
|
/* Last addressable lba sector on current device */
|
|
uint64_t ending_lba;
|
|
/* Destination buffer for kernel (normally at 0x100000) */
|
|
void *kernel_buffer;
|
|
/* Size of kernel buffer in bytes */
|
|
uint64_t kernel_buffer_size;
|
|
/* Boot flags */
|
|
uint64_t boot_flags;
|
|
/*
|
|
* Context for NV storage. Caller is responsible for calling
|
|
* VbNvSetup() and VbNvTeardown() on the context.
|
|
*/
|
|
VbNvContext *nv_context;
|
|
|
|
/*
|
|
* Outputs from LoadKernel(); valid only if LoadKernel() returns
|
|
* LOAD_KERNEL_SUCCESS
|
|
*/
|
|
/* Partition number to boot on current device (1...M) */
|
|
uint64_t partition_number;
|
|
/* Address of bootloader image in RAM */
|
|
uint64_t bootloader_address;
|
|
/* Size of bootloader image in bytes */
|
|
uint64_t bootloader_size;
|
|
/* UniquePartitionGuid for boot partition */
|
|
uint8_t partition_guid[16];
|
|
} LoadKernelParams;
|
|
|
|
/**
|
|
* Attempt to load the kernel from the current device.
|
|
*
|
|
* Returns VBERROR_SUCCESS if successful. If unsuccessful, sets a recovery
|
|
* reason via VbNvStorage and returns an error code.
|
|
*/
|
|
VbError_t LoadKernel(LoadKernelParams *params, VbCommonParams *cparams);
|
|
|
|
/*
|
|
* The bootloader is loaded using the EFI LoadImage() and StartImage() calls.
|
|
* Pass this struct via loaded_image->load_options.
|
|
*/
|
|
typedef struct KernelBootloaderOptions {
|
|
/* Drive number of boot device (0...N) */
|
|
uint64_t drive_number;
|
|
/*
|
|
* Partition number, as returned from LoadKernel() in
|
|
* LoadKernelParams.partition_number
|
|
*/
|
|
uint64_t partition_number;
|
|
/*
|
|
* Absolute bootloader start adddress, as returned from LoadKernel() in
|
|
* LoadKernelParams.bootloader_start
|
|
*/
|
|
uint64_t original_address;
|
|
/* UniquePartitionGuid for boot partition */
|
|
uint8_t partition_guid[16];
|
|
} KernelBootloaderOptions;
|
|
|
|
#endif /* VBOOT_REFERENCE_LOAD_KERNEL_FW_H_ */
|