Ignore:
Timestamp:
Jun 25, 2014, 2:19:37 PM (10 years ago)
Author:
cfuguet
Message:

giet_vm optimizations:

  • Several modifications in GIET_VM in order to support compilation with GCC optimizations (-O2) activated.
  • Adding missing volatile in some global variables.
  • Using ioread and iowrite utility functions in peripheral drivers which prevent GCC to remove writes or reads in hardware memory mapped registers.
  • Code refactoring of stdio printf functions. Now, shr_printf and tty_printf function reuse the same function body. The only difference is that shr_printf wraps printf function call with TTY get lock and release lock.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_common/vmem.c

    r295 r345  
    9595    unsigned long long pte2_paddr;
    9696
    97     register unsigned int pte2_msb;
    98     register unsigned int pte2_lsb;
    99     register unsigned int flags_value;
    100     register unsigned int ppn_value;
     97    volatile unsigned int pte2_msb;
     98    volatile unsigned int pte2_lsb;
     99    unsigned int flags_value;
     100    unsigned int ppn_value;
    101101
    102102    unsigned int ix1 = vpn >> 9;
    103103    unsigned int ix2 = vpn & 0x1FF;
     104
     105    unsigned int save_sr;
    104106
    105107    // get PTE1
     
    110112
    111113    // get physical addresses of pte2 (two 32 bits words)
    112     ptba       = (unsigned long long) (pt->pt1[ix1] & 0x0FFFFFFF) << 12;
     114    ptba       = (unsigned long long) (pte1 & 0x0FFFFFFF) << 12;
    113115    pte2_paddr = ptba + 8*ix2;
    114116    pte2_lsb   = (unsigned int) pte2_paddr;
    115117    pte2_msb   = (unsigned int) (pte2_paddr >> 32);
    116118
     119    // disable interrupts and save status register
     120    _it_disable( &save_sr );
     121
    117122    // gets ppn_value and flags_value, after temporary DTLB desactivation
    118123    asm volatile (
    119                 "li      $2,     0xFFFFFFFE  \n"     /* Mask for IE bits     */
    120                 "mfc0    $4,     $12         \n"     /* $4 <= SR             */
    121                 "and     $2,     $2,    $4   \n"
    122                 "mtc0    $2,     $12         \n"     /* disable Interrupts   */
    123 
    124                 "li      $3,     0xB         \n"     
    125                 "mtc2    $3,     $1          \n"     /* DTLB unactivated     */
     124                "mfc2    $2,     $1          \n"     /* $2 <= MMU_MODE       */
     125                "andi    $3,     $2,    0xb  \n"
     126                "mtc2    $3,     $1          \n"     /* DTLB off             */
    126127
    127128                "mtc2    %2,     $24         \n"     /* PADDR_EXT <= msb     */
     
    130131                "mtc2    $0,     $24         \n"     /* PADDR_EXT <= 0       */
    131132
    132                 "li      $3,     0xF         \n"
    133                 "mtc2    $3,     $1          \n"     /* DTLB activated       */
     133                "mtc2    $2,     $1          \n"     /* restore MMU_MODE     */
     134                : "=r" (flags_value), "=r" (ppn_value)
     135                : "r"  (pte2_msb)   , "r"  (pte2_lsb)
     136                : "$2", "$3");
    134137
    135                 "mtc0    $4,     $12         \n"     /* restore SR           */
    136                 : "=r" (flags_value), "=r" (ppn_value)
    137                 : "r" (pte2_msb), "r" (pte2_lsb)
    138                 : "$2","$3","$4");
     138    // restore saved status register
     139    _it_restore( &save_sr );
    139140
    140141    // check PTE2 mapping
     
    142143
    143144    // set return values
    144     *ppn = ppn_value;
     145    *ppn   = ppn_value;
    145146    *flags = flags_value;
     147
    146148    return 0;
    147149} // end _v2p_translate()
Note: See TracChangeset for help on using the changeset viewer.