/* * Copyright (c) 2019, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #define BUFFER_SIZE 4096 #define MAX_FILE_PATH 4096 #define MAX_FILE_NAME 260 #define StrCmp strcasecmp int usage() { fprintf(stderr, "KernelToHex \r\n" \ "Convert krn into hex file (single file)\r\n\r\n"); return -1; } bool KrnToHex(char *file_krn) { char buffer[BUFFER_SIZE]; char *aux_file_hex; char line[40]; FILE *f_in, *f_out; char * file_hex = nullptr; unsigned int *pbuffer; unsigned int n_read; int i; char *pfile_handle; aux_file_hex = (char *)malloc(MAX_FILE_PATH); // Generate destination file name (if not provided) if (aux_file_hex) { memset(aux_file_hex, 0, MAX_FILE_PATH); file_hex = aux_file_hex; i = strlen(file_krn) - 4; memcpy(file_hex, file_krn, strlen(file_krn) - 4); sprintf(aux_file_hex, "%s.hex", file_hex); } // Open files f_in = fopen(file_krn, "rb"); f_out = fopen(file_hex, "wb"); // Check if files successfully open/created if ((f_in != NULL) && (f_out != NULL)) { while (true) { n_read = fread(buffer, sizeof(char), BUFFER_SIZE, f_in); if (n_read == 0) { break; } pbuffer = (unsigned int *)buffer; for (; n_read >= 16; n_read -= 16, pbuffer += 4) { sprintf(line, "%08x %08x %08x %08x\r\n", pbuffer[0], pbuffer[1], pbuffer[2], pbuffer[3]); fwrite(line, 1, 37, f_out); } if (n_read > 0) { for (; n_read > 4; n_read -= 4, pbuffer++) { sprintf(line, "%08x ", pbuffer[0]); fwrite(line, 1, 9, f_out); } sprintf(line, "%08x\r\n", pbuffer[0]); fwrite(line, 1, 10, f_out); } } } else { if (f_in == NULL) { fprintf(stderr, "Failed to open input file \"%s\"\r\n", file_krn); } if (f_out == NULL) { fprintf(stderr, "Failed to create output file \"%s\"\r\n", file_hex); } } if (f_in != NULL) { fclose(f_in); } if (f_out != NULL) { fclose(f_out); } if (aux_file_hex != nullptr) { free(aux_file_hex); aux_file_hex = nullptr; } return true; } int main(int argc, char* argv[]) { char *p = NULL; if (argc == 2) { p = strrchr(argv[1], '.'); if (p != NULL && StrCmp(p, ".krn") == 0) { KrnToHex(argv[1]); } } else { return (usage()); } return 0; }