1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2018 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 * A reference implementation for AP (and supporting images) firmware updater. 6*8617a60dSAndroid Build Coastguard Worker */ 7*8617a60dSAndroid Build Coastguard Worker 8*8617a60dSAndroid Build Coastguard Worker #ifndef VBOOT_REFERENCE_FUTILITY_UPDATER_H_ 9*8617a60dSAndroid Build Coastguard Worker #define VBOOT_REFERENCE_FUTILITY_UPDATER_H_ 10*8617a60dSAndroid Build Coastguard Worker 11*8617a60dSAndroid Build Coastguard Worker #include "futility.h" 12*8617a60dSAndroid Build Coastguard Worker #include "updater_utils.h" 13*8617a60dSAndroid Build Coastguard Worker 14*8617a60dSAndroid Build Coastguard Worker /* FMAP section names. */ 15*8617a60dSAndroid Build Coastguard Worker static const char * const FMAP_RO = "WP_RO", 16*8617a60dSAndroid Build Coastguard Worker * const FMAP_RO_FMAP = "FMAP", 17*8617a60dSAndroid Build Coastguard Worker * const FMAP_RO_FRID = "RO_FRID", 18*8617a60dSAndroid Build Coastguard Worker * const FMAP_RO_SECTION = "RO_SECTION", 19*8617a60dSAndroid Build Coastguard Worker * const FMAP_RO_CBFS = "COREBOOT", 20*8617a60dSAndroid Build Coastguard Worker * const FMAP_RO_GBB = "GBB", 21*8617a60dSAndroid Build Coastguard Worker * const FMAP_RO_GSCVD = "RO_GSCVD", 22*8617a60dSAndroid Build Coastguard Worker * const FMAP_RO_VPD = "RO_VPD", 23*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_VBLOCK_A = "VBLOCK_A", 24*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_VBLOCK_B = "VBLOCK_B", 25*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_FW_MAIN_A = "FW_MAIN_A", 26*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_FW_MAIN_B = "FW_MAIN_B", 27*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_SECTION_A = "RW_SECTION_A", 28*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_SECTION_B = "RW_SECTION_B", 29*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_FWID = "RW_FWID", 30*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_FWID_A = "RW_FWID_A", 31*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_FWID_B = "RW_FWID_B", 32*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_SHARED = "RW_SHARED", 33*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_LEGACY = "RW_LEGACY", 34*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_VPD = "RW_VPD", 35*8617a60dSAndroid Build Coastguard Worker * const FMAP_RW_DIAG_NVRAM = "DIAG_NVRAM", 36*8617a60dSAndroid Build Coastguard Worker * const FMAP_SI_DESC = "SI_DESC", 37*8617a60dSAndroid Build Coastguard Worker * const FMAP_SI_ME = "SI_ME"; 38*8617a60dSAndroid Build Coastguard Worker 39*8617a60dSAndroid Build Coastguard Worker struct updater_config; 40*8617a60dSAndroid Build Coastguard Worker struct quirk_entry { 41*8617a60dSAndroid Build Coastguard Worker const char *name; 42*8617a60dSAndroid Build Coastguard Worker const char *help; 43*8617a60dSAndroid Build Coastguard Worker int (*apply)(struct updater_config *cfg); 44*8617a60dSAndroid Build Coastguard Worker int value; 45*8617a60dSAndroid Build Coastguard Worker }; 46*8617a60dSAndroid Build Coastguard Worker 47*8617a60dSAndroid Build Coastguard Worker enum quirk_types { 48*8617a60dSAndroid Build Coastguard Worker /* Platform-independent quirks */ 49*8617a60dSAndroid Build Coastguard Worker QUIRK_NO_CHECK_PLATFORM, 50*8617a60dSAndroid Build Coastguard Worker QUIRK_NO_VERIFY, 51*8617a60dSAndroid Build Coastguard Worker QUIRK_ENLARGE_IMAGE, 52*8617a60dSAndroid Build Coastguard Worker QUIRK_MIN_PLATFORM_VERSION, 53*8617a60dSAndroid Build Coastguard Worker QUIRK_EXTRA_RETRIES, 54*8617a60dSAndroid Build Coastguard Worker /* Arch-specific quirks */ 55*8617a60dSAndroid Build Coastguard Worker QUIRK_EC_PARTIAL_RECOVERY, 56*8617a60dSAndroid Build Coastguard Worker QUIRK_CLEAR_MRC_DATA, 57*8617a60dSAndroid Build Coastguard Worker QUIRK_PRESERVE_ME, 58*8617a60dSAndroid Build Coastguard Worker /* Platform-specific quirks (removed after AUE) */ 59*8617a60dSAndroid Build Coastguard Worker QUIRK_OVERRIDE_CUSTOM_LABEL, 60*8617a60dSAndroid Build Coastguard Worker QUIRK_EVE_SMM_STORE, 61*8617a60dSAndroid Build Coastguard Worker QUIRK_UNLOCK_CSME_EVE, 62*8617a60dSAndroid Build Coastguard Worker QUIRK_UNLOCK_CSME, 63*8617a60dSAndroid Build Coastguard Worker /* End of quirks */ 64*8617a60dSAndroid Build Coastguard Worker QUIRK_MAX, 65*8617a60dSAndroid Build Coastguard Worker }; 66*8617a60dSAndroid Build Coastguard Worker 67*8617a60dSAndroid Build Coastguard Worker /* Return values from QUIRK_EC_PARTIAL_RECOVERY. */ 68*8617a60dSAndroid Build Coastguard Worker enum { 69*8617a60dSAndroid Build Coastguard Worker EC_RECOVERY_FULL = 0, /* Must be 0 as default value of quirks. */ 70*8617a60dSAndroid Build Coastguard Worker EC_RECOVERY_RO, 71*8617a60dSAndroid Build Coastguard Worker EC_RECOVERY_DONE 72*8617a60dSAndroid Build Coastguard Worker }; 73*8617a60dSAndroid Build Coastguard Worker 74*8617a60dSAndroid Build Coastguard Worker enum try_update_type { 75*8617a60dSAndroid Build Coastguard Worker TRY_UPDATE_OFF = 0, 76*8617a60dSAndroid Build Coastguard Worker TRY_UPDATE_AUTO, 77*8617a60dSAndroid Build Coastguard Worker TRY_UPDATE_DEFERRED_HOLD, 78*8617a60dSAndroid Build Coastguard Worker TRY_UPDATE_DEFERRED_APPLY, 79*8617a60dSAndroid Build Coastguard Worker }; 80*8617a60dSAndroid Build Coastguard Worker 81*8617a60dSAndroid Build Coastguard Worker struct updater_config { 82*8617a60dSAndroid Build Coastguard Worker struct firmware_image image, image_current; 83*8617a60dSAndroid Build Coastguard Worker struct firmware_image ec_image; 84*8617a60dSAndroid Build Coastguard Worker struct dut_property dut_properties[DUT_PROP_MAX]; 85*8617a60dSAndroid Build Coastguard Worker struct quirk_entry quirks[QUIRK_MAX]; 86*8617a60dSAndroid Build Coastguard Worker struct u_archive *archive; 87*8617a60dSAndroid Build Coastguard Worker struct tempfile tempfiles; 88*8617a60dSAndroid Build Coastguard Worker enum try_update_type try_update; 89*8617a60dSAndroid Build Coastguard Worker int force_update; 90*8617a60dSAndroid Build Coastguard Worker int legacy_update; 91*8617a60dSAndroid Build Coastguard Worker int factory_update; 92*8617a60dSAndroid Build Coastguard Worker int check_platform; 93*8617a60dSAndroid Build Coastguard Worker int use_diff_image; 94*8617a60dSAndroid Build Coastguard Worker int do_verify; 95*8617a60dSAndroid Build Coastguard Worker int verbosity; 96*8617a60dSAndroid Build Coastguard Worker const char *emulation; 97*8617a60dSAndroid Build Coastguard Worker char *emulation_programmer; 98*8617a60dSAndroid Build Coastguard Worker const char *original_programmer; 99*8617a60dSAndroid Build Coastguard Worker const char *prepare_ctrl_name; 100*8617a60dSAndroid Build Coastguard Worker int override_gbb_flags; 101*8617a60dSAndroid Build Coastguard Worker uint32_t gbb_flags; 102*8617a60dSAndroid Build Coastguard Worker bool detect_model; 103*8617a60dSAndroid Build Coastguard Worker bool dut_is_remote; 104*8617a60dSAndroid Build Coastguard Worker bool output_only; 105*8617a60dSAndroid Build Coastguard Worker }; 106*8617a60dSAndroid Build Coastguard Worker 107*8617a60dSAndroid Build Coastguard Worker struct updater_config_arguments { 108*8617a60dSAndroid Build Coastguard Worker char *image, *ec_image; 109*8617a60dSAndroid Build Coastguard Worker char *archive, *quirks, *mode; 110*8617a60dSAndroid Build Coastguard Worker const char *programmer, *write_protection; 111*8617a60dSAndroid Build Coastguard Worker char *model; 112*8617a60dSAndroid Build Coastguard Worker char *emulation, *sys_props; 113*8617a60dSAndroid Build Coastguard Worker char *output_dir; 114*8617a60dSAndroid Build Coastguard Worker char *repack, *unpack; 115*8617a60dSAndroid Build Coastguard Worker int is_factory, try_update, force_update, do_manifest, host_only; 116*8617a60dSAndroid Build Coastguard Worker int fast_update; 117*8617a60dSAndroid Build Coastguard Worker int verbosity; 118*8617a60dSAndroid Build Coastguard Worker int override_gbb_flags; 119*8617a60dSAndroid Build Coastguard Worker int detect_servo; 120*8617a60dSAndroid Build Coastguard Worker int use_flash; 121*8617a60dSAndroid Build Coastguard Worker uint32_t gbb_flags; 122*8617a60dSAndroid Build Coastguard Worker bool detect_model_only; 123*8617a60dSAndroid Build Coastguard Worker bool unlock_me; 124*8617a60dSAndroid Build Coastguard Worker }; 125*8617a60dSAndroid Build Coastguard Worker 126*8617a60dSAndroid Build Coastguard Worker /* 127*8617a60dSAndroid Build Coastguard Worker * Shared getopt arguments controlling flash behaviour. 128*8617a60dSAndroid Build Coastguard Worker * These are shared by multiple commands. 129*8617a60dSAndroid Build Coastguard Worker */ 130*8617a60dSAndroid Build Coastguard Worker enum { 131*8617a60dSAndroid Build Coastguard Worker OPT_CCD = 0x100, 132*8617a60dSAndroid Build Coastguard Worker OPT_EMULATE, 133*8617a60dSAndroid Build Coastguard Worker OPT_SERVO, 134*8617a60dSAndroid Build Coastguard Worker OPT_SERVO_PORT, 135*8617a60dSAndroid Build Coastguard Worker }; 136*8617a60dSAndroid Build Coastguard Worker 137*8617a60dSAndroid Build Coastguard Worker #ifdef USE_FLASHROM 138*8617a60dSAndroid Build Coastguard Worker #define SHARED_FLASH_ARGS_SHORTOPTS "p:" 139*8617a60dSAndroid Build Coastguard Worker 140*8617a60dSAndroid Build Coastguard Worker #define SHARED_FLASH_ARGS_LONGOPTS \ 141*8617a60dSAndroid Build Coastguard Worker {"programmer", 1, NULL, 'p'}, \ 142*8617a60dSAndroid Build Coastguard Worker {"ccd_without_servod", 2, NULL, OPT_CCD}, \ 143*8617a60dSAndroid Build Coastguard Worker {"servo", 0, NULL, OPT_SERVO}, \ 144*8617a60dSAndroid Build Coastguard Worker {"servo_port", 1, NULL, OPT_SERVO_PORT}, \ 145*8617a60dSAndroid Build Coastguard Worker {"emulate", 1, NULL, OPT_EMULATE}, 146*8617a60dSAndroid Build Coastguard Worker 147*8617a60dSAndroid Build Coastguard Worker #define SHARED_FLASH_ARGS_HELP \ 148*8617a60dSAndroid Build Coastguard Worker "-p, --programmer=PRG\tChange AP (host) flashrom programmer\n" \ 149*8617a60dSAndroid Build Coastguard Worker " --ccd_without_servod[=SERIAL] \tFlash via CCD without servod\n" \ 150*8617a60dSAndroid Build Coastguard Worker " --emulate=FILE \tEmulate system firmware using file\n" \ 151*8617a60dSAndroid Build Coastguard Worker " --servo \tFlash using Servo (v2, v4, micro, ...)\n" \ 152*8617a60dSAndroid Build Coastguard Worker " --servo_port=PRT\tOverride servod port, implies --servo\n" 153*8617a60dSAndroid Build Coastguard Worker #else 154*8617a60dSAndroid Build Coastguard Worker #define SHARED_FLASH_ARGS_HELP 155*8617a60dSAndroid Build Coastguard Worker #define SHARED_FLASH_ARGS_LONGOPTS 156*8617a60dSAndroid Build Coastguard Worker #define SHARED_FLASH_ARGS_SHORTOPTS 157*8617a60dSAndroid Build Coastguard Worker #endif /* USE_FLASHROM */ 158*8617a60dSAndroid Build Coastguard Worker 159*8617a60dSAndroid Build Coastguard Worker struct patch_config { 160*8617a60dSAndroid Build Coastguard Worker char *rootkey; 161*8617a60dSAndroid Build Coastguard Worker char *vblock_a; 162*8617a60dSAndroid Build Coastguard Worker char *vblock_b; 163*8617a60dSAndroid Build Coastguard Worker char *gscvd; 164*8617a60dSAndroid Build Coastguard Worker }; 165*8617a60dSAndroid Build Coastguard Worker 166*8617a60dSAndroid Build Coastguard Worker struct model_config { 167*8617a60dSAndroid Build Coastguard Worker char *name; 168*8617a60dSAndroid Build Coastguard Worker char *image, *ec_image; 169*8617a60dSAndroid Build Coastguard Worker struct patch_config patches; 170*8617a60dSAndroid Build Coastguard Worker bool has_custom_label; 171*8617a60dSAndroid Build Coastguard Worker }; 172*8617a60dSAndroid Build Coastguard Worker 173*8617a60dSAndroid Build Coastguard Worker struct manifest { 174*8617a60dSAndroid Build Coastguard Worker int num; 175*8617a60dSAndroid Build Coastguard Worker struct model_config *models; 176*8617a60dSAndroid Build Coastguard Worker struct u_archive *archive; 177*8617a60dSAndroid Build Coastguard Worker int default_model; 178*8617a60dSAndroid Build Coastguard Worker }; 179*8617a60dSAndroid Build Coastguard Worker 180*8617a60dSAndroid Build Coastguard Worker enum updater_error_codes { 181*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_DONE, 182*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_NEED_RO_UPDATE, 183*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_NO_IMAGE, 184*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_SYSTEM_IMAGE, 185*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_INVALID_IMAGE, 186*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_SET_COOKIES, 187*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_WRITE_FIRMWARE, 188*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_PLATFORM, 189*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_TARGET, 190*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_ROOT_KEY, 191*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_TPM_ROLLBACK, 192*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_UNLOCK_CSME, 193*8617a60dSAndroid Build Coastguard Worker UPDATE_ERR_UNKNOWN, 194*8617a60dSAndroid Build Coastguard Worker }; 195*8617a60dSAndroid Build Coastguard Worker 196*8617a60dSAndroid Build Coastguard Worker /* Messages explaining enum updater_error_codes. */ 197*8617a60dSAndroid Build Coastguard Worker extern const char * const updater_error_messages[]; 198*8617a60dSAndroid Build Coastguard Worker 199*8617a60dSAndroid Build Coastguard Worker /* 200*8617a60dSAndroid Build Coastguard Worker * Returns a valid root key from GBB header, or NULL on failure. 201*8617a60dSAndroid Build Coastguard Worker */ 202*8617a60dSAndroid Build Coastguard Worker const struct vb2_packed_key *get_rootkey( 203*8617a60dSAndroid Build Coastguard Worker const struct vb2_gbb_header *gbb); 204*8617a60dSAndroid Build Coastguard Worker 205*8617a60dSAndroid Build Coastguard Worker /* 206*8617a60dSAndroid Build Coastguard Worker * The main updater to update system firmware using the configuration parameter. 207*8617a60dSAndroid Build Coastguard Worker * Returns UPDATE_ERR_DONE if success, otherwise failure. 208*8617a60dSAndroid Build Coastguard Worker */ 209*8617a60dSAndroid Build Coastguard Worker enum updater_error_codes update_firmware(struct updater_config *cfg); 210*8617a60dSAndroid Build Coastguard Worker 211*8617a60dSAndroid Build Coastguard Worker /* 212*8617a60dSAndroid Build Coastguard Worker * Allocates and initializes a updater_config object with default values. 213*8617a60dSAndroid Build Coastguard Worker * Returns the newly allocated object, or NULL on error. 214*8617a60dSAndroid Build Coastguard Worker */ 215*8617a60dSAndroid Build Coastguard Worker struct updater_config *updater_new_config(void); 216*8617a60dSAndroid Build Coastguard Worker 217*8617a60dSAndroid Build Coastguard Worker /* 218*8617a60dSAndroid Build Coastguard Worker * Releases all resources in an updater configuration object. 219*8617a60dSAndroid Build Coastguard Worker */ 220*8617a60dSAndroid Build Coastguard Worker void updater_delete_config(struct updater_config *cfg); 221*8617a60dSAndroid Build Coastguard Worker 222*8617a60dSAndroid Build Coastguard Worker /* 223*8617a60dSAndroid Build Coastguard Worker * Handle an argument if it is a shared updater option. 224*8617a60dSAndroid Build Coastguard Worker * Returns 1 if argument was used. 225*8617a60dSAndroid Build Coastguard Worker */ 226*8617a60dSAndroid Build Coastguard Worker int handle_flash_argument(struct updater_config_arguments *args, int opt, 227*8617a60dSAndroid Build Coastguard Worker char *optarg); 228*8617a60dSAndroid Build Coastguard Worker 229*8617a60dSAndroid Build Coastguard Worker /** 230*8617a60dSAndroid Build Coastguard Worker * Helper function to setup an allocated updater_config object. 231*8617a60dSAndroid Build Coastguard Worker * Returns number of failures, or 0 on success. 232*8617a60dSAndroid Build Coastguard Worker * @param[out] updater_config, 233*8617a60dSAndroid Build Coastguard Worker * @param[int] updater_config_arguments, 234*8617a60dSAndroid Build Coastguard Worker */ 235*8617a60dSAndroid Build Coastguard Worker int updater_setup_config(struct updater_config *cfg, 236*8617a60dSAndroid Build Coastguard Worker const struct updater_config_arguments *arg); 237*8617a60dSAndroid Build Coastguard Worker 238*8617a60dSAndroid Build Coastguard Worker /** 239*8617a60dSAndroid Build Coastguard Worker * Helper function to determine if to perform a update. 240*8617a60dSAndroid Build Coastguard Worker * Returns true to perform update otherwise false. 241*8617a60dSAndroid Build Coastguard Worker * @param[in] updater_config_arguments, 242*8617a60dSAndroid Build Coastguard Worker */ 243*8617a60dSAndroid Build Coastguard Worker bool updater_should_update(const struct updater_config_arguments *arg); 244*8617a60dSAndroid Build Coastguard Worker 245*8617a60dSAndroid Build Coastguard Worker /* Prints the name and description from all supported quirks. */ 246*8617a60dSAndroid Build Coastguard Worker void updater_list_config_quirks(const struct updater_config *cfg); 247*8617a60dSAndroid Build Coastguard Worker 248*8617a60dSAndroid Build Coastguard Worker /* 249*8617a60dSAndroid Build Coastguard Worker * Registers known quirks to a updater_config object. 250*8617a60dSAndroid Build Coastguard Worker */ 251*8617a60dSAndroid Build Coastguard Worker void updater_register_quirks(struct updater_config *cfg); 252*8617a60dSAndroid Build Coastguard Worker 253*8617a60dSAndroid Build Coastguard Worker /* Gets the value (setting) of specified quirks from updater configuration. */ 254*8617a60dSAndroid Build Coastguard Worker int get_config_quirk(enum quirk_types quirk, const struct updater_config *cfg); 255*8617a60dSAndroid Build Coastguard Worker 256*8617a60dSAndroid Build Coastguard Worker /* 257*8617a60dSAndroid Build Coastguard Worker * Gets the default quirk config string from target image name. 258*8617a60dSAndroid Build Coastguard Worker * Returns a string (in same format as --quirks) to load or NULL if no quirks. 259*8617a60dSAndroid Build Coastguard Worker */ 260*8617a60dSAndroid Build Coastguard Worker const char * const updater_get_model_quirks(struct updater_config *cfg); 261*8617a60dSAndroid Build Coastguard Worker 262*8617a60dSAndroid Build Coastguard Worker /* 263*8617a60dSAndroid Build Coastguard Worker * Gets the quirk config string from target image CBFS. 264*8617a60dSAndroid Build Coastguard Worker * Returns a string (in same format as --quirks) to load or NULL if no quirks. 265*8617a60dSAndroid Build Coastguard Worker */ 266*8617a60dSAndroid Build Coastguard Worker char * updater_get_cbfs_quirks(struct updater_config *cfg); 267*8617a60dSAndroid Build Coastguard Worker 268*8617a60dSAndroid Build Coastguard Worker /* 269*8617a60dSAndroid Build Coastguard Worker * Overrides the custom label config if the device was shipped with known 270*8617a60dSAndroid Build Coastguard Worker * special rootkey. 271*8617a60dSAndroid Build Coastguard Worker */ 272*8617a60dSAndroid Build Coastguard Worker const struct model_config *quirk_override_custom_label( 273*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg, 274*8617a60dSAndroid Build Coastguard Worker const struct manifest *manifest, 275*8617a60dSAndroid Build Coastguard Worker const struct model_config *model); 276*8617a60dSAndroid Build Coastguard Worker 277*8617a60dSAndroid Build Coastguard Worker /* Functions from updater_archive.c */ 278*8617a60dSAndroid Build Coastguard Worker 279*8617a60dSAndroid Build Coastguard Worker /* 280*8617a60dSAndroid Build Coastguard Worker * Opens an archive from given path. 281*8617a60dSAndroid Build Coastguard Worker * The type of archive will be determined automatically. 282*8617a60dSAndroid Build Coastguard Worker * Returns a pointer to reference to archive (must be released by archive_close 283*8617a60dSAndroid Build Coastguard Worker * when not used), otherwise NULL on error. 284*8617a60dSAndroid Build Coastguard Worker */ 285*8617a60dSAndroid Build Coastguard Worker struct u_archive *archive_open(const char *path); 286*8617a60dSAndroid Build Coastguard Worker 287*8617a60dSAndroid Build Coastguard Worker /* 288*8617a60dSAndroid Build Coastguard Worker * Closes an archive reference. 289*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success, otherwise non-zero as failure. 290*8617a60dSAndroid Build Coastguard Worker */ 291*8617a60dSAndroid Build Coastguard Worker int archive_close(struct u_archive *ar); 292*8617a60dSAndroid Build Coastguard Worker 293*8617a60dSAndroid Build Coastguard Worker /* 294*8617a60dSAndroid Build Coastguard Worker * Checks if an entry (either file or directory) exists in archive. 295*8617a60dSAndroid Build Coastguard Worker * Returns 1 if exists, otherwise 0 296*8617a60dSAndroid Build Coastguard Worker */ 297*8617a60dSAndroid Build Coastguard Worker int archive_has_entry(struct u_archive *ar, const char *name); 298*8617a60dSAndroid Build Coastguard Worker 299*8617a60dSAndroid Build Coastguard Worker /* 300*8617a60dSAndroid Build Coastguard Worker * Reads a file from archive. 301*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success (data and size reflects the file content), 302*8617a60dSAndroid Build Coastguard Worker * otherwise non-zero as failure. 303*8617a60dSAndroid Build Coastguard Worker */ 304*8617a60dSAndroid Build Coastguard Worker int archive_read_file(struct u_archive *ar, const char *fname, 305*8617a60dSAndroid Build Coastguard Worker uint8_t **data, uint32_t *size, int64_t *mtime); 306*8617a60dSAndroid Build Coastguard Worker 307*8617a60dSAndroid Build Coastguard Worker /* 308*8617a60dSAndroid Build Coastguard Worker * Writes a file into archive. 309*8617a60dSAndroid Build Coastguard Worker * If entry name (fname) is an absolute path (/file), always write into real 310*8617a60dSAndroid Build Coastguard Worker * file system. 311*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success, otherwise non-zero as failure. 312*8617a60dSAndroid Build Coastguard Worker */ 313*8617a60dSAndroid Build Coastguard Worker int archive_write_file(struct u_archive *ar, const char *fname, 314*8617a60dSAndroid Build Coastguard Worker uint8_t *data, uint32_t size, int64_t mtime); 315*8617a60dSAndroid Build Coastguard Worker 316*8617a60dSAndroid Build Coastguard Worker /* 317*8617a60dSAndroid Build Coastguard Worker * Traverses all files within archive (directories are ignored). 318*8617a60dSAndroid Build Coastguard Worker * For every entry, the path (relative the archive root) will be passed to 319*8617a60dSAndroid Build Coastguard Worker * callback function, until the callback returns non-zero. 320*8617a60dSAndroid Build Coastguard Worker * The arg argument will also be passed to callback. 321*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success otherwise non-zero as failure. 322*8617a60dSAndroid Build Coastguard Worker */ 323*8617a60dSAndroid Build Coastguard Worker int archive_walk(struct u_archive *ar, void *arg, 324*8617a60dSAndroid Build Coastguard Worker int (*callback)(const char *path, void *arg)); 325*8617a60dSAndroid Build Coastguard Worker 326*8617a60dSAndroid Build Coastguard Worker /* 327*8617a60dSAndroid Build Coastguard Worker * Copies all entries from one archive to another. 328*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success, otherwise non-zero as failure. 329*8617a60dSAndroid Build Coastguard Worker */ 330*8617a60dSAndroid Build Coastguard Worker int archive_copy(struct u_archive *from, struct u_archive *to); 331*8617a60dSAndroid Build Coastguard Worker 332*8617a60dSAndroid Build Coastguard Worker /* 333*8617a60dSAndroid Build Coastguard Worker * Creates a new manifest object by scanning files in archive. 334*8617a60dSAndroid Build Coastguard Worker * Returns the manifest on success, otherwise NULL for failure. 335*8617a60dSAndroid Build Coastguard Worker */ 336*8617a60dSAndroid Build Coastguard Worker struct manifest *new_manifest_from_archive(struct u_archive *archive); 337*8617a60dSAndroid Build Coastguard Worker 338*8617a60dSAndroid Build Coastguard Worker /* Releases all resources allocated by given manifest object. */ 339*8617a60dSAndroid Build Coastguard Worker void delete_manifest(struct manifest *manifest); 340*8617a60dSAndroid Build Coastguard Worker 341*8617a60dSAndroid Build Coastguard Worker /* Prints the information of objects in manifest (models and images) in JSON. */ 342*8617a60dSAndroid Build Coastguard Worker void print_json_manifest(const struct manifest *manifest); 343*8617a60dSAndroid Build Coastguard Worker 344*8617a60dSAndroid Build Coastguard Worker /* 345*8617a60dSAndroid Build Coastguard Worker * Modifies a firmware image from patch information specified in model config. 346*8617a60dSAndroid Build Coastguard Worker * Returns 0 on success, otherwise number of failures. 347*8617a60dSAndroid Build Coastguard Worker */ 348*8617a60dSAndroid Build Coastguard Worker int patch_image_by_model( 349*8617a60dSAndroid Build Coastguard Worker struct firmware_image *image, const struct model_config *model, 350*8617a60dSAndroid Build Coastguard Worker struct u_archive *archive); 351*8617a60dSAndroid Build Coastguard Worker 352*8617a60dSAndroid Build Coastguard Worker /* 353*8617a60dSAndroid Build Coastguard Worker * Finds the existing model_config from manifest that best matches current 354*8617a60dSAndroid Build Coastguard Worker * system (as defined by model_name). 355*8617a60dSAndroid Build Coastguard Worker * Returns a model_config from manifest, or NULL if not found. 356*8617a60dSAndroid Build Coastguard Worker */ 357*8617a60dSAndroid Build Coastguard Worker const struct model_config *manifest_find_model(struct updater_config *cfg, 358*8617a60dSAndroid Build Coastguard Worker const struct manifest *manifest, 359*8617a60dSAndroid Build Coastguard Worker const char *model_name); 360*8617a60dSAndroid Build Coastguard Worker 361*8617a60dSAndroid Build Coastguard Worker /* 362*8617a60dSAndroid Build Coastguard Worker * Finds the first existing model_config from manifest that matches current 363*8617a60dSAndroid Build Coastguard Worker * system by reading RO_FRID from the existing host firmware. 364*8617a60dSAndroid Build Coastguard Worker * Returns a model_config from manifest, or NULL if not found. 365*8617a60dSAndroid Build Coastguard Worker */ 366*8617a60dSAndroid Build Coastguard Worker const struct model_config * 367*8617a60dSAndroid Build Coastguard Worker manifest_detect_model_from_frid(struct updater_config *cfg, 368*8617a60dSAndroid Build Coastguard Worker struct manifest *manifest); 369*8617a60dSAndroid Build Coastguard Worker 370*8617a60dSAndroid Build Coastguard Worker /* 371*8617a60dSAndroid Build Coastguard Worker * Finds the custom label model config from the base model + system tag. 372*8617a60dSAndroid Build Coastguard Worker * The system tag came from the firmware VPD section. 373*8617a60dSAndroid Build Coastguard Worker * Returns the matched model_config, base if no applicable custom label data, 374*8617a60dSAndroid Build Coastguard Worker * or NULL for any critical error. 375*8617a60dSAndroid Build Coastguard Worker */ 376*8617a60dSAndroid Build Coastguard Worker const struct model_config *manifest_find_custom_label_model( 377*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg, 378*8617a60dSAndroid Build Coastguard Worker const struct manifest *manifest, 379*8617a60dSAndroid Build Coastguard Worker const struct model_config *base_model); 380*8617a60dSAndroid Build Coastguard Worker 381*8617a60dSAndroid Build Coastguard Worker #endif /* VBOOT_REFERENCE_FUTILITY_UPDATER_H_ */ 382