00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <string.h>
00026 #include "kmapi_internal.h"
00027 #define pknobs pKMnobs
00028 #include "kapi_saver_utils.h"
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 kmapi_result kmapi_save_as_header_FuList_struct(FILE *fp, kmapi_knobs_t *pKMnobs ,kmapi_fulist_t *pResList, char *pchName, FILE *fpTables)
00042 {
00043 static kmapi_save_as_header_FuList_struct_num=0;
00044 char *MyName;
00045 char pchTmp[200];
00046 FILE *fpTmp=fp;
00047 kmapi_fulist_t *pWalker=pResList;
00048 int iIndex=0;
00049
00050
00051 if (pResList==NULL)
00052 {
00053 ADD_NULL;
00054 ADD_NEWLINE;
00055 return kmapi_success;
00056 }
00057
00058
00059 kmapi_save_as_header_FuList_struct_num++;
00060 *pchTmp='\0';
00061 sprintf(pchTmp,"fu_list_%d",kmapi_save_as_header_FuList_struct_num);
00062 MyName=make_string_attach(pchName,pchTmp);
00063
00064
00065 fpTmp=fpTables;
00066 ADD_STRUCT_ARRAY_HEADER("kmapi_fulist_t",MyName);
00067 while (pWalker!=NULL)
00068 {
00069 fprintf(fpTmp,"{%#x,",pWalker->bvResourceMap);
00070 if (pWalker->pNext!=NULL)
00071 fprintf(fpTmp,"&%s[%d]},\n",MyName,++iIndex);
00072 else
00073 fprintf(fpTmp,"NULL}\n");
00074 pWalker=pWalker->pNext;
00075 }
00076 END_ARRAY;
00077
00078 fpTmp=fp;
00079 fprintf(fpTmp,"%s\n",MyName);
00080
00081 return kmapi_success;
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091 kmapi_result kmapi_save_as_header_Exception_Data_struct(FILE *fp,kmapi_knobs_t *pKMnobs,kmapi_exception_data_t *pExceptionDetails,char *pchName,FILE *fpTables)
00092 {
00093 static kmapi_save_as_header_Exception_Data_struct=0;
00094 char *MyName;
00095 char pchTmp[200];
00096 FILE *fpTmp=fp;
00097
00098 kmapi_save_as_header_Exception_Data_struct++;
00099 *pchTmp='\0';
00100 sprintf(pchTmp,"exception_data_%d",kmapi_save_as_header_Exception_Data_struct);
00101 MyName=make_string_attach(pchName,pchTmp);
00102
00103 KAPI_save_as_header_int_list(fpTmp,pExceptionDetails->bid);
00104
00105 KAPI_save_as_header_bv128(fpTmp,&(pExceptionDetails->bvfuClasses));
00106 ADD_COMMA;
00107 kmapi_save_as_header_FuList_struct(fpTmp,pKMnobs,pExceptionDetails->pfuList,MyName,fpTables);
00108
00109
00110 return kmapi_success;
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120 kmapi_result kmapi_save_as_header_ExceptionList_struct(FILE *fp, kmapi_knobs_t *pKMnobs ,kmapi_exception_t *pExceptionList, char *pchName, FILE *fpTables)
00121 {
00122 static kmapi_save_as_header_ExceptionList_struct_num=0;
00123 char *MyName;
00124 char pchTmp[200];
00125 FILE *fpTmp=tmpfile();
00126 kmapi_exception_t *pWalker=pExceptionList;
00127 int iIndex=0;
00128
00129
00130 if (pExceptionList==NULL)
00131 {
00132 fclose(fpTmp);
00133 fpTmp=fp;
00134 ADD_NULL;
00135 ADD_NEWLINE;
00136 return kmapi_success;
00137 }
00138
00139
00140 kmapi_save_as_header_ExceptionList_struct_num++;
00141 *pchTmp='\0';
00142 sprintf(pchTmp,"exception_list_%d",kmapi_save_as_header_ExceptionList_struct_num);
00143 MyName=make_string_attach(pchName,pchTmp);
00144
00145
00146 ADD_STRUCT_ARRAY_HEADER("kmapi_exception_t",MyName);
00147 while (pWalker!=NULL)
00148 {
00149 START_STRUCT;
00150 START_STRUCT;
00151 kmapi_save_as_header_Exception_Data_struct(fpTmp,pKMnobs,&(pWalker->Details),MyName,fpTables);
00152 CLOSE_STRUCT;
00153 ADD_COMMA;
00154 if (pWalker->pNext!=NULL)
00155 fprintf(fpTmp,"&%s[%d]},\n",MyName,++iIndex);
00156 else
00157 fprintf(fpTmp,"NULL}\n");
00158
00159 pWalker=pWalker->pNext;
00160 }
00161 END_ARRAY;
00162
00163 append_tmp(fpTables, fpTmp);
00164
00165 fpTmp=fp;
00166 fprintf(fpTmp,"%s\n",MyName);
00167
00168 return kmapi_success;
00169 }
00170
00171
00172
00173
00174
00175
00176
00177 kmapi_result kmapi_save_as_header_bundle_fu_list(FILE *fp,kmapi_knobs_t *pKMnobs, bundle_fus_t *pbfu, char *pchName,FILE *fpTables)
00178 {
00179 static int kmapi_save_as_header_bundle_fu_list_num=0;
00180 char *MyName;
00181 char pchTmp[200];
00182 FILE *fpTmp=fp;
00183 int iIndex=0;
00184 bundle_fus_t *pWalker=pbfu;
00185 int i;
00186
00187
00188
00189 if (pbfu==NULL)
00190 {
00191 ADD_NULL;
00192 ADD_NEWLINE;
00193 return kmapi_success;
00194 }
00195
00196 kmapi_save_as_header_bundle_fu_list_num++;
00197 *pchTmp='\0';
00198 sprintf(pchTmp,"bundle_fulist_%d",kmapi_save_as_header_bundle_fu_list_num);
00199 MyName=make_string_attach(pchName,pchTmp);
00200
00201
00202 fpTmp=fpTables;
00203 ADD_STRUCT_ARRAY_HEADER("bundle_fus_t",MyName);
00204 while (pWalker!=NULL)
00205 {
00206 START_STRUCT;
00207 START_ARRAY;
00208 for (i=0;i<kmapi_BUNDLE_WIDTH;i++)
00209 {
00210 KAPI_save_as_header_bv128(fpTmp,&(pWalker->bvSlots[i]));
00211 if (i<(kmapi_BUNDLE_WIDTH-1)) ADD_COMMA;
00212 }
00213 CLOSE_ARRAY;
00214 ADD_COMMA;
00215 if (pWalker->pNext!=NULL)
00216 fprintf(fpTmp,"&%s[%d]},\n",MyName,++iIndex);
00217 else
00218 fprintf(fpTmp,"NULL\n}");
00219
00220 pWalker=pWalker->pNext;
00221 }
00222 END_ARRAY;
00223
00224 fpTmp=fp;
00225 fprintf(fpTmp,"%s\n",MyName);
00226
00227 return kmapi_success;
00228 }
00229
00230
00231
00232
00233
00234
00235
00236
00237 kmapi_result kmapi_save_as_header_SplitRule_struct(FILE *fp, kmapi_knobs_t *pKMnobs ,kmapi_split_rule_t *pRule, char *pchName, FILE *fpTables)
00238 {
00239 static int kmapi_save_as_header_SplitRule_struct_num=0;
00240 char *MyName;
00241 char pchTmp[200];
00242 FILE *fpTmp=fp;
00243
00244 kmapi_save_as_header_SplitRule_struct_num++;
00245 *pchTmp='\0';
00246 sprintf(pchTmp,"Split_Rule_%d",kmapi_save_as_header_SplitRule_struct_num);
00247 MyName=make_string_attach(pchName,pchTmp);
00248
00249 KAPI_save_as_header_int_list(fp,pRule->bid);
00250 KAPI_save_as_header_int_list(fp,pRule->bvSplits);
00251 kmapi_save_as_header_bundle_fu_list(fp, pKMnobs, pRule->pSplitExeptions, MyName, fpTables);
00252
00253 return kmapi_success;
00254 }
00255
00256 kmapi_result KMAPI_save_as_header_allinfo_struct(FILE *fp,kmapi_knobs_t *pKMnobs, char *pchKmapiName, char *pchKapiName, FILE *fpTables)
00257 {
00258 FILE *fpTmp=tmpfile();
00259 char *pchBinfoName;
00260 char *pchOptionsName;
00261 char *pchExceptionName;
00262 char *pchFuclassListsName;
00263 char *pchSplitRulesName;
00264 char *pchMiscFuInfoName;
00265
00266 pchBinfoName=make_string_attach(pchKmapiName,"Allocation_Option_Table_By_PBS");
00267 pchOptionsName=make_string_attach(pchKmapiName,"Allocation_Option_Table_By_PSL");
00268 pchExceptionName=make_string_attach(pchKmapiName,"Allocation_Exceptions_Table_By_PSL");
00269 pchSplitRulesName=make_string_attach(pchKmapiName,"Split_Rules_Table");
00270 pchMiscFuInfoName=make_string_attach(pchKmapiName,"Misc_Fu_Info_array");
00271 pchFuclassListsName="NULL";
00272
00273
00274 ADD_PTR_STRUCT_ARRAY("kmapi_fulist_t *",pchBinfoName,pKMnobs->cBinfoLists,
00275 pKMnobs->dm3pfuBinfoLists,kmapi_save_as_header_FuList_struct);
00276 ADD_PTR_STRUCT_ARRAY("kmapi_fulist_t *",pchOptionsName,pKMnobs->cOptions,
00277 pKMnobs->dm3pOptions,kmapi_save_as_header_FuList_struct);
00278 ADD_PTR_STRUCT_ARRAY("kmapi_exception_t *",pchExceptionName, pKMnobs->cExceptions,
00279 pKMnobs->dm3pExceptions,kmapi_save_as_header_ExceptionList_struct);
00280 ADD_STRUCT_ARRAY("kmapi_split_rule_t",pchSplitRulesName,KAPI_EnumCardinality(pKMnobs->pKnobs,"bid_t"),
00281 pKMnobs->dmpSplitRules,kmapi_save_as_header_SplitRule_struct);
00282
00283 ADD_STRUCT_ARRAY_HEADER("bv32_t",pchMiscFuInfoName);
00284 KAPI_save_as_header_bv32_array(fpTmp,pKMnobs->dmpMiscFuInfo,(KAPI_EnumCardinality(pKMnobs->pKnobs,"fu_t")+1));
00285 END_ARRAY;
00286
00287
00288
00289 append_tmp(fpTables,fpTmp);
00290
00291 if (pchKapiName!=NULL)
00292 {
00293 KAPI_save_as_header_all_IA64_info(fpTables,pKMnobs->pKnobs,pchKapiName);
00294 } else
00295 pchKapiName="NULL";
00296
00297
00298 fpTmp=fp;
00299
00300 KAPI_save_as_header_name_list(fpTmp,pchKapiName);
00301 KAPI_save_as_header_int_list(fpTmp,pKMnobs->cBinfoLists);
00302 KAPI_save_as_header_name_list(fpTmp,pchBinfoName);
00303 KAPI_save_as_header_int_list(fpTmp,pKMnobs->cOptions);
00304 KAPI_save_as_header_name_list(fpTmp,pchOptionsName);
00305 KAPI_save_as_header_int_list(fpTmp,pKMnobs->cFuclassLists);
00306 KAPI_save_as_header_name_list(fpTmp,pchFuclassListsName);
00307 KAPI_save_as_header_int_list(fpTmp,pKMnobs->cExceptions);
00308 KAPI_save_as_header_name_list(fpTmp,pchExceptionName);
00309 KAPI_save_as_header_int_list(fpTmp,pKMnobs->cSplitRules);
00310 KAPI_save_as_header_name_list(fpTmp,pchSplitRulesName);
00311 KAPI_save_as_header_int_list(fpTmp,pKMnobs->iTotalResources);
00312 KAPI_save_as_header_int_list(fpTmp,pKMnobs->iScheme);
00313 ADD_NEWLINE;
00314 KAPI_save_as_header_name(fpTmp,pchMiscFuInfoName);
00315
00316
00317 return kmapi_success;
00318
00319 }
00320
00321
00322 kmapi_result kmapi_save_as_header_allinfo_saver( FILE *fp, void *pConfig , char *pchKmapiName, char *pchKapiName, int *piReserved)
00323 {
00324 kmapi_knobs_t *pKMnobs=(kmapi_knobs_t *)pConfig;
00325 FILE *fpTmp=fp;
00326 FILE *fpTmpTablesFile=NULL;
00327 char pchVersion[200];
00328 char pchHeader[]="#include \"kmapi_internal.h\"\n";
00329
00330
00331 if (NULL==fp) return kmapi_invalid_input;
00332 if (NULL==pConfig)
00333 {
00334 ADD_COMMENT("no valid configuration\n");
00335 return kmapi_invalid_input;
00336 }
00337 if (NULL==pchKmapiName)
00338 {
00339 ADD_COMMENT("no name for saving kmapi structures\n");
00340 return kmapi_invalid_input;
00341 }
00342
00343 fpTmp=tmpfile();
00344 fpTmpTablesFile=tmpfile();
00345 if ((NULL==fpTmp) || (NULL==fpTmpTablesFile))
00346 return kmapi_internal_error;
00347
00348 ADD_EXTERN_STRUCT_HEADER("kmapi_knobs_t",pchKmapiName);
00349 KMAPI_save_as_header_allinfo_struct( fpTmp, pKMnobs , pchKmapiName, pchKapiName, fpTmpTablesFile);
00350 END_STRUCT;
00351
00352 fwrite(pchHeader,sizeof(char),strlen(pchHeader),fp);
00353 append_tmp(fp,fpTmpTablesFile);
00354 append_tmp(fp,fpTmp);
00355
00356 sprintf(pchVersion,"double %s_kmapi_version = %#f\n;",pchKmapiName,KMAPI_GetInternalVersion());
00357
00358 return kmapi_success;
00359 }
00360
00361
00362
00363 kmapi_result KMAPI_save_as_header_all_kmapi_info( FILE *fp, void *pConfig , char *pchKmapiInfoName, char *pchKapiInfoName)
00364 {
00365 int iRes;
00366 int i;
00367
00368
00369 iRes=kmapi_save_as_header_allinfo_saver(fp,pConfig,pchKmapiInfoName,pchKapiInfoName,&i);
00370
00371
00372 return iRes;
00373 }
00374
00375 kmapi_result KMAPI_fEnableKmapiCalls_from_header(void **pConfig, void *pKMAPI_HeaderConfig, void *pKAPI_IA64_HeaderConfig, int iReserved)
00376 {
00377 kmapi_knobs_t *pKMnobs;
00378
00379 if (NULL==pKMAPI_HeaderConfig)
00380 return kmapi_invalid_input;
00381 pKMnobs=(kmapi_knobs_t *)pKMAPI_HeaderConfig;
00382 if (NULL!=pKAPI_IA64_HeaderConfig)
00383 pKMnobs->pKnobs=(knobs_t *)pKAPI_IA64_HeaderConfig;
00384
00385 if (NULL==pKMnobs->pKnobs)
00386 {
00387 return kmapi_invalid_input;
00388 }
00389 *pConfig=pKMnobs;
00390 return kmapi_success;
00391
00392 }
00393
00394 kmapi_result KMAPI_fDisableKmapiCalls_from_header(void **pConfig)
00395 {
00396 *pConfig=NULL;
00397 return kmapi_success;
00398 }