1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2019 The ChromiumOS Authors 2*8617a60dSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 3*8617a60dSAndroid Build Coastguard Worker * found in the LICENSE file. 4*8617a60dSAndroid Build Coastguard Worker * 5*8617a60dSAndroid Build Coastguard Worker * Utilities for firmware updater. 6*8617a60dSAndroid Build Coastguard Worker */ 7*8617a60dSAndroid Build Coastguard Worker 8*8617a60dSAndroid Build Coastguard Worker #ifndef VBOOT_REFERENCE_FUTILITY_UPDATER_UTILS_H_ 9*8617a60dSAndroid Build Coastguard Worker #define VBOOT_REFERENCE_FUTILITY_UPDATER_UTILS_H_ 10*8617a60dSAndroid Build Coastguard Worker 11*8617a60dSAndroid Build Coastguard Worker #include <stdbool.h> 12*8617a60dSAndroid Build Coastguard Worker #include <stdio.h> 13*8617a60dSAndroid Build Coastguard Worker #include "fmap.h" 14*8617a60dSAndroid Build Coastguard Worker 15*8617a60dSAndroid Build Coastguard Worker #define ASPRINTF(strp, ...) do { if (asprintf(strp, __VA_ARGS__) >= 0) break; \ 16*8617a60dSAndroid Build Coastguard Worker ERROR("Failed to allocate memory, abort.\n"); exit(1); } while (0) 17*8617a60dSAndroid Build Coastguard Worker 18*8617a60dSAndroid Build Coastguard Worker /* Structure(s) declared in updater_archive */ 19*8617a60dSAndroid Build Coastguard Worker struct u_archive; 20*8617a60dSAndroid Build Coastguard Worker 21*8617a60dSAndroid Build Coastguard Worker /* Firmware slots */ 22*8617a60dSAndroid Build Coastguard Worker static const char * const FWACT_A = "A", 23*8617a60dSAndroid Build Coastguard Worker * const FWACT_B = "B"; 24*8617a60dSAndroid Build Coastguard Worker 25*8617a60dSAndroid Build Coastguard Worker enum active_slot { 26*8617a60dSAndroid Build Coastguard Worker SLOT_UNKNOWN = -1, 27*8617a60dSAndroid Build Coastguard Worker SLOT_A = 0, 28*8617a60dSAndroid Build Coastguard Worker SLOT_B, 29*8617a60dSAndroid Build Coastguard Worker }; 30*8617a60dSAndroid Build Coastguard Worker 31*8617a60dSAndroid Build Coastguard Worker /* Utilities for managing temporary files. */ 32*8617a60dSAndroid Build Coastguard Worker struct tempfile { 33*8617a60dSAndroid Build Coastguard Worker char *filepath; 34*8617a60dSAndroid Build Coastguard Worker struct tempfile *next; 35*8617a60dSAndroid Build Coastguard Worker }; 36*8617a60dSAndroid Build Coastguard Worker 37*8617a60dSAndroid Build Coastguard Worker /* 38*8617a60dSAndroid Build Coastguard Worker * Create a new temporary file. 39*8617a60dSAndroid Build Coastguard Worker * 40*8617a60dSAndroid Build Coastguard Worker * The parameter head refers to a linked list dummy head. 41*8617a60dSAndroid Build Coastguard Worker * Returns the path of new file, or NULL on failure. 42*8617a60dSAndroid Build Coastguard Worker */ 43*8617a60dSAndroid Build Coastguard Worker const char *create_temp_file(struct tempfile *head); 44*8617a60dSAndroid Build Coastguard Worker 45*8617a60dSAndroid Build Coastguard Worker /* 46*8617a60dSAndroid Build Coastguard Worker * Remove all files created by create_temp_file(). 47*8617a60dSAndroid Build Coastguard Worker * 48*8617a60dSAndroid Build Coastguard Worker * The parameter head refers to the dummy head of linked list. 49*8617a60dSAndroid Build Coastguard Worker * This is intended to be called only once at end of program execution. 50*8617a60dSAndroid Build Coastguard Worker */ 51*8617a60dSAndroid Build Coastguard Worker void remove_all_temp_files(struct tempfile *head); 52*8617a60dSAndroid Build Coastguard Worker 53*8617a60dSAndroid Build Coastguard Worker /* Include definition of 'struct firmware_image;' */ 54*8617a60dSAndroid Build Coastguard Worker #include "flashrom.h" 55*8617a60dSAndroid Build Coastguard Worker 56*8617a60dSAndroid Build Coastguard Worker enum { 57*8617a60dSAndroid Build Coastguard Worker IMAGE_LOAD_SUCCESS = 0, 58*8617a60dSAndroid Build Coastguard Worker IMAGE_READ_FAILURE = -1, 59*8617a60dSAndroid Build Coastguard Worker IMAGE_PARSE_FAILURE = -2, 60*8617a60dSAndroid Build Coastguard Worker }; 61*8617a60dSAndroid Build Coastguard Worker 62*8617a60dSAndroid Build Coastguard Worker /* 63*8617a60dSAndroid Build Coastguard Worker * Loads a firmware image from file. 64*8617a60dSAndroid Build Coastguard Worker * If archive is provided and file_name is a relative path, read the file from 65*8617a60dSAndroid Build Coastguard Worker * archive. 66*8617a60dSAndroid Build Coastguard Worker * Returns IMAGE_LOAD_SUCCESS on success, IMAGE_READ_FAILURE on file I/O 67*8617a60dSAndroid Build Coastguard Worker * failure, or IMAGE_PARSE_FAILURE for non-vboot images. 68*8617a60dSAndroid Build Coastguard Worker */ 69*8617a60dSAndroid Build Coastguard Worker int load_firmware_image(struct firmware_image *image, const char *file_name, 70*8617a60dSAndroid Build Coastguard Worker struct u_archive *archive); 71*8617a60dSAndroid Build Coastguard Worker 72*8617a60dSAndroid Build Coastguard Worker /* Structure(s) declared in updater.h */ 73*8617a60dSAndroid Build Coastguard Worker struct updater_config; 74*8617a60dSAndroid Build Coastguard Worker 75*8617a60dSAndroid Build Coastguard Worker /* 76*8617a60dSAndroid Build Coastguard Worker * Loads the active system firmware image (usually from SPI flash chip). 77*8617a60dSAndroid Build Coastguard Worker * Returns 0 if success. Returns IMAGE_PARSE_FAILURE for non-vboot images. 78*8617a60dSAndroid Build Coastguard Worker * Returns other values for error. 79*8617a60dSAndroid Build Coastguard Worker */ 80*8617a60dSAndroid Build Coastguard Worker int load_system_firmware(struct updater_config *cfg, 81*8617a60dSAndroid Build Coastguard Worker struct firmware_image *image); 82*8617a60dSAndroid Build Coastguard Worker 83*8617a60dSAndroid Build Coastguard Worker /* Frees the allocated resource from a firmware image object. */ 84*8617a60dSAndroid Build Coastguard Worker void free_firmware_image(struct firmware_image *image); 85*8617a60dSAndroid Build Coastguard Worker 86*8617a60dSAndroid Build Coastguard Worker /* Preserves meta data and reloads image contents from given file path. */ 87*8617a60dSAndroid Build Coastguard Worker int reload_firmware_image(const char *file_path, struct firmware_image *image); 88*8617a60dSAndroid Build Coastguard Worker 89*8617a60dSAndroid Build Coastguard Worker /* Checks the consistency of RW A and B firmware versions. */ 90*8617a60dSAndroid Build Coastguard Worker void check_firmware_versions(const struct firmware_image *image); 91*8617a60dSAndroid Build Coastguard Worker 92*8617a60dSAndroid Build Coastguard Worker /* 93*8617a60dSAndroid Build Coastguard Worker * Generates a temporary file for snapshot of firmware image contents. 94*8617a60dSAndroid Build Coastguard Worker * 95*8617a60dSAndroid Build Coastguard Worker * Returns a file path if success, otherwise NULL. 96*8617a60dSAndroid Build Coastguard Worker */ 97*8617a60dSAndroid Build Coastguard Worker const char *get_firmware_image_temp_file(const struct firmware_image *image, 98*8617a60dSAndroid Build Coastguard Worker struct tempfile *tempfiles); 99*8617a60dSAndroid Build Coastguard Worker 100*8617a60dSAndroid Build Coastguard Worker /* 101*8617a60dSAndroid Build Coastguard Worker * Writes sections from a given firmware image to the system firmware. 102*8617a60dSAndroid Build Coastguard Worker * regions_len should be zero for writing the whole image; otherwise, regions 103*8617a60dSAndroid Build Coastguard Worker * should contain a list of FMAP section names of at least regions_len size. 104*8617a60dSAndroid Build Coastguard Worker * Returns 0 if success, non-zero if error. 105*8617a60dSAndroid Build Coastguard Worker */ 106*8617a60dSAndroid Build Coastguard Worker int write_system_firmware(struct updater_config *cfg, 107*8617a60dSAndroid Build Coastguard Worker const struct firmware_image *image, 108*8617a60dSAndroid Build Coastguard Worker const char *const regions[], size_t regions_len); 109*8617a60dSAndroid Build Coastguard Worker 110*8617a60dSAndroid Build Coastguard Worker struct firmware_section { 111*8617a60dSAndroid Build Coastguard Worker uint8_t *data; 112*8617a60dSAndroid Build Coastguard Worker size_t size; 113*8617a60dSAndroid Build Coastguard Worker }; 114*8617a60dSAndroid Build Coastguard Worker 115*8617a60dSAndroid Build Coastguard Worker /* 116*8617a60dSAndroid Build Coastguard Worker * Returns true if the given FMAP section exists in the firmware image. 117*8617a60dSAndroid Build Coastguard Worker */ 118*8617a60dSAndroid Build Coastguard Worker int firmware_section_exists(const struct firmware_image *image, 119*8617a60dSAndroid Build Coastguard Worker const char *section_name); 120*8617a60dSAndroid Build Coastguard Worker 121*8617a60dSAndroid Build Coastguard Worker /* 122*8617a60dSAndroid Build Coastguard Worker * Finds a firmware section by given name in the firmware image. 123*8617a60dSAndroid Build Coastguard Worker * If successful, return zero and *section argument contains the address and 124*8617a60dSAndroid Build Coastguard Worker * size of the section; otherwise failure. 125*8617a60dSAndroid Build Coastguard Worker */ 126*8617a60dSAndroid Build Coastguard Worker int find_firmware_section(struct firmware_section *section, 127*8617a60dSAndroid Build Coastguard Worker const struct firmware_image *image, 128*8617a60dSAndroid Build Coastguard Worker const char *section_name); 129*8617a60dSAndroid Build Coastguard Worker 130*8617a60dSAndroid Build Coastguard Worker /* 131*8617a60dSAndroid Build Coastguard Worker * Preserves (copies) the given section (by name) from image_from to image_to. 132*8617a60dSAndroid Build Coastguard Worker * The offset may be different, and the section data will be directly copied. 133*8617a60dSAndroid Build Coastguard Worker * If the section does not exist on either images, return as failure. 134*8617a60dSAndroid Build Coastguard Worker * If the source section is larger, contents on destination be truncated. 135*8617a60dSAndroid Build Coastguard Worker * If the source section is smaller, the remaining area is not modified. 136*8617a60dSAndroid Build Coastguard Worker * Returns 0 if success, non-zero if error. 137*8617a60dSAndroid Build Coastguard Worker */ 138*8617a60dSAndroid Build Coastguard Worker int preserve_firmware_section(const struct firmware_image *image_from, 139*8617a60dSAndroid Build Coastguard Worker struct firmware_image *image_to, 140*8617a60dSAndroid Build Coastguard Worker const char *section_name); 141*8617a60dSAndroid Build Coastguard Worker 142*8617a60dSAndroid Build Coastguard Worker /* 143*8617a60dSAndroid Build Coastguard Worker * Overwrite the given offset of a section in the firmware image with the 144*8617a60dSAndroid Build Coastguard Worker * given values. 145*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success, otherwise failure. 146*8617a60dSAndroid Build Coastguard Worker */ 147*8617a60dSAndroid Build Coastguard Worker int overwrite_section(struct firmware_image *image, 148*8617a60dSAndroid Build Coastguard Worker const char *fmap_section, size_t offset, 149*8617a60dSAndroid Build Coastguard Worker size_t size, const uint8_t *new_values); 150*8617a60dSAndroid Build Coastguard Worker 151*8617a60dSAndroid Build Coastguard Worker /* 152*8617a60dSAndroid Build Coastguard Worker * Returns rootkey hash of firmware image, or NULL on failure. 153*8617a60dSAndroid Build Coastguard Worker */ 154*8617a60dSAndroid Build Coastguard Worker const char *get_firmware_rootkey_hash(const struct firmware_image *image); 155*8617a60dSAndroid Build Coastguard Worker 156*8617a60dSAndroid Build Coastguard Worker /* 157*8617a60dSAndroid Build Coastguard Worker * Finds the GBB (Google Binary Block) header on a given firmware image. 158*8617a60dSAndroid Build Coastguard Worker * Returns a pointer to valid GBB header, or NULL on not found. 159*8617a60dSAndroid Build Coastguard Worker */ 160*8617a60dSAndroid Build Coastguard Worker struct vb2_gbb_header; 161*8617a60dSAndroid Build Coastguard Worker const struct vb2_gbb_header *find_gbb(const struct firmware_image *image); 162*8617a60dSAndroid Build Coastguard Worker 163*8617a60dSAndroid Build Coastguard Worker /* 164*8617a60dSAndroid Build Coastguard Worker * Strips a string (usually from shell execution output) by removing all the 165*8617a60dSAndroid Build Coastguard Worker * trailing characters in pattern. If pattern is NULL, match by space type 166*8617a60dSAndroid Build Coastguard Worker * characters (space, new line, tab, ... etc). 167*8617a60dSAndroid Build Coastguard Worker */ 168*8617a60dSAndroid Build Coastguard Worker void strip_string(char *s, const char *pattern); 169*8617a60dSAndroid Build Coastguard Worker 170*8617a60dSAndroid Build Coastguard Worker /* 171*8617a60dSAndroid Build Coastguard Worker * Saves everything from stdin to given output file. 172*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success, otherwise failure. 173*8617a60dSAndroid Build Coastguard Worker */ 174*8617a60dSAndroid Build Coastguard Worker int save_file_from_stdin(const char *output); 175*8617a60dSAndroid Build Coastguard Worker 176*8617a60dSAndroid Build Coastguard Worker /* 177*8617a60dSAndroid Build Coastguard Worker * Returns true if the AP write protection is enabled on current system. 178*8617a60dSAndroid Build Coastguard Worker */ 179*8617a60dSAndroid Build Coastguard Worker bool is_ap_write_protection_enabled(struct updater_config *cfg); 180*8617a60dSAndroid Build Coastguard Worker 181*8617a60dSAndroid Build Coastguard Worker /* 182*8617a60dSAndroid Build Coastguard Worker * Returns true if the EC write protection is enabled on current system. 183*8617a60dSAndroid Build Coastguard Worker */ 184*8617a60dSAndroid Build Coastguard Worker bool is_ec_write_protection_enabled(struct updater_config *cfg); 185*8617a60dSAndroid Build Coastguard Worker 186*8617a60dSAndroid Build Coastguard Worker /* 187*8617a60dSAndroid Build Coastguard Worker * Executes a command on current host and returns stripped command output. 188*8617a60dSAndroid Build Coastguard Worker * If the command has failed (exit code is not zero), returns an empty string. 189*8617a60dSAndroid Build Coastguard Worker * The caller is responsible for releasing the returned string. 190*8617a60dSAndroid Build Coastguard Worker */ 191*8617a60dSAndroid Build Coastguard Worker char *host_shell(const char *command); 192*8617a60dSAndroid Build Coastguard Worker 193*8617a60dSAndroid Build Coastguard Worker /* The environment variable name for setting servod port. */ 194*8617a60dSAndroid Build Coastguard Worker #define ENV_SERVOD_PORT "SERVOD_PORT" 195*8617a60dSAndroid Build Coastguard Worker 196*8617a60dSAndroid Build Coastguard Worker /* The environment variable name for setting servod name. */ 197*8617a60dSAndroid Build Coastguard Worker #define ENV_SERVOD_NAME "SERVOD_NAME" 198*8617a60dSAndroid Build Coastguard Worker 199*8617a60dSAndroid Build Coastguard Worker /* 200*8617a60dSAndroid Build Coastguard Worker * Helper function to detect type of Servo board attached to host. 201*8617a60dSAndroid Build Coastguard Worker * Returns a string as programmer parameter on success, otherwise NULL. 202*8617a60dSAndroid Build Coastguard Worker */ 203*8617a60dSAndroid Build Coastguard Worker char *host_detect_servo(const char **prepare_ctrl_name); 204*8617a60dSAndroid Build Coastguard Worker 205*8617a60dSAndroid Build Coastguard Worker /* 206*8617a60dSAndroid Build Coastguard Worker * Makes a dut-control request for control_name. 207*8617a60dSAndroid Build Coastguard Worker * Sets control_name to "on" if on is non zero, else "off". 208*8617a60dSAndroid Build Coastguard Worker * Does not check for failure. 209*8617a60dSAndroid Build Coastguard Worker */ 210*8617a60dSAndroid Build Coastguard Worker void prepare_servo_control(const char *control_name, bool on); 211*8617a60dSAndroid Build Coastguard Worker 212*8617a60dSAndroid Build Coastguard Worker /* DUT related functions (implementations in updater_dut.c) */ 213*8617a60dSAndroid Build Coastguard Worker 214*8617a60dSAndroid Build Coastguard Worker struct dut_property { 215*8617a60dSAndroid Build Coastguard Worker int (*getter)(struct updater_config *cfg); 216*8617a60dSAndroid Build Coastguard Worker int value; 217*8617a60dSAndroid Build Coastguard Worker int initialized; 218*8617a60dSAndroid Build Coastguard Worker }; 219*8617a60dSAndroid Build Coastguard Worker 220*8617a60dSAndroid Build Coastguard Worker enum dut_property_type { 221*8617a60dSAndroid Build Coastguard Worker DUT_PROP_MAINFW_ACT, 222*8617a60dSAndroid Build Coastguard Worker DUT_PROP_TPM_FWVER, 223*8617a60dSAndroid Build Coastguard Worker DUT_PROP_PLATFORM_VER, 224*8617a60dSAndroid Build Coastguard Worker DUT_PROP_WP_HW, 225*8617a60dSAndroid Build Coastguard Worker DUT_PROP_WP_SW_AP, 226*8617a60dSAndroid Build Coastguard Worker DUT_PROP_WP_SW_EC, 227*8617a60dSAndroid Build Coastguard Worker DUT_PROP_MAX 228*8617a60dSAndroid Build Coastguard Worker }; 229*8617a60dSAndroid Build Coastguard Worker 230*8617a60dSAndroid Build Coastguard Worker /* Helper function to initialize DUT properties. */ 231*8617a60dSAndroid Build Coastguard Worker void dut_init_properties(struct dut_property *props, int num); 232*8617a60dSAndroid Build Coastguard Worker 233*8617a60dSAndroid Build Coastguard Worker /* Gets the DUT system property by given type. Returns the property value. */ 234*8617a60dSAndroid Build Coastguard Worker int dut_get_property(enum dut_property_type property_type, 235*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg); 236*8617a60dSAndroid Build Coastguard Worker 237*8617a60dSAndroid Build Coastguard Worker int dut_set_property_string(const char *key, const char *value, 238*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg); 239*8617a60dSAndroid Build Coastguard Worker int dut_get_property_string(const char *key, char *dest, size_t size, 240*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg); 241*8617a60dSAndroid Build Coastguard Worker int dut_set_property_int(const char *key, const int value, 242*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg); 243*8617a60dSAndroid Build Coastguard Worker int dut_get_property_int(const char *key, struct updater_config *cfg); 244*8617a60dSAndroid Build Coastguard Worker 245*8617a60dSAndroid Build Coastguard Worker /* Gets the 'firmware manifest key' on the DUT. */ 246*8617a60dSAndroid Build Coastguard Worker int dut_get_manifest_key(char **manifest_key_out, struct updater_config *cfg); 247*8617a60dSAndroid Build Coastguard Worker 248*8617a60dSAndroid Build Coastguard Worker #endif /* VBOOT_REFERENCE_FUTILITY_UPDATER_UTILS_H_ */ 249