xref: /arm-trusted-firmware/tools/nxp/create_pbl/byte_swap.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright 2021 NXP
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <stdint.h>
9*91f16700Schasinglulu #include <stdio.h>
10*91f16700Schasinglulu #include <stdlib.h>
11*91f16700Schasinglulu #include <string.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu #include <getopt.h>
14*91f16700Schasinglulu #include <unistd.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #define NUM_MEM_BLOCK		1
17*91f16700Schasinglulu #define FOUR_BYTE_ALIGN		4
18*91f16700Schasinglulu #define EIGHT_BYTE_ALIGN	8
19*91f16700Schasinglulu #define SIZE_TWO_PBL_CMD	24
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #define SUCCESS			 0
22*91f16700Schasinglulu #define FAILURE			-1
23*91f16700Schasinglulu #define BYTE_SWAP_32(word)	((((word) & 0xff000000) >> 24)|	\
24*91f16700Schasinglulu 				(((word) & 0x00ff0000) >>  8) |	\
25*91f16700Schasinglulu 				(((word) & 0x0000ff00) <<  8) |	\
26*91f16700Schasinglulu 				(((word) & 0x000000ff) << 24))
27*91f16700Schasinglulu 
28*91f16700Schasinglulu 
29*91f16700Schasinglulu /*
30*91f16700Schasinglulu  * Returns:
31*91f16700Schasinglulu  *     SUCCESS, on successful byte swapping.
32*91f16700Schasinglulu  *     FAILURE, on failure.
33*91f16700Schasinglulu  */
34*91f16700Schasinglulu int do_byteswap(FILE *fp)
35*91f16700Schasinglulu {
36*91f16700Schasinglulu 	int bytes = 0;
37*91f16700Schasinglulu 	uint32_t  upper_byte;
38*91f16700Schasinglulu 	uint32_t  lower_byte;
39*91f16700Schasinglulu 	uint32_t  pad = 0U;
40*91f16700Schasinglulu 	/* Carries number of Padding bytes to be appended to
41*91f16700Schasinglulu 	 * make file size 8 byte aligned.
42*91f16700Schasinglulu 	 */
43*91f16700Schasinglulu 	int append_bytes;
44*91f16700Schasinglulu 	int ret = FAILURE;
45*91f16700Schasinglulu 
46*91f16700Schasinglulu 	fseek(fp, 0L, SEEK_END);
47*91f16700Schasinglulu 	bytes = ftell(fp);
48*91f16700Schasinglulu 
49*91f16700Schasinglulu 	append_bytes = EIGHT_BYTE_ALIGN - (bytes % EIGHT_BYTE_ALIGN);
50*91f16700Schasinglulu 	if (append_bytes != 0) {
51*91f16700Schasinglulu 		if (fwrite(&pad, append_bytes, NUM_MEM_BLOCK, fp)
52*91f16700Schasinglulu 			!= NUM_MEM_BLOCK) {
53*91f16700Schasinglulu 			printf("%s: Error in appending padding bytes.\n",
54*91f16700Schasinglulu 				__func__);
55*91f16700Schasinglulu 			goto byteswap_err;
56*91f16700Schasinglulu 		}
57*91f16700Schasinglulu 		bytes += append_bytes;
58*91f16700Schasinglulu 	}
59*91f16700Schasinglulu 
60*91f16700Schasinglulu 	rewind(fp);
61*91f16700Schasinglulu 	while (bytes > 0) {
62*91f16700Schasinglulu 		if ((fread(&upper_byte, sizeof(upper_byte), NUM_MEM_BLOCK, fp)
63*91f16700Schasinglulu 			!= NUM_MEM_BLOCK) && (feof(fp) == 0)) {
64*91f16700Schasinglulu 			printf("%s: Error reading upper bytes.\n", __func__);
65*91f16700Schasinglulu 			goto byteswap_err;
66*91f16700Schasinglulu 		}
67*91f16700Schasinglulu 		if ((fread(&lower_byte, sizeof(lower_byte), NUM_MEM_BLOCK, fp)
68*91f16700Schasinglulu 			!= NUM_MEM_BLOCK) && (feof(fp) == 0)) {
69*91f16700Schasinglulu 			printf("%s: Error reading lower bytes.\n", __func__);
70*91f16700Schasinglulu 			goto byteswap_err;
71*91f16700Schasinglulu 		}
72*91f16700Schasinglulu 		fseek(fp, -8L, SEEK_CUR);
73*91f16700Schasinglulu 		upper_byte = BYTE_SWAP_32(upper_byte);
74*91f16700Schasinglulu 		lower_byte = BYTE_SWAP_32(lower_byte);
75*91f16700Schasinglulu 		if (fwrite(&lower_byte, sizeof(lower_byte), NUM_MEM_BLOCK, fp)
76*91f16700Schasinglulu 			!= NUM_MEM_BLOCK) {
77*91f16700Schasinglulu 			printf("%s: Error writing lower bytes.\n", __func__);
78*91f16700Schasinglulu 			goto byteswap_err;
79*91f16700Schasinglulu 		}
80*91f16700Schasinglulu 		if (fwrite(&upper_byte, sizeof(upper_byte), NUM_MEM_BLOCK, fp)
81*91f16700Schasinglulu 			!= NUM_MEM_BLOCK) {
82*91f16700Schasinglulu 			printf("%s: Error writing upper bytes.\n", __func__);
83*91f16700Schasinglulu 			goto byteswap_err;
84*91f16700Schasinglulu 		}
85*91f16700Schasinglulu 		bytes -= EIGHT_BYTE_ALIGN;
86*91f16700Schasinglulu 	}
87*91f16700Schasinglulu 	ret = SUCCESS;
88*91f16700Schasinglulu 
89*91f16700Schasinglulu byteswap_err:
90*91f16700Schasinglulu 	return ret;
91*91f16700Schasinglulu }
92*91f16700Schasinglulu 
93*91f16700Schasinglulu int main(int argc, char **argv)
94*91f16700Schasinglulu {
95*91f16700Schasinglulu 	FILE *fp = NULL;
96*91f16700Schasinglulu 	int ret = 0;
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 	if (argc > 2) {
99*91f16700Schasinglulu 		printf("Usage format is byteswap <filename>");
100*91f16700Schasinglulu 		return -1;
101*91f16700Schasinglulu 	}
102*91f16700Schasinglulu 
103*91f16700Schasinglulu 	fp = fopen(argv[1], "rb+");
104*91f16700Schasinglulu 	if (fp == NULL) {
105*91f16700Schasinglulu 		printf("%s: Error opening the input file: %s\n",
106*91f16700Schasinglulu 			__func__, argv[1]);
107*91f16700Schasinglulu 		return -1;
108*91f16700Schasinglulu 	}
109*91f16700Schasinglulu 
110*91f16700Schasinglulu 	ret = do_byteswap(fp);
111*91f16700Schasinglulu 	fclose(fp);
112*91f16700Schasinglulu 	return ret;
113*91f16700Schasinglulu }
114