Ignore:
Timestamp:
Jun 12, 2012, 4:21:27 PM (12 years ago)
Author:
karaoui
Message:

giet-vm new version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/xml/xml_parser.c

    r158 r160  
    1818#include  <mapping_info.h>
    1919
    20 #define MAX_CLUSTERS            1024
     20#define MAX_CLUSTERS    1024
    2121#define MAX_PSEGS               4096
    2222#define MAX_VSPACES             1024
     
    2424#define MAX_MWMRS               4096
    2525#define MAX_VSEGS               4096
     26#define MAX_VOBJS               8192
    2627
    2728#define XML_PARSER_DEBUG        0
     
    3637mapping_vspace_t*       vspace[MAX_VSPACES];            // vspace array
    3738mapping_vseg_t*         vseg[MAX_VSEGS];                // vseg array
     39mapping_vobj_t*         vobj[MAX_VOBJS];                // vobj array
    3840mapping_task_t*         task[MAX_TASKS];                // task array
    3941
     
    4648unsigned int            task_index     = 0;
    4749unsigned int            task_loc_index = 0;
    48 unsigned int            mwmr_index     = 0;
    49 unsigned int            mwmr_loc_index = 0;
     50unsigned int            vobj_index     = 0;
     51unsigned int            vobj_loc_index = 0;
     52unsigned int            vobj_loc_vspace_index = 0;
     53           
     54char one_elf_found = 0;//bool: wether a first vobj of type elf was found
    5055
    5156//////////////////////////////////////////////////
     
    132137
    133138//////////////////////////////////////////
    134 int getVsegLocId( unsigned int  vspace_id,
     139int getVobjLocId( unsigned int  vspace_id,
    135140                  char*         str )
    136141{
    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        }
    144152    }
    145153    return -1;
     
    218226    if ( ok )
    219227    {
    220         int index = getVsegLocId( vspace_index, str );
     228        int index = getVobjLocId( vspace_index, str );
    221229        if ( index >= 0 )
    222230        {
     
    225233printf("      vsegid    = %d\n", index);
    226234#endif
    227             task[task_index]->vseglocid = index;
     235            task[task_index]->vobjlocid = index;
    228236        }
    229237        else             
     
    283291} // end taskNode()
    284292
    285 ///////////////////////////////////////////////////////////////
    286 void  vsegNode ( xmlTextReaderPtr reader )
     293void  vobjNode ( xmlTextReaderPtr reader )
    287294{
    288295    unsigned int        ok;
     
    292299    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
    293300
     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
     316printf("    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
     326printf("      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
     341printf("      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
     373printf("      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
     387printf("      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
     401printf("      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///////////////////////////////////////////////////////////////
     417void  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
    294427    if ( vseg_index >= MAX_VSEGS )
    295428    {
     
    303436
    304437    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
     442printf("- vobj_offset = %d\n", vobj_index);
     443#endif
    305444
    306445    ///////// get name attribute
     
    336475    }
    337476
    338     ////////// get length attribute
    339     value = getIntValue(reader,"length", &ok);
    340     if ( ok )
    341     {
    342 #if XML_PARSER_DEBUG
    343 printf("      length = 0x%x\n", value);
    344 #endif
    345         vseg[vseg_index]->length = value;
    346     } 
    347     else
    348     {
    349         printf("[XML ERROR] illegal or missing <length> attribute for vseg (%d,%d)\n",
    350                 vspace_index, vseg_loc_index);
    351         exit(1);
    352     }
    353477
    354478    ////////// get ident attribute (0 if missing)
     
    366490    }
    367491
    368     ////////// get mwmr attribute (0 if missing)
    369     value = getIntValue(reader,"mwmr", &ok);
    370     if ( ok )
    371     {
    372 #if XML_PARSER_DEBUG
    373 printf("      mwmr  = %d\n", value);
    374 #endif
    375         vseg[vseg_index]->mwmr = value;
    376         if ( value )
    377         {
    378             mwmr_index++;
    379             mwmr_loc_index++;
    380         }
    381     } 
    382     else
    383     {
    384         vseg[vseg_index]->mwmr = 0;
    385     }
    386492
    387493    ////////// get psegname attribute
     
    440546    }
    441547   
    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
    444578} // end vsegNode()
    445579
     
    450584    unsigned int        ok;
    451585    unsigned int        value;
     586    vobj_loc_vspace_index = 0;
     587        vseg_loc_index = 0;
     588        task_loc_index = 0;
    452589
    453590    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
     
    467604    vspace[vspace_index] = (mapping_vspace_t*)malloc(sizeof(mapping_vspace_t));
    468605
    469     ////////// set vseg_offset and task_offset attributes
     606    ////////// set vseg_offsetand task_offset attributes
    470607    vspace[vspace_index]->vseg_offset = vseg_index;
     608    vspace[vspace_index]->vobj_offset = vobj_index;
    471609    vspace[vspace_index]->task_offset = task_index;
    472610   
    473611#if XML_PARSER_DEBUG
    474612printf("- vseg_offset = %d\n", vseg_index);
     613printf("- vobj_offset = %d\n", vobj_index);
    475614printf("- task_offset = %d\n", task_index);
    476615#endif
     
    492631    }
    493632
    494     /////////// get binpath attribute
    495     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
     638printf("    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",
    506645                 vspace_index);
    507646        exit(1);
    508     }
    509 
    510     ////////// get vsegs attribute
    511     value = getIntValue(reader,"vsegs",&ok);
    512     if ( ok )
    513     {
    514 #if XML_PARSER_DEBUG
    515 printf("    vsegs = %d\n", value);
    516 #endif
    517         vspace[vspace_index]->vsegs = value;
    518     }
    519     else
    520     {
    521         printf("[XML ERROR] illegal or missing <vsegs> attribute for vspace %d",
    522                  vspace_index);
    523         exit(1);
    524     }
    525 
    526     // get tasks attribute
    527     value = getIntValue(reader,"tasks", &ok);
    528     if ( ok )
    529     {
    530 #if XML_PARSER_DEBUG
    531 printf("    tasks = %d\n", value);
    532 #endif
    533         vspace[vspace_index]->tasks = value;
    534     }
    535     else
    536     {
    537         printf("[XML ERROR] illegal or missing <tasks> attribute for vspace %d",
    538                   vspace_index);
    539         exit(1);
    540     }
    541 
    542     // get mwmrs attribute
    543     value = getIntValue(reader,"mwmrs", &ok);
    544     if ( ok )
    545     {
    546 #if XML_PARSER_DEBUG
    547 printf("    mwmrs = %d\n", value);
    548 #endif
    549         vspace[vspace_index]->mwmrs = value;
    550     }
    551     else
    552     {
    553         vspace[vspace_index]->mwmrs = 0;
    554647    }
    555648
     
    580673        else if ( strcmp(tag,"vspace") == 0  )
    581674        {
    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)
    584680            {
    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);
    587683            }
    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;
    606688        }
    607689        else
     
    898980            {
    899981                header->vsegs = vseg_index;
     982                header->vobjs = vobj_index;
    900983                header->tasks = task_index;
    901984                return;
     
    10331116    {
    10341117        printf("[XML ERROR] illegal or missing <globals> attribute in mapping_info_header\n");
    1035         exit(1);
    1036     }
    1037 
    1038     // get syspath attribute
    1039     name = getStringValue(reader, "syspath", &ok);
    1040     if ( ok )
    1041     {
    1042 #if XML_PARSER_DEBUG
    1043 printf("- syspath = %s\n\n", name);
    1044 #endif
    1045         strncpy( header->syspath, name, 63);
    1046     }     
    1047     else
    1048     {
    1049         printf("[XML ERROR] illegal or missing <syspath> attribute in header\n");
    10501118        exit(1);
    10511119    }
     
    10861154    unsigned int    vspace_id;
    10871155    unsigned int    vseg_id;
     1156    unsigned int    vobj_id;
    10881157    unsigned int    task_id;
    10891158
     
    11421211#if XML_PARSER_DEBUG
    11431212printf("write vspace %d\n", vspace_id);
     1213printf("vspace->vobj_offset: %d\n", vspace[vspace_id]->vobj_offset);
     1214printf("vspace->vobjs: %d\n", vspace[vspace_id]->vobjs);
     1215printf("header->vobjs: %d\n", header->vobjs);
    11441216#endif
    11451217
     
    11631235        {
    11641236            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
     1247printf("write vobj %d\n", vobj_id);
     1248printf("write vobj name %s\n", vobj[vobj_id]->name);
     1249printf("write vobj length %x\n", vobj[vobj_id]->length);
     1250printf("write vobj type %d\n", vobj[vobj_id]->type);
     1251#endif
     1252
     1253        if ( length != sizeof(mapping_vobj_t) )
     1254        {
     1255            perror("write vobj");
    11651256            exit(1);
    11661257        }
Note: See TracChangeset for help on using the changeset viewer.