summaryrefslogtreecommitdiff
path: root/firmware/lib/include
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/lib/include')
-rw-r--r--firmware/lib/include/load_firmware_fw.h29
-rw-r--r--firmware/lib/include/load_kernel_fw.h100
-rw-r--r--firmware/lib/include/sysincludes.h28
-rw-r--r--firmware/lib/include/utility.h115
4 files changed, 272 insertions, 0 deletions
diff --git a/firmware/lib/include/load_firmware_fw.h b/firmware/lib/include/load_firmware_fw.h
new file mode 100644
index 00000000..555cf6fd
--- /dev/null
+++ b/firmware/lib/include/load_firmware_fw.h
@@ -0,0 +1,29 @@
+/* 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 rewritable firmware.
+ * (Firmware Portion)
+ */
+
+#ifndef VBOOT_REFERENCE_LOAD_FIRMWARE_FW_H_
+#define VBOOT_REFERENCE_LOAD_FIRMWARE_FW_H_
+
+#include "vboot_api.h"
+#include "vboot_nvstorage.h"
+#include "vboot_struct.h"
+
+/**
+ * Load the rewritable firmware.
+ *
+ * Pass the common and firmware params from VbSelectFirmware(), and a
+ * VbNvContext. Caller is responsible for calling VbNvSetup() and
+ * VbNvTeardown() on the VbNvContext.
+ *
+ * Returns VBERROR_SUCCESS if successful. If unsuccessful, sets a recovery
+ * reason via VbNvStorage and returns an error code.
+ */
+int LoadFirmware(VbCommonParams *cparams, VbSelectFirmwareParams *fparams,
+ VbNvContext *vnc);
+
+#endif /* VBOOT_REFERENCE_LOAD_FIRMWARE_FW_H_ */
diff --git a/firmware/lib/include/load_kernel_fw.h b/firmware/lib/include/load_kernel_fw.h
new file mode 100644
index 00000000..dd6e1a84
--- /dev/null
+++ b/firmware/lib/include/load_kernel_fw.h
@@ -0,0 +1,100 @@
+/* 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);
+
+/*
+ * 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_ */
diff --git a/firmware/lib/include/sysincludes.h b/firmware/lib/include/sysincludes.h
new file mode 100644
index 00000000..490b51cc
--- /dev/null
+++ b/firmware/lib/include/sysincludes.h
@@ -0,0 +1,28 @@
+/* Copyright (c) 2010 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.
+ */
+
+/* System includes for vboot reference library. This is the ONLY
+ * place in firmware/ where system headers may be included via
+ * #include <...>, so that there's only one place that needs to be
+ * fixed up for platforms which don't have all the system includes.
+ *
+ * Files in firmware/stub may still include system headers, because
+ * they're local implementations and will be ported to each system
+ * anyway. */
+
+#ifndef VBOOT_REFERENCE_SYSINCLUDES_H_
+#define VBOOT_REFERENCE_SYSINCLUDES_H_
+
+#include <inttypes.h> /* For PRIu64 */
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#if defined(HAVE_ENDIAN_H) && defined(HAVE_LITTLE_ENDIAN)
+#include <byteswap.h>
+#include <memory.h>
+#endif
+
+#endif /* VBOOT_REFERENCE_SYSINCLUDES_H_ */
diff --git a/firmware/lib/include/utility.h b/firmware/lib/include/utility.h
new file mode 100644
index 00000000..f6575ed5
--- /dev/null
+++ b/firmware/lib/include/utility.h
@@ -0,0 +1,115 @@
+/* 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.
+ */
+
+/*
+ * Helper functions/wrappers for memory allocations, manipulation and
+ * comparison.
+ */
+
+#ifndef VBOOT_REFERENCE_UTILITY_H_
+#define VBOOT_REFERENCE_UTILITY_H_
+
+#include "sysincludes.h"
+
+/* Debug and error output */
+#ifdef VBOOT_DEBUG
+#define VBDEBUG(params) VbExDebug params
+#else
+#define VBDEBUG(params)
+#endif
+
+#ifdef VBOOT_DEBUG
+#define VbAssert(expr) do { if (!(expr)) { \
+ VbExError("assert fail: %s at %s:%d\n", \
+ #expr, __FILE__, __LINE__); }} while(0)
+#else
+#define VbAssert(expr)
+#endif
+
+/* Optional, up to the BIOS */
+#ifdef VBOOT_EASTER_EGG
+#define VBEASTEREGG VbExEasterEgg()
+#else
+#define VBEASTEREGG 0
+#endif
+
+/*
+ * Combine [msw] and [lsw] uint16s to a uint32_t with its [msw] and [lsw]
+ * forming the most and least signficant 16-bit words.
+ */
+#define CombineUint16Pair(msw,lsw) (((uint32_t)(msw) << 16) | \
+ (((lsw)) & 0xFFFF))
+
+/* Return the minimum of (a) or (b). */
+#define Min(a, b) (((a) < (b)) ? (a) : (b))
+
+/**
+ * Compare [n] bytes in [src1] and [src2].
+ *
+ * Returns an integer less than, equal to, or greater than zero if the first
+ * [n] bytes of [src1] is found, respectively, to be less than, to match, or be
+ * greater than the first n bytes of [src2]. */
+int Memcmp(const void *src1, const void *src2, size_t n);
+
+/**
+ * Copy [n] bytes from [src] to [dest].
+ */
+void *Memcpy(void *dest, const void *src, uint64_t n);
+
+/*
+ * Implementations of the functions below must be built as part of the firmware
+ * and defined in lib/utility.c.
+ */
+
+/**
+ * Set [n] bytes starting at [s] to [c]. Returns dest.
+ */
+void *Memset(void *dest, const uint8_t c, uint64_t n);
+
+/**
+ * Compare [n] bytes starting at [s1] with [s2] and return 0 if they
+ * match, 1 if they don't. Returns 0 if n=0, since no bytes mismatched.
+ *
+ * Time taken to perform the comparison is only dependent on [n] and
+ * not on the relationship of the match between [s1] and [s2].
+ *
+ * Note that unlike Memcmp(), this only indicates inequality, not
+ * whether s1 is less than or greater than s2.
+ */
+int SafeMemcmp(const void *s1, const void *s2, size_t n);
+
+/*
+ * Buffer size required to hold the longest possible output of Uint64ToString()
+ * - that is, Uint64ToString(~0, 2).
+ */
+#define UINT64_TO_STRING_MAX 65
+
+/**
+ * Convert a value to a string in the specified radix (2=binary, 10=decimal,
+ * 16=hex) and store it in <buf>, which is <bufsize> chars long. If
+ * <zero_pad_width>, left-pads the string to at least that width with '0'.
+ * Returns the length of the stored string, not counting the terminating null.
+ */
+uint32_t Uint64ToString(char *buf, uint32_t bufsize, uint64_t value,
+ uint32_t radix, uint32_t zero_pad_width);
+
+/**
+ * Concatenate <src> onto <dest>, which has space for <destlen> characters
+ * including the terminating null. Note that <dest> will always be
+ * null-terminated if <destlen> > 0. Returns the number of characters used in
+ * <dest>, not counting the terminating null.
+ */
+uint32_t StrnAppend(char *dest, const char *src, uint32_t destlen);
+
+/* Ensure that only our stub implementations are used, not standard C */
+#ifndef _STUB_IMPLEMENTATION_
+#define malloc _do_not_use_standard_malloc
+#define free _do_not_use_standard_free
+#define memcmp _do_not_use_standard_memcmp
+#define memcpy _do_not_use_standard_memcpy
+#define memset _do_not_use_standard_memset
+#endif
+
+#endif /* VBOOT_REFERENCE_UTILITY_H_ */