Changes between Version 12 and Version 13 of Archi-1-TP11


Ignore:
Timestamp:
Dec 9, 2021, 4:17:13 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP11

    v12 v13  
    190190{{{#!c
    191191cause_irq:
    192     addiu   $29,    $29,    -21*4       // 21 registers to save (18 temp regs + HI + LO + $31)
    193     sw      $31,    20*4($29)           // $31 because, it is lost by jal irq_handler
     192    addiu   $29,    $29,    -23*4       // 23 registers to save (18 tmp regs+HI+LO+$31+EPC+SR)
     193    mfc0    $27,    $14                 // $27 <- EPC (addr of syscall instruction)
     194    mfc0    $26,    $12                 // $26 <- SR (status register)
     195    sw      $31,    22*4($29)           // $31 because, it is lost by jal irq_handler
     196    sw      $27,    21*4($29)           // save EPC (return address of IRQ)
     197    sw      $26,    20*4($29)           // save SR (status register)
     198    mtc0    $0,     $12                 // SR <- kernel-mode without INT (UM=0 ERL=0 EXL=0 IE=0)
    194199    sw      $1,     1*4($29)            // save all temporary registers including HI and LO
    195200    sw      $2,     2*4($29)           
     
    200205    lw      $1,     1*4($29)            // restore all temporary registers including HI and LO
    201206    lw      $2,     2*4($29)
    202     [etc.]                             
    203     lw      $31,    20*4($29)           // restore also $31
    204     addiu   $29,    $29, 21*4           // restore the stack pointer
     207    [etc.]   
     208    lw      $26,    20*4($29)           // get old SR
     209    lw      $27,    21*4($29)           // get return address of syscall
     210    lw      $31,    22*4($29)           // restore $31
     211    mtc0    $26,    $12                 // restore SR
     212    mtc0    $27,    $14                 // restore EPC
     213    addiu   $29,    $29, 23*4           // restore the stack pointer
    205214    eret                                // jr C0_EPC AND C0_SR.EXL <= 0
    206215}}}
    207  Pourquoi, ne sauvez que les registres temporaires ?
    208 {{{#!protected ------------------------------------------------------------------------------------
    209 ''
    210  * On doit sauver les registres temporaires parce que l'IRQ peut interrompre le programme n'importe quand et qu'il faudra revenir à l'application interrompue dans le même état donc sans perte d'information dans les registres. On ne sauve pas les registres persistants parce que ce sera à la fonction `irq_handler()` de s'en charger, si c'est nécessaire.
     216 Pourquoi, ne sauver que les registres temporaires ?
     217{{{#!protected ------------------------------------------------------------------------------------
     218''
     219 * On doit sauver les registres temporaires parce que l'IRQ peut interrompre le programme n'importe quand et qu'il faudra revenir à l'application interrompue dans le même état donc sans perte d'information dans les registres. On ne sauve pas les registres persistants parce que ce sera fait dans la fonction `irq_handler()`, si c'est nécessaire.
    211220''
    212221}}}