Ignore:
Timestamp:
Jul 21, 2012, 10:20:47 AM (12 years ago)
Author:
karaoui
Message:

+ Adding the init attribute to the mwmr to specify the width of the mwmr channel
+ Fixing bugs in kernels_init

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/sys/kernel_init.c

    r169 r175  
    55// Copyright (c) UPMC-LIP6
    66////////////////////////////////////////////////////////////////////////////////////
     7// FIXME
    78// The kernel_init.c files is part of the GIET-VM nano-kernel.
    89// It contains the kernel entry point for the second phase of system initialisation:
     
    4243///////////////////////////////////////////////////////////////////////////////////
    4344
     45void    _kernel_ptabs_init(void);
    4446void    _kernel_vobjs_init(void);
    4547void    _kernel_tasks_init(void);
     
    6466    if ( pid == 0 )
    6567    {
     68        _kernel_ptabs_init();
     69        /* must be called after the initialisation of ptabs */
    6670        _kernel_vobjs_init();
    6771        _kernel_tasks_init();
     
    150154                 "nop");
    151155}
     156
     157///////////////////////////////////////////////////////////////////////////////
     158// used to access user space
     159///////////////////////////////////////////////////////////////////////////////
     160void _set_ptpr(unsigned int vspace_id)
     161{
     162        unsigned int ptpr = ((unsigned int)_kernel_ptabs_paddr[vspace_id]) >> 13;
     163        asm volatile("mtc2 %0, $0"::"r"(ptpr));
     164}
     165
     166///////////////////////////////////////////////////////////////////////////////
     167// This function initialises the _kernel_ptabs_paddr[] array indexed by the vspace_id,
     168// and containing the base addresses of all page tables.
     169// This _kernel_ptabs_paddr[] array is used to initialise the task contexts.
     170///////////////////////////////////////////////////////////////////////////////
     171in_kinit void _kernel_ptabs_init()
     172{
     173    mapping_header_t*   header  = (mapping_header_t*)&seg_mapping_base; 
     174    mapping_vspace_t*   vspace  = _get_vspace_base( header );     
     175    mapping_vobj_t*     vobj    = _get_vobj_base( header );
     176
     177    unsigned int        vspace_id; 
     178    unsigned int        vobj_id;
     179
     180    // loop on the vspaces
     181    for ( vspace_id = 0 ; vspace_id < header->vspaces ; vspace_id++ )
     182    {
     183        char ptab_found = 0;
     184
     185#if INIT_DEBUG_CTX
     186_puts("[INIT] --- vobjs initialisation in vspace ");
     187_puts(vspace[vspace_id].name);
     188_puts("\n");
     189#endif
     190        // loop on the vobjs and get the ptpr
     191            for(vobj_id= vspace[vspace_id].vobj_offset;
     192                        vobj_id < (vspace[vspace_id].vobj_offset+ vspace[vspace_id].vobjs);
     193                        vobj_id++)
     194            {
     195            if(vobj[vobj_id].type == VOBJ_TYPE_PTAB)
     196            {
     197                if( ptab_found )
     198                {
     199                    _puts("\n[INIT ERROR] Only one PTAB for by vspace ");
     200                    _putw( vspace_id );
     201                    _exit();
     202                }
     203
     204                ptab_found = 1;
     205                _kernel_ptabs_paddr[vspace_id] = vobj[vobj_id].paddr;
     206                _kernel_ptabs_vaddr[vspace_id] = vobj[vobj_id].vaddr;
     207
     208#if INIT_DEBUG_CTX
     209_puts("[INIT]   PTAB address = ");
     210_putw(_kernel_ptabs_paddr[vspace_id]);
     211_puts("\n");
     212#endif
     213            }
     214
     215        }
     216
     217        if( !ptab_found )
     218        {
     219            _puts("\n[INIT ERROR] Missing PTAB for vspace ");
     220            _putw( vspace_id );
     221            _exit();
     222        }
     223    }
     224       
     225    _puts("\n[INIT] Ptabss initialisation completed at cycle : ");
     226    _putw( _proctime() );
     227    _puts("\n");
     228
     229} // end kernel_ptabs_init()
     230
     231///////////////////////////////////////////////////////////////////////////////
     232// This function initializes all private vobjs defined in the vspaces,
     233// such as mwmr channels, barriers and locks, depending on the vobj type.
     234// (Most of the vobjs are not known, and not initialised by the compiler).
     235///////////////////////////////////////////////////////////////////////////////
     236in_kinit void _kernel_vobjs_init()
     237{
     238    mapping_header_t*   header  = (mapping_header_t*)&seg_mapping_base; 
     239    mapping_vspace_t*   vspace  = _get_vspace_base( header );     
     240    mapping_vobj_t*     vobj    = _get_vobj_base( header );
     241
     242    unsigned int        vspace_id; 
     243    unsigned int        vobj_id;
     244
     245    // loop on the vspaces
     246    for ( vspace_id = 0 ; vspace_id < header->vspaces ; vspace_id++ )
     247    {
     248        char ptab_found = 0;
     249
     250#if INIT_DEBUG_CTX
     251_puts("[INIT] --- vobjs initialisation in vspace ");
     252_puts(vspace[vspace_id].name);
     253_puts("\n");
     254#endif
     255        // loop on the vobjs and get the ptpr
     256            for(vobj_id= vspace[vspace_id].vobj_offset;
     257                        vobj_id < (vspace[vspace_id].vobj_offset+ vspace[vspace_id].vobjs);
     258                        vobj_id++)
     259            {
     260            if(vobj[vobj_id].type == VOBJ_TYPE_PTAB)
     261            {
     262                if( ptab_found )
     263                {
     264                    _puts("\n[INIT ERROR] Only one PTAB for by vspace ");
     265                    _putw( vspace_id );
     266                    _exit();
     267                }
     268
     269                ptab_found = 1;
     270                _kernel_ptabs_paddr[vspace_id] = vobj[vobj_id].paddr;
     271                _kernel_ptabs_vaddr[vspace_id] = vobj[vobj_id].vaddr;
     272
     273#if INIT_DEBUG_CTX
     274_puts("[INIT]   PTAB address = ");
     275_putw(_kernel_ptabs_paddr[vspace_id]);
     276_puts("\n");
     277#endif
     278            }
     279
     280        }
     281
     282        if( !ptab_found )
     283        {
     284            _puts("\n[INIT ERROR] Missing PTAB for vspace ");
     285            _putw( vspace_id );
     286            _exit();
     287        }
     288       
     289        /** Set the current vspace ptpr to initialise the vobjs */
     290                _set_ptpr(vspace_id);
     291
     292        // loop on the vobjs and get the ptpr
     293            for(vobj_id= vspace[vspace_id].vobj_offset;
     294                        vobj_id < (vspace[vspace_id].vobj_offset+ vspace[vspace_id].vobjs);
     295                        vobj_id++)
     296            {
     297            switch( vobj[vobj_id].type )
     298            {
     299                case VOBJ_TYPE_PTAB:    // initialise page table pointers array
     300                {
     301                    break;//already handled
     302                }
     303                case VOBJ_TYPE_MWMR:    // storage capacity is (vobj.length/4 - 5) words
     304                        {
     305                    mwmr_channel_t* mwmr = (mwmr_channel_t*)(vobj[vobj_id].vaddr);
     306                    mwmr->ptw   = 0;
     307                    mwmr->ptr   = 0;
     308                    mwmr->sts   = 0;
     309                    mwmr->depth = (vobj[vobj_id].length>>2) - 5;
     310                    mwmr->width = vobj[vobj_id].init;
     311                    mwmr->lock  = 0;
     312#if INIT_DEBUG_CTX
     313_puts("[INIT]   MWMR channel ");
     314_puts( vobj->name);
     315_puts(" / depth = ");
     316_putw( mwmr->depth );
     317_puts("\n");
     318#endif
     319                    break;
     320                }
     321                case VOBJ_TYPE_ELF:             // initialisation done by the loader
     322                {
     323
     324#if INIT_DEBUG_CTX
     325_puts("[INIT]   ELF section ");
     326_puts( vobj->name);
     327_puts(" / length = ");
     328_putw( vobj->length );
     329_puts("\n");
     330#endif
     331                     break;
     332                }
     333                case VOBJ_TYPE_BARRIER: // init is the number of participants
     334                {
     335                    giet_barrier_t* barrier = (giet_barrier_t*)(vobj[vobj_id].vaddr);
     336                    barrier->count = 0;
     337                    barrier->init  = vobj[vobj_id].init;
     338#if INIT_DEBUG_CTX
     339_puts("   BARRIER ");
     340_puts( vobj->name);
     341_puts(" / init_value = ");
     342_putw( barrier->init );
     343_puts("\n");
     344#endif
     345                    break;
     346                }
     347                case VOBJ_TYPE_LOCK:    // init is "not taken"
     348                {
     349                    unsigned int* lock = (unsigned int*)(vobj[vobj_id].vaddr);
     350                    *lock = 0;
     351#if INIT_DEBUG_CTX
     352_puts("   LOCK ");
     353_puts( vobj->name);
     354_puts("\n");
     355#endif
     356                    break;
     357                }
     358                case VOBJ_TYPE_BUFFER:  // nothing to do
     359                {
     360
     361#if INIT_DEBUG_CTX
     362_puts("   BUFFER ");
     363_puts( vobj->name);
     364_puts(" / length = ");
     365_putw( vobj->length );
     366_puts("\n");
     367#endif
     368                    break;
     369                }
     370                default:
     371                {
     372                    _puts("\n[INIT ERROR] illegal vobj of name ");
     373                    _puts(vobj->name);
     374                    _puts(" / in vspace = ");
     375                    _puts(vobj->name);
     376                    _puts("\n ");
     377                    _exit();
     378                }
     379            } // end switch type
     380        } // end loop on vobjs
     381    } // end loop on vspaces
     382
     383    _puts("\n[INIT] Vobjs initialisation completed at cycle : ");
     384    _putw( _proctime() );
     385    _puts("\n");
     386
     387} // end kernel_vobjs_init()
    152388
    153389///////////////////////////////////////////////////////////////////////////////
     
    181417    mapping_vobj_t*     vobj   = _get_vobj_base( header );
    182418
     419    /** Set the current vspace ptpr before acessing the memory */
     420    _set_ptpr(vspace_id);
    183421   
    184422    // values to be initialised in task context
     
    291529
    292530} // end _task_map()
    293 
    294 ///////////////////////////////////////////////////////////////////////////////
    295 // This function initializes all private vobjs defined in the vspaces,
    296 // such as mwmr channels, barriers and locks, depending on the vobj type.
    297 // (Most of the vobjs are not known, and not initialised by the compiler).
    298 // This function initialises the _kernel_ptabs_paddr[] array indexed by the vspace_id,
    299 // and containing the base addresses of all page tables.
    300 // This _kernel_ptabs_paddr[] array is used to initialise the task contexts.
    301 ///////////////////////////////////////////////////////////////////////////////
    302 in_kinit void _kernel_vobjs_init()
    303 {
    304     mapping_header_t*   header  = (mapping_header_t*)&seg_mapping_base; 
    305     mapping_vspace_t*   vspace  = _get_vspace_base( header );     
    306     mapping_vobj_t*     vobj    = _get_vobj_base( header );
    307 
    308     unsigned int        vspace_id; 
    309     unsigned int        vobj_id;
    310 
    311     // loop on the vspaces
    312     for ( vspace_id = 0 ; vspace_id < header->vspaces ; vspace_id++ )
    313     {
    314         char ptab_found = 0;
    315 
    316 #if INIT_DEBUG_CTX
    317 _puts("[INIT] --- vobjs initialisation in vspace ");
    318 _puts(vspace[vspace_id].name);
    319 _puts("\n");
    320 #endif
    321         // loop on the vobjs
    322             for(vobj_id= vspace[vspace_id].vobj_offset;
    323                         vobj_id < (vspace[vspace_id].vobj_offset+ vspace[vspace_id].vobjs);
    324                         vobj_id++)
    325             {
    326             switch( vobj[vobj_id].type )
    327             {
    328                 case VOBJ_TYPE_PTAB:    // initialise page table pointers array
    329                 {
    330                     ptab_found = 1;
    331                     _kernel_ptabs_paddr[vspace_id] = vobj[vobj_id].paddr;
    332                     _kernel_ptabs_vaddr[vspace_id] = vobj[vobj_id].vaddr;
    333 
    334 #if INIT_DEBUG_CTX
    335 _puts("[INIT]   PTAB address = ");
    336 _putw(_kernel_ptabs_paddr[vspace_id]);
    337 _puts("\n");
    338 #endif
    339                     break;
    340                 }
    341                 case VOBJ_TYPE_MWMR:    // storage capacity is (vobj.length/4 - 5) words
    342                         {
    343                     mwmr_channel_t* mwmr = (mwmr_channel_t*)(vobj[vobj_id].vaddr);
    344                     mwmr->ptw   = 0;
    345                     mwmr->ptr   = 0;
    346                     mwmr->sts   = 0;
    347                     mwmr->depth = (vobj[vobj_id].length>>2) - 5;
    348                     mwmr->lock  = 0;
    349 #if INIT_DEBUG_CTX
    350 _puts("[INIT]   MWMR channel ");
    351 _puts( vobj->name);
    352 _puts(" / depth = ");
    353 _putw( mwmr->depth );
    354 _puts("\n");
    355 #endif
    356                     break;
    357                 }
    358                 case VOBJ_TYPE_ELF:             // initialisation done by the loader
    359                 {
    360 
    361 #if INIT_DEBUG_CTX
    362 _puts("[INIT]   ELF section ");
    363 _puts( vobj->name);
    364 _puts(" / length = ");
    365 _putw( vobj->length );
    366 _puts("\n");
    367 #endif
    368                      break;
    369                 }
    370                 case VOBJ_TYPE_BARRIER: // init is the number of participants
    371                 {
    372                     giet_barrier_t* barrier = (giet_barrier_t*)(vobj[vobj_id].vaddr);
    373                     barrier->count = 0;
    374                     barrier->init  = vobj[vobj_id].init;
    375 #if INIT_DEBUG_CTX
    376 _puts("   BARRIER ");
    377 _puts( vobj->name);
    378 _puts(" / init_value = ");
    379 _putw( barrier->init );
    380 _puts("\n");
    381 #endif
    382                     break;
    383                 }
    384                 case VOBJ_TYPE_LOCK:    // init is "not taken"
    385                 {
    386                     unsigned int* lock = (unsigned int*)(vobj[vobj_id].vaddr);
    387                     *lock = 0;
    388 #if INIT_DEBUG_CTX
    389 _puts("   LOCK ");
    390 _puts( vobj->name);
    391 _puts("\n");
    392 #endif
    393                     break;
    394                 }
    395                 case VOBJ_TYPE_BUFFER:  // nothing to do
    396                 {
    397 
    398 #if INIT_DEBUG_CTX
    399 _puts("   BUFFER ");
    400 _puts( vobj->name);
    401 _puts(" / length = ");
    402 _putw( vobj->length );
    403 _puts("\n");
    404 #endif
    405                     break;
    406                 }
    407                 default:
    408                 {
    409                     _puts("\n[INIT ERROR] illegal vobj of name ");
    410                     _puts(vobj->name);
    411                     _puts(" / in vspace = ");
    412                     _puts(vobj->name);
    413                     _puts("\n ");
    414                     _exit();
    415                 }
    416             } // end switch type
    417         } // end loop on vobjs
    418         if( !ptab_found )
    419         {
    420             _puts("\n[INIT ERROR] Missing PTAB for vspace ");
    421             _putw( vspace_id );
    422             _exit();
    423         }
    424     } // end loop on vspaces
    425 
    426     _puts("\n[INIT] Vobjs initialisation completed at cycle : ");
    427     _putw( _proctime() );
    428     _puts("\n");
    429 
    430 } // end _vobjs_init()
    431531
    432532///////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.