11cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler * Use of this source code is governed by a BSD-style license that can be
3391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler * found in the LICENSE file.
4391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler *
5391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler * Tests for vboot_api_init
6391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler */
7391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
80c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include <stdint.h>
9391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include <stdio.h>
10391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include <stdlib.h>
11391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
12c8e4ff7c15e6bf5992a578b66bec47d69cde3beaBill Richardson#include "gbb_header.h"
13391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include "host_common.h"
14391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include "rollback_index.h"
15391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include "test_common.h"
16391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include "vboot_common.h"
17391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include "vboot_nvstorage.h"
18391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler#include "vboot_struct.h"
19391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
20391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler/* Mock data */
21391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic VbCommonParams cparams;
22391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic VbInitParams iparams;
23391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic VbNvContext vnc;
24391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
251cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spanglerstatic VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
26391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic uint64_t mock_timer;
27391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic int rollback_s3_retval;
28391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic int nv_write_called;
29c8e4ff7c15e6bf5992a578b66bec47d69cde3beaBill Richardsonstatic GoogleBinaryBlockHeader gbb;
30ec8df1628cd9cf236bf912dee7d4365d7977e697Bill Richardsonstatic int mock_virt_dev_sw;
31b75d8adcc01f08cf5a6d87b78aeb1d7cdfcd22afBill Richardsonstatic uint32_t mock_tpm_version;
32b75d8adcc01f08cf5a6d87b78aeb1d7cdfcd22afBill Richardsonstatic uint32_t mock_rfs_retval;
33723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spanglerstatic int rfs_clear_tpm_request;
34723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spanglerstatic int rfs_disable_dev_request;
35b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardsonstatic uint8_t backup_space[BACKUP_NV_SIZE];
36b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardsonstatic int backup_write_called;
37b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardsonstatic int backup_read_called;
38391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
39391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler/* Reset mock data (for use before each test) */
401cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spanglerstatic void ResetMocks(void)
411cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
421cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	Memset(&cparams, 0, sizeof(cparams));
431cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	cparams.shared_data_size = sizeof(shared_data);
441cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	cparams.shared_data_blob = shared_data;
451cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	cparams.gbb_data = &gbb;
46527ba810eff4006cf69579f6b96cb4350cb1e189Simon Glass	cparams.gbb_size = sizeof(gbb);
471cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
481cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	Memset(&gbb, 0, sizeof(gbb));
491cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	gbb.major_version = GBB_MAJOR_VER;
501cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	gbb.minor_version = GBB_MINOR_VER;
511cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	gbb.flags = 0;
521cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
531cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	Memset(&iparams, 0, sizeof(iparams));
541cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
551cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	Memset(&vnc, 0, sizeof(vnc));
561cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSetup(&vnc);
571cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);                   /* So CRC gets generated */
581cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
59b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	Memset(backup_space, 0, sizeof(backup_space));
60b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	backup_write_called = 0;
61b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	backup_read_called = 0;
62b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
631cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	Memset(&shared_data, 0, sizeof(shared_data));
641cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbSharedDataInit(shared, sizeof(shared_data));
651cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
661cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_timer = 10;
671cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	rollback_s3_retval = TPM_SUCCESS;
681cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	nv_write_called = 0;
691cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
701cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_virt_dev_sw = 0;
711cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_tpm_version = 0x10001;
721cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_rfs_retval = 0;
73723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
74723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	rfs_clear_tpm_request = 0;
75723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	rfs_disable_dev_request = 0;
76391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
77391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
78391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler/****************************************************************************/
79391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler/* Mocked verification functions */
80391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
811cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall SpanglerVbError_t VbExNvStorageRead(uint8_t *buf)
821cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
831cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	Memcpy(buf, vnc.raw, sizeof(vnc.raw));
841cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	return VBERROR_SUCCESS;
85391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
86391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
871cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall SpanglerVbError_t VbExNvStorageWrite(const uint8_t *buf)
881cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
89b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	nv_write_called++;
901cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	Memcpy(vnc.raw, buf, sizeof(vnc.raw));
911cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	return VBERROR_SUCCESS;
92391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
93391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
94b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardsonuint32_t RollbackBackupRead(uint8_t *raw)
95b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson{
96b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	backup_read_called++;
97b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	Memcpy(raw, backup_space, sizeof(backup_space));
98b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	return TPM_SUCCESS;
99b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson}
100b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
101b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardsonuint32_t RollbackBackupWrite(uint8_t *raw)
102b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson{
103b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	backup_write_called++;
104b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	Memcpy(backup_space, raw, sizeof(backup_space));
105b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	return TPM_SUCCESS;
106b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson}
107b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
1081cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangleruint64_t VbExGetTimer(void)
1091cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
1101cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/*
1111cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * Exponential-ish rather than linear time, so that subtracting any
1121cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * two mock values will yield a unique result.
1131cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 */
1141cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	uint64_t new_timer = mock_timer * 2 + 1;
1151cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbAssert(new_timer > mock_timer);  /* Make sure we don't overflow */
1161cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_timer = new_timer;
1171cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	return mock_timer;
118391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
119391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
1201cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangleruint32_t RollbackS3Resume(void)
1211cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
1221cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	return rollback_s3_retval;
123391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
124391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
125472d93c146403c0f95b656e182b972e15ff11835Shawn Nematbakhshuint32_t RollbackFirmwareSetup(int is_hw_dev,
126ec8df1628cd9cf236bf912dee7d4365d7977e697Bill Richardson                               int disable_dev_request,
12729e8807ea045e119e3adeaec40c5f8421901b6fbRandall Spangler                               int clear_tpm_owner_request,
128ec8df1628cd9cf236bf912dee7d4365d7977e697Bill Richardson                               /* two outputs on success */
1291cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler                               int *is_virt_dev, uint32_t *version)
1301cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
131723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	rfs_clear_tpm_request = clear_tpm_owner_request;
132723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	rfs_disable_dev_request = disable_dev_request;
133723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
1341cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	*is_virt_dev = mock_virt_dev_sw;
1351cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	*version = mock_tpm_version;
1361cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	return mock_rfs_retval;
137b75d8adcc01f08cf5a6d87b78aeb1d7cdfcd22afBill Richardson}
138b75d8adcc01f08cf5a6d87b78aeb1d7cdfcd22afBill Richardson
139391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler/****************************************************************************/
140391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler/* Test VbInit() and check expected return value and recovery reason */
1411cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
142391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spanglerstatic void TestVbInit(VbError_t expected_retval,
1431cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler                       uint8_t expected_recovery, const char *desc)
1441cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
1451cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	uint32_t rr = 256;
146391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
1471cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(VbInit(&cparams, &iparams), expected_retval, desc);
1481cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvGet(&vnc, VBNV_RECOVERY_REQUEST, &rr);
1491cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(rr, expected_recovery, "  (recovery request)");
150391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
151391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
152391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler/****************************************************************************/
153391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
1541cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spanglerstatic void VbInitTest(void)
1551cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
1561cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	uint32_t u;
1571cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
1581cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Test passing in too small a shared data area */
1591cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
1601cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	cparams.shared_data_size = VB_SHARED_DATA_MIN_SIZE - 1;
1611cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(VBERROR_INIT_SHARED_DATA, 0, "Shared data too small");
1621cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
1631cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Normal call; dev=0 rec=0 */
1641cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
1651cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Normal call");
1661cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->timer_vb_init_enter, 21, "  time enter");
1671cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->timer_vb_init_exit, 43, "  time exit");
1681cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, 0, "  shared flags");
1691cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags, 0, "  out flags");
1701cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(nv_write_called, 0,
1711cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  NV write not called since nothing changed");
1721cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
1731cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* If NV data is trashed, we initialize it */
1741cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
1751cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
1761cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/*
1771cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * Note that we're not doing a VbNvTeardown(), so the CRC hasn't been
1781cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * regenerated yet.  So VbInit() should ignore the corrupted recovery
1791cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * value and boot normally.
1801cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 */
1811cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "NV data trashed");
1821cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(nv_write_called, 1, "  NV write called");
1831cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
1841cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/*
1851cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * Test boot switch flags which are just passed through to shared
1861cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * flags, and don't have an effect on VbInit().
1871cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 */
1881cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
1891cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_WP_ENABLED;
1901cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Flags test WP");
1911cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_WP_ENABLED,
192723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		"  shared flags");
1931cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
1941cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
1951cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_SW_WP_ENABLED;
1961cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Flags test SW WP");
1971cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_FIRMWARE_SW_WP_ENABLED,
198723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		"  shared flags");
1991cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2001cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2011cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_RO_NORMAL_SUPPORT;
2021cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "  flags test RO normal");
2031cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_RO_NORMAL_SUPPORT,
204723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		"  shared flags");
205723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
206723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
207723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	iparams.flags = VB_INIT_FLAG_EC_SOFTWARE_SYNC;
208723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "  flags test EC software sync");
209723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(shared->flags, VBSD_EC_SOFTWARE_SYNC, "  shared flags");
210723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
211723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
212723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	iparams.flags = VB_INIT_FLAG_EC_SLOW_UPDATE;
213723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "  flags test EC slow update");
214723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(shared->flags, VBSD_EC_SLOW_UPDATE, "  shared flags");
2151cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2161cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* S3 resume */
2171cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2181cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_S3_RESUME;
2191cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
2201cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
2211cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* S3 resume doesn't clear the recovery request (or act on it) */
2221cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 123, "S3 resume");
2231cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_S3_RESUME, "  shared flags S3");
2241cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags, 0, "  out flags");
2251cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 0,
2261cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  S3 doesn't look at recovery request");
2271cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2281cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* S3 resume with TPM resume error */
2291cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2301cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_S3_RESUME;
2311cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	rollback_s3_retval = 1;
2321cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* S3 resume doesn't clear the recovery request (or act on it) */
2331cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(VBERROR_TPM_S3_RESUME, 0, "S3 resume rollback error");
2341cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2351cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/*
2361cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * Normal boot doesn't care about TPM resume error because it doesn't
2371cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * call RollbackS3Resume().
2381cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 */
2391cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2401cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	rollback_s3_retval = 1;
2411cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Normal doesn't S3 resume");
2421cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2431cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* S3 resume with debug reset */
2441cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2451cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_S3_RESUME;
2461cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
2471cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
2481cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "S3 debug reset");
2491cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags, VB_INIT_OUT_S3_DEBUG_BOOT, "  out flags");
2501cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u);
2511cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(u, 0, "  S3 clears nv debug reset mode");
2521cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2531cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Normal boot clears S3 debug reset mode; doesn't set output flag */
2541cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2551cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
2561cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
2571cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Normal with debug reset mode");
2581cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags, 0, "  out flags");
2591cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvGet(&vnc, VBNV_DEBUG_RESET_MODE, &u);
2601cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(u, 0, "  normal clears nv debug reset mode");
2611cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2621cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/*
2631cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * S3 resume with debug reset is a normal boot, so doesn't resume the
2641cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 * TPM.
2651cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	 */
2661cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2671cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_S3_RESUME;
2681cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	rollback_s3_retval = 1;
2691cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_DEBUG_RESET_MODE, 1);
2701cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
2711cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "S3 debug reset rollback error");
2721cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2731cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Developer mode */
2741cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2751cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
2761cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Dev mode on");
2771cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
2781cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
2791cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
2801cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
2811cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE |
2821cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DEVELOPER |
2831cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_ALTERNATE_OS, "  out flags");
2841cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, "  shared flags");
2851cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
2861cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Developer mode forced by GBB flag */
2871cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
2881cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = 0;
2891cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	gbb.flags = GBB_FLAG_FORCE_DEV_SWITCH_ON;
2901cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Dev mode via GBB");
2911cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
2921cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
2931cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
2941cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
2951cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE |
2961cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DEVELOPER |
2971cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_ALTERNATE_OS, "  out flags");
2981cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, "  shared flags");
2991cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
300723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* Developer mode when option ROM matters and isn't loaded */
301723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
302723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON |
303723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_FLAG_OPROM_MATTERS;
304723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Dev mode need oprom");
305723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
306723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(u, 1, "  oprom requested");
307723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
308723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* Developer mode when option ROM matters and is already loaded */
309723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
310723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON |
311723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED;
312723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "Dev mode has oprom");
313723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
314723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* Normal mode when option ROM matters and is loaded */
315723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
316723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1);
317723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvTeardown(&vnc);
318723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	iparams.flags = VB_INIT_FLAG_OPROM_MATTERS | VB_INIT_FLAG_OPROM_LOADED;
319723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(VBERROR_VGA_OPROM_MISMATCH, 0, "Normal mode with oprom");
320723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
321723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(u, 0, "  oprom not requested");
322723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
323723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* Option ROMs can be forced by GBB flag */
324723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
325723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	gbb.flags = GBB_FLAG_LOAD_OPTION_ROMS;
326723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "GBB load option ROMs");
327723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(iparams.out_flags, VB_INIT_OUT_ENABLE_OPROM, "  out flags");
328723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
329723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* If requiring signed only, don't enable alternate OS by default */
330723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
331723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
332723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvTeardown(&vnc);
333723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
334723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "Dev signed only");
335723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(iparams.out_flags,
336723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
337723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
338723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE |
339723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_ENABLE_DEVELOPER, "  out flags");
340723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
341723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* But that can be overridden by the GBB */
342723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
343723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
344723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvTeardown(&vnc);
345723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
346723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS;
347723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "Force option ROMs via GBB");
348723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(iparams.out_flags,
349723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
350723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
351723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE |
352723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_ENABLE_DEVELOPER |
353723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler		VB_INIT_OUT_ENABLE_ALTERNATE_OS, "  out flags");
354723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
355723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* The GBB override is ignored in normal mode */
356723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
357723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	gbb.flags = GBB_FLAG_ENABLE_ALTERNATE_OS;
358723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "Normal mode ignores forcing option ROMs via GBB");
359723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(iparams.out_flags, 0, "  out flags");
360723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
3611cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Recovery mode from NV storage */
3621cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
3631cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
3641cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
3651cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Recovery mode - from nv");
3661cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 123, "  recovery reason");
3671cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
3681cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_RECOVERY |
3691cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
3701cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
3711cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE, "  out flags");
3721cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, 0, "  shared flags");
3731cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
3741cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Recovery mode from recovery button */
3751cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
3761cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
3771cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Recovery mode - button");
3781cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
3791cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  recovery reason");
3801cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
3811cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_RECOVERY |
3821cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
3831cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
3841cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE, "  out flags");
3851cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_REC_SWITCH_ON, "  shared flags");
3861cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
3871cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Recovery button reason supersedes NV reason */
3881cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
3891cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
3901cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
3911cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
3921cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Recovery mode - button AND nv");
3931cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
3941cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  recovery reason");
3951cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
3961cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Recovery mode from previous boot fail */
3971cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
3981cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL;
3991cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Recovery mode - previous boot fail");
4001cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_FIRMWARE,
4011cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  recovery reason");
4021cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
4031cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_RECOVERY |
4041cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
4051cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
4061cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE, "  out flags");
4071cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, 0, "  shared flags");
4081cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
4091cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Recovery mode from NV supersedes previous boot fail */
4101cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
4111cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_PREVIOUS_BOOT_FAIL;
4121cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, 123);
4131cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
4141cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Recovery mode - previous boot fail AND nv");
4151cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 123, "  recovery reason");
4161cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
4171cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Dev + recovery = recovery */
4181cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
4191cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED |
4201cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_FLAG_DEV_SWITCH_ON;
4211cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Recovery mode - button");
4221cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, VBNV_RECOVERY_RO_MANUAL,
4231cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  recovery reason");
4241cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
4251cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_RECOVERY |
4261cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
4271cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
4281cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE, "  out flags");
4291cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags,
4301cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VBSD_BOOT_REC_SWITCH_ON | VBSD_BOOT_DEV_SWITCH_ON,
4311cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  shared flags");
432391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
433391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
4341cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spanglerstatic void VbInitTestTPM(void)
4351cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
436723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	uint32_t u;
437723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
4381cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Rollback setup needs to reboot */
4391cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
4401cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_rfs_retval = TPM_E_MUST_REBOOT;
4411cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, 0,
4421cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		   "Rollback TPM reboot (rec=0)");
4431cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
4441cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_rfs_retval = TPM_E_MUST_REBOOT;
4451cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_REC_BUTTON_PRESSED;
4461cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(VBERROR_TPM_REBOOT_REQUIRED, VBNV_RECOVERY_RO_TPM_REBOOT,
4471cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		   "Rollback TPM reboot, in recovery, first time");
4481cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Ignore if we already tried rebooting */
4491cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
4501cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_rfs_retval = TPM_E_MUST_REBOOT;
4511cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_RO_TPM_REBOOT);
4521cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
4531cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Rollback TPM reboot, in recovery, already retried");
4541cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->fw_version_tpm, 0x10001, "  shared fw_version_tpm");
4551cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
4561cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Other rollback setup errors */
4571cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
4581cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_rfs_retval = TPM_E_IOERROR;
4591cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_tpm_version = 0x20002;
4601cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(VBERROR_TPM_FIRMWARE_SETUP, VBNV_RECOVERY_RO_TPM_S_ERROR,
4611cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		   "Rollback TPM setup error - not in recovery");
4621cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->fw_version_tpm, 0, "  shared fw_version_tpm not set");
4631cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
4641cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_rfs_retval = TPM_E_IOERROR;
4651cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvSet(&vnc, VBNV_RECOVERY_REQUEST, VBNV_RECOVERY_US_TEST);
4661cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbNvTeardown(&vnc);
4671cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "Rollback TPM setup error ignored in recovery");
4681cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->fw_version_tpm, 0x10001, "  shared fw_version_tpm");
4691cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
4701cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Virtual developer switch, but not enabled. */
4711cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
472723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
473723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvTeardown(&vnc);
4741cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH;
4751cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "TPM Dev mode off");
4761cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
4771cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags, 0, "  out flags");
4781cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_HONOR_VIRT_DEV_SWITCH, "  shared flags");
479723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u);
480723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(u, 0, "  disable dev request");
4811cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
4821cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Virtual developer switch, enabled. */
4831cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
484723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
485723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvTeardown(&vnc);
4861cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_VIRTUAL_DEV_SWITCH;
4871cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_virt_dev_sw = 1;
4881cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "TPM Dev mode on");
4891cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
4901cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
4911cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
4921cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
4931cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE |
4941cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DEVELOPER |
4951cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_ALTERNATE_OS, "  out flags");
4961cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags,
4971cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VBSD_BOOT_DEV_SWITCH_ON | VBSD_HONOR_VIRT_DEV_SWITCH,
4981cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		"  shared flags");
499723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* Disable-request doesn't get cleared because dev mode is still on */
500723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvGet(&vnc, VBNV_DISABLE_DEV_REQUEST, &u);
501723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(u, 1, "  disable dev request");
502723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* Disable request was passed on to RollbackFirmwareSetup() */
503723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(rfs_disable_dev_request, 1, "  rfs disable dev");
5041cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
5051cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* Ignore virtual developer switch, even though enabled. */
5061cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
5071cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	mock_virt_dev_sw = 1;
5081cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "TPM Dev mode on but ignored");
5091cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
5101cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags, 0, "  out flags");
5111cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, 0, "  shared flags");
5121cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler
5131cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	/* HW dev switch on, no virtual developer switch */
5141cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	ResetMocks();
5151cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
5161cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TestVbInit(0, 0, "HW Dev mode on");
5171cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
5181cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(iparams.out_flags,
5191cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_CLEAR_RAM |
5201cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DISPLAY |
5211cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_USB_STORAGE |
5221cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_DEVELOPER |
5231cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler		VB_INIT_OUT_ENABLE_ALTERNATE_OS, "  out flags");
5241cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, "  shared flags");
525723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler
526723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	/* Check TPM owner clear request */
527723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	ResetMocks();
528723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvSet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, 1);
529723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvTeardown(&vnc);
530723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TestVbInit(0, 0, "TPM clear owner");
531723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_REQUEST, &u);
532723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(u, 0, "  tpm clear request");
533723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	VbNvGet(&vnc, VBNV_CLEAR_TPM_OWNER_DONE, &u);
534723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(u, 1, "  tpm clear request");
535723aed378cabcf347a8acdf1ccc920bebb478d24Randall Spangler	TEST_EQ(rfs_clear_tpm_request, 1, "rfs tpm clear request");
536b75d8adcc01f08cf5a6d87b78aeb1d7cdfcd22afBill Richardson}
537b75d8adcc01f08cf5a6d87b78aeb1d7cdfcd22afBill Richardson
538b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardsonstatic void VbInitTestBackup(void)
539b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson{
540b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvContext tmp_vnc;
541b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	uint32_t u, nv_w, bu_r;
542b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
543b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	ResetMocks();
544b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Normal mode call */
545b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "normal mode, no backup");
546b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, 0, "  shared flags");
547b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags, 0, "  out flags");
548b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(nv_write_called, 0,
549b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		"  NV write not called since nothing changed");
550b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
551b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	ResetMocks();
552b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Now set some params that should be backed up. */
553b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_KERNEL_FIELD, 0xaabbccdd);
554b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 0xa5);
555b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_DEV_BOOT_USB, 1);
556b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_DEV_BOOT_LEGACY, 1);
557b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
558b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* and some that don't */
559b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1);
560b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_TRY_B_COUNT, 3);
561b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Make sure they're clean */
562b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvTeardown(&vnc);
563b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Normal mode call */
564b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "normal mode, some backup");
565b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, 0, "  shared flags");
566b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags, 0, "  out flags");
567b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(nv_write_called, 1,
568b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		"  Write NV because things have changed");
569b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Some fields should be unchanged */
570b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_KERNEL_FIELD, &u);
571b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0xaabbccdd, "  NV kernel field");
572b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
573b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0xa5, "  NV localization index");
574b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
575b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  NV oprom_needed");
576b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u);
577b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 3, "  NV try_b_count");
578b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* But normal mode should have cleared the DEV_BOOT flags */
579b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_USB, &u);
580b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  NV dev_boot_usb");
581b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_LEGACY, &u);
582b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  NV dev_boot_legacy");
583b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u);
584b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  NV dev_boot_signed_only");
585b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* So we should have written the backup */
586b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_write_called, 1, "  Backup written once");
587b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* And the backup should reflect the persisent flags. */
588b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	Memset(&tmp_vnc, 0, sizeof(tmp_vnc));
589b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(0, RestoreNvFromBackup(&tmp_vnc), "read from backup");
590b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_KERNEL_FIELD, &u);
591b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0xaabbccdd, "  BU kernel field");
592b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_LOCALIZATION_INDEX, &u);
593b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0xa5, "  BU localization index");
594b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_USB, &u);
595b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU dev_boot_usb");
596b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_LEGACY, &u);
597b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU dev_boot_legacy");
598b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u);
599b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU dev_boot_signed_only");
600b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* but not the others */
601b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_OPROM_NEEDED, &u);
602b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU oprom_needed");
603b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_TRY_B_COUNT, &u);
604b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU try_b_count");
605b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
606b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/*
607b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	 * If we change one of the non-backed-up NVRAM params and try
608b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	 * again, we shouldn't need to backup again.
609b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	 */
610b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_OPROM_NEEDED, 0);
611b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_TRY_B_COUNT, 2);
612b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Make sure they're clean */
613b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvTeardown(&vnc);
614b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Normal mode call */
615b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "normal mode, expect no backup");
616b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, 0, "  shared flags");
617b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags, 0, "  out flags");
618b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_write_called, 1, "  Backup still only written once");
619b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
620b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Now switch to dev-mode. */
621b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	iparams.flags = VB_INIT_FLAG_DEV_SWITCH_ON;
622b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "Dev mode on");
623b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
624b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags,
625b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_CLEAR_RAM |
626b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DISPLAY |
627b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_USB_STORAGE |
628b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DEVELOPER |
629b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_ALTERNATE_OS, "  out flags");
630b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, "  shared flags");
631b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_write_called, 1, "  Still only one backup");
632b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
633b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Now change some params that should be backed up. */
634b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_KERNEL_FIELD, 0xdeadbeef);
635b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_LOCALIZATION_INDEX, 0x5a);
636b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_DEV_BOOT_USB, 1);
637b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_DEV_BOOT_LEGACY, 1);
638b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, 1);
639b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* and some that don't */
640b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_OPROM_NEEDED, 1);
641b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_TRY_B_COUNT, 4);
642b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Make sure they're clean */
643b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvTeardown(&vnc);
644b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "Dev mode on");
645b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
646b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags,
647b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_CLEAR_RAM |
648b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DISPLAY |
649b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_USB_STORAGE |
650b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DEVELOPER, "  out flags");
651b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, "  shared flags");
652b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_write_called, 1, "  Once more, one backup");
653b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
654b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* But if we explictly request a backup, they'll get saved. */
655b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvSet(&vnc, VBNV_BACKUP_NVRAM_REQUEST, 1);
656b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvTeardown(&vnc);
657b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "Dev mode on");
658b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
659b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags,
660b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_CLEAR_RAM |
661b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DISPLAY |
662b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_USB_STORAGE |
663b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DEVELOPER, "  out flags");
664b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, "  shared flags");
665b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_write_called, 2, "  Two backups now");
666b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_BACKUP_NVRAM_REQUEST, &u);
667b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  backup_request cleared");
668b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* Quick check that the non-backed-up stuff is still valid */
669b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
670b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  NV oprom_needed");
671b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u);
672b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 4, "  NV try_b_count");
673b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* But only the stuff we care about was backed up */
674b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	Memset(&tmp_vnc, 0, sizeof(tmp_vnc));
675b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(0, RestoreNvFromBackup(&tmp_vnc), "read from backup");
676b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_KERNEL_FIELD, &u);
677b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0xdeadbeef, "  BU kernel field");
678b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_LOCALIZATION_INDEX, &u);
679b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0x5a, "  BU localization index");
680b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_USB, &u);
681b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  BU dev_boot_usb");
682b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_LEGACY, &u);
683b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  BU dev_boot_legacy");
684b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u);
685b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  BU dev_boot_signed_only");
686b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* but not the others */
687b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_OPROM_NEEDED, &u);
688b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU oprom_needed");
689b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&tmp_vnc, VBNV_TRY_B_COUNT, &u);
690b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU try_b_count");
691b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
692b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* If we lose the NV storage, the backup bits will be restored */
693b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	vnc.raw[0] = 0;
694b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	bu_r = backup_read_called;
695b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	nv_w = nv_write_called;
696b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "Dev mode on");
697b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
698b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags,
699b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_CLEAR_RAM |
700b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DISPLAY |
701b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_USB_STORAGE |
702b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson		VB_INIT_OUT_ENABLE_DEVELOPER, "  out flags");
703b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, VBSD_BOOT_DEV_SWITCH_ON, "  shared flags");
704b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_write_called, 2, "  Still just two backups now");
705b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_read_called, bu_r + 1, "  One more backup read");
706b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(nv_write_called, nv_w + 1, "  One more NV write");
707b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* The non-backed-up stuff is reset to defaults */
708b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
709b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  NV oprom_needed");
710b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u);
711b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  NV try_b_count");
712b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* And the backed up stuff is restored */
713b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_KERNEL_FIELD, &u);
714b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0xdeadbeef, "  BU kernel field");
715b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
716b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0x5a, "  BU localization index");
717b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_USB, &u);
718b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  BU dev_boot_usb");
719b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_LEGACY, &u);
720b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  BU dev_boot_legacy");
721b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u);
722b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 1, "  BU dev_boot_signed_only");
723b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
724b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/*
725b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	 * But if we lose the NV storage and go back to normal mode at the same
726b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	 * time, then the DEV_BOOT_* flags will be cleared.
727b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	 */
728b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	vnc.raw[0] = 0;
729b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	bu_r = backup_read_called;
730b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	nv_w = nv_write_called;
731b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	iparams.flags = 0;
732b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TestVbInit(0, 0, "Back to normal mode");
733b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->recovery_reason, 0, "  recovery reason");
734b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(iparams.out_flags, 0, "  out flags");
735b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(shared->flags, 0, "  shared flags");
736b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* We read twice: once to restore, once for read-prior-to-write */
737b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_read_called, bu_r + 2, "  Two more backup reads");
738b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(backup_write_called, 3, "  Backup write due clearing DEV_*");
739b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(nv_write_called, nv_w + 1, "  One more NV write");
740b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* The non-backed-up stuff is reset to defaults */
741b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_OPROM_NEEDED, &u);
742b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  NV oprom_needed");
743b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_TRY_B_COUNT, &u);
744b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  NV try_b_count");
745b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* And the backed up stuff is restored */
746b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_KERNEL_FIELD, &u);
747b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0xdeadbeef, "  BU kernel field");
748b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_LOCALIZATION_INDEX, &u);
749b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0x5a, "  BU localization index");
750b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	/* But not the DEV_BOOT_* flags */
751b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_USB, &u);
752b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU dev_boot_usb");
753b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_LEGACY, &u);
754b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU dev_boot_legacy");
755b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &u);
756b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	TEST_EQ(u, 0, "  BU dev_boot_signed_only");
757b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson}
758b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
759b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson
7601cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spanglerint main(int argc, char *argv[])
7611cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler{
7621cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbInitTest();
7631cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	VbInitTestTPM();
764b64f097891e697eaf3b2794baae934f8b4d82d14Bill Richardson	VbInitTestBackup();
765391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler
7661cbf705405fc6d612ab6e0dcba0740ca3bce8da1Randall Spangler	return gTestSuccess ? 0 : 255;
767391b31024ddb3b04ee7c3970249c67fa48586bf4Randall Spangler}
768