Changes between Version 25 and Version 26 of Archi-1-TP11


Ignore:
Timestamp:
Dec 11, 2021, 11:08:27 AM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Archi-1-TP11

    v25 v26  
    169169''
    170170}}}
    171 1. Que signifie acquitter une IRQ et qui le demande à qui ? Comment demande-t-on l'acquittement ?
    172 {{{#!protected ------------------------------------------------------------------------------------
    173 ''
    174   * Cela signifie demander au contrôleur de périphérique concerné de baisser (désactiver) le signal IRQ. C'est l'ISR qui fait cette demande en accédant aux registres du contrôleur de périphérique. Chaque périphérique a sa propre méthode d'acquittement (il faut lire la documentation), pour le TTY, l'acquittement est fait en lisant le registre TTY_READ, pour le TIMER, l'acquittement est fait en écrivant n'importe quelle valeur dans le registre TIMER_RSTIRQ.
     1711. Que signifie acquitter une IRQ ?
     172{{{#!protected ------------------------------------------------------------------------------------
     173''
     174  * Cela signifie demander au contrôleur de périphérique concerné de baisser (désactiver) le signal IRQ.
     175''
     176}}}
     1771. Qui demande l'acquittement à qui ?
     178{{{#!protected ------------------------------------------------------------------------------------
     179''
     180  * C'est l'ISR qui fait cette demande en accédant aux registres du contrôleur de périphérique. -.
     181''
     182}}}
     1831. Comment demande-t-on l'acquittement ?
     184{{{#!protected ------------------------------------------------------------------------------------
     185''
     186  * poliment :-)
     187  * Chaque périphérique a sa propre méthode d'acquittement, il faut lire la documentation de chaque composant pour le savoir. Pour le TTY, l'acquittement est fait en lisant le registre TTY_READ, pour le TIMER, l'acquittement est fait en écrivant n'importe quelle valeur dans le registre TIMER_RSTIRQ.
    175188''
    176189}}}
     
    190203{{{#!protected ------------------------------------------------------------------------------------
    191204''
    192   * Il y a `0`.
     205  * Il y a `0`, et pour rappel `c0_cause.XCODE = 8` pour un syscall, les autres valeurs sont des numéros d'exception (division par 0, violation de privilège, etc.)
    193206''
    194207}}}
     
    196209{{{#!protected ------------------------------------------------------------------------------------
    197210''
    198   * C'est l'adresse de retour dans le programme interrompu.
     211  * C'est l'adresse de retour dans le programme interrompu. Quand le processeur reçoit une IRQ alors qu'il est en train d'exécuter l'instruction n°`i` à l'adresse `PC` (Program Counter), alors le MIPS termine l'exécution de l'instruction `i`, puis il enregistre `PC+4` (adresse de l'instruction n°`i+1`) dans `c0_EPC` et il saute à l'adresse `0x80000180`.
    199212''
    200213}}}
     
    202215{{{#!protected ------------------------------------------------------------------------------------
    203216''
    204   * Le bit `EXL` passe à 1 et la conséquence est que le MIPS passe en mode kernel, toutes les sont interruptions masquées.
     217  * Le bit `EXL` passe à 1 et la conséquence est que le MIPS passe en mode kernel, toutes les sont interruptions masquées quelque-soit les valeurs de `c0_STATUS.UM` et `c0_STATUS.IE` (respectivement le mode d'exécution et le masque d'interruption général).
    205218''
    206219}}}
     
    211224''
    212225}}}
    213 1. À l'entrée dans le noyau, `kentry` analyse le champ `XCODE` du registre de `c0_cause` et si c'est `0` alors il saut au code donné ci-après (ce n'est pas exactement le code que vous pouvez voir dans les fichiers sources pour que ce soit plus facile à comprendre).
     2261. À l'entrée dans le noyau, `kentry` analyse le champ `XCODE` du registre de `c0_cause` et si c'est `0` alors il saute au code donné ci-après (ce n'est pas exactement le code que vous pouvez voir dans les fichiers sources pour que ce soit plus facile à comprendre).
    214227{{{#!c
    215228cause_irq:
     
    223236    sw      $1,     1*4($29)            // save all temporary registers including HI and LO
    224237    sw      $2,     2*4($29)           
    225     [etc.]                             
     238    [etc. pour les autres sw de registres temporaires]                             
    226239
    227240    jal     irq_handler                 // call the irq handler fontion écrite en C
     
    229242    lw      $1,     1*4($29)            // restore all temporary registers including HI and LO
    230243    lw      $2,     2*4($29)
    231     [etc.]   
     244    [etc. pour les autres lw de registres temporaires]   
    232245    lw      $26,    20*4($29)           // get old SR
    233246    lw      $27,    21*4($29)           // get return address of syscall