Snooping
Qu'est ce c'est ?
Snooping est une caractéristique de WHDLoad qui enregistre tous les accès CPU
aux registres spécialisés (Custom).
Si Snoop est activé, tous les accès invalides aux
registres Custom créeront un Access Fault et le programme installé sera terminé.
Les accès invalides sont:
- accès aux registres non-existants
- accès en lecture aux registres Write Only
- accès en écriture aux registres Read Only
- accès aux registres Early Read
- accès par un octet en écriture (à l'exception de bltcon0 et aud*vol+1)
Les registres Strobe peuvent être lus et écrits. La validité des registres Custom
varient en fonction des Amigas OCS (Old ChipSet - A500, A1000, ancien A2000),
ECS (Enhanced ChipSet - A600, récent A2000, A3000) et AGA (Advanced Graphics - A1200, A4000).
Ceci est utile pour localiser les bugs dans les anciens programmes qui causent des accès
indéfinis aux nouveaux registres AGA.
Comment ça marche
Si Snoop est activé, WHDLoad marque les adresses des registres Custom comme valide
dans l'arbre de traduction MMU. Donc chaque accès à un registre Custom aura comme
résultat un Access Fault exception. Cette exception sera prise en main par WHDLoad.
D'abord, il vérifie que l'accès est valide. Si l'accès est invalide le programme
sera terminé. Si l'accès est valide et que c'est un accès en lecture, il sera
émulé et l'exécution du programme continuera. Si c'est un accès en écriture,
WHDLoad sauvegarde la valeur qui devait être écrite avant l'émulation.
Le programme exécuté sera ralenti car les exceptions et l'emulation prennent
le dessus. Le ralentissement dépend du type de CPU, du type de mémoire chip
(16/32 Bit), de l'alignement du pointeur de la pile, si la mémoire chip est
32 Bit (LongWord aligné ou non). Cela diffère aussi suivant le type d'accès
(Byte/Word/LongWord, Read/Write). Sur le 68030, l'Ecriture est plus rapide
que la Lecture (car pour la lecture, le stackframe est de 92 octets, pour
l'écriture, 32 octets), pour le 68060, la Lecture est plus rapide parce que
l'émulation pour l'écriture est plus complexe.
Le mode Fast Snoop
L'option Snoop/S active le Snooping rapide. Les accès à la lecture ne seront
pas vérifiés. Aucune verification spéciale ne sera éffectuée. Ce mode est utile
seulement pour recueillir les informations contenues dans les registres
custom, ex. pour capturer l'image de l'écran en utilisant SP.
Le scanner de la Copper-Liste
Depuis la version 13 de WHDLoad, les copper-listes sont aussi vérifiées.
Le scanner sera activé en accès écriture aux registres coplc, si le
copper dma est activé, ou quand le programme installé active le copper dma
en inscrivant dans le registre dmacon. Le scanner suit la copper-liste
et valide toutes les instructions Move en appliquant les restrictions causées par
l'option Snoop (OCS/ECS/AGA). Les instructions Skip et Wait (sauf CEND) seront
ignorées. Quand il trouve des entrées invalides, le programme installé sera
terminé. Le scanner suit les branches (copjmp), détecte les boucles et
vérifie jusqu'à 16 sous-listes. Les moves dans les copper-listes seront sauvegardés
dans le fichier interne des registres Custom créé par WHDLoad quand il sera
quitté. Le scanner est inactif dans le mode Fast Snoop.
Vérification de la priorité du Blitter
Quand l'option ChkBltHogs/S est activé, WHDLoad vérifiera que le programme installé
n'active pas le bit BltHog en inscrivant dans le registre dmacon.
La priorité du Blitter peut causer des problèmes sur certain matériel
en conjonction avec de large opérations Blitter (tous canaux utilisés).
Vérification de la taille du Blitter
Quand l'option ChkBltSize/S est activé, WHDLoad vérifiera que le travail
du Blitter n'accède pas à la mémoire en dehors de la BaseMem. Pour les accès
en écriture à bltsize or bltsizh, il vérifiera si le mode ligne
est activé dans bltcon1. Si le mode ligne est activé, il annulera
la vérification de la taille. Autrement WHDload calculera le premier et le dernier
mot d'accès pour chaque canal DMA activé. Si une adresse est en dehors de la BaseMem,
le programme sera terminé par un message. Le calcul a été conçu pour fonctionner avec
tous les modes (montant/descandant, modulos positive/négative, modulos/pointeur
impairs).
Souvenez-vous que le mode "line drawing" ne sera pas vérifié et que tous
les registres du blitter peuvent aussi être inscrits par le copper, si
copcon est activé.
Vérification du Blitter Wait
Quand l'option ChkBltWait/S est activé, WHDLoad utilisera une instruction trace
pour vérifier que le programme installé attend correctement que le blitter ait
fini son travail avant d'en commencer un autre. Une variable interne sera utilisée,
elle représente l'état de marche du Blitter. La variable est activée s'il se
produit un accès en écriture dans bltsize ou bltsizh et
effacée quand il y a un accès en lecture dans dmaconr. A chaque écriture
dans le registre du Blitter, la valeur de la variable interne est vérifiée,
si l'état est un travail du Blitter, le programme installé sera terminé et
WHDLoad rapportera la ligne de code du dernier travail du Blitter et l'accès actuel.
Il y a 2 goulets majeurs. Le premier est l'utilisation du Blitter via
le copper ne sera pas vérifiée et le second est l'emploi des interruptions
du Blitter qui provoquera des erreurs superflues dans la routine de vérification.
Futur
L'implémentation des caractéristiques comme le Freezing et
l'Iconifing est en projet.
Pour cela, Snoop est primordial. Par conséquent, il est recommandé
aux auteurs d'installs de vérifier leurs installs avec l'option Snoop pour garantir
une compatibilité future.
Ce que vous avez besoin
Un MMU est nécessaire pour utiliser les options Snoop. Ainsi WHDLoad doit
utiliser le MMU, par conséquent l'option MMU/S doit être activée sur les machines à base 68030.
Limitations
- 68020 + 68851
- Ce hardware n'est pas supporté actuellement
- 68030
- 68040
- Ce hardware n'est pas supporté actuellement
- 68060
- L'instruction movem peut accéder à un registre invalide sans créer
un Access Fault exception, ceci est possible car seulement le 1er accès sera
vérifié.
- Move <Cia/Custom register>,sr ne sera pas exécuté correctement,
s'il veut changer l'octet superviseur du registre d'état, l'octet restera
inchangé.
- N'importe quel(ssp)+ ou -(ssp) en conjonction avec un accès en
écriture à un registre Cia ou Custom ne peut pas être pris en main à cause des
problèmes de stackframe. WHDLoad détectera ce genre d'accès et quittera avec
un message approprié.
- Les instructions ne doivent pas accéder à plus d'un registre snoopé à la
fois, comme cette instruction move.b ($dff006),($bfd800) ne peut pas
être prise en main. Si ce genre de code apparaît, WHDLoad affichera une requête
d'Access Fault.