aboutsummaryrefslogtreecommitdiff
path: root/src/vboot/vbnv_cmos.c
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2016-07-25 11:48:03 -0700
committerFurquan Shaikh <furquan@google.com>2016-07-28 00:36:00 +0200
commit2a12e2e8da2477d97b8774babd1a74dda65d11a0 (patch)
treec8bbdc94b777269dcdaa2c5070c61432b1001986 /src/vboot/vbnv_cmos.c
parentaf8ef2a810f97b762d30de2b6f30d6ffefa0ae0e (diff)
vboot: Separate vboot from chromeos
VBOOT_VERIFY_FIRMWARE should be independent of CHROMEOS. This allows use of verified boot library without having to stick to CHROMEOS. BUG=chrome-os-partner:55639 Change-Id: Ia2c328712caedd230ab295b8a613e3c1ed1532d9 Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/15867 Tested-by: build bot (Jenkins) Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Diffstat (limited to 'src/vboot/vbnv_cmos.c')
-rw-r--r--src/vboot/vbnv_cmos.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/vboot/vbnv_cmos.c b/src/vboot/vbnv_cmos.c
new file mode 100644
index 0000000000..5eda8e6e50
--- /dev/null
+++ b/src/vboot/vbnv_cmos.c
@@ -0,0 +1,79 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2011 The ChromiumOS Authors. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <bootstate.h>
+#include <console/console.h>
+#include <types.h>
+#include <pc80/mc146818rtc.h>
+#include <vboot/vbnv.h>
+#include <vboot/vbnv_layout.h>
+
+void read_vbnv_cmos(uint8_t *vbnv_copy)
+{
+ int i;
+
+ for (i = 0; i < VBOOT_VBNV_BLOCK_SIZE; i++)
+ vbnv_copy[i] = cmos_read(CONFIG_VBOOT_VBNV_OFFSET + 14 + i);
+
+ if (IS_ENABLED(CONFIG_VBOOT_VBNV_CMOS_BACKUP_TO_FLASH)) {
+ if (verify_vbnv(vbnv_copy))
+ return;
+
+ printk(BIOS_INFO, "VBNV: CMOS invalid, restoring from flash\n");
+ read_vbnv_flash(vbnv_copy);
+
+ if (verify_vbnv(vbnv_copy)) {
+ save_vbnv_cmos(vbnv_copy);
+ printk(BIOS_INFO, "VBNV: Flash backup restored\n");
+ } else {
+ printk(BIOS_INFO, "VBNV: Restore from flash failed\n");
+ }
+ }
+}
+
+void save_vbnv_cmos(const uint8_t *vbnv_copy)
+{
+ int i;
+
+ for (i = 0; i < VBOOT_VBNV_BLOCK_SIZE; i++)
+ cmos_write(vbnv_copy[i], CONFIG_VBOOT_VBNV_OFFSET + 14 + i);
+}
+
+void init_vbnv_cmos(int rtc_fail)
+{
+ uint8_t vbnv[VBOOT_VBNV_BLOCK_SIZE];
+
+ if (rtc_fail)
+ read_vbnv_cmos(vbnv);
+
+ cmos_init(rtc_fail);
+
+ if (rtc_fail)
+ save_vbnv_cmos(vbnv);
+}
+
+#if IS_ENABLED(CONFIG_VBOOT_VBNV_CMOS_BACKUP_TO_FLASH)
+static void back_up_vbnv_cmos(void *unused)
+{
+ uint8_t vbnv_cmos[VBOOT_VBNV_BLOCK_SIZE];
+
+ /* Read current VBNV from CMOS. */
+ read_vbnv_cmos(vbnv_cmos);
+
+ /* Save to flash, will only be saved if different. */
+ save_vbnv_flash(vbnv_cmos);
+}
+BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_EXIT, back_up_vbnv_cmos, NULL);
+#endif