add load firmware stub

Review URL: http://codereview.chromium.org/2776002
diff --git a/vboot_firmware/Makefile b/vboot_firmware/Makefile
index a2245d8..b4345e0 100644
--- a/vboot_firmware/Makefile
+++ b/vboot_firmware/Makefile
@@ -42,6 +42,7 @@
 # find ./stub -iname '*.c' | sort
 STUB_SRCS = \
 	./stub/boot_device_stub.c \
+	./stub/load_firmware_stub.c \
 	./stub/tlcl.c \
 	./stub/utility_stub.c
 
diff --git a/vboot_firmware/stub/load_firmware_stub.c b/vboot_firmware/stub/load_firmware_stub.c
new file mode 100644
index 0000000..dea7f30
--- /dev/null
+++ b/vboot_firmware/stub/load_firmware_stub.c
@@ -0,0 +1,94 @@
+/* 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.
+ *
+ * TEMPORARY stub for calling LoadFirmware() which looks like the old
+ * VerifyFirmwareDriver_f() call.
+ * (Firmware portion)
+ */
+
+#include "load_firmware_fw.h"
+
+#include "firmware_image_fw.h"
+#include "utility.h"
+
+
+static uint8_t *g_firmwareA;
+static uint64_t g_firmwareA_size;
+static uint8_t *g_firmwareB;
+static uint64_t g_firmwareB_size;
+
+
+void *GetFirmwareBody(uint64_t firmware_index, uint64_t* size) {
+
+  uint8_t *fw;
+
+  /* In a real implementation, GetFirmwareBody() should be what reads
+   * and decompresses the firmware volume.  In this temporary hack, we
+   * just pass the pointer which we got from
+   * VerifyFirmwareDriver_Stub(). */
+  switch(firmware_index) {
+    case 0:
+      *size = g_firmwareA_size;
+      fw = g_firmwareA;
+    case 1:
+      *size = g_firmwareB_size;
+      fw = g_firmwareB;
+    default:
+      /* Anything else is invalid */
+      *size = 0;
+      return NULL;
+  }
+
+  /* Need to call UpdateFirmwareBodyHash() with the firmware volume
+   * data.  In this temporary hack, the FV is already decompressed, so
+   * we pass in the entire volume at once.  In a real implementation,
+   * you should call this as the FV is being decompressed. */
+  UpdateFirmwareBodyHash(fw, *size);
+
+  /* Return the firmware body pointer */
+  return fw;
+}
+
+
+/* Where you're currently calling VerifyFirmwareDriver_f(), call this
+ * function instead.  Because you still need to read in both firmware
+ * volumes, this call will still be slow.  Once we reach feature
+ * complete, you should modify your code to call LoadImage()
+ * directly. */
+int VerifyFirmwareDriver_stub(uint8_t* root_key_blob,
+                              uint8_t* verification_headerA,
+                              uint8_t* firmwareA,
+                              uint8_t* verification_headerB,
+                              uint8_t* firmwareB) {
+
+  int rv;
+
+  /* Copy the firmware volume pointers to our global variables. */
+  g_firmwareA = firmwareA;
+  g_firmwareB = firmwareB;
+
+  /* TODO: YOU NEED TO PASS IN THE FIRMWARE VOLUME SIZES SOMEHOW */
+  g_firmwareA_size = 0;
+  g_firmwareB_size = 0;
+
+  /* Set up the params for LoadFirmware() */
+  LoadFirmwareParams p;
+  p.firmware_root_key_blob = root_key_blob;
+  p.verification_block_0 = verification_headerA;
+  p.verification_block_1 = verification_headerB;
+
+  /* Call LoadFirmware() */
+  rv = LoadFirmware(&p);
+  if (LOAD_FIRMWARE_SUCCESS == rv) {
+    /* TODO: YOU NEED TO KEEP TRACK OF p.kernel_sign_key_blob AND
+     * p.kernel_sign_key_size SO YOU CAN PASS THEM TO LoadKernel(). */
+
+    return (0 == p.firmware_index ? BOOT_FIRMWARE_A_CONTINUE :
+            BOOT_FIRMWARE_B_CONTINUE);
+
+  } else {
+    /* Error */
+    return BOOT_FIRMWARE_RECOVERY_CONTINUE;
+  }
+}