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