Snooping
Co to je
Snooping je schopnost WHDLoad, která kontroluje a loguje CPU přístupy k custom registrům.
Pokud je Snoop aktivován, všechny nesprávné přístupy k custom
registrům vytvoří chybu a nainstalovaný program bude ukončen. Nesprávné přístupy jsou:
- přístupy k neexistujícím registrům
- read přístupy k Write Only registrům
- write přístupy k Read Only registrům
- přístupy k Early Read registrům
- byte write přístupy (krome bltcon0l a aud*vol+1)
Strobe registry mohou být čteny nebo zapisovány.Custom registry se odlišují -
OCS (Old ChipSet - A500, A1000, old A2000), ECS (Enhanced ChipSet
- A600, nova A2000, A3000) a AGA (Advanced Graphics - A1200, A4000). Takže se
tato funkce hodí obzvláště pro hledání chyb ve starých programech, způsobených
špatným přístupem k AGA registrům.
Jak to funguje
Pokud je snooping zapnutý, WHDLoad označí adresy custom registrů v MMU translation
tree jako nesprávné. Díky tomu se každý přístup do custom registrů stane Access Fault
vyjímkou. WHDload tuto vyjímku ovládá, takže může zjistit, jestli je přístup správný
nebo ne (při nekorektním přístupu je program ukončen, jinak program pokračuje).
Kvůli přetížení vyjímek a emulační sekvenci se běh programu značně zpomalí.
Jak moc, záleží na CPU, typu Chip RAM a stackpointer aligmentu. Vše se take liší
podle druhu přístupu (Byte/Word/LongWord, Read/Write). Na 68030 jsou zápisy
rychlejší než čtení (protože při čtení je stackframe 92 bajtu, při psaní 32),
na 68060 je to naopak, protože emulace zápisu je složitější.
Fast Snoop Mode
Volba Snoop/S zapíná rychlý snooping. Read přístupy nebudou testovány.
Žádné speciální zkoušky nejsou provedeny. Tento mód je užitečný jen pro
získání obsahu custom registru, např. pro uložení obrázku pomocí
SP.
Copper List Scanner
Od verze 13 budou zkoušeny také copperlisty. Scanner bude aktivován při zápisu
do registru coplc. Scanner procházi copperlist a ověřuje všechny move instrukce
aplikováním omezení způsobených Snoop volbou. Skip a Wait instrukce budou ignorovány,
Pokud scanner objeví ilegální přístup, program bude ukončen s chybovou hláškou.
Scanner následuje branche (copjmp), detekuje smyčky a zkouší až 16 sublistů.
Pohyby v copperlistech budou uloženy do interního logu pro custom registry a ten
bude vypsán do souboru při exitu. Scanner není aktivní při Fast Snoop módu.
Zkouška Blitter Priority
Když je volba ChkBltHog/S aktivována, WHDLoad otestuje, zda instalovaný program
nezapíná BltHog bit zapsáním do dmacon registru. Priorita blitteru může způsobit
problémy na některých konfiguracích v souvislosti s rozsáhlými operacemi přes blitter
(použití všech kanálů).
Test velikosti blitter bloku
Když je volba ChkBltSize/S aktivována, WHDlaod otestuje, zda práce blitteru
nepřistupuje mimo vyhrazenou paměť. Při zápisu do bltsize nebo bltsizh
zkouší, jestli je zapnut řádkový mód - pokud ano, nebude WHDLoad zkoušet velikost bloku.
Jinak vypočítá WHDLoad první a poslední word pro každý aktivovaný DMA kanál. Pokud
je adresa mimo BaseMem území, program bude ukončen s requesterem. Kalkulace je navržena
k práci se všemi módy.
Blitter Wait test
Pokud je volba ChkBltWait/S zapnuta, WHDLoad bude sledovat instrukce, aby ověřil,
že nainstalovaný program korektně čeká na konec blitter operace než začne novou.
Používá interní hodnotu, která reprezentuje status další blitter operace.
Hodnota je nastavena při zápisu do bltsize nebo bltsizh
a vymazána, když je čten dmaconr registr. Při každém kontrolovaném zápisu
je hodnota testována a pokud je zjištěno, že předchozí blitter operace stále
běží, program bude ukončen s chybovým registrem s adresou neukončeného blitter
procesu.
Jsou tu ale dva nedostatky: použití blitteru přes copperlist není testováno
a použití blitter přerušení způsobí, že testovací rutina hlásí zbytečné chyby.
Budoucnost
Plánuje se implementovat schopnosti jako Freezing nebo ikonifikace. Pro tohle
je Snooping ideální. Autorům instalaček se doporučuje zkoušet jejich produkty
se Snoop pro budoucí kompatibilitu.
Požadavky
Pro Snoop mód je vyžadováno vlastnit MMU, se kterým umí WHDLoad pracovat
(na 68030 je ho třeba zapnout)
Omezeni
- 68020 + 68851
- tento hardware není podporován
- 68030
- 68040
- tento hardware není podporován
- 68060
- movem instrukce mohou zasahovat nesprávný registr bez chybového
hlášení (protože je testován jen první přístup)
- move <Cia/Custom registr>,sr bude vykonán nesprávně, pokud
se snaží změnit supervisor portion stavového registru, nezmění se.
- any (ssp)+ or -(ssp) ve spojení s write přístupem k
Cia nebo Custom registru nemůže být převzato kvůli problémům se stackframes,
WHDLoad takove přístupy detekuje a vyskočí s příslušným requesterem.
- instrukce nesmi přistupovat víc než do jednoho střeženého registru najednou,
to znamená, že kód jako move.b ($dff006),($bfd800) nemůže být zvládnutý
a způsobí chybu Access Fault.