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.
Location:
soft/giet_vm/giet_common
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_common/io.h

    r289 r345  
    4040{
    4141        *(volatile unsigned int *) addr = value;
    42         asm volatile("sync");
     42        asm volatile("sync" ::: "memory");
    4343}
    4444
     
    4949{
    5050        *(volatile unsigned short *) addr = value;
    51         asm volatile("sync");
     51        asm volatile("sync" ::: "memory");
    5252}
    5353
     
    5858{
    5959        *(volatile unsigned char *) addr = value;
    60         asm volatile("sync");
     60        asm volatile("sync" ::: "memory");
    6161}
    6262
  • soft/giet_vm/giet_common/utils.c

    r344 r345  
    4444// Code taken from MutekH.
    4545///////////////////////////////////////////////////////////////////////////////////
    46 inline void* _memcpy( void*        dest,     // dest buffer vbase
    47                       const void*  source,   // source buffer vbase
    48                       unsigned int size )    // bytes
     46inline void* memcpy( void*        dest,     // dest buffer vbase
     47                     const void*  source,   // source buffer vbase
     48                     unsigned int size )    // bytes
    4949{
    5050    unsigned int* idst = (unsigned int*)dest;
     
    7474// Fill a byte string with a byte value.
    7575//////////////////////////////////////////////////////////////////////////////////
    76 inline void * _memset( void*        dest,
    77                        int          value,
    78                        unsigned int count )
     76inline void * memset( void*        dest,
     77                      int          value,
     78                      unsigned int count )
    7979{
    8080    // word-by-word copy
     
    119119// Processor suicide: infinite loop 
    120120//////////////////////////////////////////////////////////////////////////////////
     121__attribute__((noreturn))
    121122inline void _exit()
    122123{
     
    251252inline void _it_disable( unsigned int * save_sr_ptr)
    252253{
    253     unsigned int sr;
     254    unsigned int sr = 0;
    254255    asm volatile( "li      $3,        0xFFFFFFFE    \n"
    255256                  "mfc0    %0,        $12           \n"
    256257                  "and     $3,        $3,   %0      \n" 
    257258                  "mtc0    $3,        $12           \n"
    258                   : "=r"(sr)
     259                  : "+r"(sr)
    259260                  :
    260                   : "$3", "memory" );
     261                  : "$3" );
    261262    *save_sr_ptr = sr;
    262263}
     
    292293    asm volatile ( "mtc2     %0,     $0            \n"
    293294                   :
    294                    :"r" (val) );
     295                   :"r" (val)
     296                   :"memory" );
    295297}
    296298//////////////////////////////////////////////////////////////////////////////
     
    301303    asm volatile ( "mtc2     %0,     $1             \n"
    302304                   :
    303                    :"r" (val) );
     305                   :"r" (val)
     306                   :"memory" );
    304307}
    305308//////////////////////////////////////////////////////////////////////////////
     
    369372
    370373                  "mtc2   $2,     $1                 \n"     /* restore MMU_MODE */
     374                  "sync                              \n"
    371375                  :
    372376                  : "r" (value), "r" (lsb), "r" (msb)
     
    516520            :
    517521            :"r"(plock), "r"(delay)
    518             :"$2", "$3", "$4");
     522            :"$2", "$3", "$4", "memory");
    519523#else
    520524
     
    532536            :
    533537            :"r"(plock)
    534             :"$2", "$3");
     538            :"$2", "$3", "memory");
    535539#endif
    536540
  • soft/giet_vm/giet_common/utils.h

    r344 r345  
    6262///////////////////////////////////////////////////////////////////////////////////
    6363
    64 extern void* _memcpy( void* _dst,
    65                       const void* _src,
    66                       unsigned int size );
    67 
    68 extern void* _memset( void* dst,
    69                       int s,
    70                       unsigned int count );
     64extern void* memcpy( void* _dst,
     65                     const void* _src,
     66                     unsigned int size );
     67
     68extern void* memset( void* dst,
     69                     int s,
     70                     unsigned int count );
    7171
    7272///////////////////////////////////////////////////////////////////////////////////
  • 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.