[Main]
[Docs]
[Installs]
[Search]
[Team]
[Guestbook]
[Links]
Snooping (Pátranie)
Čo to vlastne je
Snooping (pátranie) je vlastnosť programu
WHDLoad, ktorá je schopná kontrolovať a zaznamenávať prístupy ku custom
a cia registrom. Ak je Snoop aktivovaný,
všetky nesprávne prístupy vytvoria Access Fault a nainštalovaný program bude
ukončený. Nesprávne prístupy sú:
- prístupy k neexistujúcim registrom
- read prístupy k Write Only registrom
- write prístupy k Read Only registrom
- prístup do registrov typu Early Read
- byte write prístupy (okrem bltcon0l a aud*vol+1)
Strobe registre môžu byť čítané alebo
zapisované. Custom registre sa odlišujú - OCS (Old ChipSet - A500, A1000, stará
A2000), ECS (Enhanced ChipSet - A600, nová A2000, A3000) a AGA (Advanced
Graphics - A1200, A4000). Takže sa táto funkcia hodí hlavne pre hľadanie chýb v
starých programoch, ktoré sú spôsobené zlým prístupom k AGA registrom.
Ako to pracuje
Ak je snooping zapnutý, WHDLoad označí adresy
custom a cia registrov v MMU translation tree ako neplatné. Vďaka tomu
každý prístup do custom a cia registrov vyústi do Access Fault výnimky.
WHDload túto výnimku zachytí a môže tak zistiť, či je prístup správny
alebo nie (pri nesprávnom prístupe je program ukončený). Zachytený správny
prístup typu read bude emulovaný a program bude pokračovať, v prípade
platného prístupu typu write, WHDLoad si naviac zapíše hodnotu do vnútorného
zásobníku.
Kvôli preťaženiu výnimiek a emulačnej sekvencie sa chod programu značne
spomalí. Miera spomalenia záleží na CPU, na type Chip RAM (16/32-bit) a na
Stackpointer aligment, ak je Chip RAM 32-bit (buď LongWord aligned alebo nie).
Líši sa to i podľa druhu prístupu (Byte/Word/LongWord, Read/Write). Na 68030 sú
zápisy rýchlejšie než čítanie (pretože pri čítaní je stackframe 92 bajtov, pri
zapisovaní 32), na 68060 je to naopak, pretože emulácia zápisu je zložitejšia.
Zapisovanie je viac zložitejšie.
Rýchly (Fast) Snoop mód
Voľba Snoop/S zapína rýchle pátranie. Read prístupy nebudú testované. Žiadne
špeciálne testovanie tiež neprebieha. Tento mód je užitočný len na získanie
obsahu custom registru, napr. kvôli uloženiu obrázku pomocou SP.
Copper List Scanner
Od verzie 13 sú testované tiež copperlisty.
Skener bude aktivovaný pri zápise do registru coplc, ak je DMA copper povolené,
alebo ak nainštalovaný program zapne copper DMA zapísaním dmacon registru. Scanner
nasleduje copperlist a validizuje všetky move inštrukcie aplikovaním obmedzenia
spôsobeného Snoop voľbou (OCS/ECS/AGA).
Inštrukcie Skip a Wait (okrem CEND) budú ignorované. Pokiaľ budú nájdené nesprávne vstupy, nainštalovaný program bude ukončený.
Scanner prehľadáva vetvy (copjmp), zisťuje slučky a kontroluje až do 16ho podlistu.
Inštrukcie Move v copperliste budú uložené do vnútorného custom registra, ktorý bude dumpovaný pri ukončení WHDLoad.
Scanner je aktívny aj pri Rýchlom Snoop móde.
Test priority Blitter-u
Keď je voľba ChkBltHog/S aktivovaná, WHDLoad
testuje, či nainštalovaný program nezapína BltHog bit zapísaním do dmacon
registru. Priorita blitteru môže spôsobiť problémy na niektorých konfiguráciách
v súvislosti s rozsiahlymi operáciami cez blitter (použitie všetkých kanálov).
Test veľkosti blitter bloku
Keď je voľba ChkBltSize/S aktivovaná, WHDLoad
otestuje, či práca blitteru nepristupuje mimo vyhradenú BaseMem pamäť. Pri
zápise do bltsize, alebo do bltsizh
skontroluje, či je zapnutý Line mód v bltcon1,
ak áno, WHDLoad nebude testovať veľkosť bloku. Inak WHDLoad vypočíta prvý a posledný
word pre prístup k jednotlivým aktivovaným DMA kanálom. Ak je jedna adresa
mimo oblasti BaseMem, program bude ukončený s hlásením. Kalkulácia je
navrhnutá, aby pracovala práci so všetkými módmi (vzostupný/zostupný,
pozitívny/negatívny modulos, nepárne modulos/pointers).
Pamätajte, že line drawing mód nebude
kontrolovaný a tak všetky blitter registre môžu byť taktiež zapísané
pomocou copper (ak je nastavený copcon).
Kontrola Blitter Wait
Ak je voľba ChkBltWait/S zapnutá, WHDLoad bude
testovať inštrukcie, aby overil, že nainštalovaný program správne čaká na
koniec blitter operácie, než začne novú. Používa sa interná hodnota, ktorá
reprezentuje status blitter operácie. Hodnota sa nastaví, ak sa objaví write
prístup do bltsize, alebo
do bltsizh. Hodnota sa vymaže pri read prístupe do dmaconr.
registru. Pri každom zápise do blitter registru sa skontroluje interná premenná a ak sa
zistí, že blitter pracuje, program bude ukončený a WHDLoad zahlási PC
posledného neukončeného blitter procesu spolu s jeho adresou.
Sú tu ale dva nedostatky: použitie blitteru cez copperlist nie je kontrolované
a použitie blitter prerušení spôsobí, že kontrolná rutina hlási zbytočné chyby.
Plány do budúcnosti
Plánujem implementovať vlastnosti ako Freezing, and Iconify.
Pre tieto dve je Snoop ideálny. Preto doporučujem autorom inštalačiek, aby si skontrolovali ich inštalácie
pre kompatibilitu so Snoopom - čím zaistia aj kompatibilitu s budúcimi verziami WHDLoad.
Požiadavky
Pre Snoop je potrebné MMU. WHDLoad musí používať MMU, prípadne
MMU/S musí byť zapnuté na 68030.
Obmedzenia
- 68020 + 68851
- momentálne nepodporovaný hardvér
- 68030
- 68040
- momentálne nepodporovaný hardvér
- 68060
- Inštrukcia movem môže pristupovať do nesprávneho registra bez vytvorenia výnimky
Access Fault, toto sa môže stať, pretože je kontrolovaný len prvý prístup do registru.
- Inštrukcia move <Cia/Custom register>,sr bude vykonaná nesprávne,
pokiaľ sa bude snažiť zmeniť časť Supervisor status registru. Táto zmena však nebude vykonaná
- Inštrukcia (ssp)+ alebo -(ssp) v súčinnosti so zápisom do Cia alebo Custom registru
nemôže byť spracovaná kvôli problémom so stackframe. WHDLoad tento prístup zachytí a ukončí program s príslušným hlásením.
- Inštrukcia nesmie prsistupovať k viac ako jednému Snoopovanému registru naraz. To znamená, že napr.: move.b ($dff006),($bfd800)
nemôže byť spracovaná. Ak sa to však udeje, WHDLoad oznámi chybu Access Fault
[Main]
[Docs]
[Installs]
[Search]
[Team]
[Guestbook]
[Links]