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