Ignore:
Timestamp:
Jun 29, 2014, 1:07:43 PM (10 years ago)
Author:
alain
Message:

Using the giet_lock_t structure in _get_lock() / _release_lock() functions,
to have only one lock per cache line.

Location:
soft/giet_vm/giet_common
Files:
3 edited

Legend:

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

    r345 r351  
    494494// betwween two successive retry.
    495495///////////////////////////////////////////////////////////////////////////////////
    496 inline void _get_lock(unsigned int * plock)
    497 {
     496inline void _get_lock(giet_lock_t* lock)
     497{
     498    register unsigned int* plock = &(lock->value);
     499
    498500#if NO_HARD_CC
    499501
    500     register unsigned int delay = ( _get_proctime() ^ _get_procid() << 4) & 0xFF;
    501 
    502     if (delay == 0) delay++;
     502    register unsigned int delay  = (_get_proctime() ^ _get_procid() << 4) & 0xFF;
     503    if (delay == 0) delay = 0x80;
    503504
    504505    asm volatile (
    505506            "_lock_llsc:             \n"
    506             "ll   $2,    0(%0)       \n" /* $2 <= _ioc_lock current value */
    507             "bnez $2,    _lock_delay \n" /* delay if _ioc_lock already taken */
    508             "li   $3,    1           \n" /* $3 <= argument for sc */
    509             "sc   $3,    0(%0)       \n" /* try to set _ioc_lock */
    510             "bnez $3,    _lock_ok    \n" /* exit if atomic */
    511             "_lock_delay:            \n"
    512             "move $4,    %1          \n" /* $4 <= delay */
    513             "_lock_loop:             \n"
    514             "addi $4,    $4,    -1   \n" /* $4 <= $4 - 1 */
    515             "bnez $4,    _lock_loop  \n" /* test end delay */
    516             "nop                     \n"
    517             "j           _lock_llsc  \n" /* retry */
    518             "nop                     \n"
    519             "_lock_ok:               \n"
     507            "    ll   $2,    0(%0)       \n" /* $2 <= lock current value        */
     508            "    bnez $2,    _lock_delay \n" /* delay if lock already taken      */
     509            "    li   $3,    1           \n" /* $3 <= argument for sc            */
     510            "    sc   $3,    0(%0)       \n" /* try to set lock                  */
     511            "    bnez $3,    _lock_ok    \n" /* exit if atomic                  */
     512            "    _lock_delay:            \n"
     513            "    move $4,    %1          \n" /* $4 <= delay                      */
     514            "    _lock_loop:             \n"
     515            "    addi $4,    $4,    -1   \n" /* $4 <= $4 - 1                    */
     516            "    bnez $4,    _lock_loop  \n" /* test end delay                  */
     517            "    nop                     \n"
     518            "    j           _lock_llsc  \n" /* retry                            */
     519            "    nop                     \n"
     520            "    _lock_ok:               \n"
    520521            :
    521522            :"r"(plock), "r"(delay)
     
    525526    asm volatile (
    526527            "_lock_llsc:                 \n"
    527             "    lw   $2,    0(%0)       \n" /* dcache <= _ioc_lock current value    */
    528             "    bnez $2,    _lock_llsc  \n" /* retry if lock already taken          */
     528            "    lw   $2,    0(%0)       \n" /* $2 <= lock current value         */
     529            "    bnez $2,    _lock_llsc  \n" /* retry if lock already taken      */
    529530            "    nop                     \n"
    530             "    ll   $2,    0(%0)       \n" /* ll_buffer <= _ioc_lock current value */
    531             "    bnez $2,    _lock_llsc  \n" /* retry if _ioc_lock already taken     */
    532             "    li   $3,    1           \n" /* $3 <= argument for sc                */
    533             "    sc   $3,    0(%0)       \n" /* try to set _ioc_lock                 */
    534             "    beqz $3,    _lock_llsc  \n" /* retry if sc failure                  */
     531            "    ll   $2,    0(%0)       \n" /* ll_buffer <= lock current value */
     532            "    bnez $2,    _lock_llsc  \n" /* retry if lock already taken      */
     533            "    li   $3,    1           \n" /* $3 <= argument for sc            */
     534            "    sc   $3,    0(%0)       \n" /* try to set lock                  */
     535            "    beqz $3,    _lock_llsc  \n" /* retry if sc failure              */
    535536            "    nop                     \n"
    536537            :
     
    539540#endif
    540541
    541 //  register unsigned int delay = ( _get_proctime() ^ _get_procid() << 4) & 0xFF;
    542 
    543 //  if (delay == 0) delay++;
    544 
    545 //  asm volatile (
    546 //          "_lock_llsc:             \n"
    547 //          "ll   $2,    0(%0)       \n" /* $2 <= _ioc_lock current value */
    548 //          "bnez $2,    _lock_delay \n" /* delay if _ioc_lock already taken */
    549 //          "li   $3,    1           \n" /* $3 <= argument for sc */
    550 //          "sc   $3,    0(%0)       \n" /* try to set _ioc_lock */
    551 //          "bnez $3,    _lock_ok    \n" /* exit if atomic */
    552 //          "_lock_delay:            \n"
    553 //          "move $4,    %1          \n" /* $4 <= delay */
    554 //          "_lock_loop:             \n"
    555 //          "addi $4,    $4,    -1   \n" /* $4 <= $4 - 1 */
    556 //          "bnez $4,    _lock_loop  \n" /* test end delay */
    557 //          "nop                     \n"
    558 //          "j           _lock_llsc  \n" /* retry */
    559 //          "nop                     \n"ache
    560 //          "_lock_ok:               \n"
    561 //          :
    562 //          :"r"(plock), "r"(delay)
    563 //          :"$2", "$3", "$4");
    564 
    565542}
    566543
     
    568545// Release a previouly taken lock.
    569546///////////////////////////////////////////////////////////////////////////////////
    570 inline void _release_lock(unsigned int * plock)
     547inline void _release_lock(giet_lock_t* lock)
    571548{
    572549    asm volatile ( "sync\n" ::: "memory" );
    573550    // sync is necessary because of the TSAR consistency model
    574     *plock = 0;
     551    lock->value = 0;
    575552}
    576553
     
    653630    char buf[11];
    654631    unsigned int i;
    655     unsigned int first;
     632    unsigned int first = 0;
    656633
    657634    buf[10] = 0;
    658635
    659     for (i = 0; i < 10; i++) {
    660         if ((val != 0) || (i == 0)) {
     636    for (i = 0; i < 10; i++)
     637    {
     638        if ((val != 0) || (i == 0))
     639        {
    661640            buf[9 - i] = DecTab[val % 10];
    662641            first = 9 - i;
    663642        }
    664         else {
     643        else
     644        {
    665645            break;
    666646        }
  • soft/giet_vm/giet_common/utils.h

    r345 r351  
    2424
    2525///////////////////////////////////////////////////////////////////////////////////
    26 // For retrieving base addresses defined in seg.ld file.
     26// This structure is used to have one single lock in a cache line
     27///////////////////////////////////////////////////////////////////////////////////
     28
     29typedef struct giet_lock_s { unsigned int value;
     30                             unsigned int padding[15]; } giet_lock_t;
     31
     32///////////////////////////////////////////////////////////////////////////////////
     33// To access the virtual addresses defined in the giet_vsegs.ld file.
    2734///////////////////////////////////////////////////////////////////////////////////
    2835
    2936typedef struct _ld_symbol_s _ld_symbol_t;
    3037
    31 // boot segments vbase addresses & sizes
    3238extern _ld_symbol_t boot_code_vbase;
    33 extern _ld_symbol_t boot_code_size;
    34 
    3539extern _ld_symbol_t boot_data_vbase;
    36 extern _ld_symbol_t boot_data_size;
    37 
    38 extern _ld_symbol_t boot_stack_vbase;
    39 extern _ld_symbol_t boot_stack_size;
    40 
    41 extern _ld_symbol_t boot_mapping_vbase;
    42 extern _ld_symbol_t boot_mapping_size;
    43 
    44 extern _ld_symbol_t boot_buffer_vbase;
    45 extern _ld_symbol_t boot_buffer_size;
    46 
    47 // kernel segments vbase addresses & sizes
     40
    4841extern _ld_symbol_t kernel_code_vbase;
    49 extern _ld_symbol_t kernel_code_size;
    50 
    5142extern _ld_symbol_t kernel_data_vbase;
    52 extern _ld_symbol_t kernel_data_size;
    53 
    5443extern _ld_symbol_t kernel_uncdata_vbase;
    55 extern _ld_symbol_t kernel_uncdata_size;
    56 
    5744extern _ld_symbol_t kernel_init_vbase;
    58 extern _ld_symbol_t kernel_init_size;
    5945
    6046///////////////////////////////////////////////////////////////////////////////////
     
    134120///////////////////////////////////////////////////////////////////////////////////
    135121
    136 extern void         _get_lock(unsigned int * lock);
    137 extern void         _release_lock(unsigned int * lock);
     122extern void         _get_lock(giet_lock_t* lock);
     123extern void         _release_lock(giet_lock_t* lock);
    138124
    139125///////////////////////////////////////////////////////////////////////////////////
  • soft/giet_vm/giet_common/vmem.c

    r345 r351  
    9595    unsigned long long pte2_paddr;
    9696
    97     volatile unsigned int pte2_msb;
    98     volatile unsigned int pte2_lsb;
     97    unsigned int pte2_msb;
     98    unsigned int pte2_lsb;
    9999    unsigned int flags_value;
    100100    unsigned int ppn_value;
     
    126126                "mtc2    $3,     $1          \n"     /* DTLB off             */
    127127
     128                "move    $4,     %3          \n"     /* $4 <= pte_lsb        */
    128129                "mtc2    %2,     $24         \n"     /* PADDR_EXT <= msb     */
    129                 "lw      %0,     0(%3)       \n"     /* read flags           */
    130                 "lw      %1,     4(%3)       \n"     /* read ppn             */
     130                "lw      %0,     0($4)       \n"     /* read flags           */
     131                "lw      %1,     4($4)       \n"     /* read ppn             */
    131132                "mtc2    $0,     $24         \n"     /* PADDR_EXT <= 0       */
    132133
     
    134135                : "=r" (flags_value), "=r" (ppn_value)
    135136                : "r"  (pte2_msb)   , "r"  (pte2_lsb)
    136                 : "$2", "$3");
     137                : "$2", "$3", "$4" );
    137138
    138139    // restore saved status register
Note: See TracChangeset for help on using the changeset viewer.