arm-trusted-firmware/tools/nxp/create_pbl/byte_swap.c

114 lines
2.4 KiB
C

/*
* Copyright 2021 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <unistd.h>
#define NUM_MEM_BLOCK 1
#define FOUR_BYTE_ALIGN 4
#define EIGHT_BYTE_ALIGN 8
#define SIZE_TWO_PBL_CMD 24
#define SUCCESS 0
#define FAILURE -1
#define BYTE_SWAP_32(word) ((((word) & 0xff000000) >> 24)| \
(((word) & 0x00ff0000) >> 8) | \
(((word) & 0x0000ff00) << 8) | \
(((word) & 0x000000ff) << 24))
/*
* Returns:
* SUCCESS, on successful byte swapping.
* FAILURE, on failure.
*/
int do_byteswap(FILE *fp)
{
int bytes = 0;
uint32_t upper_byte;
uint32_t lower_byte;
uint32_t pad = 0U;
/* Carries number of Padding bytes to be appended to
* make file size 8 byte aligned.
*/
int append_bytes;
int ret = FAILURE;
fseek(fp, 0L, SEEK_END);
bytes = ftell(fp);
append_bytes = EIGHT_BYTE_ALIGN - (bytes % EIGHT_BYTE_ALIGN);
if (append_bytes != 0) {
if (fwrite(&pad, append_bytes, NUM_MEM_BLOCK, fp)
!= NUM_MEM_BLOCK) {
printf("%s: Error in appending padding bytes.\n",
__func__);
goto byteswap_err;
}
bytes += append_bytes;
}
rewind(fp);
while (bytes > 0) {
if ((fread(&upper_byte, sizeof(upper_byte), NUM_MEM_BLOCK, fp)
!= NUM_MEM_BLOCK) && (feof(fp) == 0)) {
printf("%s: Error reading upper bytes.\n", __func__);
goto byteswap_err;
}
if ((fread(&lower_byte, sizeof(lower_byte), NUM_MEM_BLOCK, fp)
!= NUM_MEM_BLOCK) && (feof(fp) == 0)) {
printf("%s: Error reading lower bytes.\n", __func__);
goto byteswap_err;
}
fseek(fp, -8L, SEEK_CUR);
upper_byte = BYTE_SWAP_32(upper_byte);
lower_byte = BYTE_SWAP_32(lower_byte);
if (fwrite(&lower_byte, sizeof(lower_byte), NUM_MEM_BLOCK, fp)
!= NUM_MEM_BLOCK) {
printf("%s: Error writing lower bytes.\n", __func__);
goto byteswap_err;
}
if (fwrite(&upper_byte, sizeof(upper_byte), NUM_MEM_BLOCK, fp)
!= NUM_MEM_BLOCK) {
printf("%s: Error writing upper bytes.\n", __func__);
goto byteswap_err;
}
bytes -= EIGHT_BYTE_ALIGN;
}
ret = SUCCESS;
byteswap_err:
return ret;
}
int main(int argc, char **argv)
{
FILE *fp = NULL;
int ret = 0;
if (argc > 2) {
printf("Usage format is byteswap <filename>");
return -1;
}
fp = fopen(argv[1], "rb+");
if (fp == NULL) {
printf("%s: Error opening the input file: %s\n",
__func__, argv[1]);
return -1;
}
ret = do_byteswap(fp);
fclose(fp);
return ret;
}