firmware: Prune down old region API

The region API was a way for firmware and kernel verification to get
at various blocks of caller-provided data.  In practice, we only used
it internally as a way to get at parts of the GBB.  Prune it down to
access only the bits of GBB we still need, from the buffer we already
know we have.

In the long run we should use the same vb2ex_read_resource() API that
vb2 firmware verification does, but that should be done in a follow-up
CL since it'll need to be coordinated with support in depthcharge.

No change in functionality.

BUG=chromium:611535
BRANCH=none
TEST=make -j runtests; build bob firmware and boot it

Change-Id: I5715cb8d88274164a1a73ed4a56bbd93af46f9bf
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/852798
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
diff --git a/Makefile b/Makefile
index 3c12e79..ed73e26 100644
--- a/Makefile
+++ b/Makefile
@@ -318,12 +318,11 @@
 # Firmware library sources needed by VbInit() call
 VBINIT_SRCS = \
 	firmware/lib/vboot_common_init.c \
-	firmware/lib/region-init.c \
+	firmware/lib/region-init.c
 
 # Additional firmware library sources needed by VbSelectFirmware() call
 VBSF_SRCS = \
-	firmware/lib/vboot_common.c \
-	firmware/lib/region-fw.c \
+	firmware/lib/vboot_common.c
 
 # Additional firmware library sources needed by VbSelectAndLoadKernel() call
 VBSLK_SRCS = \
@@ -339,8 +338,7 @@
 	firmware/lib/vboot_display.c \
 	firmware/lib/vboot_kernel.c \
 	firmware/lib/vboot_ui.c \
-	firmware/lib/vboot_ui_menu.c \
-	firmware/lib/region-kernel.c \
+	firmware/lib/vboot_ui_menu.c
 
 # Code common to both vboot 2.0 (old structs) and 2.1 (new structs)
 FWLIB2X_SRCS = \
@@ -410,8 +408,7 @@
 # TODO: split out other stub funcs too
 VBINIT_SRCS += \
 	firmware/stub/tpm_lite_stub.c \
-	firmware/stub/vboot_api_stub_init.c \
-	firmware/stub/vboot_api_stub_region.c
+	firmware/stub/vboot_api_stub_init.c
 
 VBSLK_SRCS += \
 	firmware/stub/vboot_api_stub.c \
@@ -747,10 +744,6 @@
 	tests/rollback_index2_tests
 endif
 
-ifdef REGION_READ
-TEST_NAMES += tests/vboot_region_tests
-endif
-
 TEST_FUTIL_NAMES  = \
 	tests/futility/binary_editor \
 	tests/futility/test_file_types \
@@ -910,10 +903,6 @@
 ${FWLIB_OBJS}: CFLAGS += -DCOPY_BMP_DATA
 endif
 
-ifdef REGION_READ
-${FWLIB_OBJS}: CFLAGS += -DREGION_READ
-endif
-
 ifeq (${FIRMWARE_ARCH},)
 # Disable rollback TPM when compiling locally, since otherwise
 # load_kernel_test attempts to talk to the TPM.
diff --git a/firmware/2lib/include/2struct.h b/firmware/2lib/include/2struct.h
index 589e7c9..3411de7 100644
--- a/firmware/2lib/include/2struct.h
+++ b/firmware/2lib/include/2struct.h
@@ -208,6 +208,11 @@
 	uint32_t workbuf_kernel_key_offset;
 	uint32_t workbuf_kernel_key_size;
 
+	/* GBB data and size */
+	struct vb2_gbb_header *gbb;
+	uint32_t gbb_size;
+
+
 } __attribute__((packed));
 
 /****************************************************************************/
diff --git a/firmware/include/gbb_access.h b/firmware/include/gbb_access.h
index 7b11dc8..9b4e0dd 100644
--- a/firmware/include/gbb_access.h
+++ b/firmware/include/gbb_access.h
@@ -10,43 +10,43 @@
 
 #include "vboot_api.h"
 
-struct BmpBlockHeader;
-struct ImageInfo;
-struct GoogleBinaryBlockHeader;
-struct ScreenLayout;
+struct vb2_context;
 struct VbPublicKey;
 
 /**
- * Read the GBB header
- *
- * This accesses the GBB and reads its header.
- *
- * @param cparams	Vboot common parameters
- * @param gbb		Place to put GBB header
- */
-VbError_t VbGbbReadHeader_static(VbCommonParams *cparams,
-				 struct GoogleBinaryBlockHeader *gbb);
-
-/**
  * Read the root key from the GBB
  *
- * @param cparams	Vboot common parameters
+ * @param ctx		Vboot context
  * @param keyp		Returns a pointer to the key. The caller must call
  *			free() on the key when finished with it.
  * @return VBERROR_... error, VBERROR_SUCCESS on success,
  */
-VbError_t VbGbbReadRootKey(VbCommonParams *cparams,
+VbError_t VbGbbReadRootKey(struct vb2_context *ctx,
 			   struct VbPublicKey **keyp);
 
 /**
  * Read the recovery key from the GBB
  *
+ * @param ctx		Vboot context
  * @param cparams	Vboot common parameters
  * @param keyp		Returns a pointer to the key. The caller must call
  *			free() on the key when finished with it.
  * @return VBERROR_... error, VBERROR_SUCCESS on success,
  */
-VbError_t VbGbbReadRecoveryKey(VbCommonParams *cparams,
+VbError_t VbGbbReadRecoveryKey(struct vb2_context *ctx,
 			       struct VbPublicKey **keyp);
 
+/**
+ * Read the hardware ID from the GBB
+ *
+ * @param ctx		Vboot context
+ * @param hwid		Place to put HWID, which will be null-terminated
+ * @param max_size	Maximum size of HWID including terminated null
+ *			character (suggest 256). If this size is too small
+ *			then VBERROR_INVALID_PARAMETER is returned.
+ * @return VBERROR_... error, VBERROR_SUCCESS on success,
+ */
+VbError_t VbGbbReadHWID(struct vb2_context *ctx, char *hwid,
+			uint32_t max_size);
+
 #endif
diff --git a/firmware/include/region.h b/firmware/include/region.h
deleted file mode 100644
index 78e1dba..0000000
--- a/firmware/include/region.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* 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.
- *
- * Access to portions of the firmware image, perhaps later to be expanded
- * to other devices.
- */
-
-#ifndef VBOOT_REFERENCE_REGION_H_
-#define VBOOT_REFERENCE_REGION_H_
-
-#include "bmpblk_header.h"
-#include "gbb_header.h"
-#include "vboot_api.h"
-#include "vboot_struct.h"
-
-/* The maximum length of a hardware ID */
-#define VB_REGION_HWID_LEN	256
-
-/**
- * Read data from a region
- *
- * @param cparams	Vboot common parameters
- * @param region	Region number to read
- * @param offset	Offset within region to start reading
- * @param size		Size of data to read
- * @param buf		Buffer to put the data into
- * @return VBERROR_... error, VBERROR_SUCCESS on success,
- */
-VbError_t VbRegionReadData(VbCommonParams *cparams,
-			   enum vb_firmware_region region, uint32_t offset,
-			   uint32_t size, void *buf);
-
-/**
- * Check the version of the GBB and print debug information if valid
- *
- * @param cparams	Vboot common parameters
- */
-void VbRegionCheckVersion(VbCommonParams *cparams);
-
-/**
- * Read the hardware ID from the GBB
- *
- * @param cparams	Vboot common parameters
- * @param hwid		Place to put HWID, which will be null-terminated
- * @param max_size	Maximum size of HWID including terminated null
- *			character (suggest VB_REGION_HWID_LEN). If this size
- *			it too small then VBERROR_INVALID_PARAMETER is
- *			returned.
- * @return VBERROR_... error, VBERROR_SUCCESS on success,
- */
-VbError_t VbRegionReadHWID(VbCommonParams *cparams, char *hwid,
-			   uint32_t max_size);
-
-#endif  /* VBOOT_REFERENCE_REGION_H_ */
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index aa3ba2c..5edf0a6 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -193,9 +193,6 @@
 	 * the stack.
 	 */
 	void *caller_context;
-
-	/* For internal use of Vboot - do not examine or modify! */
-	struct GoogleBinaryBlockHeader *gbb;
 } VbCommonParams;
 
 /* Flags for VbInitParams.flags */
diff --git a/firmware/lib/include/vboot_display.h b/firmware/lib/include/vboot_display.h
index 8e6a454..20066df 100644
--- a/firmware/lib/include/vboot_display.h
+++ b/firmware/lib/include/vboot_display.h
@@ -14,9 +14,8 @@
 VbError_t VbDisplayMenu(struct vb2_context *ctx,
 			uint32_t screen, int force, uint32_t selected_index,
 			uint32_t disabled_idx_mask);
-VbError_t VbDisplayDebugInfo(struct vb2_context *ctx, VbCommonParams *cparams);
-VbError_t VbCheckDisplayKey(struct vb2_context *ctx, VbCommonParams *cparams,
-			    uint32_t key);
+VbError_t VbDisplayDebugInfo(struct vb2_context *ctx);
+VbError_t VbCheckDisplayKey(struct vb2_context *ctx, uint32_t key);
 
 /**
  * Return a description of the recovery reason code.
diff --git a/firmware/lib/include/vboot_kernel.h b/firmware/lib/include/vboot_kernel.h
index 2195e0c..3398169 100644
--- a/firmware/lib/include/vboot_kernel.h
+++ b/firmware/lib/include/vboot_kernel.h
@@ -17,11 +17,6 @@
 struct vb2_context;
 
 /**
- * Exported for unit tests only - frees memory used by VbSelectAndLoadKernel()
- */
-void VbApiKernelFree(VbCommonParams *cparams);
-
-/**
  * Attempt loading a kernel from the specified type(s) of disks.
  *
  * If successful, sets p->disk_handle to the disk for the kernel and returns
@@ -54,8 +49,7 @@
  *
  * Returns: 1=yes, 0=no, -1 = shutdown.
  */
-int VbUserConfirms(struct vb2_context *ctx, VbCommonParams *cparams,
-		   uint32_t confirm_flags);
+int VbUserConfirms(struct vb2_context *ctx, uint32_t confirm_flags);
 
 /**
  * Handle a normal boot.
diff --git a/firmware/lib/region-fw.c b/firmware/lib/region-fw.c
deleted file mode 100644
index 2bc1a69..0000000
--- a/firmware/lib/region-fw.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* 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)
- */
-
-#include "sysincludes.h"
-
-#include "bmpblk_header.h"
-#include "region.h"
-#include "gbb_access.h"
-#include "gbb_header.h"
-#include "load_kernel_fw.h"
-#include "utility.h"
-#include "vboot_api.h"
-#include "vboot_struct.h"
-
-static VbError_t VbGbbReadKey(VbCommonParams *cparams, uint32_t offset,
-			      VbPublicKey **keyp)
-{
-	VbPublicKey hdr, *key;
-	VbError_t ret;
-	uint32_t size;
-
-	ret = VbRegionReadData(cparams, VB_REGION_GBB, offset,
-			       sizeof(VbPublicKey), &hdr);
-	if (ret)
-		return ret;
-
-	/* Deal with a zero-size key (used in testing) */
-	size = hdr.key_offset + hdr.key_size;
-	if (size < sizeof(hdr))
-		size = sizeof(hdr);
-	key = malloc(size);
-	ret = VbRegionReadData(cparams, VB_REGION_GBB, offset, size, key);
-	if (ret) {
-		free(key);
-		return ret;
-	}
-
-	*keyp = key;
-	return VBERROR_SUCCESS;
-}
-
-VbError_t VbGbbReadRootKey(VbCommonParams *cparams, VbPublicKey **keyp)
-{
-	return VbGbbReadKey(cparams, cparams->gbb->rootkey_offset, keyp);
-}
-
-VbError_t VbGbbReadRecoveryKey(VbCommonParams *cparams, VbPublicKey **keyp)
-{
-	return VbGbbReadKey(cparams, cparams->gbb->recovery_key_offset, keyp);
-}
diff --git a/firmware/lib/region-init.c b/firmware/lib/region-init.c
index 26602b5..5cfd4ed 100644
--- a/firmware/lib/region-init.c
+++ b/firmware/lib/region-init.c
@@ -6,10 +6,11 @@
  * (Firmware portion)
  */
 
-#include "sysincludes.h"
+#include "2sysincludes.h"
+#include "2common.h"
+#include "2misc.h"
 
-#include "bmpblk_header.h"
-#include "region.h"
+#include "sysincludes.h"
 #include "gbb_access.h"
 #include "gbb_header.h"
 #include "load_kernel_fw.h"
@@ -17,34 +18,83 @@
 #include "vboot_api.h"
 #include "vboot_struct.h"
 
-VbError_t VbRegionReadData(VbCommonParams *cparams,
-			   enum vb_firmware_region region, uint32_t offset,
-			   uint32_t size, void *buf)
+VbError_t VbGbbReadData(struct vb2_context *ctx,
+			uint32_t offset, uint32_t size, void *buf)
 {
+	struct vb2_shared_data *sd = vb2_get_sd(ctx);
+
 	/* This is the old API, for backwards compatibility */
-	if (region == VB_REGION_GBB && cparams->gbb_data) {
-		if (offset + size > cparams->gbb_size)
-			return VBERROR_INVALID_GBB;
-		memcpy(buf, cparams->gbb_data + offset, size);
-	} else
-#ifdef REGION_READ
-	{
-		VbError_t ret;
+	if (!sd->gbb)
+		return VBERROR_INVALID_GBB;
 
-		ret = VbExRegionRead(cparams, region, offset, size, buf);
-		if (ret)
-			return ret;
-	}
-#else
-	return VBERROR_INVALID_GBB;
-#endif
+	if (offset + size > sd->gbb_size)
+		return VBERROR_INVALID_GBB;
 
+	memcpy(buf, ((uint8_t *)sd->gbb) + offset, size);
 	return VBERROR_SUCCESS;
 }
 
-VbError_t VbGbbReadHeader_static(VbCommonParams *cparams,
-				 GoogleBinaryBlockHeader *gbb)
+VbError_t VbGbbReadHWID(struct vb2_context *ctx, char *hwid, uint32_t max_size)
 {
-	return VbRegionReadData(cparams, VB_REGION_GBB, 0,
-				sizeof(GoogleBinaryBlockHeader), gbb);
+	struct vb2_shared_data *sd = vb2_get_sd(ctx);
+
+	if (!max_size)
+		return VBERROR_INVALID_PARAMETER;
+	*hwid = '\0';
+	StrnAppend(hwid, "{INVALID}", max_size);
+	if (!ctx)
+		return VBERROR_INVALID_GBB;
+
+	if (0 == sd->gbb->hwid_size) {
+		VB2_DEBUG("VbHWID(): invalid hwid size\n");
+		return VBERROR_SUCCESS; /* oddly enough! */
+	}
+
+	if (sd->gbb->hwid_size > max_size) {
+		VB2_DEBUG("VbDisplayDebugInfo(): invalid hwid offset/size\n");
+		return VBERROR_INVALID_PARAMETER;
+	}
+
+	return VbGbbReadData(ctx, sd->gbb->hwid_offset,
+			     sd->gbb->hwid_size, hwid);
+}
+
+static VbError_t VbGbbReadKey(struct vb2_context *ctx, uint32_t offset,
+			      VbPublicKey **keyp)
+{
+	VbPublicKey hdr, *key;
+	VbError_t ret;
+	uint32_t size;
+
+	ret = VbGbbReadData(ctx, offset, sizeof(VbPublicKey), &hdr);
+	if (ret)
+		return ret;
+
+	/* Deal with a zero-size key (used in testing) */
+	size = hdr.key_offset + hdr.key_size;
+	if (size < sizeof(hdr))
+		size = sizeof(hdr);
+	key = malloc(size);
+	ret = VbGbbReadData(ctx, offset, size, key);
+	if (ret) {
+		free(key);
+		return ret;
+	}
+
+	*keyp = key;
+	return VBERROR_SUCCESS;
+}
+
+VbError_t VbGbbReadRootKey(struct vb2_context *ctx, VbPublicKey **keyp)
+{
+	struct vb2_shared_data *sd = vb2_get_sd(ctx);
+
+	return VbGbbReadKey(ctx, sd->gbb->rootkey_offset, keyp);
+}
+
+VbError_t VbGbbReadRecoveryKey(struct vb2_context *ctx, VbPublicKey **keyp)
+{
+	struct vb2_shared_data *sd = vb2_get_sd(ctx);
+
+	return VbGbbReadKey(ctx, sd->gbb->recovery_key_offset, keyp);
 }
diff --git a/firmware/lib/region-kernel.c b/firmware/lib/region-kernel.c
deleted file mode 100644
index 404c189..0000000
--- a/firmware/lib/region-kernel.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* 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)
- */
-
-#include "2sysincludes.h"
-#include "2common.h"
-
-#include "sysincludes.h"
-#include "bmpblk_header.h"
-#include "region.h"
-#include "gbb_access.h"
-#include "gbb_header.h"
-#include "load_kernel_fw.h"
-#include "utility.h"
-#include "vboot_api.h"
-#include "vboot_struct.h"
-
-static VbError_t VbRegionReadGbb(VbCommonParams *cparams, uint32_t offset,
-				  uint32_t size, void *buf)
-{
-	return VbRegionReadData(cparams, VB_REGION_GBB, offset, size, buf);
-}
-
-VbError_t VbRegionReadHWID(VbCommonParams *cparams, char *hwid,
-			   uint32_t max_size)
-{
-	GoogleBinaryBlockHeader *gbb;
-	VbError_t ret;
-
-	if (!max_size)
-		return VBERROR_INVALID_PARAMETER;
-	*hwid = '\0';
-	StrnAppend(hwid, "{INVALID}", max_size);
-	if (!cparams)
-		return VBERROR_INVALID_GBB;
-
-	gbb = cparams->gbb;
-
-	if (0 == gbb->hwid_size) {
-		VB2_DEBUG("VbHWID(): invalid hwid size\n");
-		return VBERROR_SUCCESS; /* oddly enough! */
-	}
-
-	if (gbb->hwid_size > max_size) {
-		VB2_DEBUG("VbDisplayDebugInfo(): invalid hwid offset/size\n");
-		return VBERROR_INVALID_PARAMETER;
-	}
-	ret = VbRegionReadGbb(cparams, gbb->hwid_offset, gbb->hwid_size, hwid);
-	if (ret)
-		return ret;
-
-	return VBERROR_SUCCESS;
-}
-
-#define OUTBUF_LEN 128
-
-void VbRegionCheckVersion(VbCommonParams *cparams)
-{
-	GoogleBinaryBlockHeader *gbb;
-
-	if (!cparams)
-		return;
-
-	gbb = cparams->gbb;
-
-	/*
-	 * If GBB flags is nonzero, complain because that's something that the
-	 * factory MUST fix before shipping. We only have to do this here,
-	 * because it's obvious that something is wrong if we're not displaying
-	 * screens from the GBB.
-	 */
-	if (gbb->major_version == GBB_MAJOR_VER && gbb->minor_version >= 1 &&
-	    (gbb->flags != 0)) {
-		uint32_t used = 0;
-		char outbuf[OUTBUF_LEN];
-
-		*outbuf = '\0';
-		used += StrnAppend(outbuf + used, "gbb.flags is nonzero: 0x",
-				OUTBUF_LEN - used);
-		used += Uint64ToString(outbuf + used, OUTBUF_LEN - used,
-				       gbb->flags, 16, 8);
-		used += StrnAppend(outbuf + used, "\n", OUTBUF_LEN - used);
-		(void)VbExDisplayDebugInfo(outbuf);
-	}
-}
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 5bda94f..7976170 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -16,7 +16,6 @@
 #include "gbb_access.h"
 #include "gbb_header.h"
 #include "load_kernel_fw.h"
-#include "region.h"
 #include "rollback_index.h"
 #include "utility.h"
 #include "vb2_common.h"
@@ -234,16 +233,6 @@
 	return rv;
 }
 
-/* This function is also used by tests */
-void VbApiKernelFree(VbCommonParams *cparams)
-{
-	/* VbSelectAndLoadKernel() always allocates this, tests don't */
-	if (cparams->gbb) {
-		free(cparams->gbb);
-		cparams->gbb = NULL;
-	}
-}
-
 static VbError_t vb2_kernel_setup(VbCommonParams *cparams,
 				  VbSelectAndLoadKernelParams *kparams)
 {
@@ -345,12 +334,10 @@
 	kparams->flags = 0;
 	memset(kparams->partition_guid, 0, sizeof(kparams->partition_guid));
 
-	/* Read GBB header, since we'll needs flags from it */
-	cparams->gbb = malloc(sizeof(*cparams->gbb));
-	uint32_t retval = VbGbbReadHeader_static(cparams, cparams->gbb);
-	if (retval)
-		return retval;
-	sd->gbb_flags = cparams->gbb->flags;
+	/* Point to GBB data from cparams */
+	sd->gbb = cparams->gbb_data;
+	sd->gbb_size = cparams->gbb_size;
+	sd->gbb_flags = sd->gbb->flags;
 
 	/* Read kernel version from the TPM.  Ignore errors in recovery mode. */
 	if (RollbackKernelRead(&shared->kernel_version_tpm)) {
@@ -421,7 +408,6 @@
 
 	/* Free buffers */
 	free(unaligned_workbuf);
-	VbApiKernelFree(cparams);
 
 	vb2_nv_commit(ctx);
 
@@ -530,7 +516,7 @@
 		hash_only = 1;
 	} else {
 		/* Get recovery key. */
-		retval = VbGbbReadRecoveryKey(cparams, &kernel_subkey);
+		retval = VbGbbReadRecoveryKey(&ctx, &kernel_subkey);
 		if (VBERROR_SUCCESS != retval) {
 			VB2_DEBUG("Gbb Read Recovery key failed.\n");
 			goto fail;
diff --git a/firmware/lib/vboot_display.c b/firmware/lib/vboot_display.c
index d3e3a6a..ea36c1f 100644
--- a/firmware/lib/vboot_display.c
+++ b/firmware/lib/vboot_display.c
@@ -15,7 +15,6 @@
 #include "bmpblk_font.h"
 #include "gbb_access.h"
 #include "gbb_header.h"
-#include "region.h"
 #include "utility.h"
 #include "vboot_api.h"
 #include "vboot_common.h"
@@ -274,7 +273,7 @@
 
 #define DEBUG_INFO_SIZE 512
 
-VbError_t VbDisplayDebugInfo(struct vb2_context *ctx, VbCommonParams *cparams)
+VbError_t VbDisplayDebugInfo(struct vb2_context *ctx)
 {
 	struct vb2_shared_data *sd = vb2_get_sd(ctx);
 	VbSharedDataHeader *shared = sd->vbsd;
@@ -296,7 +295,7 @@
 		      disp_current_index, disp_disabled_idx_mask);
 
 	/* Add hardware ID */
-	VbRegionReadHWID(cparams, hwid, sizeof(hwid));
+	VbGbbReadHWID(ctx, hwid, sizeof(hwid));
 	used += StrnAppend(buf + used, "HWID: ", DEBUG_INFO_SIZE - used);
 	used += StrnAppend(buf + used, hwid, DEBUG_INFO_SIZE - used);
 
@@ -371,7 +370,7 @@
 			       sd->gbb_flags, 16, 8);
 
 	/* Add sha1sum for Root & Recovery keys */
-	ret = VbGbbReadRootKey(cparams, &key);
+	ret = VbGbbReadRootKey(ctx, &key);
 	if (!ret) {
 		FillInSha1Sum(sha1sum, key);
 		free(key);
@@ -381,7 +380,7 @@
 				   DEBUG_INFO_SIZE - used);
 	}
 
-	ret = VbGbbReadRecoveryKey(cparams, &key);
+	ret = VbGbbReadRecoveryKey(ctx, &key);
 	if (!ret) {
 		FillInSha1Sum(sha1sum, key);
 		free(key);
@@ -413,8 +412,7 @@
 #define MAGIC_WORD "xyzzy"
 static uint8_t MagicBuffer[MAGIC_WORD_LEN];
 
-VbError_t VbCheckDisplayKey(struct vb2_context *ctx, VbCommonParams *cparams,
-			    uint32_t key)
+VbError_t VbCheckDisplayKey(struct vb2_context *ctx, uint32_t key)
 {
 	int i;
 
@@ -426,7 +424,7 @@
 
 	if ('\t' == key) {
 		/* Tab = display debug info */
-		return VbDisplayDebugInfo(ctx, cparams);
+		return VbDisplayDebugInfo(ctx);
 	} else if (VB_KEY_LEFT == key || VB_KEY_RIGHT == key ||
 		   VB_KEY_DOWN == key || VB_KEY_UP == key) {
 		/* Arrow keys = change localization */
diff --git a/firmware/lib/vboot_kernel.c b/firmware/lib/vboot_kernel.c
index d298e68..0200dcc 100644
--- a/firmware/lib/vboot_kernel.c
+++ b/firmware/lib/vboot_kernel.c
@@ -16,7 +16,6 @@
 #include "2sha.h"
 #include "cgptlib.h"
 #include "cgptlib_internal.h"
-#include "region.h"
 #include "gbb_access.h"
 #include "gbb_header.h"
 #include "gpt_misc.h"
@@ -464,7 +463,7 @@
 	struct vb2_packed_key *kernel_subkey;
 	if (kBootRecovery == shcall->boot_mode) {
 		/* Use the recovery key to verify the kernel */
-		retval = VbGbbReadRecoveryKey(cparams,
+		retval = VbGbbReadRecoveryKey(ctx,
 					      (VbPublicKey **)&recovery_key);
 		if (VBERROR_SUCCESS != retval)
 			goto load_kernel_exit;
diff --git a/firmware/lib/vboot_ui.c b/firmware/lib/vboot_ui.c
index 36c7cdf..93bdf65 100644
--- a/firmware/lib/vboot_ui.c
+++ b/firmware/lib/vboot_ui.c
@@ -16,7 +16,6 @@
 #include "gbb_access.h"
 #include "gbb_header.h"
 #include "load_kernel_fw.h"
-#include "region.h"
 #include "rollback_index.h"
 #include "utility.h"
 #include "vb2_common.h"
@@ -91,8 +90,7 @@
 
 #define CONFIRM_KEY_DELAY 20  /* Check confirm screen keys every 20ms */
 
-int VbUserConfirms(struct vb2_context *ctx, VbCommonParams *cparams,
-		   uint32_t confirm_flags)
+int VbUserConfirms(struct vb2_context *ctx, uint32_t confirm_flags)
 {
 	struct vb2_shared_data *sd = vb2_get_sd(ctx);
 	VbSharedDataHeader *shared = sd->vbsd;
@@ -146,7 +144,7 @@
 					return 1;
 				}
 			}
-			VbCheckDisplayKey(ctx, cparams, key);
+			VbCheckDisplayKey(ctx, key);
 		}
 		VbExSleepMs(CONFIRM_KEY_DELAY);
 	}
@@ -216,7 +214,7 @@
 		VbExDisplayDebugInfo(dev_disable_msg);
 
 		/* Ignore space in VbUserConfirms()... */
-		switch (VbUserConfirms(ctx, cparams, 0)) {
+		switch (VbUserConfirms(ctx, 0)) {
 		case 1:
 			VB2_DEBUG("leaving dev-mode\n");
 			vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
@@ -278,7 +276,7 @@
 				VbDisplayScreen(ctx,
 						VB_SCREEN_DEVELOPER_TO_NORM, 0);
 				/* Ignore space in VbUserConfirms()... */
-				switch (VbUserConfirms(ctx, cparams, 0)) {
+				switch (VbUserConfirms(ctx, 0)) {
 				case 1:
 					VB2_DEBUG("leaving dev-mode\n");
 					vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST,
@@ -360,7 +358,7 @@
 			break;
 		default:
 			VB2_DEBUG("VbBootDeveloper() - pressed key %d\n", key);
-			VbCheckDisplayKey(ctx, cparams, key);
+			VbCheckDisplayKey(ctx, key);
 			break;
 		}
 	} while(vb2_audio_looping());
@@ -429,7 +427,7 @@
 		VB2_DEBUG("VbBootRecovery() waiting for manual recovery\n");
 		while (1) {
 			key = VbExKeyboardRead();
-			VbCheckDisplayKey(ctx, cparams, key);
+			VbCheckDisplayKey(ctx, key);
 			if (VbWantShutdown(ctx, key))
 				return VBERROR_SHUTDOWN_REQUESTED;
 			VbExSleepMs(REC_KEY_DELAY);
@@ -499,8 +497,7 @@
 				uint32_t vbc_flags =
 					VB_CONFIRM_SPACE_MEANS_NO |
 					VB_CONFIRM_MUST_TRUST_KEYBOARD;
-				switch (VbUserConfirms(ctx, cparams,
-						       vbc_flags)) {
+				switch (VbUserConfirms(ctx, vbc_flags)) {
 				case 1:
 					VB2_DEBUG("Enabling dev-mode...\n");
 					if (TPM_SUCCESS != SetVirtualDevMode(1))
@@ -524,7 +521,7 @@
 					break;
 				}
 			} else {
-				VbCheckDisplayKey(ctx, cparams, key);
+				VbCheckDisplayKey(ctx, key);
 			}
 			if (VbWantShutdown(ctx, key))
 				return VBERROR_SHUTDOWN_REQUESTED;
diff --git a/firmware/lib/vboot_ui_menu.c b/firmware/lib/vboot_ui_menu.c
index a8247a2..6ca602a 100644
--- a/firmware/lib/vboot_ui_menu.c
+++ b/firmware/lib/vboot_ui_menu.c
@@ -14,7 +14,6 @@
 #include "gbb_access.h"
 #include "gbb_header.h"
 #include "load_kernel_fw.h"
-#include "region.h"
 #include "rollback_index.h"
 #include "utility.h"
 #include "vb2_common.h"
@@ -245,8 +244,7 @@
 	VB_SCREEN_TO_NORM_CONFIRMED,
 };
 
-VbError_t vb2_draw_current_screen(struct vb2_context *ctx,
-				  VbCommonParams *cparams) {
+VbError_t vb2_draw_current_screen(struct vb2_context *ctx) {
 	uint32_t screen;
 	if (current_menu < VB_MENU_COUNT)
 		screen = VB_MENU_TO_SCREEN_MAP[current_menu];
@@ -645,7 +643,7 @@
 
 	vb2_set_disabled_idx_mask(shared->flags);
 	/* Show the dev mode warning screen */
-	vb2_draw_current_screen(ctx, cparams);
+	vb2_draw_current_screen(ctx);
 
 	/* Get audio/delay context */
 	vb2_audio_start(ctx);
@@ -710,21 +708,21 @@
 					return VBERROR_SUCCESS;
 				} else {
 					/* Show dev mode warning screen again */
-					vb2_draw_current_screen(ctx, cparams);
+					vb2_draw_current_screen(ctx);
 				}
 			}
 			break;
 		case VB_BUTTON_VOL_UP_SHORT_PRESS:
 		case VB_KEY_UP:
 			vb2_update_selection(key);
-			vb2_draw_current_screen(ctx, cparams);
+			vb2_draw_current_screen(ctx);
 			/* reset 30 second timer */
 			vb2_audio_start(ctx);
 			break;
 		case VB_BUTTON_VOL_DOWN_SHORT_PRESS:
 		case VB_KEY_DOWN:
 			vb2_update_selection(key);
-			vb2_draw_current_screen(ctx, cparams);
+			vb2_draw_current_screen(ctx);
 			/* reset 30 second timer */
 			vb2_audio_start(ctx);
 			break;
@@ -740,7 +738,7 @@
 
 			ret = vb2_update_menu(ctx);
 			vb2_set_disabled_idx_mask(shared->flags);
-			vb2_draw_current_screen(ctx, cparams);
+			vb2_draw_current_screen(ctx);
 
 			/* Probably shutting down */
 			if (ret != VBERROR_SUCCESS) {
@@ -757,7 +755,7 @@
 			/* Display debug information */
 			if (current_menu == VB_MENU_DEV_WARNING &&
 			    current_menu_idx == VB_WARN_DBG_INFO) {
-				VbDisplayDebugInfo(ctx, cparams);
+				VbDisplayDebugInfo(ctx);
 			}
 
 			/* Boot Legacy mode */
@@ -797,8 +795,7 @@
 						 * Show dev mode warning screen
 						 * again
 						 */
-						vb2_draw_current_screen(ctx,
-								       cparams);
+						vb2_draw_current_screen(ctx);
 				}
 			}
 
@@ -933,7 +930,7 @@
 			if (key == VB_BUTTON_POWER_SHORT_PRESS)
 				return VBERROR_SHUTDOWN_REQUESTED;
 			else {
-				VbCheckDisplayKey(ctx, cparams, key);
+				VbCheckDisplayKey(ctx, key);
 				if (VbWantShutdownMenu(ctx))
 					return VBERROR_SHUTDOWN_REQUESTED;
 			}
@@ -970,7 +967,7 @@
 		if (current_menu != VB_MENU_RECOVERY ||
 		    current_menu_idx != VB_RECOVERY_DBG_INFO) {
 			if (retval == VBERROR_NO_DISK_FOUND)
-				vb2_draw_current_screen(ctx, cparams);
+				vb2_draw_current_screen(ctx);
 			else {
 				VbDisplayScreen(ctx,
 						VB_SCREEN_RECOVERY_NO_GOOD, 0);
@@ -1005,7 +1002,7 @@
 				}
 
 				vb2_update_selection(key);
-				vb2_draw_current_screen(ctx, cparams);
+				vb2_draw_current_screen(ctx);
 				break;
 			case VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS:
 				/*
@@ -1018,7 +1015,7 @@
 					if (ret != VBERROR_SUCCESS)
 						return ret;
 					vb2_set_disabled_idx_mask(shared->flags);
-					vb2_draw_current_screen(ctx, cparams);
+					vb2_draw_current_screen(ctx);
 				}
 				break;
 			case VB_BUTTON_POWER_SHORT_PRESS:
@@ -1056,8 +1053,7 @@
 					 * printed.
 					 */
 					if (retval == VBERROR_NO_DISK_FOUND)
-						vb2_draw_current_screen(ctx,
-							cparams);
+						vb2_draw_current_screen(ctx);
 					else {
 						VbDisplayScreen(ctx,
 						VB_SCREEN_RECOVERY_NO_GOOD, 0);
@@ -1078,7 +1074,7 @@
 				/* Display debug information */
 				if (current_menu == VB_MENU_RECOVERY &&
 				    current_menu_idx == VB_RECOVERY_DBG_INFO) {
-					VbDisplayDebugInfo(ctx, cparams);
+					VbDisplayDebugInfo(ctx);
 				}
 
 				/* Confirm going into developer mode */
diff --git a/firmware/stub/vboot_api_stub_region.c b/firmware/stub/vboot_api_stub_region.c
deleted file mode 100644
index f462fe4..0000000
--- a/firmware/stub/vboot_api_stub_region.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* 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.
- *
- * Stub implementations of region API function.
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "vboot_api.h"
-
-VbError_t VbExRegionRead(VbCommonParams *cparams,
-			 enum vb_firmware_region region, uint32_t offset,
-			 uint32_t size, void *buf)
-{
-	return VBERROR_SUCCESS;
-}
diff --git a/tests/ec_sync_tests.c b/tests/ec_sync_tests.c
index 332290a..3dcc680 100644
--- a/tests/ec_sync_tests.c
+++ b/tests/ec_sync_tests.c
@@ -29,7 +29,6 @@
 static VbCommonParams cparams;
 static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
 static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
-static GoogleBinaryBlockHeader gbb;
 
 static int mock_in_rw;
 static VbError_t in_rw_retval;
@@ -69,13 +68,6 @@
 	memset(&cparams, 0, sizeof(cparams));
 	cparams.shared_data_size = sizeof(shared_data);
 	cparams.shared_data_blob = shared_data;
-	cparams.gbb_data = &gbb;
-
-	memset(&gbb, 0, sizeof(gbb));
-	gbb.major_version = GBB_MAJOR_VER;
-	gbb.minor_version = GBB_MINOR_VER;
-	gbb.flags = 0;
-	cparams.gbb = &gbb;
 
 	memset(&ctx, 0, sizeof(ctx));
 	ctx.workbuf = workbuf;
diff --git a/tests/vboot_api_devmode_tests.c b/tests/vboot_api_devmode_tests.c
index 330a89a..916cf06 100644
--- a/tests/vboot_api_devmode_tests.c
+++ b/tests/vboot_api_devmode_tests.c
@@ -100,7 +100,6 @@
 static struct vb2_shared_data *sd;
 static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
 static VbSharedDataHeader* shared = (VbSharedDataHeader*)shared_data;
-static GoogleBinaryBlockHeader gbb;
 static int current_time;
 static uint64_t current_ticks;
 static int current_event;
@@ -118,8 +117,6 @@
 static void ResetMocks(void)
 {
 	memset(&cparams, 0, sizeof(cparams));
-	cparams.gbb_data = &gbb;
-	cparams.gbb = &gbb;
 
 	memset(&ctx, 0, sizeof(ctx));
 	ctx.workbuf = workbuf;
@@ -134,11 +131,6 @@
 	VbSharedDataInit(shared, sizeof(shared_data));
 	shared->fw_keyblock_flags = 0xABCDE0;
 
-	memset(&gbb, 0, sizeof(gbb));
-	gbb.major_version = GBB_MAJOR_VER;
-	gbb.minor_version = GBB_MINOR_VER;
-	gbb.flags = 0;
-
 	current_ticks = 0;
 	current_time = 0;
 
diff --git a/tests/vboot_api_kernel2_tests.c b/tests/vboot_api_kernel2_tests.c
index 04e6466..9204120 100644
--- a/tests/vboot_api_kernel2_tests.c
+++ b/tests/vboot_api_kernel2_tests.c
@@ -28,7 +28,6 @@
 static VbCommonParams cparams;
 static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
 static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
-static GoogleBinaryBlockHeader gbb;
 static LoadKernelParams lkp;
 static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE];
 static struct vb2_context ctx;
@@ -59,13 +58,6 @@
 static void ResetMocks(void)
 {
 	memset(&cparams, 0, sizeof(cparams));
-	cparams.gbb_data = &gbb;
-	cparams.gbb = &gbb;
-
-	memset(&gbb, 0, sizeof(gbb));
-	gbb.major_version = GBB_MAJOR_VER;
-	gbb.minor_version = GBB_MINOR_VER;
-	gbb.flags = 0;
 
 	memset(VbApiKernelGetFwmp(), 0, sizeof(struct RollbackSpaceFwmp));
 
@@ -212,48 +204,48 @@
 
 	ResetMocks();
 	shutdown_request_calls_left = 1;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams, 0), -1, "Shutdown requested");
+	TEST_EQ(VbUserConfirms(&ctx, 0), -1, "Shutdown requested");
 
 	ResetMocks();
 	mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams, 0), -1, "Shutdown requested");
+	TEST_EQ(VbUserConfirms(&ctx, 0), -1, "Shutdown requested");
 
 	ResetMocks();
 	mock_keypress[0] = '\r';
-	TEST_EQ(VbUserConfirms(&ctx, &cparams, 0), 1, "Enter");
+	TEST_EQ(VbUserConfirms(&ctx, 0), 1, "Enter");
 
 	ResetMocks();
 	mock_keypress[0] = 0x1b;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams, 0), 0, "Esc");
+	TEST_EQ(VbUserConfirms(&ctx, 0), 0, "Esc");
 
 	ResetMocks();
 	mock_keypress[0] = ' ';
 	shutdown_request_calls_left = 1;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams, VB_CONFIRM_SPACE_MEANS_NO), 0,
+	TEST_EQ(VbUserConfirms(&ctx, VB_CONFIRM_SPACE_MEANS_NO), 0,
                 "Space means no");
 
 	ResetMocks();
 	mock_keypress[0] = ' ';
 	shutdown_request_calls_left = 1;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams, 0), -1, "Space ignored");
+	TEST_EQ(VbUserConfirms(&ctx, 0), -1, "Space ignored");
 
 	ResetMocks();
 	mock_keypress[0] = '\r';
 	mock_keyflags[0] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams, VB_CONFIRM_MUST_TRUST_KEYBOARD),
+	TEST_EQ(VbUserConfirms(&ctx, VB_CONFIRM_MUST_TRUST_KEYBOARD),
 		1, "Enter with trusted keyboard");
 
 	ResetMocks();
 	mock_keypress[0] = '\r';	/* untrusted */
 	mock_keypress[1] = ' ';
-	TEST_EQ(VbUserConfirms(&ctx, &cparams,
+	TEST_EQ(VbUserConfirms(&ctx,
 			       VB_CONFIRM_SPACE_MEANS_NO |
 			       VB_CONFIRM_MUST_TRUST_KEYBOARD),
 		0, "Untrusted keyboard");
 
 	ResetMocks();
 	mock_switches[0] = VB_INIT_FLAG_REC_BUTTON_PRESSED;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams,
+	TEST_EQ(VbUserConfirms(&ctx,
 			       VB_CONFIRM_SPACE_MEANS_NO |
 			       VB_CONFIRM_MUST_TRUST_KEYBOARD),
 		1, "Recovery button");
@@ -265,7 +257,7 @@
 	mock_keypress[3] = ' ';
 	mock_switches[0] = VB_INIT_FLAG_REC_BUTTON_PRESSED;
 	mock_switches_are_stuck = 1;
-	TEST_EQ(VbUserConfirms(&ctx, &cparams,
+	TEST_EQ(VbUserConfirms(&ctx,
 			       VB_CONFIRM_SPACE_MEANS_NO |
 			       VB_CONFIRM_MUST_TRUST_KEYBOARD),
 		0, "Recovery button stuck");
diff --git a/tests/vboot_api_kernel5_tests.c b/tests/vboot_api_kernel5_tests.c
index fc54eb7..a831e7f 100644
--- a/tests/vboot_api_kernel5_tests.c
+++ b/tests/vboot_api_kernel5_tests.c
@@ -34,7 +34,8 @@
 static VbSelectAndLoadKernelParams kparams;
 static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
 static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
-static GoogleBinaryBlockHeader gbb;
+static uint8_t gbb_buf[4096];
+static GoogleBinaryBlockHeader *gbb = (GoogleBinaryBlockHeader *)gbb_buf;
 
 static uint8_t kernel_buffer[80000];
 static int key_block_verify_fail;  /* 0=ok, 1=sig, 2=hash */
@@ -55,15 +56,17 @@
 	memset(&cparams, 0, sizeof(cparams));
 	cparams.shared_data_size = sizeof(shared_data);
 	cparams.shared_data_blob = shared_data;
-	cparams.gbb_data = &gbb;
-	cparams.gbb_size = sizeof(gbb);
+	cparams.gbb_data = gbb_buf;
+	cparams.gbb_size = sizeof(gbb_buf);
 
 	memset(&kparams, 0, sizeof(kparams));
 
-	memset(&gbb, 0, sizeof(gbb));
-	gbb.major_version = GBB_MAJOR_VER;
-	gbb.minor_version = GBB_MINOR_VER;
-	gbb.flags = 0;
+	memset(gbb_buf, 0, sizeof(gbb_buf));
+	gbb->major_version = GBB_MAJOR_VER;
+	gbb->minor_version = GBB_MINOR_VER;
+	gbb->flags = 0;
+	gbb->rootkey_offset = sizeof(*gbb);
+	gbb->rootkey_size = sizeof(VbPublicKey);
 
 	memset(&ctx, 0, sizeof(ctx));
 	ctx.workbuf = workbuf;
@@ -223,7 +226,7 @@
 	/* Key Block Hash Failure */
 	ResetMocks();
 	shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
-	gbb.flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
+	gbb->flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
 	key_block_verify_fail = 1;
 	TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
 					kernel_buffer_size),
@@ -256,7 +259,7 @@
 	kbh.key_block_flags = KEY_BLOCK_FLAG_DEVELOPER_0 |
 		KEY_BLOCK_FLAG_RECOVERY_1;
 	copy_kbh();
-	gbb.flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
+	gbb->flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
 	shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
 	TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
 					kernel_buffer_size),
@@ -269,7 +272,7 @@
 		KEY_BLOCK_FLAG_RECOVERY_0;
 	copy_kbh();
 	shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
-	gbb.flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
+	gbb->flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
 	TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
 					kernel_buffer_size),
 		VBERROR_SUCCESS,
diff --git a/tests/vboot_detach_menu_tests.c b/tests/vboot_detach_menu_tests.c
index 0e3cc3b..db04f6b 100644
--- a/tests/vboot_detach_menu_tests.c
+++ b/tests/vboot_detach_menu_tests.c
@@ -30,7 +30,6 @@
 static VbCommonParams cparams;
 static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
 static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
-static GoogleBinaryBlockHeader gbb;
 static LoadKernelParams lkp;
 static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE];
 static struct vb2_context ctx;
@@ -61,13 +60,6 @@
 static void ResetMocks(void)
 {
 	memset(&cparams, 0, sizeof(cparams));
-	cparams.gbb_data = &gbb;
-	cparams.gbb = &gbb;
-
-	memset(&gbb, 0, sizeof(gbb));
-	gbb.major_version = GBB_MAJOR_VER;
-	gbb.minor_version = GBB_MINOR_VER;
-	gbb.flags = 0;
 
 	memset(VbApiKernelGetFwmp(), 0, sizeof(struct RollbackSpaceFwmp));
 
diff --git a/tests/vboot_display_tests.c b/tests/vboot_display_tests.c
index 7ddc28e..a6d2b9f 100644
--- a/tests/vboot_display_tests.c
+++ b/tests/vboot_display_tests.c
@@ -15,9 +15,9 @@
 #include "2misc.h"
 #include "2nvstorage.h"
 #include "bmpblk_font.h"
+#include "gbb_access.h"
 #include "gbb_header.h"
 #include "host_common.h"
-#include "region.h"
 #include "test_common.h"
 #include "vboot_common.h"
 #include "vboot_display.h"
@@ -31,6 +31,7 @@
 static GoogleBinaryBlockHeader *gbb = (GoogleBinaryBlockHeader *)gbb_data;
 static char debug_info[4096];
 static struct vb2_context ctx;
+struct vb2_shared_data *sd;
 static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE];
 static uint32_t mock_localization_count;
 
@@ -55,12 +56,6 @@
 	memset(&cparams, 0, sizeof(cparams));
 	cparams.gbb_data = gbb;
 	cparams.gbb_size = sizeof(gbb_data);
-
-	/*
-	 * Note, VbApiKernelFree() expects this to be allocated by
-	 * malloc(), so we cannot just assign it staticly.
-	 */
-	cparams.gbb = malloc(sizeof(*gbb));
 	gbb->header_size = sizeof(*gbb);
 	gbb->rootkey_offset = gbb_used;
 	gbb->rootkey_size = 64;
@@ -68,7 +63,6 @@
 	gbb->recovery_key_offset = gbb_used;
 	gbb->recovery_key_size = 64;
 	gbb_used += 64;
-	memcpy(cparams.gbb, gbb, sizeof(*gbb));
 
 	memset(&ctx, 0, sizeof(ctx));
 	ctx.workbuf = workbuf;
@@ -76,8 +70,10 @@
 	vb2_init_context(&ctx);
 	vb2_nv_init(&ctx);
 
-	struct vb2_shared_data *sd = vb2_get_sd(&ctx);
+	sd = vb2_get_sd(&ctx);
 	sd->vbsd = shared;
+	sd->gbb = (struct vb2_gbb_header *)gbb_data;
+	sd->gbb_size = sizeof(gbb_data);
 
 	memset(&shared_data, 0, sizeof(shared_data));
 	VbSharedDataInit(shared, sizeof(shared_data));
@@ -106,7 +102,7 @@
 /* Test displaying debug info */
 static void DebugInfoTest(void)
 {
-	char hwid[VB_REGION_HWID_LEN];
+	char hwid[256];
 	int i;
 
 	/* Recovery string should be non-null for any code */
@@ -115,82 +111,72 @@
 
 	/* HWID should come from the gbb */
 	ResetMocks();
-	VbRegionReadHWID(&cparams, hwid, sizeof(hwid));
+	VbGbbReadHWID(&ctx, hwid, sizeof(hwid));
 	TEST_EQ(strcmp(hwid, "Test HWID"), 0, "HWID");
-	VbApiKernelFree(&cparams);
 
 	ResetMocks();
-	cparams.gbb_size = 0;
-	VbRegionReadHWID(&cparams, hwid, sizeof(hwid));
+	sd->gbb_size = 0;
+	VbGbbReadHWID(&ctx, hwid, sizeof(hwid));
 	TEST_EQ(strcmp(hwid, "{INVALID}"), 0, "HWID bad gbb");
-	VbApiKernelFree(&cparams);
 
 	ResetMocks();
-	cparams.gbb->hwid_size = 0;
-	VbRegionReadHWID(&cparams, hwid, sizeof(hwid));
+	sd->gbb->hwid_size = 0;
+	VbGbbReadHWID(&ctx, hwid, sizeof(hwid));
 	TEST_EQ(strcmp(hwid, "{INVALID}"), 0, "HWID missing");
-	VbApiKernelFree(&cparams);
 
 	ResetMocks();
-	cparams.gbb->hwid_offset = cparams.gbb_size + 1;
-	VbRegionReadHWID(&cparams, hwid, sizeof(hwid));
+	sd->gbb->hwid_offset = sd->gbb_size + 1;
+	VbGbbReadHWID(&ctx, hwid, sizeof(hwid));
 	TEST_EQ(strcmp(hwid, "{INVALID}"), 0, "HWID past end");
-	VbApiKernelFree(&cparams);
 
 	ResetMocks();
-	cparams.gbb->hwid_size = cparams.gbb_size;
-	VbRegionReadHWID(&cparams, hwid, sizeof(hwid));
+	sd->gbb->hwid_size = sd->gbb_size;
+	VbGbbReadHWID(&ctx, hwid, sizeof(hwid));
 	TEST_EQ(strcmp(hwid, "{INVALID}"), 0, "HWID overflow");
-	VbApiKernelFree(&cparams);
 
 	/* Display debug info */
 	ResetMocks();
-	VbDisplayDebugInfo(&ctx, &cparams);
+	VbDisplayDebugInfo(&ctx);
 	TEST_NEQ(*debug_info, '\0', "Some debug info was displayed");
-	VbApiKernelFree(&cparams);
 }
 
 /* Test display key checking */
 static void DisplayKeyTest(void)
 {
 	ResetMocks();
-	VbCheckDisplayKey(&ctx, &cparams, 'q');
+	VbCheckDisplayKey(&ctx, 'q');
 	TEST_EQ(*debug_info, '\0', "DisplayKey q = does nothing");
-	VbApiKernelFree(&cparams);
 
 	ResetMocks();
-	VbCheckDisplayKey(&ctx, &cparams, '\t');
+	VbCheckDisplayKey(&ctx, '\t');
 	TEST_NEQ(*debug_info, '\0', "DisplayKey tab = display");
-	VbApiKernelFree(&cparams);
 
 	/* Toggle localization */
 	ResetMocks();
 	vb2_nv_set(&ctx, VB2_NV_LOCALIZATION_INDEX, 0);
-	VbCheckDisplayKey(&ctx, &cparams, VB_KEY_DOWN);
+	VbCheckDisplayKey(&ctx, VB_KEY_DOWN);
 	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX), 2,
 		"DisplayKey up");
-	VbCheckDisplayKey(&ctx, &cparams, VB_KEY_LEFT);
+	VbCheckDisplayKey(&ctx, VB_KEY_LEFT);
 	vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX);
 	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX), 1,
 		"DisplayKey left");
-	VbCheckDisplayKey(&ctx, &cparams, VB_KEY_RIGHT);
+	VbCheckDisplayKey(&ctx, VB_KEY_RIGHT);
 	vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX);
 	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX), 2,
 		"DisplayKey right");
-	VbCheckDisplayKey(&ctx, &cparams, VB_KEY_UP);
+	VbCheckDisplayKey(&ctx, VB_KEY_UP);
 	vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX);
 	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX), 0,
 		"DisplayKey up");
-	VbApiKernelFree(&cparams);
 
 	/* Reset localization if localization count is invalid */
 	ResetMocks();
 	vb2_nv_set(&ctx, VB2_NV_LOCALIZATION_INDEX, 1);
 	mock_localization_count = 0xffffffff;
-	VbCheckDisplayKey(&ctx, &cparams, VB_KEY_UP);
+	VbCheckDisplayKey(&ctx, VB_KEY_UP);
 	TEST_EQ(vb2_nv_get(&ctx, VB2_NV_LOCALIZATION_INDEX), 0,
 		"DisplayKey invalid");
-	VbApiKernelFree(&cparams);
 }
 
 int main(void)
diff --git a/tests/vboot_kernel_tests.c b/tests/vboot_kernel_tests.c
index a591978..c6798d2 100644
--- a/tests/vboot_kernel_tests.c
+++ b/tests/vboot_kernel_tests.c
@@ -146,9 +146,6 @@
 	shared->kernel_version_tpm = 0x20001;
 
 	memset(&cparams, '\0', sizeof(cparams));
-	cparams.gbb = gbb;
-	cparams.gbb_data = gbb;
-	cparams.gbb_size = sizeof(gbb_data);
 
 	memset(&lkp, 0, sizeof(lkp));
 	lkp.bytes_per_lba = 512;
@@ -185,6 +182,8 @@
 
 	struct vb2_shared_data *sd = vb2_get_sd(&ctx);
 	sd->vbsd = shared;
+	sd->gbb = (struct vb2_gbb_header *)gbb_data;
+	sd->gbb_size = sizeof(gbb_data);
 
 	// TODO: more workbuf fields - flags, secdata, secdatak
 }
diff --git a/tests/vboot_region_tests.c b/tests/vboot_region_tests.c
deleted file mode 100644
index a08daed..0000000
--- a/tests/vboot_region_tests.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* Copyright (c) 2011 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.
- *
- * Tests for vboot region API
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "bmpblk_font.h"
-#include "gbb_header.h"
-#include "host_common.h"
-#include "rollback_index.h"
-#include "test_common.h"
-#include "vboot_common.h"
-#include "vboot_struct.h"
-
-typedef struct VbNvContext VbNvContext;
-
-/* Mock data */
-static VbCommonParams cparams;
-static VbSelectFirmwareParams fparams;
-VbSelectAndLoadKernelParams kparams;
-static char gbb_data[4096 + sizeof(GoogleBinaryBlockHeader)];
-static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
-static VbSharedDataHeader* shared = (VbSharedDataHeader*)shared_data;
-/* Mock TPM versions */
-static uint32_t mock_tpm_version;
-static uint32_t mock_lf_tpm_version;  /* TPM version set by LoadFirmware() */
-static uint32_t mock_seen_region;
-/* Mock return values, so we can simulate errors */
-static VbError_t mock_lf_retval;
-
-#define COMPRESSED_SIZE		200
-#define ORIGINAL_SIZE		400
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void) {
-	GoogleBinaryBlockHeader *gbb;
-	BmpBlockHeader *bhdr;
-	ImageInfo *image_info;
-	ScreenLayout *layout;
-	int gbb_used;
-
-	memset(&cparams, 0, sizeof(cparams));
-	cparams.shared_data_size = sizeof(shared_data);
-	cparams.shared_data_blob = shared_data;
-
-	memset(&fparams, 0, sizeof(fparams));
-
-	memset(gbb_data, 0, sizeof(gbb_data));
-	gbb = (GoogleBinaryBlockHeader *)gbb_data;
-	gbb->major_version = GBB_MAJOR_VER;
-	gbb->minor_version = GBB_MINOR_VER;
-	gbb->flags = 0;
-	gbb_used = sizeof(GoogleBinaryBlockHeader);
-
-	gbb->hwid_offset = gbb_used;
-	strcpy(gbb_data + gbb->hwid_offset, "Test HWID");
-	gbb->hwid_size = strlen(gbb_data + gbb->hwid_offset) + 1;
-	gbb_used = (gbb_used + gbb->hwid_size + 7) & ~7;
-
-	gbb->bmpfv_offset = gbb_used;
-	bhdr = (BmpBlockHeader *)(gbb_data + gbb->bmpfv_offset);
-	gbb->bmpfv_size = sizeof(BmpBlockHeader);
-	gbb_used = (gbb_used + gbb->bmpfv_size + 7) & ~7;
-	memcpy(bhdr->signature, BMPBLOCK_SIGNATURE, BMPBLOCK_SIGNATURE_SIZE);
-	bhdr->major_version = BMPBLOCK_MAJOR_VERSION;
-	bhdr->minor_version = BMPBLOCK_MINOR_VERSION;
-	bhdr->number_of_localizations = 3;
-	bhdr->number_of_screenlayouts = 1;
-
-	layout = (ScreenLayout *)(gbb_data + gbb_used);
-	gbb_used += sizeof(*layout);
-	layout->images[0].x = 1;
-	layout->images[0].image_info_offset = gbb_used - gbb->bmpfv_offset;
-
-	/* First image is uncompressed */
-	image_info = (ImageInfo *)(gbb_data + gbb_used);
-	image_info->format = FORMAT_BMP;
-	image_info->compressed_size = ORIGINAL_SIZE;
-	image_info->original_size = ORIGINAL_SIZE;
-	image_info->compression = COMPRESS_NONE;
-	gbb_used += sizeof(*image_info);
-	strcpy(gbb_data + gbb_used, "original");
-	gbb_used += ORIGINAL_SIZE;
-
-	/* Second image is compressed */
-	layout->images[1].image_info_offset = gbb_used - gbb->bmpfv_offset;
-	layout->images[1].x = 2;
-	image_info = (ImageInfo *)(gbb_data + gbb_used);
-	image_info->format = FORMAT_BMP;
-	image_info->compressed_size = COMPRESSED_SIZE;
-	image_info->original_size = ORIGINAL_SIZE;
-	image_info->compression = COMPRESS_LZMA1;
-	gbb_used += sizeof(*image_info) + COMPRESSED_SIZE;
-
-	memset(&shared_data, 0, sizeof(shared_data));
-	VbSharedDataInit(shared, sizeof(shared_data));
-	shared->fw_keyblock_flags = 0xABCDE0;
-
-	mock_tpm_version = mock_lf_tpm_version = 0x20004;
-	shared->fw_version_tpm_start = mock_tpm_version;
-	mock_lf_retval = 0;
-	mock_seen_region = 0;
-}
-
-/****************************************************************************/
-/* Mocked verification functions */
-
-VbError_t VbExNvStorageRead(uint8_t* buf) {
-  return VBERROR_SUCCESS;
-}
-
-VbError_t VbExNvStorageWrite(const uint8_t* buf) {
-  return VBERROR_SUCCESS;
-}
-
-VbError_t VbExRegionRead(VbCommonParams *cparams,
-			 enum vb_firmware_region region, uint32_t offset,
-			 uint32_t size, void *buf)
-{
-	if (region != VB_REGION_GBB)
-		return VBERROR_UNSUPPORTED_REGION;
-	mock_seen_region |= 1 << region;
-	if (offset + size > sizeof(gbb_data))
-		return VBERROR_REGION_READ_INVALID;
-	memcpy(buf, gbb_data + offset, size);
-	return VBERROR_SUCCESS;
-}
-
-VbError_t VbExDisplayImage(uint32_t x, uint32_t y,
-                           void *buffer, uint32_t buffersize)
-{
-	switch (x) {
-	case 1:
-		TEST_STR_EQ(buffer, "original", "  uncompressed image");
-		break;
-	case 2:
-		TEST_STR_EQ(buffer, "decompressed", "  compressed image");
-		break;
-	default:
-		TEST_STR_EQ(buffer, "invalid", "  correct image");
-		break;
-	}
-	return VBERROR_SUCCESS;
-}
-
-VbError_t VbExDecompress(void *inbuf, uint32_t in_size,
-                         uint32_t compression_type,
-                         void *outbuf, uint32_t *out_size)
-{
-	*out_size = ORIGINAL_SIZE;
-	strcpy(outbuf, "decompressed");
-	return VBERROR_SUCCESS;
-}
-
-int LoadFirmware(VbCommonParams *cparams, VbSelectFirmwareParams *fparams,
-                 VbNvContext *vnc) {
-	shared->fw_version_tpm = mock_lf_tpm_version;
-	TEST_PTR_NEQ(cparams->gbb, NULL, "  GBB allocated");
-	return mock_lf_retval;
-}
-
-/****************************************************************************/
-
-static void VbRegionReadTest(void) {
-	/* Should read GBB */
-	ResetMocks();
-	TEST_TRUE(1, "Normal call");
-	TEST_EQ(VbSelectFirmware(&cparams, &fparams), VBERROR_SUCCESS,
-		"  Success");
-	TEST_EQ(mock_seen_region, 1 << VB_REGION_GBB, "  GBB region");
-	TEST_PTR_EQ(cparams.gbb, NULL, "  GBB free");
-
-	ResetMocks();
-	TEST_EQ(VbSelectAndLoadKernel(&cparams, &kparams),
-		VBERROR_NO_DISK_FOUND, "Kernel");
-	TEST_PTR_EQ(cparams.gbb, NULL, "  GBB free");
-	TEST_PTR_EQ(cparams.bmp, NULL, "  BMP free");
-
-	ResetMocks();
-	shared->flags |= VBSD_BOOT_DEV_SWITCH_ON;
-	TEST_EQ(VbSelectAndLoadKernel(&cparams, &kparams),
-		VBERROR_NO_DISK_FOUND, "Kernel");
-}
-
-int main(int argc, char* argv[])
-{
-  VbRegionReadTest();
-
-  return gTestSuccess ? 0 : 255;
-}
diff --git a/utility/load_kernel_test.c b/utility/load_kernel_test.c
index 481e78c..da1667b 100644
--- a/utility/load_kernel_test.c
+++ b/utility/load_kernel_test.c
@@ -163,7 +163,7 @@
 
   /* Initialize the GBB */
   cparams.gbb_size = sizeof(GoogleBinaryBlockHeader) + key_size;
-  cparams.gbb = gbb = (GoogleBinaryBlockHeader*)malloc(cparams.gbb_size);
+  cparams.gbb_data = gbb = (GoogleBinaryBlockHeader*)malloc(cparams.gbb_size);
   memset(gbb, 0, cparams.gbb_size);
   memcpy(gbb->signature, GBB_SIGNATURE, GBB_SIGNATURE_SIZE);
   gbb->major_version = GBB_MAJOR_VER;