1 /* Copyright (c) 2014 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 * Misc functions which need access to vb2_context but are not public APIs 6 */ 7 8 #ifndef VBOOT_REFERENCE_VBOOT_2MISC_H_ 9 #define VBOOT_REFERENCE_VBOOT_2MISC_H_ 10 11 #include "2api.h" 12 13 struct vb2_gbb_header; 14 struct vb2_workbuf; 15 16 /** 17 * Get the shared data pointer from the vboot context 18 * 19 * @param ctx Vboot context 20 * @return The shared data pointer. 21 */ 22 static __inline struct vb2_shared_data *vb2_get_sd(struct vb2_context *ctx) { 23 return (struct vb2_shared_data *)ctx->workbuf; 24 } 25 26 /** 27 * Validate gbb signature (the magic number) 28 * 29 * @param sig Pointer to the signature bytes to validate 30 * @return VB2_SUCCESS if valid or non-zero if error. 31 */ 32 int vb2_validate_gbb_signature(uint8_t *sig); 33 34 /** 35 * Initialize a work buffer from the vboot context. 36 * 37 * This sets the work buffer to the unused portion of the context work buffer. 38 * 39 * @param ctx Vboot context 40 * @param wb Work buffer to initialize 41 */ 42 void vb2_workbuf_from_ctx(struct vb2_context *ctx, struct vb2_workbuf *wb); 43 44 /** 45 * Read the GBB header. 46 * 47 * @param ctx Vboot context 48 * @param gbb Destination for header 49 * @return VB2_SUCCESS, or non-zero if error. 50 */ 51 int vb2_read_gbb_header(struct vb2_context *ctx, struct vb2_gbb_header *gbb); 52 53 /** 54 * Handle vboot failure. 55 * 56 * If the failure occurred after choosing a firmware slot, and the other 57 * firmware slot is not known-bad, try the other firmware slot after reboot. 58 * 59 * If the failure occurred before choosing a firmware slot, or both slots have 60 * failed in successive boots, request recovery. 61 * 62 * @param reason Recovery reason 63 * @param subcode Recovery subcode 64 */ 65 void vb2_fail(struct vb2_context *ctx, uint8_t reason, uint8_t subcode); 66 67 /** 68 * Set up the verified boot context data, if not already set up. 69 * 70 * This uses ctx->workbuf_used=0 as a flag to indicate that the data has not 71 * yet been set up. Caller must set that before calling any voot functions; 72 * see 2api.h. 73 * 74 * @param ctx Vboot context to initialize 75 * @return VB2_SUCCESS, or error code on error. 76 */ 77 int vb2_init_context(struct vb2_context *ctx); 78 79 /** 80 * Check for recovery reasons we can determine early in the boot process. 81 * 82 * On exit, check ctx->flags for VB2_CONTEXT_RECOVERY_MODE; if present, jump to 83 * the recovery path instead of continuing with normal boot. This is the only 84 * direct path to recovery mode. All other errors later in the boot process 85 * should induce a reboot instead of jumping to recovery, so that recovery mode 86 * starts from a consistent firmware state. 87 * 88 * @param ctx Vboot context 89 */ 90 void vb2_check_recovery(struct vb2_context *ctx); 91 92 /** 93 * Parse the GBB header. 94 * 95 * @param ctx Vboot context 96 * @return VB2_SUCCESS, or error code on error. 97 */ 98 int vb2_fw_parse_gbb(struct vb2_context *ctx); 99 100 /** 101 * Check developer switch position. 102 * 103 * @param ctx Vboot context 104 * @return VB2_SUCCESS, or error code on error. 105 */ 106 int vb2_check_dev_switch(struct vb2_context *ctx); 107 108 /** 109 * Check if we need to clear the TPM owner. 110 * 111 * @param ctx Vboot context 112 * @return VB2_SUCCESS, or error code on error. 113 */ 114 int vb2_check_tpm_clear(struct vb2_context *ctx); 115 116 /** 117 * Decide which firmware slot to try this boot. 118 * 119 * @param ctx Vboot context 120 * @return VB2_SUCCESS, or error code on error. 121 */ 122 int vb2_select_fw_slot(struct vb2_context *ctx); 123 124 /** 125 * Verify the firmware keyblock using the root key. 126 * 127 * After this call, the data key is stored in the work buffer. 128 * 129 * @param ctx Vboot context 130 * @return VB2_SUCCESS, or error code on error. 131 */ 132 int vb2_load_fw_keyblock(struct vb2_context *ctx); 133 134 /** 135 * Verify the firmware preamble using the data subkey from the keyblock. 136 * 137 * After this call, the preamble is stored in the work buffer. 138 * 139 * @param ctx Vboot context 140 * @return VB2_SUCCESS, or error code on error. 141 */ 142 int vb2_load_fw_preamble(struct vb2_context *ctx); 143 144 #endif /* VBOOT_REFERENCE_VBOOT_2MISC_H_ */ 145