V. Gestion des exceptions▲
V-A. Mécanisme général▲
Il existe 256 exceptions possibles sur les ColdFire, dont une dizaine sont réservées à un usage interne. Qu'il s'agisse d'interruptions réservées à des périphériques ou de mécanismes d'erreur, leur déroulement est toujours semblable.
Un départ en exception ne se produit jamais en cours d'exécution d'une instruction. Le processeur finit toujours le traitement en cours avant de commuter le contexte.
- Le registre d'état est sauvegardé dans un registre interne. Il est en suite modifié. Le bit T (mode Trace) est forcé à 0, le bit S est forcé à 1. Une exception se déroule donc toujours en mode superviseur. Le masque d'interruption est relevé au niveau de la demande. Tout interruption de niveau inférieur ou égal sera donc masquée.
- Un numéro de vecteur sur 8 bits est associé à la demande.
- Le Compteur Programme (l'adresse de retour) ainsi que le registre d'état précédemment sauvegardé, sont poussés dans la pile qui est automatiquement alignée
- Le numéro de vecteur est multiplié par quatre et ajouté au VBR. C'est l'adresse du vecteur. Celui-ci est récupéré et poussé dans le PC.
Les interruptions de niveau 7 ne sont pas masquables.
V-B. Reset▲
Reset est une interruption non masquable provoquée par la mise en état bas de RSTI ou l'instruction STOP.
Quoique son nom ne le laisse pas penser, reset est l'interruption d'initialisation du processeur.
Toute activité est interrompue. Il n'y a aucune sauvegarde du contexte. Le processeur passe en mode superviseur. Le VBR est forcé à 0. Le vecteur 0 est transféré dans A7 ; le vecteur dans PC. On imagine donc bien que les adresses basses (depuis 0) seront définies en ROM et contiendront le code d'initialisation.
Lorsqu'un processeur est initialisé, les registres et la mémoire ne contiennent pas rien mais n'importe quoi !
V-C. Les erreurs▲
Vecteur | Nom | Description |
---|---|---|
2 | Erreur d'accès | Accès à une zone mémoire protégée |
3 | Erreur d'adresse | Le processeur tente d'accéder à une instruction sur une adresse impaire |
4 | Instruction interdite | Le processeur ne connaît pas l'opcode qu'on essaye de lui refiler |
5 | Division par zéro | |
8 | Violation de privilèges | le processeur est en mode utilisateur et tente d'exécuter une instruction privilégiée. |
14 | Erreur format | Se produit lorsqu'on a malencontreusement bidouillé la pile et que l'instruction RTE ne retrouve plus ses petits. |
Bien souvent on se dit : "division par zéro ! Moi jamais ..."
Et puis un jour la machine plante :-\
Tous les vecteurs d'erreur doivent être initialisés.
V-D. Les périphériques▲
Le gros des exceptions correspond à ce qu'on appelle des interruptions. Cela permet de dialoguer avec les périphériques sans perdre de temps dans des boucles d'attente et autres scans approximatifs.
Vecteur | Nom | Description |
---|---|---|
25 à 31 | Auto vecteurs | Certains périphériques anciens ne peuvent fournir leur numéro de vecteur. Ces interruptions leurs sont réservées. |
64 à 255 | Vecteurs interruptions utilisateur | Pour les périphériques à même de fournir leur numéro de vecteur. |
15 | Périphérique non initialisé | 15 est la valeur par défaut forcée par l'instruction RESET dans le registre des périphériques donnant le vecteur. Utile pour l'initialisation. |
24 | Interruption parasite | Si un périphérique ne fournit pas son numéro de vecteur. |
Nous n'irons pas plus loin sur les périphériques Ce n'est pas notre propos ici.
V-E. Les exceptions programmables▲
Il est utile de pouvoir déclencher des départs en interruption, pour une raison ou pour une autre. C'est par exemple le seul moyen de revenir en mode superviseur.
Vecteur | Nom | Description |
---|---|---|
32 à 47 | Vecteur d'instruction TRAP | Voir l'exemple ci-dessous |
10 et 11 | Emulateur de ligne 1010 et émulateur de ligne 1011 | Permet d'émuler des instructions qui n'existent pas. L'opcode doit commencer par 1010 ou 1011. Permet par exemple la compatibilité avec le code M68K. Très lent. |
Pour illustrer notre propos, regardons l'utilisation de l'instruction TRAP pour revenir
en mode superviseur lorsqu'on est utilisateur et inversement.
org $20000
* Module d'initatlisation du VBR *
debut: nop
;On va recopier la table des vecteurs à l'adresse 0x40000
clr.l D0
move.b #255,D0 ;On place la valeur 255 dans D0
movea.l #$5000,A0 ;On place l'origine de la nouvelle table dans D1
boucle: move.l D0,D1 ;Copions D0 dans D1
lsl.l #$2,D1 ;On multiplie D1 par 4
movea.l D1,A1 ;On obtient l'adresse du vecteur que l'on place dans A1
move.l (A1),D2 ;On recopie le vecteur dans D2
move.l D2,(A0,D1) ;Puis en mémoire dans la nouvelle table
subq.l #1,D0 ;On décremante le numéro de vecteur
fin_b: bpl boucle ; Tant que ce n'est pas négatif, on continue.
;On veut maintenant que le vecteur 32 soit la case mémoire 0x5080 point vers l'adresse 0x30000
move.l #$30000,D0
move.l D0,$5080
;Le VBR doit pointer vers 5000
move.l #$5000,D0
movec.l D0,VBR
fin: nop
*********************************************************************************
* Programme de test *
test: trap #0
bsr test
**********************************************************************************
* On crée le programme associé à l'instruction trap #0 *
org $30000
* Il faut manipuler les valeurs enpilées. On sais qu'un départ en exception empile ceci :
* 16 bits de controles
* 16 bits du SR
* 32 bits du PC
mod_t: bchg.b #5,(2,SP) ; trifouillons la pile
rte ; obligatoire pour revenir d'exception