Ignore:
Timestamp:
Jun 21, 2012, 2:47:19 PM (12 years ago)
Author:
karaoui
Message:

changing mover to memo
changing soft.bin to soft.elf
...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/boot/boot_handler.c

    r162 r163  
    6161#endif
    6262
    63 #if !defined(GIET_NB_PT2_MAX)
    64 # error The GIET_NB_PT2_MAX value must be defined in the 'giet_config.h' file !
    65 #endif
    66 
    67 
    6863////////////////////////////////////////////////////////////////////////////
    6964//  Global variables
     
    434429// As the set of PT2s is implemented as a fixed size array (no dynamic
    435430// allocation), this function checks a possible overflow of the PT2 array.
     431//
     432// The parametre global is a boolean taht indicate wether a global vseg is
     433// being mapped.
    436434//////////////////////////////////////////////////////////////////////////////
    437435void boot_add_pte( unsigned int    vspace_id,   
    438                            unsigned int    vpn,           
    439                            unsigned int    flags,
    440                            unsigned int    ppn )
     436                   unsigned int    vpn,           
     437                   unsigned int    flags,
     438                   unsigned int    ppn,
     439                   unsigned char   global )
    441440{
    442441    unsigned int    ix1;
     
    488487    if ( ( *pt_flags & PTE_V) != 0 )    // page already mapped
    489488    {
    490         boot_tty_puts("\n[BOOT ERROR] in boot_add_pte() function\n");
    491         boot_tty_puts("page already mapped\n");
    492         boot_exit();
    493     }
    494     else                                          // set PTE2
    495     {
    496         *pt_flags = flags;
    497         *pt_ppn   = ppn;
    498     }
     489        if(global)
     490        {
     491            boot_tty_puts("\n[BOOT ERROR] in boot_add_pte() function\n");
     492            boot_tty_puts("page already mapped\n");
     493            boot_exit();
     494        }else
     495        {
     496            /**
     497             * The case where a global vseg is already mapped as private vseg of a
     498             * vspace_id. Typically used when a vseg is being replicated.
     499             */ 
     500            boot_tty_puts("\n[BOOT] global PTE for vspace ");
     501            boot_tty_putw(vspace_id);
     502            boot_tty_puts(" already mapped, vpn = ");
     503            boot_tty_putw(vpn);
     504            boot_tty_puts("\n");
     505            return;
     506        }
     507    }
     508
     509    // set PTE2
     510    *pt_flags = flags;
     511    *pt_ppn   = ppn;
     512
    499513} // end boot_add_pte()
    500514               
     
    517531    mapping_vspace_t*  vspace = boot_get_vspace_base( header );
    518532    mapping_vseg_t*    vseg   = boot_get_vseg_base( header );
     533   
     534    // private segments
     535    for ( vseg_id = vspace[vspace_id].vseg_offset ;
     536          vseg_id < (vspace[vspace_id].vseg_offset + vspace[vspace_id].vsegs) ;
     537          vseg_id++ )
     538    {
     539        vpn       = vseg[vseg_id].vbase >> 12;
     540        ppn       = vseg[vseg_id].pbase >> 12;
     541        npages    = vseg[vseg_id].length >> 12;
     542        if ( (vseg[vseg_id].length & 0xFFF) != 0 ) npages++;
     543
     544        flags = PTE_V;
     545        if ( vseg[vseg_id].mode & C_MODE_MASK )  flags = flags | PTE_C;
     546        if ( vseg[vseg_id].mode & X_MODE_MASK )  flags = flags | PTE_X;
     547        if ( vseg[vseg_id].mode & W_MODE_MASK )  flags = flags | PTE_W;
     548        if ( vseg[vseg_id].mode & U_MODE_MASK )  flags = flags | PTE_U;
     549
     550#if BOOT_DEBUG_PT
     551boot_tty_puts("- vseg ");
     552boot_tty_puts( vseg[vseg_id].name );
     553boot_tty_puts(" / flags = ");
     554boot_tty_putw( flags );
     555boot_tty_puts("\n");
     556#endif       
     557        // loop on 4K pages
     558        for ( page_id = 0 ; page_id < npages ; page_id++ )
     559        {
     560            boot_add_pte( vspace_id,
     561                          vpn,
     562                          flags,
     563                          ppn,
     564                          0 );
     565            vpn++;
     566            ppn++;
     567        }
     568    }
    519569
    520570    // global segments
     
    547597                          vpn,
    548598                          flags,
    549                           ppn );
    550             vpn++;
    551             ppn++;
    552         }
    553     }
    554    
    555     // private segments
    556     for ( vseg_id = vspace[vspace_id].vseg_offset ;
    557           vseg_id < (vspace[vspace_id].vseg_offset + vspace[vspace_id].vsegs) ;
    558           vseg_id++ )
    559     {
    560         vpn       = vseg[vseg_id].vbase >> 12;
    561         ppn       = vseg[vseg_id].pbase >> 12;
    562         npages    = vseg[vseg_id].length >> 12;
    563         if ( (vseg[vseg_id].length & 0xFFF) != 0 ) npages++;
    564 
    565         flags = PTE_V;
    566         if ( vseg[vseg_id].mode & C_MODE_MASK )  flags = flags | PTE_C;
    567         if ( vseg[vseg_id].mode & X_MODE_MASK )  flags = flags | PTE_X;
    568         if ( vseg[vseg_id].mode & W_MODE_MASK )  flags = flags | PTE_W;
    569         if ( vseg[vseg_id].mode & U_MODE_MASK )  flags = flags | PTE_U;
    570 
    571 #if BOOT_DEBUG_PT
    572 boot_tty_puts("- vseg ");
    573 boot_tty_puts( vseg[vseg_id].name );
    574 boot_tty_puts(" / flags = ");
    575 boot_tty_putw( flags );
    576 boot_tty_puts("\n");
    577 #endif       
    578         // loop on 4K pages
    579         for ( page_id = 0 ; page_id < npages ; page_id++ )
    580         {
    581             boot_add_pte( vspace_id,
    582                           vpn,
    583                           flags,
    584                           ppn );
     599                          ppn,
     600                          1 );
    585601            vpn++;
    586602            ppn++;
     
    628644        _max_pte2[region_id]    = (vobj->length - PT1_SIZE) / PT2_SIZE;
    629645
     646#if BOOT_DEBUG_VIEW
    630647        boot_tty_puts("ptabs for vspace ");
    631648        boot_tty_putw(region_id);
    632         boot_tty_puts("address:");
     649        boot_tty_puts(" address: ");
    633650        boot_tty_putw((unsigned)_ptabs[region_id]);
    634651        boot_tty_puts("\n");
     652#endif
    635653    }
    636654}
     
    780798    }
    781799
    782     // GIET_NB_PT2_MAX must be even
    783     if ( (GIET_NB_PT2_MAX & 0x1) != 0 )
    784     {
    785         boot_tty_puts("\n[BOOT ERROR] : GIET_NB_PT2_MAX must be an even numver\n");
    786         boot_tty_puts("\n");
    787         boot_exit();
    788     }
    789 
    790800    // number of virtual spaces no larger than GIET_NB_VSPACE_MAX
    791801    if ( header->vspaces > GIET_NB_VSPACE_MAX )
Note: See TracChangeset for help on using the changeset viewer.