1 /* common utility functions for cbfstool */
2 /* SPDX-License-Identifier: GPL-2.0-only */
18 static off_t
get_file_size(FILE *f
)
21 fseek(f
, 0, SEEK_END
);
23 fseek(f
, 0, SEEK_SET
);
27 /* Buffer and file I/O */
28 int buffer_create(struct buffer
*buffer
, size_t size
, const char *name
)
30 buffer
->name
= strdup(name
);
33 buffer
->data
= (char *)malloc(buffer
->size
);
35 fprintf(stderr
, "buffer_create: Insufficient memory (0x%zx).\n",
38 return (buffer
->data
== NULL
);
41 int buffer_from_file_aligned_size(struct buffer
*buffer
, const char *filename
,
42 size_t size_granularity
)
44 FILE *fp
= fopen(filename
, "rb");
50 off_t file_size
= get_file_size(fp
);
52 fprintf(stderr
, "could not determine size of %s\n", filename
);
56 buffer
->size
= ALIGN_UP(file_size
, size_granularity
);
57 buffer
->name
= strdup(filename
);
58 buffer
->data
= (char *)malloc(buffer
->size
);
60 if (fread(buffer
->data
, 1, file_size
, fp
) != (size_t)file_size
) {
61 fprintf(stderr
, "incomplete read: %s\n", filename
);
63 buffer_delete(buffer
);
68 if (buffer
->size
> (size_t)file_size
)
69 memset(buffer
->data
+ file_size
, 0xff, buffer
->size
- file_size
);
74 int buffer_from_file(struct buffer
*buffer
, const char *filename
)
76 return buffer_from_file_aligned_size(buffer
, filename
, 1);
79 int buffer_write_file(struct buffer
*buffer
, const char *filename
)
81 FILE *fp
= fopen(filename
, "wb");
86 assert(buffer
&& buffer
->data
);
87 if (fwrite(buffer
->data
, 1, buffer
->size
, fp
) != buffer
->size
) {
88 fprintf(stderr
, "incomplete write: %s\n", filename
);
96 void buffer_delete(struct buffer
*buffer
)
104 free(buffer_get_original_backing(buffer
));
115 { CBFS_ARCHITECTURE_AARCH64
, "arm64" },
116 { CBFS_ARCHITECTURE_ARM
, "arm" },
117 { CBFS_ARCHITECTURE_MIPS
, "mips" },
118 { CBFS_ARCHITECTURE_PPC64
, "ppc64" },
119 /* power8 is a reasonable alias */
120 { CBFS_ARCHITECTURE_PPC64
, "power8" },
121 { CBFS_ARCHITECTURE_RISCV
, "riscv" },
122 { CBFS_ARCHITECTURE_X86
, "x86" },
123 { CBFS_ARCHITECTURE_UNKNOWN
, "unknown" }
126 uint32_t string_to_arch(const char *arch_string
)
129 uint32_t ret
= CBFS_ARCHITECTURE_UNKNOWN
;
131 for (i
= 0; i
< ARRAY_SIZE(arch_names
); i
++) {
132 if (!strcasecmp(arch_string
, arch_names
[i
].name
)) {
133 ret
= arch_names
[i
].arch
;
141 const char *arch_to_string(uint32_t a
)
144 const char *ret
= NULL
;
146 for (i
= 0; i
< ARRAY_SIZE(arch_names
); i
++) {
147 if (a
== arch_names
[i
].arch
) {
148 ret
= arch_names
[i
].name
;
156 void print_supported_architectures(void)
160 for (i
= 0; i
< ARRAY_SIZE(arch_names
); i
++) {
161 printf(i
== 0? " ":", ");
162 printf("%s", arch_names
[i
].name
);
168 void print_supported_filetypes(void)
172 for (i
=0; filetypes
[i
].name
; i
++) {
173 printf(" %s%c", filetypes
[i
].name
, filetypes
[i
+ 1].name
? ',' : '\n');
179 uint64_t intfiletype(const char *name
)
182 for (i
= 0; filetypes
[i
].name
; i
++)
183 if (strcmp(filetypes
[i
].name
, name
) == 0)
184 return filetypes
[i
].type
;
188 char *bintohex(uint8_t *data
, size_t len
)
190 static const char translate
[16] = "0123456789abcdef";
192 char *result
= malloc(len
* 2 + 1);
196 result
[len
*2] = '\0';
198 for (i
= 0; i
< len
; i
++) {
199 result
[i
*2] = translate
[(data
[i
] >> 4) & 0xf];
200 result
[i
*2+1] = translate
[data
[i
] & 0xf];