Ignore:
Timestamp:
Feb 12, 2013, 6:33:31 PM (12 years ago)
Author:
meunier
Message:

Added support for memspaces and const.
Added an interrupt masking to the "giet_context_switch" syscall
Corrected two bugs in boot/boot_init.c (one minor and one regarding barriers initialization)
Reformatted the code in all files.

File:
1 edited

Legend:

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

    r207 r228  
    2020
    2121/////////////////////////////////////////////////////////////////////////////
    22 //      Global variable : IOMMU page table
     22//     Global variable : IOMMU page table
    2323/////////////////////////////////////////////////////////////////////////////
    2424
    25 __attribute__((section (".iommu"))) page_table_t        _iommu_ptab;
     25__attribute__((section (".iommu"))) page_table_t _iommu_ptab;
    2626
    2727//////////////////////////////////////////////////////////////////////////////
    2828// _iommu_add_pte2()
    2929//////////////////////////////////////////////////////////////////////////////
    30 void _iommu_add_pte2( unsigned int      ix1,
    31                       unsigned int      ix2,
    32                       unsigned int      ppn,
    33                       unsigned int      flags )
    34 {
    35     unsigned int        ptba;
    36     unsigned int*       pt_ppn;
    37     unsigned int*       pt_flags;
     30void _iommu_add_pte2(
     31        unsigned int ix1,
     32        unsigned int ix2,
     33        unsigned int ppn,
     34        unsigned int flags) {
     35    unsigned int ptba;
     36    unsigned int * pt_ppn;
     37    unsigned int * pt_flags;
    3838
    3939    // get pointer on iommu page table
    40     page_table_t* pt = &_iommu_ptab;
     40    page_table_t * pt = &_iommu_ptab;
    4141
    4242    // get ptba and update PT2
    43     if ( (pt->pt1[ix1] & PTE_V) == 0 )
    44     {
     43    if ((pt->pt1[ix1] & PTE_V) == 0) {
    4544        _puts("\n[GIET ERROR] in iommu_add_pte2 function\n");
    4645        _puts("the IOMMU PT1 entry is not mapped / ix1 = ");
     
    4948        _exit();
    5049    }
    51     else
    52     {
    53         ptba      = pt->pt1[ix1] << 12;
    54         pt_flags  = (unsigned int*)(ptba + 8*ix2);
    55         pt_ppn    = (unsigned int*)(ptba + 8*ix2 + 4);
     50    else {
     51        ptba = pt->pt1[ix1] << 12;
     52        pt_flags = (unsigned int *) (ptba + 8 * ix2);
     53        pt_ppn = (unsigned int *) (ptba + 8 * ix2 + 4);
    5654        *pt_flags = flags;
    57         *pt_ppn   = ppn;
     55        *pt_ppn = ppn;
    5856    }
    5957} // end _iommu_add_pte2()
     58
    6059
    6160//////////////////////////////////////////////////////////////////////////////
    6261// _iommu_inval_pte2()
    6362//////////////////////////////////////////////////////////////////////////////
    64 void _iommu_inval_pte2( unsigned int    ix1,
    65                         unsigned int    ix2 )
    66 {
    67     unsigned int        ptba;
    68     unsigned int*       pt_flags;
     63void _iommu_inval_pte2(unsigned int ix1, unsigned int ix2) {
     64    unsigned int ptba;
     65    unsigned int * pt_flags;
    6966
    7067    // get pointer on iommu page table
    71     page_table_t* pt = &_iommu_ptab;
     68    page_table_t * pt = &_iommu_ptab;
    7269
    7370    // get ptba and inval PTE2
    74     if ( (pt->pt1[ix1] & PTE_V) == 0 )
    75     {
     71    if ((pt->pt1[ix1] & PTE_V) == 0) {
    7672        _puts("\n[GIET ERROR] in iommu_inval_pte2 function\n");
    7773        _puts("the IOMMU PT1 entry is not mapped / ix1 = ");
     
    8076        _exit();
    8177    }
    82     else
    83     {
    84         ptba      = pt->pt1[ix1] << 12;
    85         pt_flags  = (unsigned int*)(ptba + 8*ix2);
     78    else {
     79        ptba = pt->pt1[ix1] << 12;
     80        pt_flags = (unsigned int *) (ptba + 8 * ix2);
    8681        *pt_flags = 0;
    8782    }   
    8883} // end _iommu_inval_pte2()
     84
    8985
    9086//////////////////////////////////////////////////////////////////////////////
     
    9288// Returns 0 if success, 1 if PTE1 or PTE2 unmapped
    9389//////////////////////////////////////////////////////////////////////////////
    94 unsigned int _v2p_translate( page_table_t*      pt,
    95                              unsigned int       vpn,
    96                              unsigned int*      ppn,           
    97                              unsigned int*      flags ) 
    98 {
    99     unsigned int    ptba;
     90unsigned int _v2p_translate(
     91        page_table_t * pt,
     92        unsigned int vpn,
     93        unsigned int * ppn,       
     94        unsigned int * flags) {
     95    unsigned int ptba;
     96    register unsigned int * pte2;
     97    register unsigned int flags_value;
     98    register unsigned int ppn_value;
    10099
    101     register unsigned int*   pte2;
    102     register unsigned int    flags_value;
    103     register unsigned int    ppn_value;
    104 
    105     unsigned int    ix1 = vpn >> 9;
    106     unsigned int    ix2 = vpn & 0x1FF;
    107 /*
    108 _puts("\n\n********************** entering v2p_translate");
    109 _puts("\n - pt    = ");
    110 _putx( (unsigned int)pt );
    111 _puts("\n - vpn   = ");
    112 _putx( vpn << 12 );
    113 _puts("\n - ptba  = ");
    114 _putx( pt->pt1[ix1] << 12 ) ;
    115 _puts("\n - &pte2 = ");
    116 _putx( (pt->pt1[ix1] << 12) + 8*ix2 );
    117 _puts("\n - flags = ");
    118 _putx( *(unsigned int*)((pt->pt1[ix1] << 12) + 8*ix2) );
    119 _puts("\n");
    120 */
     100    unsigned int ix1 = vpn >> 9;
     101    unsigned int ix2 = vpn & 0x1FF;
     102    /*
     103       _puts("\n\n********************** entering v2p_translate");
     104       _puts("\n - pt    = ");
     105       _putx( (unsigned int)pt );
     106       _puts("\n - vpn   = ");
     107       _putx( vpn << 12 );
     108       _puts("\n - ptba  = ");
     109       _putx( pt->pt1[ix1] << 12 ) ;
     110       _puts("\n - &pte2 = ");
     111       _putx( (pt->pt1[ix1] << 12) + 8*ix2 );
     112       _puts("\n - flags = ");
     113       _putx( *(unsigned int*)((pt->pt1[ix1] << 12) + 8*ix2) );
     114       _puts("\n");
     115       */
    121116    // check PTE1 mapping
    122     if ( (pt->pt1[ix1] & PTE_V) == 0 )
    123     {
     117    if ((pt->pt1[ix1] & PTE_V) == 0) {
    124118        return 1;
    125119    }
    126     else
    127     {
     120    else {
    128121        // get physical addresses of pte2
    129122        ptba = pt->pt1[ix1] << 12;
    130         pte2 = (unsigned int*)(ptba + 8*ix2);
     123        pte2 = (unsigned int *) (ptba + 8 * ix2);
    131124
    132125        // gets ppn_value and flags_value, after temporary DTLB desactivation
    133         asm volatile ( "li      $27,    0xFFFFFFFE  \n"     /* Mask for IE bits     */
    134                        "mfc0    $26,    $12         \n"     /* save SR              */
    135                        "and     $27,    $26,    $27 \n"
    136                        "mtc0    $27,    $12         \n"     /* disable Interrupts   */
     126        asm volatile (
     127                "li      $27,    0xFFFFFFFE  \n"     /* Mask for IE bits     */
     128                "mfc0    $26,    $12         \n"     /* save SR              */
     129                "and     $27,    $26,    $27 \n"
     130                "mtc0    $27,    $12         \n"     /* disable Interrupts   */
    137131
    138                        "li      $27,    0xB         \n"     
    139                        "mtc2    $27,    $1          \n"     /* DTLB unactivated     */
     132                "li      $27,    0xB         \n"     
     133                "mtc2    $27,    $1          \n"     /* DTLB unactivated     */
    140134
    141                        "move    $27,    %2          \n"     /* $27 <= pte2          */
    142                        "lw      %0,     0($27)      \n"     /* read flags           */
    143                        "lw      %1,     4($27)      \n"     /* read ppn             */
     135                "move    $27,    %2          \n"     /* $27 <= pte2          */
     136                "lw      %0,     0($27)      \n"     /* read flags           */
     137                "lw      %1,     4($27)      \n"     /* read ppn             */
    144138
    145                        "li      $27,    0xF         \n"
    146                        "mtc2    $27,    $1          \n"     /* DTLB activated       */
     139                "li      $27,    0xF         \n"
     140                "mtc2    $27,    $1          \n"     /* DTLB activated       */
    147141
    148                        "mtc0    $26,    $12         \n"     /* restore SR           */
    149                         :"=r"(flags_value), "=r"(ppn_value)
    150                         :"r"(pte2)
    151                         :"$26","$27","$8" );
     142                "mtc0    $26,    $12         \n"     /* restore SR           */
     143                : "=r" (flags_value), "=r" (ppn_value)
     144                : "r" (pte2)
     145                : "$26","$27","$8");
    152146
    153147        // check PTE2 mapping
    154         if ( (flags_value & PTE_V) == 0 )
    155         {
     148        if ((flags_value & PTE_V) == 0) {
    156149            return 1;
    157150        }
    158151
    159152        // set return values
    160         *ppn      = ppn_value;
    161         *flags    = flags_value;
     153        *ppn = ppn_value;
     154        *flags = flags_value;
    162155    }
    163156    return 0;
    164 }       // end _v2p_translate()
     157} // end _v2p_translate()
    165158
    166159// Local Variables:
     
    170163// indent-tabs-mode: nil
    171164// End:
     165// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
    172166
    173 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
    174167
Note: See TracChangeset for help on using the changeset viewer.