xref: /aosp_15_r20/external/intel-media-driver/Tools/MediaDriverTools/GenKrnBin/main.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1*ba62d9d3SAndroid Build Coastguard Worker // Disable deprecated
2*ba62d9d3SAndroid Build Coastguard Worker #pragma warning(disable : 4995)
3*ba62d9d3SAndroid Build Coastguard Worker 
4*ba62d9d3SAndroid Build Coastguard Worker #include <assert.h>
5*ba62d9d3SAndroid Build Coastguard Worker #include <list>
6*ba62d9d3SAndroid Build Coastguard Worker #include <string>
7*ba62d9d3SAndroid Build Coastguard Worker #include <vector>
8*ba62d9d3SAndroid Build Coastguard Worker #include <fstream>
9*ba62d9d3SAndroid Build Coastguard Worker #include <algorithm>
10*ba62d9d3SAndroid Build Coastguard Worker #include "linkfile.h"
11*ba62d9d3SAndroid Build Coastguard Worker 
12*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
13*ba62d9d3SAndroid Build Coastguard Worker #include <dirent.h>
14*ba62d9d3SAndroid Build Coastguard Worker #include <sys/stat.h>
15*ba62d9d3SAndroid Build Coastguard Worker #include <strings.h>
16*ba62d9d3SAndroid Build Coastguard Worker #include <cstring>
17*ba62d9d3SAndroid Build Coastguard Worker #endif
18*ba62d9d3SAndroid Build Coastguard Worker 
19*ba62d9d3SAndroid Build Coastguard Worker using namespace std;
20*ba62d9d3SAndroid Build Coastguard Worker 
21*ba62d9d3SAndroid Build Coastguard Worker // Defaults
22*ba62d9d3SAndroid Build Coastguard Worker #define KERNEL                      "kernel"
23*ba62d9d3SAndroid Build Coastguard Worker #define KERNEL_HEADER_FILE_NAME     "krnheader.h"
24*ba62d9d3SAndroid Build Coastguard Worker 
25*ba62d9d3SAndroid Build Coastguard Worker char KERNEL_COMPONENT_DIR[MAX_STRING_SIZE]        = "";
26*ba62d9d3SAndroid Build Coastguard Worker char KERNEL_HEADER_FILE[MAX_STRING_SIZE]        = "";
27*ba62d9d3SAndroid Build Coastguard Worker char KERNEL_TEMP_HEADER_FILE[MAX_STRING_SIZE]    = "";
28*ba62d9d3SAndroid Build Coastguard Worker char KERNEL_BINARY_FILE[MAX_STRING_SIZE]        = "";
29*ba62d9d3SAndroid Build Coastguard Worker char KERNEL_SEARCH_DIR[MAX_STRING_SIZE]            = "";
30*ba62d9d3SAndroid Build Coastguard Worker 
31*ba62d9d3SAndroid Build Coastguard Worker char  KERNEL_HEADER_PREFIX[8]       = "";
32*ba62d9d3SAndroid Build Coastguard Worker char  KERNEL_HEADER_GEN[8]          = "";
33*ba62d9d3SAndroid Build Coastguard Worker char  KERNEL_HEADER_KIND[16]        = "";
34*ba62d9d3SAndroid Build Coastguard Worker char  KERNEL_HEADER_PREFIX_UPPER[8] = "";
35*ba62d9d3SAndroid Build Coastguard Worker char  KERNEL_HEADER_SENTRY[64]      = "";
36*ba62d9d3SAndroid Build Coastguard Worker char  KERNEL_IDR[16]                = "";
37*ba62d9d3SAndroid Build Coastguard Worker 
38*ba62d9d3SAndroid Build Coastguard Worker static const char *COPYRIGHT        =
39*ba62d9d3SAndroid Build Coastguard Worker     "/*\n"
40*ba62d9d3SAndroid Build Coastguard Worker     " * Copyright (c) 2019, Intel Corporation\n"
41*ba62d9d3SAndroid Build Coastguard Worker     " *\n"
42*ba62d9d3SAndroid Build Coastguard Worker     " * Permission is hereby granted, free of charge, to any person obtaining a\n"
43*ba62d9d3SAndroid Build Coastguard Worker     " * copy of this software and associated documentation files (the\n"
44*ba62d9d3SAndroid Build Coastguard Worker     " * 'Software'), to deal in the Software without restriction, including\n"
45*ba62d9d3SAndroid Build Coastguard Worker     " * without limitation the rights to use, copy, modify, merge, publish,\n"
46*ba62d9d3SAndroid Build Coastguard Worker     " * distribute, sublicense, and/or sell copies of the Software, and to\n"
47*ba62d9d3SAndroid Build Coastguard Worker     " * permit persons to whom the Software is furnished to do so, subject to\n"
48*ba62d9d3SAndroid Build Coastguard Worker     " * the following conditions:\n"
49*ba62d9d3SAndroid Build Coastguard Worker     " *\n"
50*ba62d9d3SAndroid Build Coastguard Worker     " * The above copyright notice and this permission notice shall be included\n"
51*ba62d9d3SAndroid Build Coastguard Worker     " * in all copies or substantial portions of the Software.\n"
52*ba62d9d3SAndroid Build Coastguard Worker     " *\n"
53*ba62d9d3SAndroid Build Coastguard Worker     " * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS\n"
54*ba62d9d3SAndroid Build Coastguard Worker     " * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n"
55*ba62d9d3SAndroid Build Coastguard Worker     " * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n"
56*ba62d9d3SAndroid Build Coastguard Worker     " * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n"
57*ba62d9d3SAndroid Build Coastguard Worker     " * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n"
58*ba62d9d3SAndroid Build Coastguard Worker     " * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n"
59*ba62d9d3SAndroid Build Coastguard Worker     " * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
60*ba62d9d3SAndroid Build Coastguard Worker     "*/\n"
61*ba62d9d3SAndroid Build Coastguard Worker     "\n"
62*ba62d9d3SAndroid Build Coastguard Worker     "////////////////////////////////////////////////////////////////////////////////\n"
63*ba62d9d3SAndroid Build Coastguard Worker     "// !!! WARNING - AUTO GENERATED FILE. DO NOT EDIT DIRECTLY. !!!\n"
64*ba62d9d3SAndroid Build Coastguard Worker     "// Generated by GenKrnBin.exe tool\n"
65*ba62d9d3SAndroid Build Coastguard Worker     "////////////////////////////////////////////////////////////////////////////////\n"
66*ba62d9d3SAndroid Build Coastguard Worker ;
67*ba62d9d3SAndroid Build Coastguard Worker 
68*ba62d9d3SAndroid Build Coastguard Worker #define INDEX_OPEN_FORMAT_STRING         "#ifndef %s\n#define %s\n\n\0",              \
69*ba62d9d3SAndroid Build Coastguard Worker     KERNEL_HEADER_SENTRY,                                                                   \
70*ba62d9d3SAndroid Build Coastguard Worker     KERNEL_HEADER_SENTRY
71*ba62d9d3SAndroid Build Coastguard Worker #define INDEX_ENTRY_FORMAT_STRING(index) "#define %s_%s %d\n\0",                          \
72*ba62d9d3SAndroid Build Coastguard Worker     KERNEL_IDR, index, dwKernelCount
73*ba62d9d3SAndroid Build Coastguard Worker #define INDEX_CLOSE_FORMAT_STRING        "\n#endif // %s\0", KERNEL_HEADER_SENTRY
74*ba62d9d3SAndroid Build Coastguard Worker #define INDEX_ENTRY_FORMAT_INT(index,i)  "#define %s_%s %d\n\0",                          \
75*ba62d9d3SAndroid Build Coastguard Worker     KERNEL_IDR, index, i
76*ba62d9d3SAndroid Build Coastguard Worker #define KERNEL_NAME_DEFINE(index)        "#define %s_%s   \\\n",                          \
77*ba62d9d3SAndroid Build Coastguard Worker     KERNEL_IDR, index
78*ba62d9d3SAndroid Build Coastguard Worker #define KERNEL_NAME_ENTRY(index)         "    _" "T(\"%s\"),\\\n",                        \
79*ba62d9d3SAndroid Build Coastguard Worker     index
80*ba62d9d3SAndroid Build Coastguard Worker #define KERNEL_ID_ENTRY(index)           "    _" "T(\"%03d\"),\\\n",                      \
81*ba62d9d3SAndroid Build Coastguard Worker     index
82*ba62d9d3SAndroid Build Coastguard Worker 
83*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
84*ba62d9d3SAndroid Build Coastguard Worker #define StrCmp strncasecmp
85*ba62d9d3SAndroid Build Coastguard Worker #else
86*ba62d9d3SAndroid Build Coastguard Worker #define StrCmp strnicmp
87*ba62d9d3SAndroid Build Coastguard Worker #endif
88*ba62d9d3SAndroid Build Coastguard Worker 
89*ba62d9d3SAndroid Build Coastguard Worker void ConcatenateKernelBinary(char *pKernelName, bool bVerbose);
90*ba62d9d3SAndroid Build Coastguard Worker 
91*ba62d9d3SAndroid Build Coastguard Worker // scratch global variables for writing files
92*ba62d9d3SAndroid Build Coastguard Worker char    g_Buffer[MAX_STRING_SIZE];
93*ba62d9d3SAndroid Build Coastguard Worker bool    g_bReturn;
94*ba62d9d3SAndroid Build Coastguard Worker 
95*ba62d9d3SAndroid Build Coastguard Worker // size_t is integral data type returned by the language operator sizeof and is defined in the <cstring> header file (among others) as an unsigned integral type
96*ba62d9d3SAndroid Build Coastguard Worker unsigned int   g_SizetOfTextToWrite;
97*ba62d9d3SAndroid Build Coastguard Worker unsigned int   g_dwNumBytesWritten;
98*ba62d9d3SAndroid Build Coastguard Worker 
99*ba62d9d3SAndroid Build Coastguard Worker // globals used in multiple functions
100*ba62d9d3SAndroid Build Coastguard Worker FILE          *g_hKernelBinary        = NULL;
101*ba62d9d3SAndroid Build Coastguard Worker unsigned int   g_dwTotalKernelCount   = 0;
102*ba62d9d3SAndroid Build Coastguard Worker unsigned int   g_dwCurrentKernelCount = 0;
103*ba62d9d3SAndroid Build Coastguard Worker 
104*ba62d9d3SAndroid Build Coastguard Worker // offset table
105*ba62d9d3SAndroid Build Coastguard Worker unsigned int  *g_pOffsetTable;
106*ba62d9d3SAndroid Build Coastguard Worker unsigned int   g_dwOffsetTableSize;
107*ba62d9d3SAndroid Build Coastguard Worker unsigned int   g_dwCurrentKernel;
108*ba62d9d3SAndroid Build Coastguard Worker 
109*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
strupr(char * str)110*ba62d9d3SAndroid Build Coastguard Worker char strupr(char *str)
111*ba62d9d3SAndroid Build Coastguard Worker {
112*ba62d9d3SAndroid Build Coastguard Worker     char *ptr = str;
113*ba62d9d3SAndroid Build Coastguard Worker 
114*ba62d9d3SAndroid Build Coastguard Worker     while (*ptr != '\0')
115*ba62d9d3SAndroid Build Coastguard Worker     {
116*ba62d9d3SAndroid Build Coastguard Worker         if (islower(*ptr))
117*ba62d9d3SAndroid Build Coastguard Worker         *ptr = toupper(*ptr);
118*ba62d9d3SAndroid Build Coastguard Worker         ptr++;
119*ba62d9d3SAndroid Build Coastguard Worker     }
120*ba62d9d3SAndroid Build Coastguard Worker }
121*ba62d9d3SAndroid Build Coastguard Worker 
122*ba62d9d3SAndroid Build Coastguard Worker #define _strupr_s strupr
123*ba62d9d3SAndroid Build Coastguard Worker #endif
124*ba62d9d3SAndroid Build Coastguard Worker 
main(int argc,char * argv[])125*ba62d9d3SAndroid Build Coastguard Worker int main(int argc, char *argv[])
126*ba62d9d3SAndroid Build Coastguard Worker {
127*ba62d9d3SAndroid Build Coastguard Worker     // list template class is based on a doubly-linked list
128*ba62d9d3SAndroid Build Coastguard Worker     list <string> KernelList; // creates an empty list for elements of type "string"
129*ba62d9d3SAndroid Build Coastguard Worker     list <string>::const_iterator iterator; // allows iterating over list <string>
130*ba62d9d3SAndroid Build Coastguard Worker     FILE *hKernelDirs, *hKernels, *hHeaderFile, *hTempHeaderFile;
131*ba62d9d3SAndroid Build Coastguard Worker 
132*ba62d9d3SAndroid Build Coastguard Worker     // TCHAR data type is char string used to represent a string of either the WCHAR or char type
133*ba62d9d3SAndroid Build Coastguard Worker     char SearchString[MAX_STRING_SIZE];
134*ba62d9d3SAndroid Build Coastguard Worker     char KernelNameNoExt[MAX_STRING_SIZE];
135*ba62d9d3SAndroid Build Coastguard Worker     char KernelNameFull[MAX_STRING_SIZE];
136*ba62d9d3SAndroid Build Coastguard Worker     char KernelBinName[MAX_STRING_SIZE];
137*ba62d9d3SAndroid Build Coastguard Worker     bool  bKernelNames, bVerbose;
138*ba62d9d3SAndroid Build Coastguard Worker     char* pcHeaderFile, pcTempHeaderFile;
139*ba62d9d3SAndroid Build Coastguard Worker     unsigned int dwKernelCount, dwHeaderSize, dwTempHeaderSize, dwBytesRead;
140*ba62d9d3SAndroid Build Coastguard Worker 
141*ba62d9d3SAndroid Build Coastguard Worker     bVerbose = false;
142*ba62d9d3SAndroid Build Coastguard Worker     if (argc < 5)
143*ba62d9d3SAndroid Build Coastguard Worker     {
144*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Usage: GenKrnBin.exe <kernel root dir> <component> [-verbose]\n");
145*ba62d9d3SAndroid Build Coastguard Worker         exit (-1);
146*ba62d9d3SAndroid Build Coastguard Worker     }
147*ba62d9d3SAndroid Build Coastguard Worker 
148*ba62d9d3SAndroid Build Coastguard Worker     int idx = 5;        // scan the command-line options from index 3
149*ba62d9d3SAndroid Build Coastguard Worker     while (idx < argc)
150*ba62d9d3SAndroid Build Coastguard Worker     {
151*ba62d9d3SAndroid Build Coastguard Worker         if (StrCmp(argv[idx], "-verbose", 8) == 0)
152*ba62d9d3SAndroid Build Coastguard Worker         {
153*ba62d9d3SAndroid Build Coastguard Worker             bVerbose = true;
154*ba62d9d3SAndroid Build Coastguard Worker         }
155*ba62d9d3SAndroid Build Coastguard Worker         ++idx;
156*ba62d9d3SAndroid Build Coastguard Worker     }
157*ba62d9d3SAndroid Build Coastguard Worker 
158*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
159*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_COMPONENT_DIR,"%s", argv[1]);
160*ba62d9d3SAndroid Build Coastguard Worker     strncpy(KERNEL_HEADER_PREFIX, argv[2], sizeof(KERNEL_HEADER_PREFIX));
161*ba62d9d3SAndroid Build Coastguard Worker     strncpy(KERNEL_HEADER_GEN, argv[3], sizeof(KERNEL_HEADER_GEN));
162*ba62d9d3SAndroid Build Coastguard Worker     strncpy(KERNEL_HEADER_KIND, argv[4], sizeof(KERNEL_HEADER_KIND));
163*ba62d9d3SAndroid Build Coastguard Worker     strncpy(KERNEL_HEADER_PREFIX_UPPER, argv[2], sizeof(KERNEL_HEADER_PREFIX));
164*ba62d9d3SAndroid Build Coastguard Worker    _strupr_s(KERNEL_HEADER_PREFIX_UPPER);
165*ba62d9d3SAndroid Build Coastguard Worker 
166*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_HEADER_FILE, "%s/ig%skrn_%s_%s.h", KERNEL_COMPONENT_DIR, KERNEL_HEADER_PREFIX, KERNEL_HEADER_GEN, KERNEL_HEADER_KIND);
167*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_TEMP_HEADER_FILE, "%s/%stemp%s", KERNEL_COMPONENT_DIR, KERNEL_HEADER_PREFIX, KERNEL_HEADER_FILE_NAME);
168*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_BINARY_FILE, "%s/ig%skrn_%s_%s.bin", KERNEL_COMPONENT_DIR, KERNEL_HEADER_PREFIX, KERNEL_HEADER_GEN, KERNEL_HEADER_KIND);
169*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_SEARCH_DIR, "%s/g*", KERNEL_COMPONENT_DIR);
170*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_HEADER_SENTRY, "__%sKRNHEADER_H__", KERNEL_HEADER_PREFIX_UPPER);
171*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_IDR, "IDR_%s", KERNEL_HEADER_PREFIX_UPPER);
172*ba62d9d3SAndroid Build Coastguard Worker #else
173*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_COMPONENT_DIR,"%s", argv[1]);
174*ba62d9d3SAndroid Build Coastguard Worker     strncpy(KERNEL_HEADER_PREFIX, argv[2], sizeof(KERNEL_HEADER_PREFIX));
175*ba62d9d3SAndroid Build Coastguard Worker     strncpy(KERNEL_HEADER_PREFIX_UPPER, argv[2], sizeof(KERNEL_HEADER_PREFIX));
176*ba62d9d3SAndroid Build Coastguard Worker     _strupr_s(KERNEL_HEADER_PREFIX_UPPER);
177*ba62d9d3SAndroid Build Coastguard Worker 
178*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_HEADER_FILE, "%s\\ig%skrn_g11_icllp.h", KERNEL_COMPONENT_DIR, KERNEL_HEADER_PREFIX);
179*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_TEMP_HEADER_FILE, "%s\\%stemp%s", KERNEL_COMPONENT_DIR, KERNEL_HEADER_PREFIX, KERNEL_HEADER_FILE_NAME);
180*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_BINARY_FILE, "%s\\ig%skrn_g11_icllp.bin", KERNEL_COMPONENT_DIR, KERNEL_HEADER_PREFIX);
181*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_SEARCH_DIR, "%s\\g*", KERNEL_COMPONENT_DIR);
182*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_HEADER_SENTRY, "__%sKRNHEADER_H__", KERNEL_HEADER_PREFIX_UPPER);
183*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KERNEL_IDR, "IDR_%s", KERNEL_HEADER_PREFIX_UPPER);
184*ba62d9d3SAndroid Build Coastguard Worker #endif
185*ba62d9d3SAndroid Build Coastguard Worker     bKernelNames = true;
186*ba62d9d3SAndroid Build Coastguard Worker 
187*ba62d9d3SAndroid Build Coastguard Worker     /////////////////////////////////////////////////
188*ba62d9d3SAndroid Build Coastguard Worker     // Generate a superset list of all the kernels //
189*ba62d9d3SAndroid Build Coastguard Worker     /////////////////////////////////////////////////
190*ba62d9d3SAndroid Build Coastguard Worker 
191*ba62d9d3SAndroid Build Coastguard Worker 
192*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
193*ba62d9d3SAndroid Build Coastguard Worker     sprintf(SearchString, "%s", KERNEL_COMPONENT_DIR);
194*ba62d9d3SAndroid Build Coastguard Worker 
195*ba62d9d3SAndroid Build Coastguard Worker     struct dirent* ent = NULL;
196*ba62d9d3SAndroid Build Coastguard Worker 
197*ba62d9d3SAndroid Build Coastguard Worker     DIR *pDir=NULL;
198*ba62d9d3SAndroid Build Coastguard Worker     pDir=opendir(SearchString);
199*ba62d9d3SAndroid Build Coastguard Worker     int n;
200*ba62d9d3SAndroid Build Coastguard Worker 
201*ba62d9d3SAndroid Build Coastguard Worker     while (NULL != (ent=readdir(pDir)))
202*ba62d9d3SAndroid Build Coastguard Worker     {
203*ba62d9d3SAndroid Build Coastguard Worker         n = strlen(ent->d_name);
204*ba62d9d3SAndroid Build Coastguard Worker         //printf("kernel name  = %s; ent->d_reclen = %d\n", ent->d_name, n);
205*ba62d9d3SAndroid Build Coastguard Worker         //printf("kernel offset= %s\n", ent->d_name + n - 4);
206*ba62d9d3SAndroid Build Coastguard Worker 
207*ba62d9d3SAndroid Build Coastguard Worker         if ((StrCmp(ent->d_name + n - 4, ".krn", 4) == 0) ||
208*ba62d9d3SAndroid Build Coastguard Worker             (StrCmp(ent->d_name + n - 4, ".hex", 4) == 0))
209*ba62d9d3SAndroid Build Coastguard Worker         {
210*ba62d9d3SAndroid Build Coastguard Worker             KernelList.push_back(string(ent->d_name));
211*ba62d9d3SAndroid Build Coastguard Worker             continue;
212*ba62d9d3SAndroid Build Coastguard Worker         }
213*ba62d9d3SAndroid Build Coastguard Worker         else
214*ba62d9d3SAndroid Build Coastguard Worker         {
215*ba62d9d3SAndroid Build Coastguard Worker             continue;
216*ba62d9d3SAndroid Build Coastguard Worker         }
217*ba62d9d3SAndroid Build Coastguard Worker     };
218*ba62d9d3SAndroid Build Coastguard Worker 
219*ba62d9d3SAndroid Build Coastguard Worker     closedir(pDir);
220*ba62d9d3SAndroid Build Coastguard Worker #endif
221*ba62d9d3SAndroid Build Coastguard Worker 
222*ba62d9d3SAndroid Build Coastguard Worker     // include LinkFile.txt
223*ba62d9d3SAndroid Build Coastguard Worker     KernelList.push_back(string("LinkFile.krn"));
224*ba62d9d3SAndroid Build Coastguard Worker 
225*ba62d9d3SAndroid Build Coastguard Worker     // remove duplicate entries from the list (create superset)
226*ba62d9d3SAndroid Build Coastguard Worker     KernelList.sort();
227*ba62d9d3SAndroid Build Coastguard Worker 
228*ba62d9d3SAndroid Build Coastguard Worker     // assumes list is sorted. removes subsequent consecutive equal values.
229*ba62d9d3SAndroid Build Coastguard Worker     KernelList.unique();
230*ba62d9d3SAndroid Build Coastguard Worker 
231*ba62d9d3SAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////
232*ba62d9d3SAndroid Build Coastguard Worker     // Create a temp header that defines the indicies into the table //
233*ba62d9d3SAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////
234*ba62d9d3SAndroid Build Coastguard Worker 
235*ba62d9d3SAndroid Build Coastguard Worker     // create the header file that will define the kernel IDs
236*ba62d9d3SAndroid Build Coastguard Worker     hHeaderFile = fopen(KERNEL_HEADER_FILE, "w");
237*ba62d9d3SAndroid Build Coastguard Worker     if (hHeaderFile == NULL)
238*ba62d9d3SAndroid Build Coastguard Worker     {
239*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to open Temp Header File\n");
240*ba62d9d3SAndroid Build Coastguard Worker         exit (-1);
241*ba62d9d3SAndroid Build Coastguard Worker     }
242*ba62d9d3SAndroid Build Coastguard Worker 
243*ba62d9d3SAndroid Build Coastguard Worker     // print the copyright comment text to the file
244*ba62d9d3SAndroid Build Coastguard Worker     fwrite(COPYRIGHT, 1, strlen(COPYRIGHT), hHeaderFile);
245*ba62d9d3SAndroid Build Coastguard Worker 
246*ba62d9d3SAndroid Build Coastguard Worker     fprintf(hHeaderFile, INDEX_OPEN_FORMAT_STRING);
247*ba62d9d3SAndroid Build Coastguard Worker     fprintf(hHeaderFile, INDEX_ENTRY_FORMAT_INT("LINKFILE_VERSION", LINKFILE_VERSION));
248*ba62d9d3SAndroid Build Coastguard Worker     fprintf(hHeaderFile, INDEX_ENTRY_FORMAT_INT("LINKFILE_HEADER" , sizeof(LinkFileHeader)));
249*ba62d9d3SAndroid Build Coastguard Worker     fprintf(hHeaderFile, "\n");
250*ba62d9d3SAndroid Build Coastguard Worker 
251*ba62d9d3SAndroid Build Coastguard Worker     for (iterator = KernelList.begin(), dwKernelCount = 0;
252*ba62d9d3SAndroid Build Coastguard Worker         iterator != KernelList.end(); iterator++, dwKernelCount++)
253*ba62d9d3SAndroid Build Coastguard Worker     {
254*ba62d9d3SAndroid Build Coastguard Worker         strncpy(KernelNameNoExt, iterator->c_str(), MAX_STRING_SIZE);
255*ba62d9d3SAndroid Build Coastguard Worker 
256*ba62d9d3SAndroid Build Coastguard Worker         *(strrchr(KernelNameNoExt, '.')) = '\0';
257*ba62d9d3SAndroid Build Coastguard Worker         char *c;
258*ba62d9d3SAndroid Build Coastguard Worker 
259*ba62d9d3SAndroid Build Coastguard Worker         while ((c = strchr(KernelNameNoExt, '.')) != NULL) *c = '_';
260*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, INDEX_ENTRY_FORMAT_STRING(KernelNameNoExt));
261*ba62d9d3SAndroid Build Coastguard Worker     }
262*ba62d9d3SAndroid Build Coastguard Worker 
263*ba62d9d3SAndroid Build Coastguard Worker     fprintf(hHeaderFile, INDEX_ENTRY_FORMAT_STRING("TOTAL_NUM_KERNELS"));
264*ba62d9d3SAndroid Build Coastguard Worker 
265*ba62d9d3SAndroid Build Coastguard Worker     // kernel names are defined in the same sequence as they are loaded
266*ba62d9d3SAndroid Build Coastguard Worker     if (bKernelNames)
267*ba62d9d3SAndroid Build Coastguard Worker     {
268*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, "\n#if _DEBUG || _RELEASE_INTERNAL\n");
269*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, KERNEL_NAME_DEFINE("KERNEL_NAMES"));
270*ba62d9d3SAndroid Build Coastguard Worker         for (iterator = KernelList.begin(), dwKernelCount = 0;
271*ba62d9d3SAndroid Build Coastguard Worker         iterator != KernelList.end(); iterator++, dwKernelCount++)
272*ba62d9d3SAndroid Build Coastguard Worker         {
273*ba62d9d3SAndroid Build Coastguard Worker             strncpy(KernelNameNoExt, iterator->c_str(), MAX_STRING_SIZE);
274*ba62d9d3SAndroid Build Coastguard Worker             *(strrchr(KernelNameNoExt, '.')) = '\0';
275*ba62d9d3SAndroid Build Coastguard Worker             char *c;
276*ba62d9d3SAndroid Build Coastguard Worker             while ((c = strchr(KernelNameNoExt, '.')) != NULL) *c = '_';
277*ba62d9d3SAndroid Build Coastguard Worker             fprintf(hHeaderFile, KERNEL_NAME_ENTRY(KernelNameNoExt));
278*ba62d9d3SAndroid Build Coastguard Worker         }
279*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, "    _" "T(\"\")\n");
280*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, "#else // !_DEBUG\n");
281*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, KERNEL_NAME_DEFINE("KERNEL_NAMES"));
282*ba62d9d3SAndroid Build Coastguard Worker         for (int i = 0; i < dwKernelCount; i++)
283*ba62d9d3SAndroid Build Coastguard Worker         {
284*ba62d9d3SAndroid Build Coastguard Worker             fprintf(hHeaderFile, KERNEL_ID_ENTRY(i));
285*ba62d9d3SAndroid Build Coastguard Worker         }
286*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, "    _" "T(\"\")\n");
287*ba62d9d3SAndroid Build Coastguard Worker         fprintf(hHeaderFile, "#endif // _DEBUG\n");
288*ba62d9d3SAndroid Build Coastguard Worker     }
289*ba62d9d3SAndroid Build Coastguard Worker 
290*ba62d9d3SAndroid Build Coastguard Worker     fprintf(hHeaderFile, INDEX_CLOSE_FORMAT_STRING);
291*ba62d9d3SAndroid Build Coastguard Worker     fprintf(hHeaderFile, "\n");
292*ba62d9d3SAndroid Build Coastguard Worker     g_dwTotalKernelCount = dwKernelCount;
293*ba62d9d3SAndroid Build Coastguard Worker     fclose(hHeaderFile);
294*ba62d9d3SAndroid Build Coastguard Worker 
295*ba62d9d3SAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////
296*ba62d9d3SAndroid Build Coastguard Worker     // Create bin containing kernel table and actual kernel binaries //
297*ba62d9d3SAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////
298*ba62d9d3SAndroid Build Coastguard Worker     // allocate kernel offset table
299*ba62d9d3SAndroid Build Coastguard Worker     g_dwOffsetTableSize = (g_dwTotalKernelCount + 1) * sizeof(unsigned int);
300*ba62d9d3SAndroid Build Coastguard Worker     g_pOffsetTable      = (unsigned int *)malloc(g_dwOffsetTableSize);
301*ba62d9d3SAndroid Build Coastguard Worker     if (!g_pOffsetTable)
302*ba62d9d3SAndroid Build Coastguard Worker     {
303*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to allocate offset table\n");
304*ba62d9d3SAndroid Build Coastguard Worker         exit (-1);
305*ba62d9d3SAndroid Build Coastguard Worker     }
306*ba62d9d3SAndroid Build Coastguard Worker 
307*ba62d9d3SAndroid Build Coastguard Worker     // do for every family specific folder
308*ba62d9d3SAndroid Build Coastguard Worker     // create the file that will be the concatenation of all kernel binaries
309*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KernelBinName, "%s", KERNEL_BINARY_FILE);
310*ba62d9d3SAndroid Build Coastguard Worker     g_hKernelBinary = fopen(KernelBinName, "wb");
311*ba62d9d3SAndroid Build Coastguard Worker     if (g_hKernelBinary == NULL)
312*ba62d9d3SAndroid Build Coastguard Worker     {
313*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "Failed to open Kernel Bin File\n");
314*ba62d9d3SAndroid Build Coastguard Worker         exit (-1);
315*ba62d9d3SAndroid Build Coastguard Worker     }
316*ba62d9d3SAndroid Build Coastguard Worker 
317*ba62d9d3SAndroid Build Coastguard Worker     // write empty offset table
318*ba62d9d3SAndroid Build Coastguard Worker     memset(g_pOffsetTable,  0, g_dwOffsetTableSize);
319*ba62d9d3SAndroid Build Coastguard Worker     fwrite( g_pOffsetTable, 1, g_dwOffsetTableSize, (FILE *)g_hKernelBinary);
320*ba62d9d3SAndroid Build Coastguard Worker 
321*ba62d9d3SAndroid Build Coastguard Worker     // create link information for the current family folder
322*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
323*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KernelNameFull, "%s", KERNEL_COMPONENT_DIR);
324*ba62d9d3SAndroid Build Coastguard Worker #else
325*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KernelNameFull, "%s", KERNEL_COMPONENT_DIR);
326*ba62d9d3SAndroid Build Coastguard Worker #endif
327*ba62d9d3SAndroid Build Coastguard Worker     CreateLinkFile(KernelNameFull, KernelList);
328*ba62d9d3SAndroid Build Coastguard Worker 
329*ba62d9d3SAndroid Build Coastguard Worker     // for every kernel in the superset list
330*ba62d9d3SAndroid Build Coastguard Worker     g_dwCurrentKernel = 0;
331*ba62d9d3SAndroid Build Coastguard Worker     for (iterator = KernelList.begin(); iterator != KernelList.end(); iterator++, g_dwCurrentKernel++)
332*ba62d9d3SAndroid Build Coastguard Worker     {
333*ba62d9d3SAndroid Build Coastguard Worker         // check if this kernel exists for this platform
334*ba62d9d3SAndroid Build Coastguard Worker         // cFileName contains file name
335*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
336*ba62d9d3SAndroid Build Coastguard Worker         sprintf(KernelNameFull, "%s/%s", KERNEL_COMPONENT_DIR, iterator->c_str());
337*ba62d9d3SAndroid Build Coastguard Worker #else
338*ba62d9d3SAndroid Build Coastguard Worker         sprintf(KernelNameFull, "%s\\%s", KERNEL_COMPONENT_DIR, iterator->c_str());
339*ba62d9d3SAndroid Build Coastguard Worker #endif
340*ba62d9d3SAndroid Build Coastguard Worker         // add kernel binary, update offset table
341*ba62d9d3SAndroid Build Coastguard Worker         ConcatenateKernelBinary(KernelNameFull, bVerbose);
342*ba62d9d3SAndroid Build Coastguard Worker     }
343*ba62d9d3SAndroid Build Coastguard Worker 
344*ba62d9d3SAndroid Build Coastguard Worker     // write offset table
345*ba62d9d3SAndroid Build Coastguard Worker     fseek(g_hKernelBinary, 0, SEEK_SET);
346*ba62d9d3SAndroid Build Coastguard Worker     fwrite(g_pOffsetTable, 1, g_dwOffsetTableSize, g_hKernelBinary);
347*ba62d9d3SAndroid Build Coastguard Worker 
348*ba62d9d3SAndroid Build Coastguard Worker     fclose(g_hKernelBinary);
349*ba62d9d3SAndroid Build Coastguard Worker 
350*ba62d9d3SAndroid Build Coastguard Worker #ifdef LINUX_
351*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KernelNameFull, "%s", KERNEL_COMPONENT_DIR);
352*ba62d9d3SAndroid Build Coastguard Worker #else
353*ba62d9d3SAndroid Build Coastguard Worker     sprintf(KernelNameFull, "%s", KERNEL_COMPONENT_DIR);
354*ba62d9d3SAndroid Build Coastguard Worker #endif
355*ba62d9d3SAndroid Build Coastguard Worker 
356*ba62d9d3SAndroid Build Coastguard Worker     DeleteLinkFile(KernelNameFull);
357*ba62d9d3SAndroid Build Coastguard Worker 
358*ba62d9d3SAndroid Build Coastguard Worker     // free offset table
359*ba62d9d3SAndroid Build Coastguard Worker     if (g_pOffsetTable)
360*ba62d9d3SAndroid Build Coastguard Worker     {
361*ba62d9d3SAndroid Build Coastguard Worker         free(g_pOffsetTable);
362*ba62d9d3SAndroid Build Coastguard Worker     }
363*ba62d9d3SAndroid Build Coastguard Worker 
364*ba62d9d3SAndroid Build Coastguard Worker     return 0;
365*ba62d9d3SAndroid Build Coastguard Worker }
366*ba62d9d3SAndroid Build Coastguard Worker 
ConcatenateKernelBinary(char * pKernelName,bool bVerbose)367*ba62d9d3SAndroid Build Coastguard Worker void ConcatenateKernelBinary(char *pKernelName, bool bVerbose)
368*ba62d9d3SAndroid Build Coastguard Worker {
369*ba62d9d3SAndroid Build Coastguard Worker     FILE *hKernel;
370*ba62d9d3SAndroid Build Coastguard Worker     char pBuffer[MAX_STRING_SIZE];
371*ba62d9d3SAndroid Build Coastguard Worker     unsigned int dwBytesRead, dwBytesWritten, dwBinaryPos, dwFileSize;
372*ba62d9d3SAndroid Build Coastguard Worker     int   iLength;
373*ba62d9d3SAndroid Build Coastguard Worker 
374*ba62d9d3SAndroid Build Coastguard Worker     // update offset table
375*ba62d9d3SAndroid Build Coastguard Worker     dwBinaryPos = ftell(g_hKernelBinary) - g_dwOffsetTableSize;
376*ba62d9d3SAndroid Build Coastguard Worker     g_pOffsetTable[g_dwCurrentKernel] = dwBinaryPos;
377*ba62d9d3SAndroid Build Coastguard Worker 
378*ba62d9d3SAndroid Build Coastguard Worker     // the function opens an existing file and returns a handle that can be used to access the object
379*ba62d9d3SAndroid Build Coastguard Worker     // open .krn/.hex file
380*ba62d9d3SAndroid Build Coastguard Worker     hKernel = fopen(pKernelName, "r");
381*ba62d9d3SAndroid Build Coastguard Worker 
382*ba62d9d3SAndroid Build Coastguard Worker     if (hKernel == NULL)
383*ba62d9d3SAndroid Build Coastguard Worker     {
384*ba62d9d3SAndroid Build Coastguard Worker         fclose(hKernel);
385*ba62d9d3SAndroid Build Coastguard Worker         g_pOffsetTable[g_dwCurrentKernel + 1] = dwBinaryPos;
386*ba62d9d3SAndroid Build Coastguard Worker         return;
387*ba62d9d3SAndroid Build Coastguard Worker     }
388*ba62d9d3SAndroid Build Coastguard Worker     else
389*ba62d9d3SAndroid Build Coastguard Worker     {
390*ba62d9d3SAndroid Build Coastguard Worker         fseek(hKernel, 0, SEEK_END);
391*ba62d9d3SAndroid Build Coastguard Worker         dwFileSize = ftell(hKernel);
392*ba62d9d3SAndroid Build Coastguard Worker         fseek(hKernel, 0, SEEK_SET);
393*ba62d9d3SAndroid Build Coastguard Worker     }
394*ba62d9d3SAndroid Build Coastguard Worker 
395*ba62d9d3SAndroid Build Coastguard Worker     // print kernel name processed
396*ba62d9d3SAndroid Build Coastguard Worker     if (bVerbose)
397*ba62d9d3SAndroid Build Coastguard Worker     {
398*ba62d9d3SAndroid Build Coastguard Worker         fprintf(stderr, "%s\n", pKernelName);
399*ba62d9d3SAndroid Build Coastguard Worker     }
400*ba62d9d3SAndroid Build Coastguard Worker 
401*ba62d9d3SAndroid Build Coastguard Worker     // .hex file
402*ba62d9d3SAndroid Build Coastguard Worker     iLength = strlen(pKernelName);
403*ba62d9d3SAndroid Build Coastguard Worker     if (StrCmp(&pKernelName[iLength-4], ".hex", 4) == 0)
404*ba62d9d3SAndroid Build Coastguard Worker     {
405*ba62d9d3SAndroid Build Coastguard Worker         int    iLine = 1;
406*ba62d9d3SAndroid Build Coastguard Worker         char   pBinBuffer[MAX_STRING_SIZE];
407*ba62d9d3SAndroid Build Coastguard Worker         int    iBinLeft = MAX_STRING_SIZE;
408*ba62d9d3SAndroid Build Coastguard Worker         unsigned int * pBinCurrent = (unsigned int *)pBinBuffer;
409*ba62d9d3SAndroid Build Coastguard Worker         char  *pBuffCurrent = pBuffer;
410*ba62d9d3SAndroid Build Coastguard Worker         int    iBuffLeft  = 0;
411*ba62d9d3SAndroid Build Coastguard Worker 
412*ba62d9d3SAndroid Build Coastguard Worker         dwBytesRead = 0;
413*ba62d9d3SAndroid Build Coastguard Worker         do
414*ba62d9d3SAndroid Build Coastguard Worker         {
415*ba62d9d3SAndroid Build Coastguard Worker             // shift and read hex data
416*ba62d9d3SAndroid Build Coastguard Worker             if (iBuffLeft < 35)
417*ba62d9d3SAndroid Build Coastguard Worker             {
418*ba62d9d3SAndroid Build Coastguard Worker                 // move incomplete line to the beginning of the buffer
419*ba62d9d3SAndroid Build Coastguard Worker                 if (iBuffLeft)
420*ba62d9d3SAndroid Build Coastguard Worker                 {
421*ba62d9d3SAndroid Build Coastguard Worker                     memcpy(pBuffer, pBuffCurrent, iBuffLeft);
422*ba62d9d3SAndroid Build Coastguard Worker                 }
423*ba62d9d3SAndroid Build Coastguard Worker 
424*ba62d9d3SAndroid Build Coastguard Worker                 // fill buffer (leave room for 0 at the end of the string)
425*ba62d9d3SAndroid Build Coastguard Worker                 pBuffCurrent = pBuffer;
426*ba62d9d3SAndroid Build Coastguard Worker                 if (dwBytesRead = fread(pBuffCurrent + iBuffLeft, 1, sizeof(pBuffer) - iBuffLeft - 1, hKernel))
427*ba62d9d3SAndroid Build Coastguard Worker                 {
428*ba62d9d3SAndroid Build Coastguard Worker                     // add data
429*ba62d9d3SAndroid Build Coastguard Worker                     iBuffLeft += dwBytesRead;
430*ba62d9d3SAndroid Build Coastguard Worker 
431*ba62d9d3SAndroid Build Coastguard Worker                     // terminate string with 0 to avoid parsing issues
432*ba62d9d3SAndroid Build Coastguard Worker                     pBuffCurrent[iBuffLeft] = 0;
433*ba62d9d3SAndroid Build Coastguard Worker 
434*ba62d9d3SAndroid Build Coastguard Worker                     // no data to read - EOF
435*ba62d9d3SAndroid Build Coastguard Worker                     if (dwBytesRead == 0)
436*ba62d9d3SAndroid Build Coastguard Worker                     {
437*ba62d9d3SAndroid Build Coastguard Worker                         if (iBuffLeft > 4)
438*ba62d9d3SAndroid Build Coastguard Worker                         {
439*ba62d9d3SAndroid Build Coastguard Worker                             fprintf(stderr, "Hex file %s is not 32 bytes aligned. Left %d bytes not processed. May have critical issue!!!\n", pKernelName, iBuffLeft);
440*ba62d9d3SAndroid Build Coastguard Worker                         }
441*ba62d9d3SAndroid Build Coastguard Worker                         iBuffLeft = -1;
442*ba62d9d3SAndroid Build Coastguard Worker                     }
443*ba62d9d3SAndroid Build Coastguard Worker                 }
444*ba62d9d3SAndroid Build Coastguard Worker                 else
445*ba62d9d3SAndroid Build Coastguard Worker                 {
446*ba62d9d3SAndroid Build Coastguard Worker                     if (iBuffLeft > 4)
447*ba62d9d3SAndroid Build Coastguard Worker                     {
448*ba62d9d3SAndroid Build Coastguard Worker                         fprintf(stderr, "Hex file %s is not 32 bytes aligned. Left %d bytes not processed. May have critical issue!!!\n", pKernelName, iBuffLeft);
449*ba62d9d3SAndroid Build Coastguard Worker                     }
450*ba62d9d3SAndroid Build Coastguard Worker                     iBuffLeft = -1;
451*ba62d9d3SAndroid Build Coastguard Worker                 }
452*ba62d9d3SAndroid Build Coastguard Worker             }
453*ba62d9d3SAndroid Build Coastguard Worker 
454*ba62d9d3SAndroid Build Coastguard Worker             // process hex data one line at a time (35 chars => "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx")
455*ba62d9d3SAndroid Build Coastguard Worker             while (iBuffLeft >= 35 && iBinLeft > 0)
456*ba62d9d3SAndroid Build Coastguard Worker             {
457*ba62d9d3SAndroid Build Coastguard Worker                 // skip CR/LF/TAB (control characters)
458*ba62d9d3SAndroid Build Coastguard Worker                 while (iBuffLeft > 35 && *pBuffCurrent < 32)
459*ba62d9d3SAndroid Build Coastguard Worker                 {
460*ba62d9d3SAndroid Build Coastguard Worker                     pBuffCurrent++;
461*ba62d9d3SAndroid Build Coastguard Worker                     iBuffLeft--;
462*ba62d9d3SAndroid Build Coastguard Worker                 }
463*ba62d9d3SAndroid Build Coastguard Worker 
464*ba62d9d3SAndroid Build Coastguard Worker                 // convert hex to bin (4 DW = 16 B = 128 bits/line)
465*ba62d9d3SAndroid Build Coastguard Worker                 if ( 4 != sscanf(pBuffCurrent, "%08x %08x %08x %08x", pBinCurrent, pBinCurrent+1, pBinCurrent+2, pBinCurrent+3) )
466*ba62d9d3SAndroid Build Coastguard Worker                 {
467*ba62d9d3SAndroid Build Coastguard Worker                     fprintf(stderr, "Fail to process file %s at line %d\n", pKernelName, iLine);
468*ba62d9d3SAndroid Build Coastguard Worker                     exit(-1);
469*ba62d9d3SAndroid Build Coastguard Worker                 }
470*ba62d9d3SAndroid Build Coastguard Worker 
471*ba62d9d3SAndroid Build Coastguard Worker                 // line counter
472*ba62d9d3SAndroid Build Coastguard Worker                 iLine++;
473*ba62d9d3SAndroid Build Coastguard Worker 
474*ba62d9d3SAndroid Build Coastguard Worker                 // increment hex buffer
475*ba62d9d3SAndroid Build Coastguard Worker                 pBuffCurrent += 35;
476*ba62d9d3SAndroid Build Coastguard Worker                 iBuffLeft    -= 35;
477*ba62d9d3SAndroid Build Coastguard Worker 
478*ba62d9d3SAndroid Build Coastguard Worker                 // increment bin buffer
479*ba62d9d3SAndroid Build Coastguard Worker                 pBinCurrent += 4;
480*ba62d9d3SAndroid Build Coastguard Worker                 iBinLeft    -= 4 * sizeof(unsigned int);
481*ba62d9d3SAndroid Build Coastguard Worker 
482*ba62d9d3SAndroid Build Coastguard Worker             }
483*ba62d9d3SAndroid Build Coastguard Worker 
484*ba62d9d3SAndroid Build Coastguard Worker             if (iBinLeft == 0 || iBuffLeft < 0)
485*ba62d9d3SAndroid Build Coastguard Worker             {
486*ba62d9d3SAndroid Build Coastguard Worker                 // get actual size of binary buffer
487*ba62d9d3SAndroid Build Coastguard Worker                 dwBytesRead = sizeof(pBinBuffer) - iBinLeft;
488*ba62d9d3SAndroid Build Coastguard Worker 
489*ba62d9d3SAndroid Build Coastguard Worker                 dwBinaryPos = ftell(g_hKernelBinary);
490*ba62d9d3SAndroid Build Coastguard Worker                 fwrite(pBinBuffer, 1, dwBytesRead, g_hKernelBinary);
491*ba62d9d3SAndroid Build Coastguard Worker 
492*ba62d9d3SAndroid Build Coastguard Worker                 if (iBuffLeft >= 0)
493*ba62d9d3SAndroid Build Coastguard Worker                 {
494*ba62d9d3SAndroid Build Coastguard Worker                     pBinCurrent = (unsigned int *)pBinBuffer;
495*ba62d9d3SAndroid Build Coastguard Worker                     iBinLeft    = sizeof(pBinBuffer);
496*ba62d9d3SAndroid Build Coastguard Worker                 }
497*ba62d9d3SAndroid Build Coastguard Worker             }
498*ba62d9d3SAndroid Build Coastguard Worker         } while (dwBytesRead > 0 && iBuffLeft >= 0);
499*ba62d9d3SAndroid Build Coastguard Worker     }
500*ba62d9d3SAndroid Build Coastguard Worker     else
501*ba62d9d3SAndroid Build Coastguard Worker     {
502*ba62d9d3SAndroid Build Coastguard Worker         if (fread(pBuffer, 1, sizeof(pBuffer), hKernel))
503*ba62d9d3SAndroid Build Coastguard Worker         {
504*ba62d9d3SAndroid Build Coastguard Worker             dwBinaryPos = ftell(g_hKernelBinary);
505*ba62d9d3SAndroid Build Coastguard Worker             fwrite(pBuffer, 1, dwFileSize, g_hKernelBinary);
506*ba62d9d3SAndroid Build Coastguard Worker         }
507*ba62d9d3SAndroid Build Coastguard Worker     }
508*ba62d9d3SAndroid Build Coastguard Worker 
509*ba62d9d3SAndroid Build Coastguard Worker     dwBinaryPos = ftell(g_hKernelBinary) - g_dwOffsetTableSize;
510*ba62d9d3SAndroid Build Coastguard Worker     g_pOffsetTable[g_dwCurrentKernel+1] = dwBinaryPos;
511*ba62d9d3SAndroid Build Coastguard Worker 
512*ba62d9d3SAndroid Build Coastguard Worker     // close kernel file
513*ba62d9d3SAndroid Build Coastguard Worker     if (hKernel != NULL) fclose(hKernel);
514*ba62d9d3SAndroid Build Coastguard Worker }
515