Changeset 171 for soft/giet_vm


Ignore:
Timestamp:
Jul 18, 2012, 9:17:22 AM (12 years ago)
Author:
karaoui
Message:

Testing the placement of the kernel segments without the identity mapping.
debugging memo.
debugging the vm_handler to disable the interrupts while passing in physical addressing.

Location:
soft/giet_vm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/map.xml

    r170 r171  
    8989                        vbase     = "0x80000000"
    9090                        mode      = "CX__"
    91                         psegname  = "PSEG_RAK"
    92                         ident     = "1" >
     91                        psegname  = "PSEG_RAU"
     92                        ident     = "0" >
    9393                                        <vobj   name    = "seg_kernel_code"
    9494                                                        type    = "ELF"
     
    101101                        vbase     = "0x80010000"
    102102                        mode      = "C_W_"
    103                         psegname  = "PSEG_RAK"
    104                         ident     = "1" >
     103                        psegname  = "PSEG_RAU"
     104                        ident     = "O" >
    105105                                        <vobj   name    = "seg_kernel_data"
    106106                                                        type    = "ELF"
     
    112112                        vbase     = "0x80080000"
    113113                        mode      = "__W_"
    114                         psegname  = "PSEG_RAK"
    115                         ident     = "1" >
     114                        psegname  = "PSEG_RAU"
     115                        ident     = "0" >
    116116                                            <vobj   name        = "seg_kernel_uncdata"
    117117                                                        type    = "ELF"
     
    123123                        vbase     = "0x80090000"
    124124                        mode      = "CX__"
    125                         psegname  = "PSEG_RAK"
    126                         ident     = "1" >
     125                        psegname  = "PSEG_RAU"
     126                        ident     = "0" >
    127127                                        <vobj   name    = "seg_kernel_init"
    128128                                                        type    = "ELF"
  • soft/giet_vm/memo/src/libelfpp/elfpp_access.cc

    r163 r171  
    644644        segment *s = new segment(obj);
    645645
    646         if(!(sec->get_flags() & elfpp::SHF_ALLOC))
    647     {
    648             s->set_type(PT_NULL);
    649         continue;
    650     }
    651    
    652     s->set_type(PT_LOAD);
    653         s->set_file_offset(0);//done while writing section in file
    654         s->set_vaddr(sec->get_vaddr());
    655         s->set_paddr(sec->get_vaddr());
    656 
    657         s->set_mem_size(sec->get_size());
    658         s->set_file_size(sec->get_size());
    659 
    660         flag = PF_R ;//ALLOC ==> read ?
    661         flag = flag | (p_flags_e)(sec->get_flags() & SHF_WRITE)? PF_W : PF_R ;
    662         flag = flag | (p_flags_e)(sec->get_flags() & SHF_EXECINSTR)? PF_X : PF_R ;
    663         s->set_flags(flag);
    664         s->set_align(0);//FIXME!
    665 
    666         obj.add_segment(*s);
     646        if(!(sec->get_flags() & elfpp::SHF_ALLOC))
     647        {
     648            s->set_type(PT_NULL);
     649            continue;
     650        }
     651       
     652        s->set_type(PT_LOAD);
     653        s->set_file_offset(0);//done while writing section in file
     654#ifdef MEMO_DEBUG
     655        std::cout << "seg building (" << std::hex << sec->get_vaddr() << ") for: " << *sec << std::endl;
     656#endif
     657        s->set_vaddr(sec->get_vaddr());
     658        s->set_paddr(sec->get_vaddr());
     659
     660        s->set_mem_size(sec->get_size());
     661        s->set_file_size(sec->get_size());
     662
     663            flag = PF_R ;//ALLOC ==> read ?
     664            flag = flag | (p_flags_e)(sec->get_flags() & SHF_WRITE)? PF_W : PF_R ;
     665            flag = flag | (p_flags_e)(sec->get_flags() & SHF_EXECINSTR)? PF_X : PF_R ;
     666        s->set_flags(flag);
     667        s->set_align(0);//FIXME!
     668
     669#ifdef MEMO_DEBUG
     670        std::cout <<"New segment " << s->get_file_size() << std::endl;
     671#endif
     672        obj.add_segment(*s);
    667673      }
    668674  }
     
    675681    if (obj.generate_symtab_)
    676682      save_symtab(obj);
     683
     684    // create all segments
    677685
    678686    create_segments(obj);
     
    797805    std::memset(phdr, 0, sizeof(phdr));
    798806
    799     unsigned int i = 0;
     807    unsigned int i = 1;//to keep the same order as sections
    800808    FOREACH(s, obj.get_segment_table())
    801809      {
     
    812820       
    813821        swap(&phdr[i].p_align, s->get_align());
    814         //offset done while writing sections
     822        //note: offset done while writing sections
    815823        i++;
    816824      }
     
    829837    FOREACH(s, obj.get_section_table())
    830838      {
    831         if (s->get_type() == SHT_NOBITS)
    832           continue;
    833 
     839        if (s->get_type() == SHT_NOBITS)
     840          continue;
     841
     842#ifdef MEMO_DEBUG
     843        std::cout << "offset: " << ftell(file) << " for " << *s << std::endl;
     844        std::cout << std::hex << "paddr: " << phdr[s->index_].p_paddr << ", sect vaddr: " << s->get_vaddr() << "/" <<shdr[s->index_].sh_addr << std::endl;
     845#endif
    834846        swap(&shdr[s->index_].sh_offset, ftell(file));
    835847        swap(&phdr[s->index_].p_offset, ftell(file));
  • soft/giet_vm/sys/vm_handler.c

    r170 r171  
    118118
    119119        // gets ppn_value and flags_value, after temporary DTLB desactivation
    120         asm volatile ( "move    $27, %2     \n"     /* $27 <= pte2      */
    121                        "li      $26, 0xB    \n"     /* DTLB unactivated */
    122                        "mtc2    $26, $1     \n"
    123                        "lw      %0,  0($27) \n"     /* read flags       */
    124                        "lw      %1,  4($27) \n"     /* read ppn         */
    125                        "li      $26, 0xF    \n"
    126                        "mtc2    $26, $1     \n"     /* DTLB activated   */
     120        asm volatile (
     121                       "li      $27,    0xFFFFFFFE  \n"     /* Mask for IE bits     */
     122                       "mfc0    $8,     $12         \n"     /* $8 <= SR             */
     123                       "and     $26,    $26,    $27 \n"     /* disable Interrupts   */
     124                       "move    $27,    %2          \n"     /* $27 <= pte2          */
     125                       "li      $26,    0xB         \n"     /* DTLB unactivated     */
     126                       "mtc2    $26,    $1          \n"
     127                       "lw      %0,     0($27)      \n"     /* read flags           */
     128                       "lw      %1,     4($27)      \n"     /* read ppn             */
     129                       "li      $26,    0xF         \n"
     130                       "mtc2    $26,    $1          \n"     /* DTLB activated       */
     131                       "or     $26,     $8,    $0   \n"     /* SR previous state    */
    127132                        :"=r"(flags_value), "=r"(ppn_value)
    128133                        :"r"(pte2)
    129                         :"$26" );
     134                        :"$26","$27","$8" );
    130135
    131136        // check PTE2 mapping
Note: See TracChangeset for help on using the changeset viewer.