xref: /arm-trusted-firmware/tools/amlogic/doimage.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019, Remi Pommarel <repk@triplefau.lt>
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu #include <stdlib.h>
7*91f16700Schasinglulu #include <stdio.h>
8*91f16700Schasinglulu #include <fcntl.h>
9*91f16700Schasinglulu #include <unistd.h>
10*91f16700Schasinglulu #include <stdint.h>
11*91f16700Schasinglulu #include <endian.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #define DEFAULT_PROGNAME "doimage"
14*91f16700Schasinglulu #define PROGNAME(argc, argv) (((argc) >= 1) ? ((argv)[0]) : DEFAULT_PROGNAME)
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #define BL31_MAGIC 0x12348765
17*91f16700Schasinglulu #define BL31_LOADADDR 0x05100000
18*91f16700Schasinglulu #define BUFLEN 512
19*91f16700Schasinglulu 
20*91f16700Schasinglulu static inline void usage(char const *prog)
21*91f16700Schasinglulu {
22*91f16700Schasinglulu 	fprintf(stderr, "Usage: %s <bl31.bin> <bl31.img>\n", prog);
23*91f16700Schasinglulu }
24*91f16700Schasinglulu 
25*91f16700Schasinglulu static inline int fdwrite(int fd, uint8_t *data, size_t len)
26*91f16700Schasinglulu {
27*91f16700Schasinglulu 	ssize_t nr;
28*91f16700Schasinglulu 	size_t l;
29*91f16700Schasinglulu 	int ret = -1;
30*91f16700Schasinglulu 
31*91f16700Schasinglulu 	for (l = 0; l < len; l += nr) {
32*91f16700Schasinglulu 		nr = write(fd, data + l, len - l);
33*91f16700Schasinglulu 		if (nr < 0) {
34*91f16700Schasinglulu 			perror("Cannot write to bl31.img");
35*91f16700Schasinglulu 			goto out;
36*91f16700Schasinglulu 		}
37*91f16700Schasinglulu 	}
38*91f16700Schasinglulu 
39*91f16700Schasinglulu 	ret = 0;
40*91f16700Schasinglulu out:
41*91f16700Schasinglulu 	return ret;
42*91f16700Schasinglulu }
43*91f16700Schasinglulu 
44*91f16700Schasinglulu int main(int argc, char **argv)
45*91f16700Schasinglulu {
46*91f16700Schasinglulu 	int fin, fout, ret = -1;
47*91f16700Schasinglulu 	ssize_t len;
48*91f16700Schasinglulu 	uint32_t data;
49*91f16700Schasinglulu 	uint8_t buf[BUFLEN];
50*91f16700Schasinglulu 
51*91f16700Schasinglulu 	if (argc != 3) {
52*91f16700Schasinglulu 		usage(PROGNAME(argc, argv));
53*91f16700Schasinglulu 		goto out;
54*91f16700Schasinglulu 	}
55*91f16700Schasinglulu 
56*91f16700Schasinglulu 	fin = open(argv[1], O_RDONLY);
57*91f16700Schasinglulu 	if (fin < 0) {
58*91f16700Schasinglulu 		perror("Cannot open bl31.bin");
59*91f16700Schasinglulu 		goto out;
60*91f16700Schasinglulu 	}
61*91f16700Schasinglulu 
62*91f16700Schasinglulu 	fout = open(argv[2], O_WRONLY | O_CREAT, 0660);
63*91f16700Schasinglulu 	if (fout < 0) {
64*91f16700Schasinglulu 		perror("Cannot open bl31.img");
65*91f16700Schasinglulu 		goto closefin;
66*91f16700Schasinglulu 	}
67*91f16700Schasinglulu 
68*91f16700Schasinglulu 	data = htole32(BL31_MAGIC);
69*91f16700Schasinglulu 	if (fdwrite(fout, (uint8_t *)&data, sizeof(data)) < 0)
70*91f16700Schasinglulu 		goto closefout;
71*91f16700Schasinglulu 
72*91f16700Schasinglulu 	lseek(fout, 8, SEEK_SET);
73*91f16700Schasinglulu 	data = htole32(BL31_LOADADDR);
74*91f16700Schasinglulu 	if (fdwrite(fout, (uint8_t *)&data, sizeof(data)) < 0)
75*91f16700Schasinglulu 		goto closefout;
76*91f16700Schasinglulu 
77*91f16700Schasinglulu 	lseek(fout, 0x200, SEEK_SET);
78*91f16700Schasinglulu 	while ((len = read(fin, buf, sizeof(buf))) > 0)
79*91f16700Schasinglulu 		if (fdwrite(fout, buf, len) < 0)
80*91f16700Schasinglulu 			goto closefout;
81*91f16700Schasinglulu 	if (len < 0) {
82*91f16700Schasinglulu 		perror("Cannot read bl31.bin");
83*91f16700Schasinglulu 		goto closefout;
84*91f16700Schasinglulu 	}
85*91f16700Schasinglulu 
86*91f16700Schasinglulu 	ret = 0;
87*91f16700Schasinglulu 
88*91f16700Schasinglulu closefout:
89*91f16700Schasinglulu 	close(fout);
90*91f16700Schasinglulu closefin:
91*91f16700Schasinglulu 	close(fin);
92*91f16700Schasinglulu out:
93*91f16700Schasinglulu 	return ret;
94*91f16700Schasinglulu }
95