vboot_nvstorage.h revision 0c3ba249abb1dc60f5ebabccf84ff13206440b83
1a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/* Copyright (c) 2013 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 6a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/* Non-volatile storage routines for verified boot. */ 7b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 8b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler#ifndef VBOOT_REFERENCE_NVSTORAGE_H_ 9b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler#define VBOOT_REFERENCE_NVSTORAGE_H_ 100c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include <stdint.h> 11b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 129e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_BLOCK_SIZE 16 /* Size of NV storage block in bytes */ 13b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 14b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglertypedef struct VbNvContext { 15a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Raw NV data. Caller must fill this before calling VbNvSetup(). */ 16a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler uint8_t raw[VBNV_BLOCK_SIZE]; 17a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 18a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Flag indicating whether raw data has changed. Set by VbNvTeardown() 19a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * if the raw data has changed and needs to be stored to the underlying 20a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * non-volatile data store. 21a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 22a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler int raw_changed; 23b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 24a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 25a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Internal data for NV storage routines. Caller should not touch 26a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * these fields. 27a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 28a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler int regenerate_crc; 29b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler} VbNvContext; 30b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 31b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler/* Parameter type for VbNvGet(), VbNvSet(). */ 32b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spanglertypedef enum VbNvParam { 33a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 34a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Parameter values have been reset to defaults (flag for firmware). 35a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 0=clear; 1=set. 36a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 37a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_FIRMWARE_SETTINGS_RESET = 0, 38a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 39a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Parameter values have been reset to defaults (flag for kernel). 40a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 0=clear; 1=set. 41a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 42a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_KERNEL_SETTINGS_RESET, 43a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Request debug reset on next S3->S0 transition. 0=clear; 1=set. */ 44a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_DEBUG_RESET_MODE, 45a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 46a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Number of times to try booting RW firmware slot B before slot A. 47a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Valid range: 0-15. 48a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 49a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_TRY_B_COUNT, 50a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 51a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Request recovery mode on next boot; see VBNB_RECOVERY_* below for 52a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * currently defined reason codes. 8-bit value. 53a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 54a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_RECOVERY_REQUEST, 55a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 56a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Localization index for screen bitmaps displayed by firmware. 57a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 8-bit value. 58a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 59a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_LOCALIZATION_INDEX, 60a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Field reserved for kernel/user-mode use; 32-bit value. */ 61a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_KERNEL_FIELD, 62a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Allow booting from USB in developer mode. 0=no, 1=yes. */ 63a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_DEV_BOOT_USB, 64a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Allow booting of legacy OSes in developer mode. 0=no, 1=yes. */ 65a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_DEV_BOOT_LEGACY, 66a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Only boot Google-signed images in developer mode. 0=no, 1=yes. */ 67a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_DEV_BOOT_SIGNED_ONLY, 68a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 69a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Set by userspace to request that RO firmware disable dev-mode on the 70a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * next boot. This is likely only possible if the dev-switch is 71a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * virtual. 72a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 73a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_DISABLE_DEV_REQUEST, 74a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* 75a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Set and cleared by vboot to request that the video Option ROM be 76a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * loaded at boot time, so that BIOS screens can be displayed. 0=no, 77a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 1=yes. 78a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 79a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_OPROM_NEEDED, 80a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Request that the firmware clear the TPM owner on the next boot. */ 81a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_CLEAR_TPM_OWNER_REQUEST, 82a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* Flag that TPM owner was cleared on request. */ 83a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_CLEAR_TPM_OWNER_DONE, 84a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler /* More details on recovery reason */ 85a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler VBNV_RECOVERY_SUBCODE, 86b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler} VbNvParam; 87b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 889e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Recovery reason codes for VBNV_RECOVERY_REQUEST */ 899e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Recovery not requested. */ 909e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_NOT_REQUESTED 0x00 91a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/* 92a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Recovery requested from legacy utility. (Prior to the NV storage spec, 93a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * recovery mode was a single bitfield; this value is reserved so that scripts 94a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * which wrote 1 to the recovery field are distinguishable from scripts whch 95a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * use the recovery reasons listed here. 96a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 979e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_LEGACY 0x01 989e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* User manually requested recovery via recovery button */ 999e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_MANUAL 0x02 1009e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* RW firmware failed signature check (neither RW firmware slot was valid) */ 1019e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_INVALID_RW 0x03 1029e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* S3 resume failed */ 1039e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_S3_RESUME 0x04 104640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM error in read-only firmware (deprecated) */ 105640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_DEP_RO_TPM_ERROR 0x05 10695c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler/* Shared data error in read-only firmware */ 10795c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler#define VBNV_RECOVERY_RO_SHARED_DATA 0x06 108b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from S3Resume() */ 109b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RO_TEST_S3 0x07 110b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from LoadFirmwareSetup() */ 111b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RO_TEST_LFS 0x08 112b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from LoadFirmware() */ 113b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RO_TEST_LF 0x09 114a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/* 115a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * RW firmware failed signature check (neither RW firmware slot was valid). 1169243e616d727c3e57525f8dec2b5f22840900451Randall Spangler * Recovery reason is VBNV_RECOVERY_RO_INVALID_RW_CHECK_MIN + the check value 1179243e616d727c3e57525f8dec2b5f22840900451Randall Spangler * for the slot which came closest to validating; see VBSD_LF_CHECK_* in 118a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * vboot_struct.h. 119a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 1209243e616d727c3e57525f8dec2b5f22840900451Randall Spangler#define VBNV_RECOVERY_RO_INVALID_RW_CHECK_MIN 0x10 1219243e616d727c3e57525f8dec2b5f22840900451Randall Spangler#define VBNV_RECOVERY_RO_INVALID_RW_CHECK_MAX 0x1F 122a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/* 123a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Firmware boot failure outside of verified boot (RAM init, missing SSD, 124a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * etc.). 125a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 1269619112a574b975476667545e3a326052fa0c50bRandall Spangler#define VBNV_RECOVERY_RO_FIRMWARE 0x20 127a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/* 128a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Recovery mode TPM initialization requires a system reboot. The system was 129a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * already in recovery mode for some other reason when this happened. 130a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 131ad03a439bc97523e03d19aa1dcd568744d60889cRandall Spangler#define VBNV_RECOVERY_RO_TPM_REBOOT 0x21 132584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - other error */ 133d4faa060cc6445cf532e3f9c9cd785e0726f1b82Randall Spangler#define VBNV_RECOVERY_EC_SOFTWARE_SYNC 0x22 134584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - unable to determine active EC image */ 135d4faa060cc6445cf532e3f9c9cd785e0726f1b82Randall Spangler#define VBNV_RECOVERY_EC_UNKNOWN_IMAGE 0x23 136640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* EC software sync - error obtaining EC image hash (deprecated) */ 137640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_DEP_EC_HASH 0x24 138584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - error obtaining expected EC image */ 139584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_EXPECTED_IMAGE 0x25 140584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - error updating EC */ 141584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_UPDATE 0x26 142584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - unable to jump to EC-RW */ 143584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_JUMP_RW 0x27 144584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler/* EC software sync - unable to protect / unprotect EC-RW */ 145584e0d2070aca1a5e091442cb9bad0726451ad95Randall Spangler#define VBNV_RECOVERY_EC_PROTECT 0x28 1465ca4ea087a3d67c2a639e8b9254f51f076bf85faRandall Spangler/* EC software sync - error obtaining expected EC hash */ 1475ca4ea087a3d67c2a639e8b9254f51f076bf85faRandall Spangler#define VBNV_RECOVERY_EC_EXPECTED_HASH 0x29 1485ca4ea087a3d67c2a639e8b9254f51f076bf85faRandall Spangler/* EC software sync - expected EC image doesn't match hash */ 1495ca4ea087a3d67c2a639e8b9254f51f076bf85faRandall Spangler#define VBNV_RECOVERY_EC_HASH_MISMATCH 0x2A 1509e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in read-only firmware */ 1519e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RO_UNSPECIFIED 0x3F 152a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/* 153a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * User manually requested recovery by pressing a key at developer 154a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * warning screen 155a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 1569e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_DEV_SCREEN 0x41 1579e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* No OS kernel detected */ 1589e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_NO_OS 0x42 1599e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* OS kernel failed signature check */ 1609e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_INVALID_OS 0x43 161640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM error in rewritable firmware (deprecated) */ 162640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_DEP_RW_TPM_ERROR 0x44 163640fb51d866e7ac8a92f61a2f69145bfe6b13699Randall Spangler/* RW firmware in dev mode, but dev switch is off */ 164640fb51d866e7ac8a92f61a2f69145bfe6b13699Randall Spangler#define VBNV_RECOVERY_RW_DEV_MISMATCH 0x45 16595c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler/* Shared data error in rewritable firmware */ 16695c4031ce903258036beeed0705d25c7e9d25da0Randall Spangler#define VBNV_RECOVERY_RW_SHARED_DATA 0x46 167b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler/* Test error from LoadKernel() */ 168b17e8d353c50d46f0e5f29578f6294003692ea1dRandall Spangler#define VBNV_RECOVERY_RW_TEST_LK 0x47 169640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* No bootable disk found (deprecated)*/ 170640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_DEP_RW_NO_DISK 0x48 171d2852eabf6da8bd36ba898c9b375f0480fab02d2Luigi Semenzato/* Rebooting did not correct TPM_E_FAIL or TPM_E_FAILEDSELFTEST */ 172d2852eabf6da8bd36ba898c9b375f0480fab02d2Luigi Semenzato#define VBNV_RECOVERY_TPM_E_FAIL 0x49 173640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM setup error in read-only firmware */ 174640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RO_TPM_S_ERROR 0x50 175640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM write error in read-only firmware */ 176640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RO_TPM_W_ERROR 0x51 177640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM lock error in read-only firmware */ 178640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RO_TPM_L_ERROR 0x52 179640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM update error in read-only firmware */ 180640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RO_TPM_U_ERROR 0x53 181640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM read error in rewritable firmware */ 182640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RW_TPM_R_ERROR 0x54 183640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM write error in rewritable firmware */ 184640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RW_TPM_W_ERROR 0x55 185640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* TPM lock error in rewritable firmware */ 186640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RW_TPM_L_ERROR 0x56 187640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* EC software sync unable to get EC image hash */ 188640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_EC_HASH_FAILED 0x57 189640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* EC software sync invalid image hash size */ 190640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_EC_HASH_SIZE 0x58 191640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* Unspecified error while trying to load kernel */ 192640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_LK_UNSPECIFIED 0x59 193640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* No bootable storage device in system */ 194640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RW_NO_DISK 0x5A 195640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson/* No bootable kernel found on disk */ 196640b1c420748049c796b3f9d59406e38ff8f4774Bill Richardson#define VBNV_RECOVERY_RW_NO_KERNEL 0x5B 1979e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in rewritable firmware */ 1989e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_RW_UNSPECIFIED 0x7F 1999e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* DM-verity error */ 2009e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_KE_DM_VERITY 0x81 2019e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in kernel */ 2029e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_KE_UNSPECIFIED 0xBF 2039e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Recovery mode test from user-mode */ 2049e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_US_TEST 0xC1 2059e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler/* Unspecified/unknown error in user-mode */ 2069e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler#define VBNV_RECOVERY_US_UNSPECIFIED 0xFF 2079e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler 208a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/** 209a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Initialize the NV storage library. 210a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 211a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * This must be called before any other functions in this library. Returns 0 212a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * if success, non-zero if error. 213b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * 2149e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * Proper calling procedure: 2159e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 1) Allocate a context struct. 2169e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 2) If multi-threaded/multi-process, acquire a lock to prevent 2179e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * other processes from modifying the underlying storage. 2189e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 3) Read underlying storage and fill in context->raw. 2199e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 4) Call VbNvSetup(). 2209e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 221a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * If you have access to global variables, you may want to wrap all that in 222a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * your own VbNvOpen() function. We don't do that in here because there are no 223a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * global variables in UEFI BIOS during the PEI phase (that's also why we have 224a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * to pass around a context pointer). 225a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 226a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spanglerint VbNvSetup(VbNvContext *context); 227b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 228a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/** 229a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Clean up and flush changes back to the raw data. 230a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 231a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * This must be called after other functions in this library. Returns 0 if 232b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * success, non-zero if error. 233b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * 2349e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * Proper calling procedure: 2359e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 1) Call VbNvExit(). 2369e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 2) If context.raw_changed, write data back to underlying storage. 2379e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 3) Release any lock you acquired before calling VbNvSetup(). 2389e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 4) Free the context struct. 2399e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 240b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler * If you have access to global variables, you may want to wrap this 241a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * in your own VbNvClose() function. 242a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 243a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spanglerint VbNvTeardown(VbNvContext *context); 244b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 245a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/** 246a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Read a NV storage parameter into *dest. 2479e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 248a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Returns 0 if success, non-zero if error. 2499e162cdaa7433dff01d3e47ba3a47cb8b39ff3a1Randall Spangler * 250a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * This may only be called between VbNvSetup() and VbNvTeardown(). 251a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 252a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spanglerint VbNvGet(VbNvContext *context, VbNvParam param, uint32_t *dest); 253b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 254a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler/** 255a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Set a NV storage param to a new value. 256a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 257a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * Returns 0 if success, non-zero if error. 258a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * 259a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler * This may only be called between VbNvSetup() and VbNvTeardown(). 260a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spangler */ 261a2db67d204c0dd3d152ff54958bf42c5dbe394ffRandall Spanglerint VbNvSet(VbNvContext *context, VbNvParam param, uint32_t value); 262b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler 263b944534edd3799b3353f73bcb8ee90161d640c2bRandall Spangler#endif /* VBOOT_REFERENCE_NVSTORAGE_H_ */ 264