There is a technical debt in ChromeOS flashrom, `cros_alias.c`, which is to work around ChromeOS calling flashrom with `-p host` instead of `-p internal`. Replace all `-p host` occurrences with `-p internal`. BUG=b:296978620 TEST=none Signed-off-by: Hsuan Ting Chen <roccochen@chromium.org> Change-Id: I81674213b9a21598002f349ced1130f0844841ca Reviewed-on: https://review.coreboot.org/c/coreboot/+/77865 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org> Reviewed-by: Martin L Roth <gaumless@gmail.com>
		
			
				
	
	
		
			144 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Copyright 2020 The ChromiumOS Authors. All rights reserved.
 | |
|  * Use of this source code is governed by a BSD-style license that can be
 | |
|  * found in the LICENSE file.
 | |
|  */
 | |
| 
 | |
| /* For strdup */
 | |
| #define _POSIX_C_SOURCE 200809L
 | |
| #include <fcntl.h>
 | |
| #include <limits.h>
 | |
| #include <stdbool.h>
 | |
| #include <stdint.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <sys/stat.h>
 | |
| #include <sys/types.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| #include "common.h" /* from cbfstool for buffer API. */
 | |
| #include "subprocess.h" /* from vboot_reference */
 | |
| #include "flashrom.h"
 | |
| 
 | |
| #define FLASHROM_EXEC_NAME "flashrom"
 | |
| #define FLASHROM_PROGRAMMER_INTERNAL_AP "internal"
 | |
| 
 | |
| /**
 | |
|  * Helper to create a temporary file.
 | |
|  *
 | |
|  * @param path_out	An output pointer for the filename. Caller should free.
 | |
|  *
 | |
|  * @return 0 on success, -1 for file open error, or -2 for write error.
 | |
|  */
 | |
| static int create_temp_file(char **path_out)
 | |
| {
 | |
| 	int fd;
 | |
| 	int rv;
 | |
| 	char *path;
 | |
| 	mode_t umask_save;
 | |
| 
 | |
| #if defined(__FreeBSD__)
 | |
| #define P_tmpdir "/tmp"
 | |
| #endif
 | |
| 	*path_out = NULL;
 | |
| 	path = strdup(P_tmpdir "/flashrom.XXXXXX");
 | |
| 	/* Set the umask before mkstemp for security considerations. */
 | |
| 	umask_save = umask(077);
 | |
| 	fd = mkstemp(path);
 | |
| 	umask(umask_save);
 | |
| 	if (fd < 0) {
 | |
| 		rv = -1;
 | |
| 		goto fail;
 | |
| 	}
 | |
| 
 | |
| 	close(fd);
 | |
| 	*path_out = path;
 | |
| 
 | |
| 	return 0;
 | |
| fail:
 | |
| 	free(path);
 | |
| 	return rv;
 | |
| }
 | |
| 
 | |
| static int run_flashrom(const char *const argv[])
 | |
| {
 | |
| 	int status = subprocess_run(argv, &subprocess_null, &subprocess_null,
 | |
| 				    &subprocess_null);
 | |
| 	if (status) {
 | |
| 		fprintf(stderr, "Flashrom invocation failed (exit status %d):",
 | |
| 			status);
 | |
| 		for (const char *const *argp = argv; *argp; argp++)
 | |
| 			fprintf(stderr, " %s", *argp);
 | |
| 		fprintf(stderr, "\n");
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| int flashrom_host_read(struct buffer *buffer, const char *region)
 | |
| {
 | |
| 	char *tmpfile;
 | |
| 	char region_param[PATH_MAX];
 | |
| 	int rv;
 | |
| 
 | |
| 	if (create_temp_file(&tmpfile) != 0)
 | |
| 		return -1;
 | |
| 	if (region)
 | |
| 		snprintf(region_param, sizeof(region_param), "%s:%s", region,
 | |
| 			 tmpfile);
 | |
| 	const char *const argv[] = {
 | |
| 		FLASHROM_EXEC_NAME,
 | |
| 		"-p",
 | |
| 		FLASHROM_PROGRAMMER_INTERNAL_AP,
 | |
| 		"-r",
 | |
| 		region ? "-i" : tmpfile,
 | |
| 		region ? region_param : NULL,
 | |
| 		NULL,
 | |
| 	};
 | |
| 	rv = run_flashrom(argv);
 | |
| 	if (!rv)
 | |
| 		rv = buffer_from_file(buffer, tmpfile);
 | |
| 
 | |
| 	unlink(tmpfile);
 | |
| 	free(tmpfile);
 | |
| 
 | |
| 	return rv;
 | |
| }
 | |
| 
 | |
| int flashrom_host_write(struct buffer *buffer, const char *region)
 | |
| {
 | |
| 	char *tmpfile;
 | |
| 	char region_param[PATH_MAX];
 | |
| 	int rv;
 | |
| 
 | |
| 	if (create_temp_file(&tmpfile) != 0)
 | |
| 		return -1;
 | |
| 	if (buffer_write_file(buffer, tmpfile) != 0) {
 | |
| 		rv = -2;
 | |
| 		goto fail;
 | |
| 	}
 | |
| 
 | |
| 	if (region)
 | |
| 		snprintf(region_param, sizeof(region_param), "%s:%s", region,
 | |
| 			 tmpfile);
 | |
| 	const char *const argv[] = {
 | |
| 		FLASHROM_EXEC_NAME,
 | |
| 		"-p",
 | |
| 		FLASHROM_PROGRAMMER_INTERNAL_AP,
 | |
| 		"--noverify-all",
 | |
| 		"-w",
 | |
| 		region ? "-i" : tmpfile,
 | |
| 		region ? region_param : NULL,
 | |
| 		NULL,
 | |
| 	};
 | |
| 
 | |
| 	rv = run_flashrom(argv);
 | |
| 
 | |
| fail:
 | |
| 	unlink(tmpfile);
 | |
| 	free(tmpfile);
 | |
| 
 | |
| 	return rv;
 | |
| }
 |