vboot_nvstorage.h revision 584e0d2070aca1a5e091442cb9bad0726451ad95
1c0e3742996a84d3c503cfa002b09a0831bcb2c32Randall Spangler/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * Use of this source code is governed by a BSD-style license that can be 3b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * found in the LICENSE file. 4b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler */ 5b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 69e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Non-volatile storage routines for verified boot. 7b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler */ 8b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 9b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler#ifndef VBOOT_REFERENCE_NVSTORAGE_H_ 10b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler#define VBOOT_REFERENCE_NVSTORAGE_H_ 11b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 129e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_BLOCK_SIZE 16 /* Size of NV storage block in bytes */ 13b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 14b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglertypedef struct VbNvContext { 15b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler /* Raw NV data. Caller must fill this before calling VbNvSetup(). */ 169e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler uint8_t raw[VBNV_BLOCK_SIZE]; 17b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler /* Flag indicating whether raw data has changed. Set by VbNvTeardown() if 18b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * the raw data has changed and needs to be stored to the underlying 19b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * non-volatile data store. */ 20b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler int raw_changed; 21b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 22b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler /* Internal data for NV storage routines. Caller should not touch 23b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * these fields. */ 24b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler int regenerate_crc; 25b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 26b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler} VbNvContext; 27b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 28b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 29b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler/* Parameter type for VbNvGet(), VbNvSet(). */ 30b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglertypedef enum VbNvParam { 319e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler /* Parameter values have been reset to defaults (flag for firmware). 329e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 0=clear; 1=set. */ 33b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler VBNV_FIRMWARE_SETTINGS_RESET = 0, 349e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler /* Parameter values have been reset to defaults (flag for kernel). 359e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 0=clear; 1=set. */ 36b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler VBNV_KERNEL_SETTINGS_RESET, 379e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler /* Request debug reset on next S3->S0 transition. 0=clear; 1=set. */ 38b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler VBNV_DEBUG_RESET_MODE, 399e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler /* Number of times to try booting RW firmware slot B before slot A. 409e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * Valid range: 0-15. */ 41b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler VBNV_TRY_B_COUNT, 429e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler /* Request recovery mode on next boot; see VBNB_RECOVERY_* below for 439e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * currently defined reason codes. 8-bit value. */ 44b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler VBNV_RECOVERY_REQUEST, 459e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler /* Localization index for screen bitmaps displayed by firmware. 469e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 8-bit value. */ 47b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler VBNV_LOCALIZATION_INDEX, 489e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler /* Field reserved for kernel/user-mode use; 32-bit value. */ 49b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler VBNV_KERNEL_FIELD, 50daa807c51ef6d5bf6599e649d1777432bea8a3e5Randall Spangler /* Allow booting from USB in developer mode. 0=no, 1=yes. */ 51daa807c51ef6d5bf6599e649d1777432bea8a3e5Randall Spangler VBNV_DEV_BOOT_USB, 527272a6951107251a5c9b26330c506319a92a54b3Bill Richardson /* Only boot Google-signed images in developer mode. 0=no, 1=yes. */ 537272a6951107251a5c9b26330c506319a92a54b3Bill Richardson VBNV_DEV_BOOT_SIGNED_ONLY, 5435d073362603c2c3f63974d04b4af9548297e208Bill Richardson /* Set by userspace to request that RO firmware disable dev-mode on the next 5535d073362603c2c3f63974d04b4af9548297e208Bill Richardson * boot. This is likely only possible if the dev-switch is virtual. */ 5635d073362603c2c3f63974d04b4af9548297e208Bill Richardson VBNV_DISABLE_DEV_REQUEST, 5717b8224ea582b2ba90b30a3e8e2d913e49c7818aBill Richardson /* Set and cleared by vboot to request that the video Option ROM be loaded at 5817b8224ea582b2ba90b30a3e8e2d913e49c7818aBill Richardson * boot time, so that BIOS screens can be displayed. 0=no, 1=yes. */ 5917b8224ea582b2ba90b30a3e8e2d913e49c7818aBill Richardson VBNV_OPROM_NEEDED, 60b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler} VbNvParam; 61b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 62b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 639e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Recovery reason codes for VBNV_RECOVERY_REQUEST */ 649e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Recovery not requested. */ 659e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_NOT_REQUESTED 0x00 669e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Recovery requested from legacy utility. (Prior to the NV storage 679e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * spec, recovery mode was a single bitfield; this value is reserved 689e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * so that scripts which wrote 1 to the recovery field are 699e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * distinguishable from scripts whch use the recovery reasons listed 709e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * here. */ 719e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_LEGACY 0x01 729e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* User manually requested recovery via recovery button */ 739e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_MANUAL 0x02 749e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* RW firmware failed signature check (neither RW firmware slot was valid) */ 759e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_INVALID_RW 0x03 769e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* S3 resume failed */ 779e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_S3_RESUME 0x04 789e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* TPM error in read-only firmware */ 799e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_TPM_ERROR 0x05 8095c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler/* Shared data error in read-only firmware */ 8195c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler#define VBNV_RECOVERY_RO_SHARED_DATA 0x06 82b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from S3Resume() */ 83b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RO_TEST_S3 0x07 84b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from LoadFirmwareSetup() */ 85b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RO_TEST_LFS 0x08 86b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from LoadFirmware() */ 87b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RO_TEST_LF 0x09 889243e616d727c3e57525f8dec2b5f22840900451Randall Spangler/* RW firmware failed signature check (neither RW firmware slot was valid). 899243e616d727c3e57525f8dec2b5f22840900451Randall Spangler * Recovery reason is VBNV_RECOVERY_RO_INVALID_RW_CHECK_MIN + the check value 909243e616d727c3e57525f8dec2b5f22840900451Randall Spangler * for the slot which came closest to validating; see VBSD_LF_CHECK_* in 919243e616d727c3e57525f8dec2b5f22840900451Randall Spangler * vboot_struct.h. */ 929243e616d727c3e57525f8dec2b5f22840900451Randall Spangler#define VBNV_RECOVERY_RO_INVALID_RW_CHECK_MIN 0x10 939243e616d727c3e57525f8dec2b5f22840900451Randall Spangler#define VBNV_RECOVERY_RO_INVALID_RW_CHECK_MAX 0x1F 949619112a574b975476667545e3a326052fa0c50bRandall Spangler/* Firmware boot failure outside of verified boot (RAM init, missing SSD, 959619112a574b975476667545e3a326052fa0c50bRandall Spangler * etc.). */ 969619112a574b975476667545e3a326052fa0c50bRandall Spangler#define VBNV_RECOVERY_RO_FIRMWARE 0x20 97ad03a439bc97523e03d19aa1dcd568744d60889cRandall Spangler/* Recovery mode TPM initialization requires a system reboot. The system was 98ad03a439bc97523e03d19aa1dcd568744d60889cRandall Spangler * already in recovery mode for some other reason when this happened. */ 99ad03a439bc97523e03d19aa1dcd568744d60889cRandall Spangler#define VBNV_RECOVERY_RO_TPM_REBOOT 0x21 100584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - other error */ 101d4faa060cc6445cf532e3f9c9cd785e0726f1b82Randall Spangler#define VBNV_RECOVERY_EC_SOFTWARE_SYNC 0x22 102584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - unable to determine active EC image */ 103d4faa060cc6445cf532e3f9c9cd785e0726f1b82Randall Spangler#define VBNV_RECOVERY_EC_UNKNOWN_IMAGE 0x23 104584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - error obtaining EC image hash */ 105584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_HASH 0x24 106584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - error obtaining expected EC image */ 107584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_EXPECTED_IMAGE 0x25 108584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - error updating EC */ 109584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_UPDATE 0x26 110584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - unable to jump to EC-RW */ 111584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_JUMP_RW 0x27 112584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - unable to protect / unprotect EC-RW */ 113584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_PROTECT 0x28 1149e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in read-only firmware */ 1159e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_UNSPECIFIED 0x3F 1169e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* User manually requested recovery by pressing a key at developer 1179e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * warning screen */ 1189e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_DEV_SCREEN 0x41 1199e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* No OS kernel detected */ 1209e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_NO_OS 0x42 1219e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* OS kernel failed signature check */ 1229e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_INVALID_OS 0x43 1239e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* TPM error in rewritable firmware */ 1249e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_TPM_ERROR 0x44 125640fb51d866e7ac8a92f61a2f69145bfe6b13699Randall Spangler/* RW firmware in dev mode, but dev switch is off */ 126640fb51d866e7ac8a92f61a2f69145bfe6b13699Randall Spangler#define VBNV_RECOVERY_RW_DEV_MISMATCH 0x45 12795c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler/* Shared data error in rewritable firmware */ 12895c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler#define VBNV_RECOVERY_RW_SHARED_DATA 0x46 129b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from LoadKernel() */ 130b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RW_TEST_LK 0x47 1317adcc60e6f5f6db081b9ad6e02288335502a0d77Randall Spangler/* No bootable disk found */ 1327adcc60e6f5f6db081b9ad6e02288335502a0d77Randall Spangler#define VBNV_RECOVERY_RW_NO_DISK 0x48 1339e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in rewritable firmware */ 1349e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_UNSPECIFIED 0x7F 1359e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* DM-verity error */ 1369e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_KE_DM_VERITY 0x81 1379e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in kernel */ 1389e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_KE_UNSPECIFIED 0xBF 1399e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Recovery mode test from user-mode */ 1409e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_US_TEST 0xC1 1419e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in user-mode */ 1429e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_US_UNSPECIFIED 0xFF 1439e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler 1449e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler 145b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler/* Initialize the NV storage library. This must be called before any 1469e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * other functions in this library. Returns 0 if success, non-zero if 147b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * error. 148b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * 1499e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * Proper calling procedure: 1509e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 1) Allocate a context struct. 1519e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 2) If multi-threaded/multi-process, acquire a lock to prevent 1529e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * other processes from modifying the underlying storage. 1539e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 3) Read underlying storage and fill in context->raw. 1549e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 4) Call VbNvSetup(). 1559e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 1569e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * If you have access to global variables, you may want to wrap all 1579e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * that in your own VbNvOpen() function. We don't do that in here 1589e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * because there are no global variables in UEFI BIOS during the PEI 1599e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * phase (that's also why we have to pass around a context pointer). */ 160b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglerint VbNvSetup(VbNvContext* context); 161b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 162b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler/* Clean up and flush changes back to the raw data. This must be 1639e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * called after other functions in this library. Returns 0 if 164b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * success, non-zero if error. 165b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * 1669e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * Proper calling procedure: 1679e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 1) Call VbNvExit(). 1689e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 2) If context.raw_changed, write data back to underlying storage. 1699e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 3) Release any lock you acquired before calling VbNvSetup(). 1709e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 4) Free the context struct. 1719e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 172b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * If you have access to global variables, you may want to wrap this 1739e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * in your own VbNvClose() function. */ 174b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglerint VbNvTeardown(VbNvContext* context); 175b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 176b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler/* Read a NV storage parameter into *dest. Returns 0 if success, 1779e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * non-zero if error. 1789e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 1799e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * This may only be called between VbNvSetup() and VbNvTeardown(). */ 180b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglerint VbNvGet(VbNvContext* context, VbNvParam param, uint32_t* dest); 181b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 182b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler/* Set a NV storage param to a new value. Returns 0 if success, 1839e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * non-zero if error. 1849e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 1859e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * This may only be called between VbNvSetup() and VbNvTeardown(). */ 186b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglerint VbNvSet(VbNvContext* context, VbNvParam param, uint32_t value); 187b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 188b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 189b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler#endif /* VBOOT_REFERENCE_NVSTORAGE_H_ */ 190