Changeset 160 for soft/giet_vm/xml/xml_parser.c
- Timestamp:
- Jun 12, 2012, 4:21:27 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/xml/xml_parser.c
r158 r160 18 18 #include <mapping_info.h> 19 19 20 #define MAX_CLUSTERS 20 #define MAX_CLUSTERS 1024 21 21 #define MAX_PSEGS 4096 22 22 #define MAX_VSPACES 1024 … … 24 24 #define MAX_MWMRS 4096 25 25 #define MAX_VSEGS 4096 26 #define MAX_VOBJS 8192 26 27 27 28 #define XML_PARSER_DEBUG 0 … … 36 37 mapping_vspace_t* vspace[MAX_VSPACES]; // vspace array 37 38 mapping_vseg_t* vseg[MAX_VSEGS]; // vseg array 39 mapping_vobj_t* vobj[MAX_VOBJS]; // vobj array 38 40 mapping_task_t* task[MAX_TASKS]; // task array 39 41 … … 46 48 unsigned int task_index = 0; 47 49 unsigned int task_loc_index = 0; 48 unsigned int mwmr_index = 0; 49 unsigned int mwmr_loc_index = 0; 50 unsigned int vobj_index = 0; 51 unsigned int vobj_loc_index = 0; 52 unsigned int vobj_loc_vspace_index = 0; 53 54 char one_elf_found = 0;//bool: wether a first vobj of type elf was found 50 55 51 56 ////////////////////////////////////////////////// … … 132 137 133 138 ////////////////////////////////////////// 134 int getV segLocId( unsigned int vspace_id,139 int getVobjLocId( unsigned int vspace_id, 135 140 char* str ) 136 141 { 137 unsigned int vseg_id; 138 unsigned int vseg_min = vspace[vspace_id]->vseg_offset; 139 unsigned int vseg_max = vseg_min + vspace[vspace_id]->vsegs; 140 141 for ( vseg_id = vseg_min ; vseg_id < vseg_max ; vseg_id++ ) 142 { 143 if ( strcmp(vseg[vseg_id]->name, str) == 0 ) return (vseg_id - vseg_min); 142 unsigned int vobj_id; 143 unsigned int vobj_min = vspace[vspace_id]->vobj_offset; 144 unsigned int vobj_max = vobj_min + vobj_loc_vspace_index; 145 146 for ( vobj_id = vobj_min ; vobj_id < vobj_max ; vobj_id++ ) 147 { 148 if ( strcmp(vobj[vobj_id]->name, str) == 0 ) 149 { 150 return (vobj_id - vobj_min); 151 } 144 152 } 145 153 return -1; … … 218 226 if ( ok ) 219 227 { 220 int index = getV segLocId( vspace_index, str );228 int index = getVobjLocId( vspace_index, str ); 221 229 if ( index >= 0 ) 222 230 { … … 225 233 printf(" vsegid = %d\n", index); 226 234 #endif 227 task[task_index]->v seglocid = index;235 task[task_index]->vobjlocid = index; 228 236 } 229 237 else … … 283 291 } // end taskNode() 284 292 285 /////////////////////////////////////////////////////////////// 286 void vsegNode ( xmlTextReaderPtr reader ) 293 void vobjNode ( xmlTextReaderPtr reader ) 287 294 { 288 295 unsigned int ok; … … 292 299 if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return; 293 300 301 if ( vobj_index >= MAX_VOBJS ) 302 { 303 printf("[XML ERROR] The number of vobjs is larger than %d\n", MAX_VSEGS); 304 exit(1); 305 } 306 307 if(one_elf_found != 0) 308 { 309 printf("[XML ERROR] a vobj of the type ELF must be defined alone in a vseg (%d,%d)\n", 310 vspace_index, vobj_loc_vspace_index); 311 exit(1); 312 313 } 314 315 #if XML_PARSER_DEBUG 316 printf(" vobj %d\n", vobj_loc_index); 317 #endif 318 319 vobj[vobj_index] = (mapping_vobj_t*)malloc(sizeof(mapping_vobj_t)); 320 321 ///////// get name attribute 322 str = getStringValue(reader, "name", &ok); 323 if ( ok ) 324 { 325 #if XML_PARSER_DEBUG 326 printf(" name = %s\n", str); 327 #endif 328 strncpy( vobj[vobj_index]->name, str, 31); 329 } 330 else 331 { 332 printf("[XML ERROR] illegal or missing <name> attribute for vobj (%d,%d)\n", 333 vseg_index, vobj_loc_index); 334 exit(1); 335 } 336 337 338 // get type attribute 339 str = getStringValue(reader, "type", &ok); 340 #if XML_PARSER_DEBUG 341 printf(" type = %s\n", str); 342 #endif 343 if (ok && (strcmp(str, "ELF") == 0)){ 344 vobj[vobj_index]->type = ELF; 345 one_elf_found = 1; 346 if(vobj_loc_index != 0) //check that this vobj is the first 347 { 348 printf("[XML ERROR] a vobj of the type ELF must be defined alone in a vobj (%d,%d)\n", 349 vspace_index, vobj_loc_vspace_index); 350 exit(1); 351 352 } 353 } 354 else if (ok && (strcmp(str, "PTAB") == 0)) vobj[vobj_index]->type = PTAB; 355 else if (ok && (strcmp(str, "PERI") == 0)) vobj[vobj_index]->type = PERI; 356 else if (ok && (strcmp(str, "MWMR") == 0)) vobj[vobj_index]->type = MWMR; 357 else if (ok && (strcmp(str, "LOCK") == 0)) vobj[vobj_index]->type = LOCK; 358 else if (ok && (strcmp(str, "BUFFER") == 0)) vobj[vobj_index]->type = BUFFER; 359 else if (ok && (strcmp(str, "BARRIER") == 0)) vobj[vobj_index]->type = BARRIER; 360 else 361 { 362 printf("[XML ERROR] illegal or missing <type> attribute for vobj (%d,%d)\n", 363 vspace_index, vobj_loc_vspace_index); 364 exit(1); 365 } 366 367 368 ////////// get length attribute (0 if missing) 369 value = getIntValue(reader,"length", &ok); 370 if ( ok ) 371 { 372 #if XML_PARSER_DEBUG 373 printf(" length = %d\n", value); 374 #endif 375 vobj[vobj_index]->length = value; 376 } 377 else 378 { 379 vobj[vobj_index]->length = 0; 380 } 381 382 ////////// get align attribute (0 if missing) 383 value = getIntValue(reader,"align", &ok); 384 if ( ok ) 385 { 386 #if XML_PARSER_DEBUG 387 printf(" align = %d\n", value); 388 #endif 389 vobj[vobj_index]->align = value; 390 } 391 else 392 { 393 vobj[vobj_index]->align = 0; 394 } 395 396 ////////// get binpath attribute ('\0' if missing) 397 str = getStringValue(reader, "binpath", &ok); 398 if ( ok ) 399 { 400 #if XML_PARSER_DEBUG 401 printf(" binpath = %s\n", str); 402 #endif 403 strncpy(vobj[vobj_index]->binpath, str, 63); 404 } 405 else 406 { 407 vobj[vobj_index]->binpath[0] = '\0'; 408 } 409 410 vobj_index++; 411 vobj_loc_index++; 412 vobj_loc_vspace_index++; 413 } 414 415 416 /////////////////////////////////////////////////////////////// 417 void vsegNode ( xmlTextReaderPtr reader ) 418 { 419 unsigned int ok; 420 unsigned int value; 421 char* str; 422 vobj_loc_index = 0; 423 one_elf_found = 0; 424 425 if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return; 426 294 427 if ( vseg_index >= MAX_VSEGS ) 295 428 { … … 303 436 304 437 vseg[vseg_index] = (mapping_vseg_t*)malloc(sizeof(mapping_vseg_t)); 438 439 ////////// set vobj_offset attributes 440 vseg[vseg_index]->vobj_offset = vobj_index; 441 #if XML_PARSER_DEBUG 442 printf("- vobj_offset = %d\n", vobj_index); 443 #endif 305 444 306 445 ///////// get name attribute … … 336 475 } 337 476 338 ////////// get length attribute339 value = getIntValue(reader,"length", &ok);340 if ( ok )341 {342 #if XML_PARSER_DEBUG343 printf(" length = 0x%x\n", value);344 #endif345 vseg[vseg_index]->length = value;346 }347 else348 {349 printf("[XML ERROR] illegal or missing <length> attribute for vseg (%d,%d)\n",350 vspace_index, vseg_loc_index);351 exit(1);352 }353 477 354 478 ////////// get ident attribute (0 if missing) … … 366 490 } 367 491 368 ////////// get mwmr attribute (0 if missing)369 value = getIntValue(reader,"mwmr", &ok);370 if ( ok )371 {372 #if XML_PARSER_DEBUG373 printf(" mwmr = %d\n", value);374 #endif375 vseg[vseg_index]->mwmr = value;376 if ( value )377 {378 mwmr_index++;379 mwmr_loc_index++;380 }381 }382 else383 {384 vseg[vseg_index]->mwmr = 0;385 }386 492 387 493 ////////// get psegname attribute … … 440 546 } 441 547 442 vseg_index++; 443 vseg_loc_index++; 548 549 ////////// set the length attribute to 0 550 //the final value will be set by the VLoader 551 vseg[vseg_index]->length = value; 552 553 ////////// get vobjs 554 int status = xmlTextReaderRead ( reader ); 555 while ( status == 1 ) 556 { 557 const char* tag = (const char*)xmlTextReaderConstName(reader); 558 559 if ( strcmp(tag,"vobj") == 0 ) vobjNode(reader); 560 else if ( strcmp(tag,"#text" ) == 0 ) { } 561 else if ( strcmp(tag,"vseg") == 0 ) 562 { 563 // checking source file consistency? 564 vseg[vseg_index]->vobjs = vobj_loc_index; 565 vseg_index++; 566 vseg_loc_index++; 567 return; 568 } 569 else 570 { 571 printf("[XML ERROR] Unknown tag %s",tag); 572 exit(1); 573 } 574 status = xmlTextReaderRead ( reader ); 575 } 576 577 444 578 } // end vsegNode() 445 579 … … 450 584 unsigned int ok; 451 585 unsigned int value; 586 vobj_loc_vspace_index = 0; 587 vseg_loc_index = 0; 588 task_loc_index = 0; 452 589 453 590 if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return; … … 467 604 vspace[vspace_index] = (mapping_vspace_t*)malloc(sizeof(mapping_vspace_t)); 468 605 469 ////////// set vseg_offset 606 ////////// set vseg_offsetand task_offset attributes 470 607 vspace[vspace_index]->vseg_offset = vseg_index; 608 vspace[vspace_index]->vobj_offset = vobj_index; 471 609 vspace[vspace_index]->task_offset = task_index; 472 610 473 611 #if XML_PARSER_DEBUG 474 612 printf("- vseg_offset = %d\n", vseg_index); 613 printf("- vobj_offset = %d\n", vobj_index); 475 614 printf("- task_offset = %d\n", task_index); 476 615 #endif … … 492 631 } 493 632 494 ////////// / get binpathattribute495 str = getStringValue(reader, " binpath", &ok);496 if ( ok ) 497 { 498 #if XML_PARSER_DEBUG 499 printf(" binpath= %s\n", str);500 #endif 501 strncpy(vspace[vspace_index]->binpath, str, 63);502 } 503 else 504 { 505 printf("[XML ERROR] illegal or missing < binpath> attribute for vspace %d",633 ////////// get funcs_entry attribute 634 str = getStringValue(reader, "funcs", &ok); 635 if ( ok ) 636 { 637 #if XML_PARSER_DEBUG 638 printf(" name = %s\n", str); 639 #endif 640 //used after parsing all the vobjs 641 } 642 else 643 { 644 printf("[XML ERROR] illegal or missing <name> attribute for vspace %d", 506 645 vspace_index); 507 646 exit(1); 508 }509 510 ////////// get vsegs attribute511 value = getIntValue(reader,"vsegs",&ok);512 if ( ok )513 {514 #if XML_PARSER_DEBUG515 printf(" vsegs = %d\n", value);516 #endif517 vspace[vspace_index]->vsegs = value;518 }519 else520 {521 printf("[XML ERROR] illegal or missing <vsegs> attribute for vspace %d",522 vspace_index);523 exit(1);524 }525 526 // get tasks attribute527 value = getIntValue(reader,"tasks", &ok);528 if ( ok )529 {530 #if XML_PARSER_DEBUG531 printf(" tasks = %d\n", value);532 #endif533 vspace[vspace_index]->tasks = value;534 }535 else536 {537 printf("[XML ERROR] illegal or missing <tasks> attribute for vspace %d",538 vspace_index);539 exit(1);540 }541 542 // get mwmrs attribute543 value = getIntValue(reader,"mwmrs", &ok);544 if ( ok )545 {546 #if XML_PARSER_DEBUG547 printf(" mwmrs = %d\n", value);548 #endif549 vspace[vspace_index]->mwmrs = value;550 }551 else552 {553 vspace[vspace_index]->mwmrs = 0;554 647 } 555 648 … … 580 673 else if ( strcmp(tag,"vspace") == 0 ) 581 674 { 582 // checking source file consistency 583 if ( vseg_loc_index != vspace[vspace_index]->vsegs ) 675 vspace[vspace_index]->vobjs = vobj_loc_vspace_index; 676 vspace[vspace_index]->tasks = task_loc_index ; 677 vspace[vspace_index]->vsegs = vseg_loc_index ; 678 int index = getVobjLocId( vspace_index, str ); 679 if(index == -1) 584 680 { 585 printf(" [XML ERROR] Wrong number of vsegs in vspace %d\n", vspace_index);586 exit( 1);681 printf("Error funcs entry vobj not found %s\n",str); 682 exit(-1); 587 683 } 588 else if ( task_loc_index != vspace[vspace_index]->tasks ) 589 { 590 printf("[XML ERROR] Wrong number of tasks in vspace %d\n", vspace_index); 591 exit(1); 592 } 593 else if ( mwmr_loc_index != vspace[vspace_index]->mwmrs ) 594 { 595 printf("[XML ERROR] Wrong number of mwmrs in vspace %d\n", vspace_index); 596 exit(1); 597 } 598 else 599 { 600 vseg_loc_index = 0; 601 task_loc_index = 0; 602 mwmr_loc_index = 0; 603 vspace_index++; 604 return; 605 } 684 vspace[vspace_index]->funcs_offset = index; 685 686 vspace_index++; 687 return; 606 688 } 607 689 else … … 898 980 { 899 981 header->vsegs = vseg_index; 982 header->vobjs = vobj_index; 900 983 header->tasks = task_index; 901 984 return; … … 1033 1116 { 1034 1117 printf("[XML ERROR] illegal or missing <globals> attribute in mapping_info_header\n"); 1035 exit(1);1036 }1037 1038 // get syspath attribute1039 name = getStringValue(reader, "syspath", &ok);1040 if ( ok )1041 {1042 #if XML_PARSER_DEBUG1043 printf("- syspath = %s\n\n", name);1044 #endif1045 strncpy( header->syspath, name, 63);1046 }1047 else1048 {1049 printf("[XML ERROR] illegal or missing <syspath> attribute in header\n");1050 1118 exit(1); 1051 1119 } … … 1086 1154 unsigned int vspace_id; 1087 1155 unsigned int vseg_id; 1156 unsigned int vobj_id; 1088 1157 unsigned int task_id; 1089 1158 … … 1142 1211 #if XML_PARSER_DEBUG 1143 1212 printf("write vspace %d\n", vspace_id); 1213 printf("vspace->vobj_offset: %d\n", vspace[vspace_id]->vobj_offset); 1214 printf("vspace->vobjs: %d\n", vspace[vspace_id]->vobjs); 1215 printf("header->vobjs: %d\n", header->vobjs); 1144 1216 #endif 1145 1217 … … 1163 1235 { 1164 1236 perror("write vseg"); 1237 exit(1); 1238 } 1239 } 1240 1241 // write vobjs 1242 for ( vobj_id = 0 ; vobj_id < header->vobjs ; vobj_id++ ) 1243 { 1244 length = write(fdout, (char*)vobj[vobj_id], sizeof(mapping_vobj_t)); 1245 1246 #if XML_PARSER_DEBUG 1247 printf("write vobj %d\n", vobj_id); 1248 printf("write vobj name %s\n", vobj[vobj_id]->name); 1249 printf("write vobj length %x\n", vobj[vobj_id]->length); 1250 printf("write vobj type %d\n", vobj[vobj_id]->type); 1251 #endif 1252 1253 if ( length != sizeof(mapping_vobj_t) ) 1254 { 1255 perror("write vobj"); 1165 1256 exit(1); 1166 1257 }
Note: See TracChangeset
for help on using the changeset viewer.