Snooping
Τι είναι
Το Snooping είναι ένα χαρακτηριστικό του WHDLoad που πραγματοποιεί ελέγχους και καταγραφές
προσβάσεων στους καταχωρητές Custom και Cia. Αν η Snoop έχει
ενεργοποιηθεί όλες οι άκυρες προσβάσεις θα δημιουργήσουν Access
Fault και το εγκατεστημένο πρόγραμμα θα τερματιστεί. Τέτοιες προσβάσεις είναι:
- προσβάσεις σε ανύπαρκτους καταχωρητές
- προσβάσης ανάγνωσης σε καταχωρητές Μόνο Εγγραφής
- προσβάσεις εγγραφής σε καταχωρητές Μόνο Ανάγνωσης
- προσβάσεις σε καταχωρητές Early Read
- προσβάσεις εγγραφής byte (εκτός από bltcon0l και aud*vol+1)
Οι καταχωρητές Strobe μπορούν να διαβαστούν ή να γραφούν. Το σετ των έγκυρων καταχωρητών Custom
μπορεί να διαφέρει μεταξύ του OCS (Old ChipSet - A500, A1000, παλιά A2000), ECS (Enhanced ChipSet
- A600, νέα A2000, A3000) και AGA (Advanced Graphics - A1200, A4000). Αυτό είναι
χρήσιμο ειδικά για τον εντοπισμό bugs σε παλιά προγράμματα που προκαλούνται από απροσδιόριστες
προσβάσεις σε νέους καταχωρητές AGA.
Πως λειτουργεί
Αν ενεργοποιηθεί το Snoop, το WHDLoad σημειώνει τις διευθύνσεις των καταχωρητών custom και cia ως
άκυρες στο δέντρο μετάφρασης του MMU. Λόγω αυτού, κάθε πρόσβαση σε καταχωρητή custom ή cia
θα έχει σαν αποτέλεσμα μία εξαίρεση Access Fault. Ο χειριστής εξαιρέσεων στο
WHDLoad χειρίζεται αυτή την εξαίρεση. Πρώτα ελέγχει αν η πρόσβαση είναι έγκυρη. Αν η
πρόσβαση είναι άκυρη το πρόγραμμα θα τερματιστεί. Αν η πρόσβαση είναι έγκυρη και
πρόκειται για λειτουργία ανάγνωσης θα εξομοιωθεί και η εκτέλεση του προγράμματος
συνεχίζεται. Αν πρόκειται για λειτουργία εγγραφής το WHDload επιπλέον θα αποθηκεύσει την τιμή
σε μία εσωτερική καταχώρηση.
Λόγω της επιβάρυνσης στη διαδικασία εξαίρεσης και εξομοίωσης
η ταχύτητα εκτέλεσης του προγράμματος θα καθυστερήσει. Πόσο θα καθυστερήσει εξαρτάται από το CPU,
το τύπο μνήμης Chip (16/32-bit) και το Stackpointer alignment αν η μνήμη Chip
είναι 32-bit (LongWord aligned ή όχι). Διαφέρει επίσης ανάλογα το τύπο πρόσβασης
(Byte/Word/LongWord, Read/Write). Στον 68030 οι Εγγραφές είναι γρηγορότερες από
τις Αναγνώσεις (γιατί στις αναγνώσεις το stackframe είναι 92 bytes στις εγγραφές 32 bytes), στον
68060 οι Αναγνώσεις είναι γρηγορότερες γιατί η εξομοίωση για τις Εγγραφές είναι
ποιό πολύπλοκη.
Fast Snoop Mode
Η επιλογή Snoop/S ενεργοποιεί το γρήγορο snooping. Οι προσβάσεις Ανάγνωσης
δεν θα ελεγχθούν. Δεν πραγματοποιούνται ειδικοί έλεγχοι. Αυτό το mode ίσως είναι χρήσιμο για
να πάρετε μόνο δεδομένα από τους καταχωρητές custom, π.χ. για αποθήκευση μίας εικόνας χρησιμοποιώντας το SP.
Copper List Scanner
Από την έκδοση 13 του WHDLoad θα ελεχθούν επίσης και copperlists. Ο
scanner θα ενεργοποιηθεί σε εγγραφές στους καταχωρητές coplc αν το copper
dma είναι ενεργό, ή όταν το εγκατεστημένο πρόγραμμα ενεργοποιεί το coppper dma
γράφοντας το καταχωρητή dmacon. Ο scanner ακολουθεί τη copperlist και
επιβεβαιώνει όλες τις εντολές Move εφαρμόζοντας τους περιορισμούς που ορίστηκαν
από την επιλογή Snoop (OCS/ECS/AGA). Οι εντολές Skip και Wait (εκτός CEND) θα αγνοηθούν. Όταν
βρει άκυρες καταχωρήσεις το εγκατεστημένο πρόγραμμα θα τερματιστεί. Ο scanner
ακολουθεί τα branches (copjmp), ανιχνεύει loops και ελέγχει μέχρι 16 υπο-λίστες. Οι
εντολές Move στα copperlists θα αποθηκευτούν στο εσωτερικό αρχείο καταχωρητή custom
που γίνεται dump στην έξοδο του WHDLoad. Ο scanner δεν είναι ενεργός στο Fast Snoop
Mode.
Blitter Priority Check
Όταν ενεργοποιηθεί η επιλογή ChkBltHog/S το WHDLoad θα ελέγξει να μην ενεργοποιήσει
το εγκατεστημένο πρόγραμμα το BltHog bit γράφοντας στο καταχωρητή dmacon.
Το Blitter Priority μπορεί να προκαλέσει προβλήματα σε μερικούς συνδυασμούς hardware σε
σε συνδυασμό με μεγάλες λειτουργίες blitter (να χρησιμοποιούνται όλα τα κανάλια).
Blitter Size Check
Όταν η επιλογή ChkBltSize/S ενεργοποιηθεί το WHDLoad θα ελέγξει να μην προσπελάσουν
μνήμη έξω από τη περιοχή BaseMem οι εργασίες του Blitter. Σε προσβάσεις εγγραφής στα
bltsize ή bltsizh ελέγχει αν είναι ενεργοποιημένο το line mode
στο bltcon1. Αν το line mode είναι ενεργό θα ακυρώσει τον έλεγχο μεγέθους.
Διαφορετικά το WHDLoad θα υπολογίσει την πρώτη και την τελευταία word που έχει πρόσβαση
για κάθε ενεργοποιημένο κανάλι DMA. Αν μια διεύθυνση είναι έξω από τη περιοχή BaseMem το
πρόγραμμα θα τερματιστεί με έναν επιλογέα. Ο υπολογισμός είναι σχεδιασμένος
να λειτουργήσει με όλα τα modes (ascending/descending, positive/negativ modulos, odd
modulos/pointers).
Θυμιθείτε ότι το line drawing mode δεν θα επιβεβαιωθεί και όλοι οι καταχωρητές του blitter
μπορούν επίσης να γραφούν από τον copper εάν οριστεί η copcon.
Blitter Wait Check
Όταν ενεργοποιηθεί η επιλογή ChkBltWait/S το WHDLoad θα χρησιμοποιήσει μία ανίχνευση εντολών
για επιβεβαίωση ότι το εγκατεστημένο πρόγραμμα περιμένει κανονικά το blitter να
τελειώσει πριν ξεκινήσει μία νέα εργασία του blitter. Χρησιμοποιεί μία εσωτερκή μεταβλητή
που αντιπροσωπεύει την τρέχουσα κατάσταση του blitter. Η μεταβλητή ορίζεται όταν μία
πρόσβαση εγγραφής συμβαίνει στο bltsize ή bltsizh και καθαρίζει όταν
πραγματοποιείται πρόσβαση ανάγνωσης στο καταχωρητή dmaconr. Σε κάθε
εγγραφή σε καταχωρητή του blitter η τιμή της εσωτερικής μεταβλητής ελέγχεται,
αν δείχνει μία τρέχουσα εργασία του blitter το εγκατεστημένο πρόγραμμα τερματίζεται
και το WHDLoad θα αναφέρει το PC της τελευταίας εργασίας του blitter που ξεκίνησε
μαζί με την τρέχουσα πρόσβαση.
Υπάρχουν δύο σοβαρές επιβαρύνσεις με αυτό το χαρακτηριστικό. Πρώτον η χρήση του blitter
μέσω του copper δεν ελέγχονται και δεύτερον η χρήση των blitter interrupts
θα προκαλέσει τη ρουτίνα ελέγχου να αναφέρει σφάλματα που δεν θα έπρεπε.
Μέλλον
Σχεδιάζεται να υλοποιηθούν χαρακτηριστικά όπως Freezing και Iconifing.
Για αυτά, το Snoop είναι απαραίτητη προϋπόθεση. Οπότε συνίσταται
οι συγγραφείς εγκαταστάσεων να ελέγχουν τις εγκαταστάσεις τους με το Snoop για να
σιγουρέψουν μελλοντική συμβατότητα.
Απαιτήσεις
Ένα MMU απαιτείται για το χαρακτηριστικό Snoop. Επίσης το WHDLoad πρέπει να χρησιμοποιεί ο MMU, οπότε η MMU/S πρέπει να έχει ενεργοποιηθεί σε μηχανήματα με 68030.
Περιορισμοί
- 68020 + 68851
- αυτό το hardware δεν υποστηρίζεται προς το παρόν
- 68030
- 68040
- αυτό το hardware δεν υποστηρίζεται προς το παρόν
- 68060
- Η εντολή movem μπορεί να προσπελάσει έναν άκυρο καταχωρητή χωρίς
να δημιουργήσει μία εξαίρεση Access Fault, αυτό είναι δυνατόν γιατί μόνο η πρώτη
προσπέλαση θα επιβεβαιωθεί ότι ταιριάζει με έγκυρο καταχωρητή
- Η move <Cia/Custom register>,sr θα εκτελεστεί λανθασμένα
αν αλλάζει το κομμάτι supervisor του καταχωρητή status, το κομμάτι
supervisor θα παραμείνει απαράλλακτο
- κάθε (ssp)+ ή -(ssp) σε συνδυασμό με πρόσβαση
εγγραφής σε ένα καταχωρητή Cia ή Custom δεν μπορεί να ελεχθεί λόγω προβλημάτων stackframe,
το WHDLoad θα εντοπίσει τέτοιες προσβάσεις και θα τερματιστεί με ένα
κατάλληλο επιλογέα
- οι εντολές δεν πρέπει να έχουν προσπέλαση σε πάνω από έναν snooped καταχωρητή κάθε φορά,
αυτό σημαίνει ότι κώδικας όπως move.b ($dff006),($bfd800) δεν μπορεί να ελεγχθεί,
αν προκύψει τέτοιος κώδικας το WHDLoad θα εμφανίσει έναν επιλογέα Access Fault