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