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