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