xref: /aosp_15_r20/external/vboot_reference/futility/updater.h (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
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