Home | History | Annotate | Download | only in include
      1 /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 /* APIs provided by firmware to vboot_reference.
      7  *
      8  * General notes:
      9  *
     10  * All verified boot functions now start with "Vb" for namespace clarity.  This
     11  * fixes the problem where uboot and vboot both defined assert().
     12  *
     13  * Verified boot APIs to be implemented by the calling firmware and exported to
     14  * vboot_reference start with "VbEx".
     15  *
     16  * TODO: split this file into a vboot_entry_points.h file which contains the
     17  * entry points for the firmware to call vboot_reference, and a
     18  * vboot_firmware_exports.h which contains the APIs to be implemented by the
     19  * calling firmware and exported to vboot_reference.
     20  */
     21 
     22 #ifndef VBOOT_REFERENCE_VBOOT_API_H_
     23 #define VBOOT_REFERENCE_VBOOT_API_H_
     24 #include <stdint.h>
     25 #include <stdlib.h>
     26 
     27 /*****************************************************************************/
     28 /* Error codes */
     29 
     30 /*
     31  * Functions which return an error all return this type.  This is a 32-bit
     32  * value rather than an int so it's consistent across UEFI, which is 32-bit
     33  * during PEI and 64-bit during DXE/BDS.
     34  */
     35 typedef uint32_t VbError_t;
     36 
     37 /*
     38  * Predefined error numbers.  Success is 0.  Errors are non-zero, but differ
     39  * between functions.  For example, the TPM functions may pass through TPM
     40  * error codes, some of which may be recoverable.
     41  */
     42 enum VbErrorPredefined_t {
     43 	/* No error; function completed successfully. */
     44 	VBERROR_SUCCESS                       = 0,
     45 
     46 	/*
     47 	 * The verified boot entry points VbInit(), VbSelectFirmware(),
     48 	 * VbSelectAndLoadKernel() may return the following errors.
     49 	 */
     50 	/* Unknown error */
     51 	VBERROR_UNKNOWN                       = 0x10000,
     52 	/* Unable to initialize shared data */
     53 	VBERROR_INIT_SHARED_DATA              = 0x10001,
     54 	/* Error resuming TPM during a S3 resume */
     55 	VBERROR_TPM_S3_RESUME                 = 0x10002,
     56 	/* VbSelectFirmware() failed to find a valid firmware */
     57 	VBERROR_LOAD_FIRMWARE                 = 0x10003,
     58 	/* Unable to write firmware versions to TPM */
     59 	VBERROR_TPM_WRITE_FIRMWARE            = 0x10004,
     60 	/* Unable to lock firmware versions in TPM */
     61 	VBERROR_TPM_LOCK_FIRMWARE             = 0x10005,
     62 	/* Unable to set boot mode state in TPM */
     63 	VBERROR_TPM_SET_BOOT_MODE_STATE       = 0x10006,
     64 	/* TPM requires reboot */
     65 	VBERROR_TPM_REBOOT_REQUIRED           = 0x10007,
     66 	/* Unable to set up TPM */
     67 	VBERROR_TPM_FIRMWARE_SETUP            = 0x10008,
     68 	/* Unable to read kernel versions from TPM */
     69 	VBERROR_TPM_READ_KERNEL               = 0x10009,
     70 	/* Attempt to load developer-only firmware with developer switch off */
     71 	VBERROR_DEV_FIRMWARE_SWITCH_MISMATCH  = 0x1000A,
     72 	/* Unable to write kernel versions to TPM */
     73 	VBERROR_TPM_WRITE_KERNEL              = 0x1000B,
     74 	/* Unable to lock kernel versions in TPM */
     75 	VBERROR_TPM_LOCK_KERNEL               = 0x1000C,
     76 	/* Calling firmware requested shutdown via VbExIsShutdownRequested() */
     77 	VBERROR_SHUTDOWN_REQUESTED            = 0x1000D,
     78 	/* Unable to find a boot device on which to look for a kernel */
     79 	VBERROR_NO_DISK_FOUND                 = 0x1000E,
     80 	/* No OS kernel found on any boot device */
     81 	VBERROR_NO_KERNEL_FOUND               = 0x1000F,
     82 	/* All OS kernels found were invalid (corrupt, improperly signed...) */
     83 	VBERROR_INVALID_KERNEL_FOUND          = 0x10010,
     84 	/* VbSelectAndLoadKernel() requested recovery mode */
     85 	VBERROR_LOAD_KERNEL_RECOVERY          = 0x10011,
     86 	/* Other error inside VbSelectAndLoadKernel() */
     87 	VBERROR_LOAD_KERNEL                   = 0x10012,
     88 	/* Invalid Google binary block */
     89 	VBERROR_INVALID_GBB                   = 0x10013,
     90 	/* Invalid bitmap volume */
     91 	VBERROR_INVALID_BMPFV                 = 0x10014,
     92 	/* Invalid screen index */
     93 	VBERROR_INVALID_SCREEN_INDEX          = 0x10015,
     94 	/* Simulated (test) error */
     95 	VBERROR_SIMULATED                     = 0x10016,
     96 	/* Invalid parameter */
     97 	VBERROR_INVALID_PARAMETER             = 0x10017,
     98 	/* VbExBeep() can't make sounds at all */
     99 	VBERROR_NO_SOUND                      = 0x10018,
    100 	/* VbExBeep() can't make sound in the background */
    101 	VBERROR_NO_BACKGROUND_SOUND           = 0x10019,
    102 	/* Developer has requested a BIOS shell */
    103 	VBERROR_BIOS_SHELL_REQUESTED          = 0x10020,
    104 	/* Need VGA and don't have it, or vice-versa */
    105 	VBERROR_VGA_OPROM_MISMATCH            = 0x10021,
    106 	/* Need EC to reboot to read-only code */
    107 	VBERROR_EC_REBOOT_TO_RO_REQUIRED      = 0x10022,
    108 	/* Invalid region read parameters */
    109 	VBERROR_REGION_READ_INVALID           = 0x10023,
    110 	/* Cannot read from region */
    111 	VBERROR_REGION_READ_FAILED            = 0x10024,
    112 	/* Unsupported region type */
    113 	VBERROR_UNSUPPORTED_REGION            = 0x10025,
    114 	/* No image present (returned from VbGbbReadImage() for missing image) */
    115 	VBERROR_NO_IMAGE_PRESENT              = 0x10026,
    116 
    117 	/* VbExEcGetExpectedRWHash() may return the following codes */
    118 	/* Compute expected RW hash from the EC image; BIOS doesn't have it */
    119 	VBERROR_EC_GET_EXPECTED_HASH_FROM_IMAGE = 0x20000,
    120 };
    121 
    122 
    123 /*****************************************************************************/
    124 /* Main entry points from firmware into vboot_reference */
    125 
    126 /*
    127  * Minimum and recommended size of shared_data_blob in bytes.  Shared data blob
    128  * is used to communicate data between calls to VbInit(), VbSelectFirmware(),
    129  * the OS.  Minimum size is enough to hold all required data for verified boot
    130  * but may not be able to hold debug output.
    131  */
    132 #define VB_SHARED_DATA_MIN_SIZE 3072
    133 #define VB_SHARED_DATA_REC_SIZE 16384
    134 
    135 /*
    136  * Data passed by firmware to VbInit(), VbSelectFirmware() and
    137  * VbSelectAndLoadKernel().
    138  *
    139  * Note that in UEFI, these are called by different phases in different
    140  * processor modes (VbInit() and VbSelectFirmware() = 32-bit PEI,
    141  * VbSelectAndLoadKernel() = 64-bit BDS), so the data may be at a different
    142  * location between calls.
    143  */
    144 typedef struct VbCommonParams {
    145 	/* Pointer to GBB data */
    146 	void *gbb_data;
    147 	/* Size of GBB data in bytes */
    148 	uint32_t gbb_size;
    149 
    150 	/*
    151 	 * Shared data blob for data shared between verified boot entry points.
    152 	 * This should be at least VB_SHARED_DATA_MIN_SIZE bytes long, and
    153 	 * ideally is VB_SHARED_DATA_REC_SIZE bytes long.
    154 	 */
    155 	/* Pointer to shared data blob buffer */
    156 	void *shared_data_blob;
    157 	/*
    158 	 * On input, set to size of shared data blob buffer, in bytes.  On
    159 	 * output, this will contain the actual data size placed into the
    160 	 * buffer.
    161 	 */
    162 	uint32_t shared_data_size;
    163 
    164 	/*
    165 	 * Internal context/data for verified boot, to maintain state during
    166 	 * calls to other API functions such as VbExHashFirmwareBody().
    167 	 * Allocated and freed inside the entry point; firmware should not look
    168 	 * at this.
    169 	 */
    170 	void *vboot_context;
    171 
    172 	/*
    173 	 * Internal context/data for firmware / VbExHashFirmwareBody().  Needed
    174 	 * because the PEI phase of UEFI boot runs out of ROM and thus can't
    175 	 * modify global variables; everything needs to get passed around on
    176 	 * the stack.
    177 	 */
    178 	void *caller_context;
    179 
    180 	/* For internal use of Vboot - do not examine or modify! */
    181 	struct GoogleBinaryBlockHeader *gbb;
    182 	struct BmpBlockHeader *bmp;
    183 } VbCommonParams;
    184 
    185 /* Flags for VbInitParams.flags */
    186 /* Developer switch was on at boot time. */
    187 #define VB_INIT_FLAG_DEV_SWITCH_ON       0x00000001
    188 /* Recovery button was pressed at boot time. */
    189 #define VB_INIT_FLAG_REC_BUTTON_PRESSED  0x00000002
    190 /* Hardware write protect was enabled at boot time. */
    191 #define VB_INIT_FLAG_WP_ENABLED          0x00000004
    192 /* This is a S3 resume, not a normal boot. */
    193 #define VB_INIT_FLAG_S3_RESUME           0x00000008
    194 /*
    195  * Previous boot attempt failed for reasons external to verified boot (RAM
    196  * init failure, SSD missing, etc.).
    197  *
    198  * TODO: add a field to VbInitParams which holds a reason code, and report
    199  * that via VbSharedData.
    200  */
    201 #define VB_INIT_FLAG_PREVIOUS_BOOT_FAIL  0x00000010
    202 /*
    203  * Calling firmware supports read only firmware for normal/developer boot path.
    204  */
    205 #define VB_INIT_FLAG_RO_NORMAL_SUPPORT   0x00000020
    206 /*
    207  * This platform does not have a physical dev-switch, so we must rely on a
    208  * virtual switch (kept in the TPM) instead. When this flag is set,
    209  * VB_INIT_FLAG_DEV_SWITCH_ON is ignored.
    210  */
    211 #define VB_INIT_FLAG_VIRTUAL_DEV_SWITCH  0x00000040
    212 /* Set when the VGA Option ROM has been loaded already. */
    213 #define VB_INIT_FLAG_OPROM_LOADED        0x00000080
    214 /* Set if we care about the VGA Option ROM - some platforms don't. */
    215 #define VB_INIT_FLAG_OPROM_MATTERS       0x00000100
    216 /* EC on this platform supports EC software sync. */
    217 #define VB_INIT_FLAG_EC_SOFTWARE_SYNC    0x00000200
    218 /* EC on this platform is slow to update. */
    219 #define VB_INIT_FLAG_EC_SLOW_UPDATE      0x00000400
    220 /*
    221  * Software write protect was enabled at boot time. This is separate from the
    222  * HW write protect. Both must be set for flash write protection to work.
    223  */
    224 #define VB_INIT_FLAG_SW_WP_ENABLED       0x00000800
    225 /*
    226  * This platform does not have a physical recovery switch which, when present,
    227  * can (and should) be used for additional physical presence checks.
    228  */
    229 #define VB_INIT_FLAG_VIRTUAL_REC_SWITCH  0x00001000
    230 /* Set when we are calling VbInit() before loading Option ROMs */
    231 #define VB_INIT_FLAG_BEFORE_OPROM_LOAD   0x00002000
    232 
    233 /*
    234  * Output flags for VbInitParams.out_flags.  Used to indicate potential boot
    235  * paths and configuration to the calling firmware early in the boot process,
    236  * so that it can properly configure itself for the capabilities subsequently
    237  * required by VbSelectFirmware() and VbSelectAndLoadKernel().
    238  */
    239 /*
    240  * Enable recovery path.  Do not rely on any rewritable data (cached RAM
    241  * timings, etc.).  Reliable operation is more important than boot speed.
    242  */
    243 #define VB_INIT_OUT_ENABLE_RECOVERY      0x00000001
    244 /* RAM must be cleared before calling VbSelectFirmware(). */
    245 #define VB_INIT_OUT_CLEAR_RAM            0x00000002
    246 /*
    247  * Load display drivers; VbExDisplay*() functions may be called.  If this flag
    248  * is not present, VbExDisplay*() functions will not be called this boot.
    249  */
    250 #define VB_INIT_OUT_ENABLE_DISPLAY       0x00000004
    251 /*
    252  * Load USB storage drivers; VbExDisk*() functions may be called with the
    253  * VB_DISK_FLAG_REMOVABLE flag.  If this flag is not present, VbExDisk*()
    254  * functions will only be called for fixed disks.
    255  */
    256 #define VB_INIT_OUT_ENABLE_USB_STORAGE   0x00000008
    257 /* If this is a S3 resume, do a debug reset boot instead */
    258 #define VB_INIT_OUT_S3_DEBUG_BOOT        0x00000010
    259 /* BIOS should load any PCI option ROMs it finds, not just internal video */
    260 #define VB_INIT_OUT_ENABLE_OPROM         0x00000020
    261 /* BIOS may be asked to boot something other than ChromeOS */
    262 #define VB_INIT_OUT_ENABLE_ALTERNATE_OS  0x00000040
    263 /* Enable developer path. */
    264 #define VB_INIT_OUT_ENABLE_DEVELOPER     0x00000080
    265 
    266 /* Data only used by VbInit() */
    267 typedef struct VbInitParams {
    268 	/* Inputs to VbInit() */
    269 	/* Flags (see VB_INIT_FLAG_*) */
    270 	uint32_t flags;
    271 
    272 	/* Outputs from VbInit(); valid only if it returns success. */
    273 	/* Output flags for firmware; see VB_INIT_OUT_*) */
    274 	uint32_t out_flags;
    275 } VbInitParams;
    276 
    277 /*
    278  * Firmware types for VbHashFirmwareBody() and
    279  * VbSelectFirmwareParams.selected_firmware.  Note that we store these in a
    280  * uint32_t because enum maps to int, which isn't fixed-size.
    281  */
    282 enum VbSelectFirmware_t {
    283 	/* Recovery mode */
    284 	VB_SELECT_FIRMWARE_RECOVERY = 0,
    285 	/* Rewritable firmware A/B for normal or developer path */
    286 	VB_SELECT_FIRMWARE_A = 1,
    287 	VB_SELECT_FIRMWARE_B = 2,
    288 	/* Read only firmware for normal or developer path. */
    289 	VB_SELECT_FIRMWARE_READONLY = 3,
    290         VB_SELECT_FIRMWARE_COUNT,
    291 };
    292 
    293 /* Data only used by VbSelectFirmware() */
    294 typedef struct VbSelectFirmwareParams {
    295 	/* Inputs to VbSelectFirmware() */
    296 	/* Key block + preamble for firmware A */
    297 	void *verification_block_A;
    298 	/* Key block + preamble for firmware B */
    299 	void *verification_block_B;
    300 	/* Verification block A size in bytes */
    301 	uint32_t verification_size_A;
    302 	/* Verification block B size in bytes */
    303 	uint32_t verification_size_B;
    304 
    305 	/* Outputs from VbSelectFirmware(); valid only if it returns success. */
    306 	/* Main firmware to run; see VB_SELECT_FIRMWARE_*. */
    307 	uint32_t selected_firmware;
    308 } VbSelectFirmwareParams;
    309 
    310 /*
    311  * We use disk handles rather than indices.  Using indices causes problems if
    312  * a disk is removed/inserted in the middle of processing.
    313  */
    314 typedef void *VbExDiskHandle_t;
    315 
    316 /* Data used only by VbSelectAndLoadKernel() */
    317 typedef struct VbSelectAndLoadKernelParams {
    318 	/* Inputs to VbSelectAndLoadKernel() */
    319 	/* Destination buffer for kernel (normally at 0x100000 on x86) */
    320 	void *kernel_buffer;
    321 	/* Size of kernel buffer in bytes */
    322 	uint32_t kernel_buffer_size;
    323 
    324 	/*
    325 	 * Outputs from VbSelectAndLoadKernel(); valid only if it returns
    326 	 * success.
    327 	 */
    328 	/* Handle of disk containing loaded kernel */
    329 	VbExDiskHandle_t disk_handle;
    330 	/* Partition number on disk to boot (1...M) */
    331 	uint32_t partition_number;
    332 	/* Address of bootloader image in RAM */
    333 	uint64_t bootloader_address;
    334 	/* Size of bootloader image in bytes */
    335 	uint32_t bootloader_size;
    336 	/* UniquePartitionGuid for boot partition */
    337 	uint8_t partition_guid[16];
    338 	/* Flags passed in by signer */
    339 	uint32_t flags;
    340 	/*
    341 	 * TODO: in H2C, all that pretty much just gets passed to the
    342 	 * bootloader as KernelBootloaderOptions, though the disk handle is
    343 	 * passed as an index instead of a handle.  Is that used anymore now
    344 	 * that we're passing partition_guid?
    345 	 */
    346 } VbSelectAndLoadKernelParams;
    347 
    348 /**
    349  * Initialize the verified boot library.
    350  *
    351  * Returns VBERROR_SUCCESS if success, non-zero if error; on error,
    352  * caller should reboot.
    353  */
    354 VbError_t VbInit(VbCommonParams *cparams, VbInitParams *iparams);
    355 
    356 /**
    357  * Select the main firmware.
    358  *
    359  * Returns VBERROR_SUCCESS if success, non-zero if error; on error,
    360  * caller should reboot.
    361  *
    362  * NOTE: This is now called in all modes, including recovery.  Previously,
    363  * LoadFirmware() was not called in recovery mode, which meant that
    364  * LoadKernel() needed to duplicate the TPM and VbSharedData initialization
    365  * code.
    366  */
    367 VbError_t VbSelectFirmware(VbCommonParams *cparams,
    368                            VbSelectFirmwareParams *fparams);
    369 
    370 /**
    371  * Update the data hash for the current firmware image, extending it by [size]
    372  * bytes stored in [*data].  This function must only be called inside
    373  * VbExHashFirmwareBody(), which is in turn called by VbSelectFirmware().
    374  */
    375 void VbUpdateFirmwareBodyHash(VbCommonParams *cparams,
    376                               uint8_t *data, uint32_t size);
    377 
    378 /**
    379  * Select and loads the kernel.
    380  *
    381  * Returns VBERROR_SUCCESS if success, non-zero if error; on error, caller
    382  * should reboot. */
    383 VbError_t VbSelectAndLoadKernel(VbCommonParams *cparams,
    384                                 VbSelectAndLoadKernelParams *kparams);
    385 
    386 /*****************************************************************************/
    387 /* Debug output (from utility.h) */
    388 
    389 /**
    390  * Output an error message and quit.  Does not return.  Supports
    391  * printf()-style formatting.
    392  */
    393 void VbExError(const char *format, ...);
    394 
    395 /**
    396  * Output a debug message.  Supports printf()-style formatting.
    397  */
    398 void VbExDebug(const char *format, ...)
    399 	__attribute__ ((format (__printf__, 1, 2)));
    400 
    401 /*****************************************************************************/
    402 /* Memory (from utility.h) */
    403 
    404 /**
    405  * Allocate [size] bytes and return a pointer to the allocated memory. Abort
    406  * on error; this always either returns a good pointer or never returns.
    407  *
    408  * If any of the firmware API implementations require aligned data (for
    409  * example, disk access on ARM), all pointers returned by VbExMalloc() must
    410  * also be aligned.
    411  */
    412 void *VbExMalloc(size_t size);
    413 
    414 /**
    415  * Free memory pointed to by [ptr] previously allocated by VbExMalloc().
    416  */
    417 void VbExFree(void *ptr);
    418 
    419 /*****************************************************************************/
    420 /* Timer and delay (first two from utility.h) */
    421 
    422 /**
    423  * Read a high-resolution timer.  Returns the current timer value in arbitrary
    424  * units.
    425  *
    426  * This is intended for benchmarking, so this call MUST be fast.  The timer
    427  * frequency must be >1 KHz (preferably >1 MHz), and the timer must not wrap
    428  * around for at least 10 minutes.  It is preferable (but not required) that
    429  * the timer be initialized to 0 at boot.
    430  *
    431  * It is assumed that the firmware has some other way of communicating the
    432  * timer frequency to the OS.  For example, on x86 we use TSC, and the OS
    433  * kernel reports the initial TSC value at kernel-start and calculates the
    434  * frequency. */
    435 uint64_t VbExGetTimer(void);
    436 
    437 /**
    438  * Delay for at least the specified number of milliseconds.  Should be accurate
    439  * to within 10% (a requested delay of 1000 ms should result in an actual delay
    440  * of between 1000 - 1100 ms).
    441  */
    442 void VbExSleepMs(uint32_t msec);
    443 
    444 /**
    445  * Play a beep tone of the specified frequency in Hz and duration in msec.
    446  * This is effectively a VbSleep() variant that makes noise.
    447  *
    448  * If the audio codec can run in the background, then:
    449  *   zero frequency means OFF, non-zero frequency means ON
    450  *   zero msec means return immediately, non-zero msec means delay (and
    451  *     then OFF if needed)
    452  * otherwise,
    453  *   non-zero msec and non-zero frequency means ON, delay, OFF, return
    454  *   zero msec or zero frequency means do nothing and return immediately
    455  *
    456  * The return value is used by the caller to determine the capabilities. The
    457  * implementation should always do the best it can if it cannot fully support
    458  * all features - for example, beeping at a fixed frequency if frequency
    459  * support is not available.  At a minimum, it must delay for the specified
    460  * non-zero duration.
    461  */
    462 VbError_t VbExBeep(uint32_t msec, uint32_t frequency);
    463 
    464 /*****************************************************************************/
    465 /* TPM (from tlcl_stub.h) */
    466 
    467 /**
    468  * Initialize the stub library. */
    469 VbError_t VbExTpmInit(void);
    470 
    471 /**
    472  * Close and open the device.  This is needed for running more complex commands
    473  * at user level, such as TPM_TakeOwnership, since the TPM device can be opened
    474  * only by one process at a time.
    475  */
    476 VbError_t VbExTpmClose(void);
    477 VbError_t VbExTpmOpen(void);
    478 
    479 /**
    480  * Send a request_length-byte request to the TPM and receive a response.  On
    481  * input, response_length is the size of the response buffer in bytes.  On
    482  * exit, response_length is set to the actual received response length in
    483  * bytes. */
    484 VbError_t VbExTpmSendReceive(const uint8_t *request, uint32_t request_length,
    485                              uint8_t *response, uint32_t *response_length);
    486 
    487 /*****************************************************************************/
    488 /* Non-volatile storage */
    489 
    490 #define VBNV_BLOCK_SIZE 16  /* Size of NV storage block in bytes */
    491 
    492 /**
    493  * Read the VBNV_BLOCK_SIZE-byte non-volatile storage into buf.
    494  */
    495 VbError_t VbExNvStorageRead(uint8_t *buf);
    496 
    497 /**
    498  * Write the VBNV_BLOCK_SIZE-byte non-volatile storage from buf.
    499  */
    500 VbError_t VbExNvStorageWrite(const uint8_t *buf);
    501 
    502 /*****************************************************************************/
    503 /* Firmware / EEPROM access (previously in load_firmware_fw.h) */
    504 
    505 /**
    506  * Calculate the hash of the firmware body data for [firmware_index], which is
    507  * either VB_SELECT_FIRMWARE_A or VB_SELECT_FIRMWARE B.
    508  *
    509  * This function must call VbUpdateFirmwareBodyHash() before returning, to
    510  * update the secure hash for the firmware image.  For best performance, the
    511  * implementation should call VbUpdateFirmwareBodyHash() periodically during
    512  * the read, so that updating the hash can be pipelined with the read.  If the
    513  * reader cannot update the hash during the read process, it should call
    514  * VbUpdateFirmwareBodyHash() on the entire firmware data after the read,
    515  * before returning.
    516  *
    517  * It is recommended that the firmware use this call to copy the requested
    518  * firmware body from EEPROM into RAM, so that it doesn't need to do a second
    519  * slow copy from EEPROM to RAM if this firmware body is selected.
    520  *
    521  * Note this function doesn't actually pass the firmware body data to verified
    522  * boot, because verified boot doesn't actually need the firmware body, just
    523  * its hash.  This is important on x86, where the firmware is stored
    524  * compressed.  We hash the compressed data, but the BIOS decompresses it
    525  * during read.  Simply updating a hash is compatible with the x86
    526  * read-and-decompress pipeline.
    527  */
    528 VbError_t VbExHashFirmwareBody(VbCommonParams *cparams,
    529                                uint32_t firmware_index);
    530 
    531 /*****************************************************************************/
    532 /* Disk access (previously in boot_device.h) */
    533 
    534 /* Flags for VbDisk APIs */
    535 /* Disk is removable.  Example removable disks: SD cards, USB keys.  */
    536 #define VB_DISK_FLAG_REMOVABLE 0x00000001
    537 /*
    538  * Disk is fixed.  If this flag is present, disk is internal to the system and
    539  * not removable.  Example fixed disks: internal SATA SSD, eMMC.
    540  */
    541 #define VB_DISK_FLAG_FIXED     0x00000002
    542 /*
    543  * Note that VB_DISK_FLAG_REMOVABLE and VB_DISK_FLAG_FIXED are
    544  * mutually-exclusive for a single disk.  VbExDiskGetInfo() may specify both
    545  * flags to request disks of both types in a single call.
    546  *
    547  * At some point we could specify additional flags, but we don't currently
    548  * have a way to make use of these:
    549  *
    550  * USB              Device is known to be attached to USB.  Note that the SD
    551  *                  card reader inside x86 systems is attached to USB so this
    552  *                  isn't super useful.
    553  * SD               Device is known to be a SD card.  Note that external card
    554  *                  readers might not return this information, so also of
    555  *                  questionable use.
    556  * READ_ONLY        Device is known to be read-only.  Could be used by recovery
    557  *                  when processing read-only recovery image.
    558  */
    559 
    560 /*
    561  * Disks are used in two ways:
    562  * - As a random-access device to read and write the GPT
    563  * - As a streaming device to read the kernel
    564  * These are implemented differently on raw NAND vs eMMC/SATA/USB
    565  * - On eMMC/SATA/USB, both of these refer to the same underlying
    566  *   storage, so they have the same size and LBA size. In this case,
    567  *   the GPT should not point to the same address as itself.
    568  * - On raw NAND, the GPT is held on a portion of the SPI flash.
    569  *   Random access GPT operations refer to the SPI and streaming
    570  *   operations refer to NAND. The GPT may therefore point into
    571  *   the same offsets as itself.
    572  * These types are distinguished by the following flag and VbDiskInfo
    573  * has separate fields to describe the random-access ("GPT") and
    574  * streaming aspects of the disk. If a disk is random-access (i.e.
    575  * not raw NAND) then these fields are equal.
    576  */
    577 #define VB_DISK_FLAG_EXTERNAL_GPT	0x00000004
    578 
    579 /* Information on a single disk */
    580 typedef struct VbDiskInfo {
    581 	/* Disk handle */
    582 	VbExDiskHandle_t handle;
    583 	/* Size of a random-access LBA sector in bytes */
    584 	uint64_t bytes_per_lba;
    585 	/* Number of random-access LBA sectors on the device.
    586 	 * If streaming_lba_count is 0, this stands in for the size of the
    587 	 * randomly accessed portion as well as the streaming portion.
    588 	 * Otherwise, this is only the randomly-accessed portion. */
    589 	uint64_t lba_count;
    590 	/* Number of streaming sectors on the device */
    591 	uint64_t streaming_lba_count;
    592 	/* Flags (see VB_DISK_FLAG_* constants) */
    593 	uint32_t flags;
    594 	/*
    595 	 * Optional name string, for use in debugging.  May be empty or null if
    596 	 * not available.
    597 	 */
    598 	const char *name;
    599 } VbDiskInfo;
    600 
    601 /**
    602  * Store information into [info] for all disks (storage devices) attached to
    603  * the system which match all of the disk_flags.
    604  *
    605  * On output, count indicates how many disks are present, and [infos_ptr]
    606  * points to a [count]-sized array of VbDiskInfo structs with the information
    607  * on those disks; this pointer must be freed by calling VbExDiskFreeInfo().
    608  * If count=0, infos_ptr may point to NULL.  If [infos_ptr] points to NULL
    609  * because count=0 or error, it is not necessary to call VbExDiskFreeInfo().
    610  *
    611  * A multi-function device (such as a 4-in-1 card reader) should provide
    612  * multiple disk handles.
    613  *
    614  * The firmware must not alter or free the list pointed to by [infos_ptr] until
    615  * VbExDiskFreeInfo() is called.
    616  */
    617 VbError_t VbExDiskGetInfo(VbDiskInfo **infos_ptr, uint32_t *count,
    618                           uint32_t disk_flags);
    619 
    620 /**
    621  * Free a disk information list [infos] previously returned by
    622  * VbExDiskGetInfo().  If [preserve_handle] != NULL, the firmware must ensure
    623  * that handle remains valid after this call; all other handles from the info
    624  * list need not remain valid after this call.
    625  */
    626 VbError_t VbExDiskFreeInfo(VbDiskInfo *infos,
    627                            VbExDiskHandle_t preserve_handle);
    628 
    629 /**
    630  * Read lba_count LBA sectors, starting at sector lba_start, from the disk,
    631  * into the buffer.
    632  *
    633  * This is used for random access to the GPT. It is not for the partition
    634  * contents. The upper limit is lba_count.
    635  *
    636  * If the disk handle is invalid (for example, the handle refers to a disk
    637  * which as been removed), the function must return error but must not
    638  * crash.
    639  */
    640 VbError_t VbExDiskRead(VbExDiskHandle_t handle, uint64_t lba_start,
    641                        uint64_t lba_count, void *buffer);
    642 
    643 /**
    644  * Write lba_count LBA sectors, starting at sector lba_start, to the disk, from
    645  * the buffer.
    646  *
    647  * This is used for random access to the GPT. It does not (necessarily) access
    648  * the streaming portion of the device.
    649  *
    650  * If the disk handle is invalid (for example, the handle refers to a disk
    651  * which as been removed), the function must return error but must not
    652  * crash.
    653  */
    654 VbError_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
    655                         uint64_t lba_count, const void *buffer);
    656 
    657 /* Streaming read interface */
    658 typedef void *VbExStream_t;
    659 
    660 /**
    661  * Open a stream on a disk
    662  *
    663  * @param handle	Disk to open the stream against
    664  * @param lba_start	Starting sector offset within the disk to stream from
    665  * @param lba_count	Maximum extent of the stream in sectors
    666  * @param stream	out-paramter for the generated stream
    667  *
    668  * @return Error code, or VBERROR_SUCCESS.
    669  *
    670  * This is used for access to the contents of the actual partitions on the
    671  * device. It is not used to access the GPT. The size of the content addressed
    672  * is within streaming_lba_count.
    673  */
    674 VbError_t VbExStreamOpen(VbExDiskHandle_t handle, uint64_t lba_start,
    675 			 uint64_t lba_count, VbExStream_t *stream_ptr);
    676 
    677 /**
    678  * Read from a stream on a disk
    679  *
    680  * @param stream	Stream to read from
    681  * @param bytes		Number of bytes to read
    682  * @param buffer	Destination to read into
    683  *
    684  * @return Error code, or VBERROR_SUCCESS. Failure to read as much data as
    685  * requested is an error.
    686  *
    687  * This is used for access to the contents of the actual partitions on the
    688  * device. It is not used to access the GPT.
    689  */
    690 VbError_t VbExStreamRead(VbExStream_t stream, uint32_t bytes, void *buffer);
    691 
    692 /**
    693  * Close a stream
    694  *
    695  * @param stream	Stream to close
    696  */
    697 void VbExStreamClose(VbExStream_t stream);
    698 
    699 
    700 /*****************************************************************************/
    701 /* Display */
    702 
    703 /* Predefined (default) screens for VbExDisplayScreen(). */
    704 enum VbScreenType_t {
    705 	/* Blank (clear) screen */
    706 	VB_SCREEN_BLANK = 0,
    707 	/* Developer - warning */
    708 	VB_SCREEN_DEVELOPER_WARNING = 0x101,
    709 	/* Developer - easter egg */
    710 	VB_SCREEN_DEVELOPER_EGG     = 0x102,
    711 	/* Recovery - remove inserted devices */
    712 	VB_SCREEN_RECOVERY_REMOVE   = 0x201,
    713 	/* Recovery - insert recovery image */
    714 	VB_SCREEN_RECOVERY_INSERT   = 0x202,
    715 	/* Recovery - inserted image invalid */
    716 	VB_SCREEN_RECOVERY_NO_GOOD  = 0x203,
    717 	/* Recovery - confirm dev mode */
    718 	VB_SCREEN_RECOVERY_TO_DEV   = 0x204,
    719 	/* Developer - confirm normal mode */
    720 	VB_SCREEN_DEVELOPER_TO_NORM = 0x205,
    721 	/* Please wait - programming EC */
    722 	VB_SCREEN_WAIT              = 0x206,
    723 	/* Confirm after DEVELOPER_TO_NORM */
    724 	VB_SCREEN_TO_NORM_CONFIRMED = 0x207,
    725 };
    726 
    727 /**
    728  * Initialize and clear the display.  Set width and height to the screen
    729  * dimensions in pixels.
    730  */
    731 VbError_t VbExDisplayInit(uint32_t *width, uint32_t *height);
    732 
    733 /**
    734  * Enable (enable!=0) or disable (enable=0) the display backlight.
    735  */
    736 VbError_t VbExDisplayBacklight(uint8_t enable);
    737 
    738 /**
    739  * Sets the logical dimension to display.
    740  *
    741  * If the physical display is larger or smaller than given dimension, display
    742  * provider may decide to scale or shift images (from VbExDisplayImage)to proper
    743  * location.
    744  */
    745 VbError_t VbExDisplaySetDimension(uint32_t width, uint32_t height);
    746 
    747 /**
    748  * Display a predefined screen; see VB_SCREEN_* for valid screens.
    749  *
    750  * This is a backup method of screen display, intended for use if the GBB does
    751  * not contain a full set of bitmaps.  It is acceptable for the backup screen
    752  * to be simple ASCII text such as "NO GOOD" or "INSERT"; these screens should
    753  * only be seen during development.
    754  */
    755 VbError_t VbExDisplayScreen(uint32_t screen_type);
    756 
    757 /**
    758  * Write an image to the display, with the upper left corner at the specified
    759  * pixel coordinates.  The bitmap buffer is a pointer to the platform-dependent
    760  * uncompressed binary blob with dimensions and format specified internally
    761  * (for example, a raw BMP, GIF, PNG, whatever). We pass the size just for
    762  * convenience.
    763  */
    764 VbError_t VbExDisplayImage(uint32_t x, uint32_t y,
    765                            void *buffer, uint32_t buffersize);
    766 
    767 /**
    768  * Display a string containing debug information on the screen, rendered in a
    769  * platform-dependent font.  Should be able to handle newlines '\n' in the
    770  * string.  Firmware must support displaying at least 20 lines of text, where
    771  * each line may be at least 80 characters long.  If the firmware has its own
    772  * debug state, it may display it to the screen below this information.
    773  *
    774  * NOTE: This is what we currently display when TAB is pressed.  Some
    775  * information (HWID, recovery reason) is ours; some (CMOS breadcrumbs) is
    776  * platform-specific.  If we decide to soft-render the HWID string
    777  * (chrome-os-partner:3693), we'll need to maintain our own fonts, so we'll
    778  * likely display it via VbExDisplayImage() above.
    779  */
    780 VbError_t VbExDisplayDebugInfo(const char *info_str);
    781 
    782 /*****************************************************************************/
    783 /* Keyboard and switches */
    784 
    785 /* Key codes for required non-printable-ASCII characters. */
    786 enum VbKeyCode_t {
    787 	VB_KEY_UP = 0x100,
    788 	VB_KEY_DOWN = 0x101,
    789 	VB_KEY_LEFT = 0x102,
    790 	VB_KEY_RIGHT = 0x103,
    791 	VB_KEY_CTRL_ENTER = 0x104,
    792 };
    793 
    794 /* Flags for additional information.
    795  * TODO(semenzato): consider adding flags for modifiers instead of
    796  * making up some of the key codes above.
    797  */
    798 enum VbKeyFlags_t {
    799 	VB_KEY_FLAG_TRUSTED_KEYBOARD = 1 << 0,
    800 };
    801 
    802 /**
    803  * Read the next keypress from the keyboard buffer.
    804  *
    805  * Returns the keypress, or zero if no keypress is pending or error.
    806  *
    807  * The following keys must be returned as ASCII character codes:
    808  *    0x08          Backspace
    809  *    0x09          Tab
    810  *    0x0D          Enter (carriage return)
    811  *    0x01 - 0x1A   Ctrl+A - Ctrl+Z (yes, those alias with backspace/tab/enter)
    812  *    0x1B          Esc
    813  *    0x20          Space
    814  *    0x30 - 0x39   '0' - '9'
    815  *    0x60 - 0x7A   'a' - 'z'
    816  *
    817  * Some extended keys must also be supported; see the VB_KEY_* defines above.
    818  *
    819  * Keys ('/') or key-chords (Fn+Q) not defined above may be handled in any of
    820  * the following ways:
    821  *    1. Filter (don't report anything if one of these keys is pressed).
    822  *    2. Report as ASCII (if a well-defined ASCII value exists for the key).
    823  *    3. Report as any other value in the range 0x200 - 0x2FF.
    824  * It is not permitted to report a key as a multi-byte code (for example,
    825  * sending an arrow key as the sequence of keys '\x1b', '[', '1', 'A'). */
    826 uint32_t VbExKeyboardRead(void);
    827 
    828 /**
    829  * Same as VbExKeyboardRead(), but return extra information.
    830  */
    831 uint32_t VbExKeyboardReadWithFlags(uint32_t *flags_ptr);
    832 
    833 /**
    834  * Return the current state of the switches specified in request_mask
    835  */
    836 uint32_t VbExGetSwitches(uint32_t request_mask);
    837 
    838 /*****************************************************************************/
    839 /* Embedded controller (EC) */
    840 
    841 /*
    842  * All these functions take a devidx parameter, which indicates which embedded
    843  * processor the call applies to.  At present, only devidx=0 is valid, but
    844  * upcoming CLs will add support for multiple devices.
    845  */
    846 
    847 /**
    848  * This is called only if the system implements a keyboard-based (virtual)
    849  * developer switch. It must return true only if the system has an embedded
    850  * controller which is provably running in its RO firmware at the time the
    851  * function is called.
    852  */
    853 int VbExTrustEC(int devidx);
    854 
    855 /**
    856  * Check if the EC is currently running rewritable code.
    857  *
    858  * If the EC is in RO code, sets *in_rw=0.
    859  * If the EC is in RW code, sets *in_rw non-zero.
    860  * If the current EC image is unknown, returns error. */
    861 VbError_t VbExEcRunningRW(int devidx, int *in_rw);
    862 
    863 /**
    864  * Request the EC jump to its rewritable code.  If successful, returns when the
    865  * EC has booting its RW code far enough to respond to subsequent commands.
    866  * Does nothing if the EC is already in its rewritable code.
    867  */
    868 VbError_t VbExEcJumpToRW(int devidx);
    869 
    870 /**
    871  * Tell the EC to refuse another jump until it reboots. Subsequent calls to
    872  * VbExEcJumpToRW() in this boot will fail.
    873  */
    874 VbError_t VbExEcDisableJump(int devidx);
    875 
    876 /**
    877  * Read the SHA-256 hash of the rewriteable EC image.
    878  */
    879 VbError_t VbExEcHashRW(int devidx, const uint8_t **hash, int *hash_size);
    880 
    881 /**
    882  * Get the expected contents of the EC image associated with the main firmware
    883  * specified by the "select" argument.
    884  */
    885 VbError_t VbExEcGetExpectedRW(int devidx, enum VbSelectFirmware_t select,
    886                               const uint8_t **image, int *image_size);
    887 
    888 /**
    889  * Read the SHA-256 hash of the expected contents of the EC image associated
    890  * with the main firmware specified by the "select" argument.
    891  */
    892 VbError_t VbExEcGetExpectedRWHash(int devidx, enum VbSelectFirmware_t select,
    893 		       const uint8_t **hash, int *hash_size);
    894 
    895 /**
    896  * Update the EC rewritable image.
    897  */
    898 VbError_t VbExEcUpdateRW(int devidx, const uint8_t *image, int image_size);
    899 
    900 /**
    901  * Lock the EC code to prevent updates until the EC is rebooted.
    902  * Subsequent calls to VbExEcUpdateRW() this boot will fail.
    903  */
    904 VbError_t VbExEcProtectRW(int devidx);
    905 
    906 /**
    907  * Info the EC of the boot mode selected by the AP.
    908  * mode: Normal, Developer, or Recovery
    909  */
    910 enum VbEcBootMode_t {VB_EC_NORMAL, VB_EC_DEVELOPER, VB_EC_RECOVERY };
    911 VbError_t VbExEcEnteringMode(int devidx, enum VbEcBootMode_t mode);
    912 
    913 /*****************************************************************************/
    914 /* Misc */
    915 
    916 /* Args to VbExProtectFlash() */
    917 enum VbProtectFlash_t { VBPROTECT_RW_A, VBPROTECT_RW_B, VBPROTECT_RW_DEVKEY };
    918 
    919 /**
    920  * Lock a section of the BIOS flash address space to prevent updates until the
    921  * host is rebooted. Subsequent attempts to erase or modify the specified BIOS
    922  * image will fail. If this function is called more than once each call should
    923  * be cumulative.
    924  */
    925 VbError_t VbExProtectFlash(enum VbProtectFlash_t region);
    926 
    927 /**
    928  * Check if the firmware needs to shut down the system.
    929  *
    930  * Returns a non-zero VB_SHUTDOWN_REQUEST mask indicating the reason(s) for
    931  * shutdown if a shutdown is being requested (see VB_SHUTDOWN_REQUEST_*), or 0
    932  * if a shutdown is not being requested.
    933  *
    934  * NOTE: When we're displaying a screen, pressing the power button should shut
    935  * down the computer.  We need a way to break out of our control loop so this
    936  * can occur cleanly.
    937  */
    938 uint32_t VbExIsShutdownRequested(void);
    939 
    940 /*
    941  * Shutdown requested for a reason which is not defined among other
    942  * VB_SHUTDOWN_REQUEST_* values. This must be defined as 1 for backward
    943  * compatibility with old versions of the API.
    944  */
    945 #define VB_SHUTDOWN_REQUEST_OTHER		0x00000001
    946 /* Shutdown requested due to a lid switch being closed. */
    947 #define VB_SHUTDOWN_REQUEST_LID_CLOSED		0x00000002
    948 /* Shutdown requested due to a power button being pressed. */
    949 #define VB_SHUTDOWN_REQUEST_POWER_BUTTON	0x00000004
    950 
    951 /**
    952  * Expose the BIOS' built-in decompression routine to the vboot wrapper. The
    953  * caller must know how large the uncompressed data will be and must manage
    954  * that memory. The decompression routine just puts the uncompressed data into
    955  * the specified buffer. We pass in the size of the outbuf, and get back the
    956  * actual size used.
    957  */
    958 VbError_t VbExDecompress(void *inbuf, uint32_t in_size,
    959                          uint32_t compression_type,
    960                          void *outbuf, uint32_t *out_size);
    961 
    962 /* Constants for compression_type */
    963 enum {
    964 	COMPRESS_NONE = 0,
    965 	COMPRESS_EFIv1,           /* The x86 BIOS only supports this */
    966 	COMPRESS_LZMA1,           /* The ARM BIOS supports LZMA1 */
    967 	MAX_COMPRESS,
    968 };
    969 
    970 /**
    971  * Execute legacy boot option.
    972  */
    973 int VbExLegacy(void);
    974 
    975 /* Regions for VbExRegionRead() */
    976 enum vb_firmware_region {
    977 	VB_REGION_GBB,	/* Google Binary Block - see gbbheader.h */
    978 
    979 	VB_REGION_COUNT,
    980 };
    981 
    982 /**
    983  * Read data from a region of the firmware image
    984  *
    985  * Vboot wants access to a region, to read data from it. This function
    986  * reads it (typically from the firmware image such as SPI flash) and
    987  * returns the data.
    988  *
    989  * cparams is passed so that the boot loader has some context for the
    990  * operation.
    991  *
    992  * @param cparams	Common parameters, e.g. use member caller_context
    993  *			to point to useful context data
    994  * @param region	Firmware region to read
    995  * @param offset	Start offset within region
    996  * @param size		Number of bytes to read
    997  * @param buf		Place to put data
    998  * @return VBERROR_... error, VBERROR_SUCCESS on success,
    999  */
   1000 VbError_t VbExRegionRead(VbCommonParams *cparams,
   1001 			 enum vb_firmware_region region, uint32_t offset,
   1002 			 uint32_t size, void *buf);
   1003 
   1004 #endif  /* VBOOT_REFERENCE_VBOOT_API_H_ */
   1005