Changeset 301 for soft/giet_vm


Ignore:
Timestamp:
Apr 14, 2014, 6:44:51 PM (10 years ago)
Author:
cfuguet
Message:

Bugfix for interrupt masking and demasking.

Location:
soft/giet_vm
Files:
4 edited

Legend:

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

    r295 r301  
    257257                  : "=r"(sr)
    258258                  :
    259                   : "$3" );
     259                  : "$3", "memory" );
    260260    *save_sr_ptr = sr;
    261261}
     
    269269                  "or      $3,        $3, $4        \n"
    270270                  "mtc0    $3,        $12           \n" 
    271                   ::: "$3", "$4" );
     271                  ::: "$3", "$4", "memory" );
    272272}
    273273
     
    280280    asm volatile( "mtc0    %0,        $12           \n"
    281281                  :
    282                   : "r"(sr) );
     282                  : "r"(sr)
     283                  : "memory" );
    283284}
    284285
     
    325326    unsigned int lsb = (unsigned int) paddr;
    326327    unsigned int msb = (unsigned int) (paddr >> 32);
    327 
     328    unsigned int sr;
     329
     330    _it_disable(&sr);
    328331    asm volatile(
    329             "li     $3,     0xFFFFFFFE         \n"
    330             "mfc0   $2,     $12                \n"
    331             "and    $3,     $2,        $3      \n"
    332             "mtc0   $3,     $12                \n"     /* IRQ disabled     */
    333 
    334332            "mfc2   $2,     $1                 \n"     /* $2 <= MMU_MODE   */
    335333            "andi   $3,     $2,        0xb     \n"
     
    341339
    342340            "mtc2   $2,     $1                 \n"     /* restore MMU_MODE */
    343 
    344             "li     $3,     0x00000001         \n"
    345             "mfc0   $2,     $12                \n"
    346             "or     $3,     $3,        $2      \n"
    347             "mtc0   $3,     $12                \n"     /* IRQ enabled      */
    348341            : "=r" (value)
    349342            : "r" (lsb), "r" (msb)
    350343            : "$2", "$3");
     344    _it_restore(&sr);
    351345    return value;
    352346}
     
    360354    unsigned int lsb = (unsigned int)paddr;
    361355    unsigned int msb = (unsigned int)(paddr >> 32);
    362 
     356    unsigned int sr;
     357
     358    _it_disable(&sr);
    363359    asm volatile(
    364             "li     $3,     0xFFFFFFFE         \n"
    365             "mfc0   $2,     $12                \n"
    366             "and    $3,     $2,        $3      \n"
    367             "mtc0   $3,     $12                \n"     /* IRQ disabled     */
    368 
    369360            "mfc2   $2,     $1                 \n"     /* $2 <= MMU_MODE   */
    370361            "andi   $3,     $2,        0xb     \n"
     
    376367
    377368            "mtc2   $2,     $1                 \n"     /* restore MMU_MODE */
    378 
    379             "li     $3,     0x00000001         \n"
    380             "mfc0   $2,     $12                \n"
    381             "or     $3,     $3,        $2      \n"
    382             "mtc0   $3,     $12                \n"     /* IRQ enabled      */
    383369            :
    384370            : "r" (value), "r" (lsb), "r" (msb)
    385371            : "$2", "$3");
     372    _it_restore(&sr);
    386373}
    387374
  • soft/giet_vm/giet_kernel/giet.s

    r267 r301  
    5656_sys_handler:
    5757    addiu   $29,    $29,    -24     /* 2 slots for SR&EPC, 4 slots for args passing */
    58     mfc0    $26,    $12             /* load SR */
    59     sw      $26,    16($29)         /* save it in the stack */
    6058    mfc0    $27,    $14             /* load EPC */
    6159    addiu   $27,    $27,    4       /* increment EPC for return address */
     
    7371    mtc0    $26,    $12             /* interrupt enabled */
    7472    jalr    $3                      /* jump to the proper syscall */
    75     mtc0    $0,     $12             /* interrupt disbled */
    7673
    77     lw      $26,    16($29)         /* load SR from stack */
    78     mtc0    $26,    $12             /* restore SR */
     74    mfc0    $26,    $12             /* load SR */
     75    ori     $26,    $26,    0x2     /* set EXL bit */
     76    mtc0    $26,    $12
     77
    7978    lw      $26,    20($29)         /* load EPC from stack */
    8079    mtc0    $26,    $14             /* restore EPC */
    81     addiu   $29,    $29,     24     /* restore stack pointer */
     80    addiu   $29,    $29,    24      /* restore stack pointer */
    8281    eret                            /* exit GIET */
    8382
  • soft/giet_vm/giet_kernel/switch.s

    r263 r301  
    22* This function receives two arguments that are the current task context
    33* (virtual) addresses and the next task context (virtual) address.
     4*
     5* This function should be called in a critical section
    46*
    57* TODO (AG) Il semble possible de limiter le nombre de registres à sauver:
     
    1820
    1921_task_switch:
    20 
    21     /* enter critical section */
    22     li      $2,     0xFFFFFFFE 
    23     mfc0    $3,     $12       
    24     and     $3,     $3, $2   
    25     mtc0    $3,     $12   
    2622
    2723    /* save _current task context */
     
    123119    mtc2    $26,    $0          /* restore PTPR */
    124120
    125     /* exit critical section */
    126     li      $2,     0x00000001 
    127     mfc0    $3,     $12       
    128     or      $3,     $3, $2   
    129     mtc0    $3,     $12   
    130 
    131121    /* returns to caller */
    132122    jr      $31
  • soft/giet_vm/giet_kernel/sys_handler.c

    r294 r301  
    5555    &_sys_ukn,             /* 0x17 */
    5656    &_sys_ukn,             /* 0x18 */   
    57     &_ctx_switch,          /* 0x19 */
     57    &_context_switch,      /* 0x19 */
    5858    &_vobj_get_vbase,      /* 0x1A */
    5959    &_sys_ukn,             /* 0x1B */
Note: See TracChangeset for help on using the changeset viewer.