Pour chacune de ces exceptions 8, il convient d’ajouter à la partie opérative un état, l’ayant détectée,
durant lequel on enregistre la cause de cette exception dans un registre spécifique du coprocesseur 0 : le
registre de cause(CR). Ces causes sont codées de la manière suivante :
CR6···2Cause de l’exception
0 interruption externe
4 erreur d’adressage sur une lecture (instruction, mot, demi-mot ou octet)
5 erreur d’adressage sur une écriture
8 exception syscall
9 exception break
A instruction non définie
C dépassement de capacité arithmétique
Le départ en exception est déclenché par le coprocesseur si CR6···2est non nul et si les interruptions
ne sont pas inhibées par le registre SR (le même que celui utilisé pour l’interruption simple).
Les départs en exception (sur une nouvelle entrée ERQ pour la PC) et en interruption (sur l’entrée IT)
ne diffèrent que par la valeur à stocker dans EPC. On a vu qu’une interruption va y mettre l’adresse de
l’instruction suivante, tandis qu’une exception va conserver l’adresse de l’instruction fautive. Ayant déjà
réalisé PC+4 dans l’état décode, il faut donc stocker PC-4 dans EPC pour traiter correctement une excep-
tion. Noter que dans les deux cas, le traitant d’interruption est situé au même endroit. C’est donc à lui
qu’incombe la tâche de trouver la source de l’interruption ou de l’exception et de la traiter correctement.
Détail des registres
Contrairement à ce qu’on a vu dans le processeur simple, EPC et SR (Status Register) sont comme CR
des registres du coprocesseur 0.
Pour accéder à ces registres et écrire un traitant d’interruption plus efficace, le programmeur peut
utiliser les instructions mtc0 et mfc0. Ces registres y sont désignés par leurs indexes dans le coprocesseur
0 soit $12 pour le registre de status SR, $13 pour le registre de cause CR et $14 pour le registre EPC.
Les registres SR et CR sont organisés comme suit :
Registre de status :
31 16 15 8 5 4 3 2 1 0
masque KU IE KU IE KU IE
ligne vieux précédent courant
Registre de cause :
31 16 15 8 6 2
lignes code
d’interruption d’exception
Pour SR, IE à 1 signifie que les interruptions sont activées et KU indique si on est en mode kernel (0) ou
User (1). A priori, vous pouvez ignorer le bit KU. Ces deux bits doivent être sauvegardés lors d’un départ
en interruption ou en exception. Pour le faire, on décale SR de 2 vers la gauche sur les 6 premiers bits :
SR5···0⇐SR3···0||02. Au retour en interruption, l’instruction rfe se charge de restaurer le registre SR.
Si IE=1, le masque d’interruption dans SR15...8permet de masquer/démasquer les 8 lignes d’interrup-
tion (CR15...8) individuellement. L’entrée IT de la partie contrôle est alors généré par un OR8 issu des ET
bit à bit entre SR et CR. A ce stade, vous devez être en mesure de gérer plusieurs sources d’interruptions
matérielles ininterruptible.
Pour permettre à une interruption d’en interrompre une autre, il faut fixer des priorités à vos lignes.
Généralement la ligne d’interruption la plus à gauche a la plus forte priorité. Ainsi votre traitant d’in-
terruption, après avoir identifié la source de l’interruption, va pouvoir autoriser les interruptions plus
prioritaires avant le retour d’interruption. L’architecture décrite ne supporterait pas plus de 2 instructions
sans perdre les informations de SR. Pour être capable, de gérer plus, il faut mettre en place une pile pour
les exceptions où EPC et CR seraient stockés pour chaque appel. A vous d’imaginer cela.
8. Faire en priorité l’overflow et les instructions non définies.8