00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include "ekapi_ia64.h"
00043 #include "ekapi_util.h"
00044
00045
00046
00047
00048
00049 int EKAPI_RegClassCount(void *pknobs)
00050 {
00051 int count=0;
00052 count = KAPI_EnumCardinality(pknobs, "REGCLASS");
00053 Is_True(count>=0, ("[REGCLASS] type is not existed"));
00054 return count;
00055 }
00056
00057
00058
00059
00060 int EKAPI_RegClassid4name(void *pknobs, char *name)
00061 {
00062 return KAPI_EnumIndex(pknobs, "REGCLASS", name);
00063 }
00064
00065
00066
00067 void EKAPI_RegStruct4id(void *pknobs, EKAPI_REGISTER_CLASS_INFO *reginfo,
00068 int rcid)
00069 {
00070 int i,j;
00071 char *str_knob, *str;
00072
00073 str_knob = KAPI_attribute4index(pknobs, "regclassprop", rcid);
00074 FmtAssert(str_knob != NULL,
00075 ("regclassprop attribute line %d is not existed", rcid));
00076
00077
00078 str = StrTrim(strtok(str_knob, ","));
00079 assert(KAPI_EnumIndex(pknobs, "REGCLASS", str)>=0);
00080 reginfo->name = str;
00081
00082
00083 str = StrTrim(strtok(NULL, ","));
00084 if (strcasecmp(str, "all_isa_mask") == 0 ){
00085 reginfo->isa_mask = 0x01;
00086 }
00087 else {
00088 reginfo->isa_mask =0;
00089 }
00090
00091
00092 str = StrTrim(strtok(NULL, ","));
00093 reginfo->min_regnum = 0;
00094 reginfo->max_regnum = atoi(str)-1;
00095
00096
00097 str = StrTrim(strtok(NULL, ","));
00098 reginfo->bit_size = atoi(str);
00099
00100
00101 str = StrTrim(strtok(NULL, ","));
00102 reginfo->can_store = atoi(str);
00103
00104
00105 str = StrTrim(strtok(NULL, ","));
00106 reginfo->multiple_save = atoi(str);
00107
00108
00109 str = StrTrim(strtok(NULL, ","));
00110 reginfo->name = str;
00111
00112
00113 str = StrTrim(strtok(NULL, ","));
00114 reginfo->naming_rule = str;
00115
00116
00117 str = StrTrim(strtok(NULL, ","));
00118 reginfo->special_array = str;
00119
00120 }
00121
00122
00123
00124
00125 int EKAPI_GetRegNum(EKAPI_REGISTER_CLASS_INFO *reginfo)
00126 {
00127 if (reginfo){
00128 return reginfo->max_regnum+1;
00129 }
00130 return 0;
00131 }
00132
00133
00134
00135
00136 int EKAPI_GetRegIsaMask(EKAPI_REGISTER_CLASS_INFO *reginfo)
00137 {
00138 if (reginfo){
00139 return reginfo->isa_mask;
00140 }
00141 return 0;
00142 }
00143
00144
00145
00146
00147
00148 char *EKAPI_GetRegClassName(EKAPI_REGISTER_CLASS_INFO *reginfo)
00149 {
00150 if (reginfo){
00151 return reginfo->name;
00152 }
00153 return NULL;
00154 }
00155
00156
00157
00158
00159 int EKAPI_GetRegMinNum(EKAPI_REGISTER_CLASS_INFO *reginfo)
00160 {
00161 if (reginfo){
00162 return reginfo->min_regnum;
00163 }
00164 return 0;
00165 }
00166
00167
00168
00169
00170 int EKAPI_GetRegMaxNum(EKAPI_REGISTER_CLASS_INFO *reginfo)
00171 {
00172 if (reginfo){
00173 return reginfo->max_regnum;
00174 }
00175 return 0;
00176 }
00177
00178
00179
00180
00181 int EKAPI_GetRegBitSize(EKAPI_REGISTER_CLASS_INFO *reginfo)
00182 {
00183 if (reginfo){
00184 return reginfo->bit_size;
00185 }
00186 return 0;
00187 }
00188
00189
00190
00191
00192
00193 int EKAPI_GetRegCanStore(EKAPI_REGISTER_CLASS_INFO *reginfo)
00194 {
00195 if (reginfo){
00196 return reginfo->can_store;
00197 }
00198 return 0;
00199 }
00200
00201
00202
00203
00204
00205 int EKAPI_GetRegMultiSave(EKAPI_REGISTER_CLASS_INFO *reginfo)
00206 {
00207 if (reginfo){
00208 return reginfo->multiple_save;
00209 }
00210 return 0;
00211 }
00212
00213
00214
00215
00216 char *EKAPI_GetRegName(void *pknobs, EKAPI_REGISTER_CLASS_INFO *reginfo,
00217 int rid)
00218 {
00219 int index;
00220 char *str, regname[100];
00221 char *name;
00222
00223 if (reginfo){
00224 str = itos(rid);
00225 Is_True(str, ("Register index is valid!"));
00226
00227
00228 if ((index = KAPI_ArrayIndex(pknobs, reginfo->special_array, str)) <0){
00229 sprintf(regname, reginfo->naming_rule, rid);
00230 name = regname;
00231 }
00232 else {
00233 name = KAPI_GetStringVariable(pknobs,
00234 reginfo->special_array, index);
00235 }
00236 free(str);
00237 }
00238
00239 return name;
00240 }
00241
00242
00243
00244
00245 int EKAPI_RegSubclassCount(void *pknobs)
00246 {
00247 int count;
00248 count = KAPI_EnumCardinality(pknobs, "REGSUBCLASS");
00249 Is_True(count>=0, ("[REGSUBCLASS] type of KNOBS FILE is not existed!"));
00250 return count;
00251 }
00252
00253
00254
00255
00256
00257 char *EKAPI_RegSubclassName(void *pknobs, int rsubid)
00258 {
00259 char *name;
00260 name = KAPI_EnumName(pknobs, rsubid, "REGSUBCLASS");
00261 Is_True(name, ("[REGSUBCLASS] type or specified index of KNOBS is not existed!"));
00262 return name;
00263 }
00264
00265
00266
00267
00268 int EKAPI_RegSubclassid4name(void *pknobs, char *name)
00269 {
00270 return KAPI_EnumIndex(pknobs, "REGSUBCLASS", name);
00271 }
00272
00273
00274
00275
00276
00277
00278 int EKAPI_RegSubclassMember(void *pknobs, int regsubclass, int *regclass,
00279 int member[])
00280 {
00281 char *str_knob, *str;
00282 int i = 0;
00283 int cond;
00284
00285 Is_True( regsubclass < KAPI_EnumCardinality(pknobs, "REGSUBCLASS"),
00286 ("regsubclass number beyond bundary!"));
00287
00288 str_knob = KAPI_attribute4index(pknobs, "regsubclassprop", regsubclass);
00289 FmtAssert(str_knob != NULL,
00290 ("KNOBS FILE:line %d of regsubclassprop attribute be NULL",
00291 regsubclass));
00292
00293 str = StrTrim(strtok(str_knob, ","));
00294 cond = strcmp(str, KAPI_EnumName(pknobs, regsubclass, "REGSUBCLASS")) == 0;
00295 Is_True( cond,
00296 ("KNOB FILE- regsubclass properties order not same as enum order!")
00297 );
00298
00299 str = StrTrim(strtok(NULL, ","));
00300 *regclass = EKAPI_RegClassid4name(pknobs,str);
00301 Is_True( *regclass < KAPI_EnumCardinality(pknobs, "REGCLASS"),
00302 ("Regclass id %d in regsubclassprop beyond bundary!", *regclass)
00303 );
00304
00305 while (str = StrTrim(strtok(NULL, ",")))
00306 {
00307 if (atoi(str) == -1) break;
00308 member[i] = atoi(str);
00309 i++;
00310 }
00311 free(str_knob);
00312 return i;
00313 }
00314
00315
00316
00317
00318 int EKAPI_ABICount(void *pknobs)
00319 {
00320 int count;
00321 count = KAPI_EnumCardinality(pknobs, "ABI");
00322 Is_True(count>=0, ("[ABI] enum type is not exited"));
00323 return count;
00324 }
00325
00326
00327
00328
00329 char *EKAPI_ABIName(void *pknobs, int id)
00330 {
00331 return KAPI_EnumName(pknobs, id, "ABI");
00332 }
00333
00334
00335
00336
00337 int EKAPI_ABIPropCount(void *pknobs)
00338 {
00339 int count;
00340 count = KAPI_EnumCardinality(pknobs, "ABIPROP");
00341 Is_True(count>=0, ("[ABI] enum type is not exited"));
00342 return count;
00343 }
00344
00345
00346
00347
00348 char *EKAPI_ABIPropName(void *pknobs, int id)
00349 {
00350 return KAPI_EnumName(pknobs, id, "ABIPROP");
00351 }
00352
00353
00354
00355
00356
00357
00358
00359 int EKAPI_RegPropMask(void *pknobs, int regclass, bv32_t flags[])
00360 {
00361 int i;
00362 int propcount, propid, regnum;
00363 char *str_knob, *str, *rc_name;
00364 char errmsg[512];
00365 EKAPI_REGISTER_CLASS_INFO reginfo;
00366
00367 str_knob = NULL;
00368 str = NULL;
00369 rc_name = NULL;
00370
00371 propcount = KAPI_count4attribute(pknobs, "regprop");
00372 rc_name = KAPI_EnumName(pknobs, regclass, "REGCLASS");
00373 FmtAssert(rc_name != NULL,
00374 ("KNOBS FILES: index %d of REGCLASS is not exited", regclass));
00375
00376
00377 EKAPI_RegStruct4id(pknobs, ®info, regclass);
00378 regnum = EKAPI_GetRegNum(®info);
00379 memset(flags, 0, regnum * sizeof(bv32_t));
00380
00381
00382 for(i=0; i<propcount; i++)
00383 {
00384 str_knob = KAPI_attribute4index(pknobs, "regprop", i);
00385 FmtAssert(str_knob != NULL,
00386 ("KNOBS FILES: line %d of regprop attribute is not exited", i));
00387
00388 str = StrTrim(strtok(str_knob, ","));
00389
00390
00391 if (strcmp(str, rc_name) == 0) {
00392
00393 str = StrTrim(strtok(NULL, ","));
00394
00395 propid = KAPI_EnumIndex(pknobs, "ABIPROP", str);
00396 sprintf(errmsg, "prop %s not exist!", str);
00397 Is_True( propid >= 0,
00398 (errmsg)
00399 );
00400 while (str = StrTrim(strtok(NULL, ",")))
00401 {
00402 int idx;
00403 idx = atoi(str);
00404 if (idx == -1) break;
00405 Is_True(idx >= 0 && idx < regnum,
00406 ("register number violation boundary!"));
00407 Is_True(propid!=0, ("entry_ptr should not be used!\n"));
00408 flags[idx] |= 1ULL << (propid - 1);
00409 }
00410
00411 }
00412 free(str_knob);
00413 }
00414
00415 return regnum;
00416 }
00417
00418
00419
00420
00421
00422 BOOL EKAPI_RegInfo4Name(void *pknobs, char *regname, int *regclassid, int *regid)
00423 {
00424 int rc_count, reg_count;
00425 int rc_i;
00426 EKAPI_REGISTER_CLASS_INFO reginfo;
00427
00428 rc_count = EKAPI_RegClassCount(pknobs);
00429
00430
00431
00432 for(rc_i=0; rc_i< rc_count; rc_i++)
00433 {
00434 EKAPI_RegStruct4id(pknobs, ®info, rc_i);
00435 reg_count = EKAPI_GetRegNum(®info);
00436
00437 for(int r_i=0; r_i<reg_count; r_i++)
00438 {
00439 char *pname = EKAPI_GetRegName(pknobs, ®info, r_i);
00440 if (strcmp(pname, regname) == 0) {
00441 *regclassid = rc_i;
00442 *regid = r_i;
00443 return 1;
00444 }
00445 }
00446
00447 }
00448 *regclassid = -1;
00449 *regid = -1;
00450 return 0;
00451 }