Changeset 160 for soft/giet_vm/xml


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

giet-vm new version

Location:
soft/giet_vm/xml
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/xml/Makefile

    r158 r160  
    88        gcc -Wall -I. -I/usr/include/libxml2 xml_parser.c -o xml2bin -lxml2
    99
     10test:
     11        ./xml2bin map.xml test.bin
     12        ./bin2xml test.bin test.xml
     13
     14up_test:
     15        ./xml2bin ../map.xml ../test.bin
     16        ./bin2xml ../test.bin ../test.xml
     17
     18
    1019clean:
    1120        rm xml2bin bin2xml
  • soft/giet_vm/xml/mapping_info.h

    r158 r160  
    1818// - mapping_vspace_t   vspace[vspaces]     (MAPPING_VSPACE_SIZE * vspaces)
    1919// - mapping_vseg_t     vseg[vsegs]         (MAPPING_VSEG_SIZE * vsegs)
     20// - mapping_vseg_t     vobj[vsegs]         (MAPPING_VOBJ_SIZE * vsegs)
    2021// - mapping_task_t     task[tasks]         (MAPPING_TASK_SIZE * tasks)
    21 // - mapping_mwmr_t     mwmr[mwmrs]         (MAPPING_MWMR_SIZE * mwmrs)
    2222//
    2323// The number of clusters and the number of vspaces are defined in the header.
     
    4343#define MAPPING_VSPACE_SIZE     sizeof(mapping_vspace_t)
    4444#define MAPPING_VSEG_SIZE           sizeof(mapping_vseg_t)
     45#define MAPPING_VOBJ_SIZE           sizeof(mapping_vobj_t)
    4546#define MAPPING_PSEG_SIZE           sizeof(mapping_pseg_t)
    4647#define MAPPING_TASK_SIZE           sizeof(mapping_task_t)
     
    5455#define OUT_MAPPING_SIGNATURE   0xBABEF00D
    5556
     57enum
     58{
     59    ELF = 0,    //loadable code object
     60    PTAB,       //page table
     61    PERI,       //hardware component
     62    MWMR,       //MWMR channel
     63    LOCK,       //Lock
     64    BUFFER,     //Any "no intialiasation needed" objects (stacks...)
     65    BARRIER     //Barrier
     66};
     67
     68
    5669///////////////////////////////
    5770typedef struct mapping_header_s
     
    6376        unsigned int    globals;                // number of vsegs mapped in all vspaces
    6477        unsigned int    vspaces;                // number of virtual spaces
    65         unsigned int    vsegs;                  // total number of virtual segments (for all vspaces
     78        unsigned int    vsegs;                  // total number of virtual segments (for all vspaces)
     79        unsigned int    vobjs;                  // total number of virtual memory objects (for all vspaces)
    6680        unsigned int    tasks;                  // total number of tasks (for all vspaces)
    6781    char            name[32];       // mapping name
    68     char            syspath[64];    // path for the system binary code ("sys.bin")
    6982} mapping_header_t;
    7083
     
    90103{
    91104    char            name[32];       // virtual space name
    92     char            binpath[64];    // pathname to the binary code ("app.bin")
     105    unsigned int    funcs_offset;   // offset of the vobj containing the function entry table (relative to vobj_offset)
    93106        unsigned int    vsegs;              // number of private virtual segments
     107        unsigned int    vobjs;              // number of vobjs channels
    94108        unsigned int    tasks;              // number of tasks
    95         unsigned int    mwmrs;              // number of mwmr channels
    96109        unsigned int    ttys;               // number of required TTY terminals
    97110    unsigned int    vseg_offset;    // index of first vseg in vspace
     111    unsigned int    vobj_offset;    // index of first vobjs in vspace
    98112    unsigned int    task_offset;    // index of first task in vspace
    99     unsigned int    mwmr_offset;    // index of first mwmr in vspace
    100113} mapping_vspace_t;
    101114
     
    110123        unsigned char   mode;           // C-X-W-U flags
    111124    unsigned char   ident;          // identity mapping if non zero
    112     unsigned char   mwmr;           // mwmr channel if non zero
     125        unsigned int    vobjs;              // number of vobjs channels
     126    unsigned int    vobj_offset;    // index of first vobjs in vspace
    113127    unsigned char   reserved;       // unused
    114128} mapping_vseg_t;
     
    120134        unsigned int    clusterid;          // physical cluster index
    121135        unsigned int    proclocid;      // processor local index (inside cluster)
    122     unsigned int    vseglocid;      // stack vseg index in vspace
     136    unsigned int    vobjlocid;      // stack vobj index in vspace
    123137    unsigned int    startid;        // index in start_vector (in seg_data)
    124138    unsigned int    ttylocid;       // tty index (inside the vspace)
    125139} mapping_task_t;
     140
     141/////////////////////////////
     142typedef struct mapping_vobj_s
     143{
     144    char            name[32];       // vobj name (unique in a vspace)
     145    char            binpath[64];    // path for the binary code ("*.bin")
     146        unsigned int    type;           // type of vobj
     147        unsigned int    length;         // size (bytes)
     148        unsigned int    align;          // required alignement (logarithm of 2)
     149        unsigned int    vaddr;          // virtual addresse of the vobj location (bytes)
     150        unsigned int    paddr;          // physical addresse of the vobj location (bytes)
     151} mapping_vobj_t;
    126152
    127153#endif
  • soft/giet_vm/xml/xml_driver.c

    r158 r160  
    2020void buildXml( mapping_header_t* header, FILE* fpout)
    2121{
     22
     23    const char*
     24    vobj_type[] =
     25    {
     26        "ELF",
     27        "PTAB",   //page table
     28        "PERI",   //hardware component
     29        "MWMR",   //MWMR channel
     30        "LOCK",   //Lock
     31        "BUFFER", //Any "no intialiasation needed" objects (stacks...)
     32        "BARRIER" //Barrier
     33    };
    2234    const char* mode_str[] = { "____",
    2335                               "___U",
     
    4153    unsigned int                pseg_id;
    4254    unsigned int                vseg_id;
     55    unsigned int                vobj_id;
    4356    unsigned int                task_id;
    4457
     
    4760    mapping_vspace_t*   vspace;
    4861    mapping_vseg_t*     vseg;
     62    mapping_vobj_t*     vobj;
    4963    mapping_task_t*     task;
    5064
     
    7185                                  MAPPING_VSPACE_SIZE*header->vspaces );
    7286
     87    // computes the base adresss for vobjs array,
     88    vobj    = (mapping_vobj_t*)   ((char*)header +
     89                                  MAPPING_HEADER_SIZE +
     90                                  MAPPING_CLUSTER_SIZE*header->clusters +
     91                                  MAPPING_PSEG_SIZE*header->psegs +
     92                                  MAPPING_VSPACE_SIZE*header->vspaces +
     93                                  MAPPING_VSEG_SIZE*header->vsegs );
     94
    7395    // computes the base address for tasks array
    7496    task    = (mapping_task_t*)   ((char*)header +
     
    7799                                  MAPPING_PSEG_SIZE*header->psegs +
    78100                                  MAPPING_VSPACE_SIZE*header->vspaces +
     101                                  MAPPING_VOBJ_SIZE*header->vobjs +
    79102                                  MAPPING_VSEG_SIZE*header->vsegs );
    80103
     
    89112    fprintf( fpout, "              ttys      = \"%d\"\n", header->ttys);
    90113    fprintf( fpout, "              vspaces   = \"%d\"\n", header->vspaces);
    91     fprintf( fpout, "              globals   = \"%d\"\n", header->globals);
    92     fprintf( fpout, "              syspath   = \"%s\" >\n", header->syspath);
     114    fprintf( fpout, "              globals   = \"%d\" />\n\n", header->globals);
    93115
    94116    ///////////////////// clusters ///////////////////////////////////////////////
     
    124146        fprintf( fpout, "        <vseg    name     = \"%s\"\n",      vseg[vseg_id].name);
    125147        fprintf( fpout, "                 vbase    = \"0x%x\"\n",    vseg[vseg_id].vbase);
    126         fprintf( fpout, "                 length   = \"0x%x\"\n",    vseg[vseg_id].length);
    127148        fprintf( fpout, "                 mode     = \"%s\"\n", mode_str[vseg[vseg_id].mode]);
    128149        fprintf( fpout, "                 psegname = \"%s\"\n",      pseg[pseg_id].name);
    129         fprintf( fpout, "                 ident    = \"%d\" />\n\n", vseg[vseg_id].ident);
     150        fprintf( fpout, "                 ident    = \"%d\" >\n", vseg[vseg_id].ident);
     151            for ( vobj_id = vseg[vseg_id].vobj_offset ;
     152                  vobj_id < (vseg[vseg_id].vobj_offset + vseg[vseg_id].vobjs) ; vobj_id++ )
     153            {
     154                fprintf( fpout, "                 <vobj name     = \"%s\"\n",     vobj[vobj_id].name);
     155                fprintf( fpout, "                       type     = \"%s\" \n", vobj_type[vobj[vobj_id].type]);
     156                if(vobj[vobj_id].length)
     157                    fprintf( fpout, "                       length   = \"0x%x\" \n",   vobj[vobj_id].length);
     158                if(vobj[vobj_id].align)
     159                    fprintf( fpout, "                       align    = \"%d\" \n",   vobj[vobj_id].align);
     160                if(vobj[vobj_id].binpath[0]!='\0')
     161                    fprintf( fpout, "                       binpath  = \"%s\" \n",   vobj[vobj_id].binpath);
     162                fprintf( fpout, "                       />\n");
     163            }
     164            fprintf( fpout, "        </vseg>\n\n");
    130165    }
    131166    fprintf( fpout, "    </globalset>\n" );
     
    136171    for ( vspace_id = 0 ; vspace_id < header->vspaces ; vspace_id++ )
    137172    {
     173        unsigned int func_id = vspace[vspace_id].vobj_offset + vspace[vspace_id].funcs_offset;
    138174        fprintf( fpout, "        <vspace  name    = \"%s\"\n",     vspace[vspace_id].name);
    139         fprintf( fpout, "                 binpath = \"%s\"\n",     vspace[vspace_id].binpath);
    140         fprintf( fpout, "                 vsegs   = \"%d\"\n",     vspace[vspace_id].vsegs);
    141         fprintf( fpout, "                 tasks   = \"%d\"\n",     vspace[vspace_id].tasks);
    142         fprintf( fpout, "                 mwmrs   = \"%d\"\n",     vspace[vspace_id].mwmrs);
     175        fprintf( fpout, "                 funcs   = \"%s\"\n",     vobj[func_id].name);
    143176        fprintf( fpout, "                 ttys    = \"%d\" >\n\n", vspace[vspace_id].ttys);
    144177
     
    150183            fprintf( fpout, "                 <vseg name      = \"%s\"\n",      vseg[vseg_id].name);
    151184            fprintf( fpout, "                       vbase     = \"0x%x\"\n",    vseg[vseg_id].vbase);
    152             fprintf( fpout, "                       length    = \"0x%x\"\n",    vseg[vseg_id].length);
    153185            fprintf( fpout, "                       mode      = \"%s\"\n", mode_str[vseg[vseg_id].mode]);
    154186            fprintf( fpout, "                       psegname  = \"%s\"\n",      pseg[pseg_id].name);
    155             fprintf( fpout, "                       mwmr      = \"%d\"\n",      vseg[vseg_id].mwmr);
    156             fprintf( fpout, "                       ident     = \"%d\" />\n\n", vseg[vseg_id].ident);
     187            fprintf( fpout, "                       ident     = \"%d\" >\n", vseg[vseg_id].ident);
     188
     189            for ( vobj_id = vseg[vseg_id].vobj_offset ;
     190                  vobj_id < (vseg[vseg_id].vobj_offset + vseg[vseg_id].vobjs) ; vobj_id++ )
     191            {
     192                fprintf( fpout, "\t                 <vobj name     = \"%s\"\n",     vobj[vobj_id].name);
     193                fprintf( fpout, "\t                       type     = \"%s\" \n", vobj_type[vobj[vobj_id].type]);
     194                if(vobj[vobj_id].length)
     195                    fprintf( fpout, "\t                       length   = \"0x%x\" \n",   vobj[vobj_id].length);
     196                if(vobj[vobj_id].align)
     197                    fprintf( fpout, "\t                       align    = \"%d\" \n",   vobj[vobj_id].align);
     198                if(vobj[vobj_id].binpath[0]!='\0')
     199                    fprintf( fpout, "\t                       binpath  = \"%s\" \n",   vobj[vobj_id].binpath);
     200                fprintf( fpout, "\t                       />\n");
     201            }
     202            fprintf( fpout, "\t\t        </vseg>\n\n");
    157203        }
    158204        for ( task_id = vspace[vspace_id].task_offset ;
    159205              task_id < (vspace[vspace_id].task_offset + vspace[vspace_id].tasks) ; task_id++ )
    160206        {
    161             unsigned int vseg_id = task[task_id].vseglocid + vspace[vspace_id].vseg_offset;
     207            unsigned int vobj_id = task[task_id].vobjlocid + vspace[vspace_id].vobj_offset;
    162208
    163209            fprintf( fpout, "                 <task name      = \"%s\"\n",      task[task_id].name);
    164210            fprintf( fpout, "                       clusterid = \"%d\"\n",      task[task_id].clusterid);
    165211            fprintf( fpout, "                       proclocid = \"%d\"\n",      task[task_id].proclocid);
    166             fprintf( fpout, "                       stackname = \"%s\"\n",      vseg[vseg_id].name);
     212            fprintf( fpout, "                       stackname = \"%s\"\n",      vobj[vobj_id].name);
    167213            fprintf( fpout, "                       startid   = \"%d\"\n",      task[task_id].startid);
    168214            fprintf( fpout, "                       ttylocid  = \"%d\" />\n\n", task[task_id].ttylocid);
  • 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.