CPU Cache Handling

### CPU Cache Overview

Per incrementare le prestazioni alcune CPU della famiglia 68k sono capaci di utilizzare una cache per gli accessi alla memoria.
Le cache vengono sempre assegnate mediante l'utilizzo di indirizzi logici, incluso il codice funzione dell'accesso. Questo significa che gli accessi nella Modalità Utente e nella Modalità Supervisore verranno differenziati e quindi inseriti in posti diversi nella cache (consulta la documentazione di Motorola per maggiori informazioni).

Segue uno sguardo alla capacità dei diversi processori della famiglia 68k di utilizzare le cache:

- 68000 nessuna
- 68010
  - Instruction Prefetch (Precaricamento Istruzione)
    due word di precaricamento, una word per il registro di decodifica
  - Loop Mode
    viene attivato quando una istruzione grande una word è seguita da un DBcc, nessun fetch istruzione verrà applicato fino alla fine del loop
- 68020
  - Instruction Prefetch
    una long word
  - Instruction Cache (Cache Istruzioni)
    16 linee per 16 byte = 256 byte
    possono essere abilitate o congelate tramite CACR
- 68030
  - Instruction Prefetch
    una long word
  - Instruction Cache
    16 linee per 16 byte = 256 byte
    possono essere abilitate o congelate tramite CACR
  - Data Cache (Cache Dati)
    16 lines per 16 byte = 256 byte
    possono essere abilitate o congelate tramite CACR
    sempre WriteThrough
    modalità Write Allocation selezionabile
- 68040
  - Instruction Prefetch
    una long word
  - Instruction Cache
    256 linee per 16 byte = 4096 byte
    possono essere abilitate tramite CACR
  - Data Cache
    256 linee per 16 byte = 4096 byte
    possono essere abilitate tramite CACR
    modalità CopyBack/WriteThrough selezionabili tramite MMU
- 68060
  - Instruction Prefetch
    una long word
  - Instruction Cache
    512 lines per 16 byte = 8192 byte
    possono essere attivate, congelate e ridotte a metà della loro dimensione tramite CACR
  - Branch Cache
    possono essere abilitate tramite CACR
    non risente della configurazione della MMU!
  - Superscalar Dispatch
    può essere abilitato tramite CACR
  - Data Cache
    512 linee per 16 byte = 8192 byte
    possono essere attivate, congelate e ridotte a metà della loro dimensione tramite CACR
    modalità CopyBack/WriteThrough selezionabili tramite MMU
  - Push Buffer
    può essere disabilitato tramite PCR
  - Store Buffer
    può essere abilitato tramite CACR
    Le pagine non devono essere NonCachable Serialized (precise)

#### Utilizzo delle Cache in WHDLoad

La prima cosa importante è di sapere che le cache nei 68030..68060 sono controllate dal Cache Control Register (CACR) (Registro di Controllo delle Cache) e la MMU (assumendo che WHDLoad utilizza e controlla la MMU)!
Nel CACR le cache saranno globalmente o abilitate o disabilitate. Utilizzando le Pagine singole della MMU (4 KByte con WHDLoad), verranno rese note le loro modalità di utilizzo delle cache.
Nel 68030 una pagina di memoria può essere Cacheable (possono essere utilizzate le cache) o NotCacheable (le cache non possono essere utilizzate). In un 68040/68060 può essere cacheable WriteThrough, cacheable CopyBack, NonCacheable (impreciso) o NonCacheable Serialized (preciso).

Se la MMU non viene usata da WHDLoad, quest'ultimo controllerà solo il CACR.

#### Impostazioni Predefinite delle Cache

Di default le aree di WHDLoad, lo Slave e ExpMem vengono impostati come cacheable CopyBack. L'area BaseMem viene marcata come NonCacheable, e le Data e Instruction Cache vengono abilitate nel CACR. In questo modo il programma localizzato nell'area BaseMem girerà senza Cache ma WHDLoad e lo Slave le utilizzeranno per aumentare le prestazioni.

#### Controllo delle Cache da parte del Programmatore

Ci sono due funzioni resload per controllare le cache: resload_SetCACR e resload_SetCPU. La resload_SetCACR è una routine molto vecchia e può essere completamente rimpiazzata da resload_SetCPU (WHDLoad mappa internamente gli argomenti di resload_SetCACR e chiama resload_SetCPU). In ogni caso l'utilizzo di resload_SetCACR è raccomandato per tutte le persone che non sono degli esperti delle cache e del loro modo di funzionare in un sistema Amiga. Mediante l'utilizzo di resload_SetCACR le instruction e le data cache possono essere abilitate o disabilitate separatamente. resload_SetCACR non inficia sulla possibilità di utilizzo delle cache nell'area BaseMem.

#### Controllo delle Cache da parte dell'Utente

Se il programmatore ha svolto un lavoro pulito allora l'utente non dovrà preoccuparsi delle cache, perché tutte le necessarie impostazioni del caso saranno state eseguite dallo Slave.
Tuttavia ci possono essere due ragioni per cambiare manualmente queste impostazioni. In primo luogo per permettere ad un installatore che va troppo veloce (ad esempio mostra errori nella grafica) di funzionare correttamente, ma anche per velocizzare un programma installato.

Per permettere ad un programma che va in crash di funzionare, si può usare l'opzione NoCache. Questa opzione disabilita tutte le cache e marca tutta la memoria come NonCachable Serialized (preciso). Se la macchina possiede memoria Chip a 32-bit sarà comunque più veloce di un A500 originale.

Per rendere un programma installato più veloce si possono impostare alcune opzioni che abilitano le Cache. Questa impostazione avrà priorità sulle impostazioni dello Slave. Nel 68020 si può impostare l'opzione Cache. Con un 68030 può essere usata anche l'opzione DCache la quale include anche l'opzione Cache. Con il 68060 c'è la possibiltà di utilizzare anche altre opzioni: BranchCache, StoreBuffer e SuperScalar. L'opzione ChipNoCache/S può migliorare le prestazioni in presenza di 68040 e 68060, leggi qui sotto.

#### Cacheability (possibilità di utilizzo delle cache) della memoria Chip

Le cache possono essere attivate non solo dalla CPU (CACR) e dalle impostazioni della MMU, ma anche da hardware esterno. La CPU manderà dei segnali al bus se tenterà di usare le cache per un accesso. Ed un hardware esterno può segnalare alla CPU (dopo che un indirizzo sarà stato immesso nel bus indirizzi durante un accesso alla memoria) che un accesso non è cacheable (non devono essere attivate le cache per questo accesso).
Il meccanismo dove l'hardware segnala alla CPU che la memoria può o non può essere cacheable viene usato in tutti gli Amiga (per quanto ne sappia) e schede CPU con processore >= 68030 (perché possiedono una cache dati). Risentono di queste impostazioni tutta la memoria Chip e lo spazio di I/O (CIA/Custom/RTC), dove non si devono utilizzare le cache dati. Questo diventa necessario per evitare problemi con le cache, per esempio a causa dell'attività del DMA.
La reazione della CPU nei confronti di un rifiuto hardware di un accesso cacheable dipende dal modello utilizzato. Con il 68030 non c'è nessun impatto nelle prestazioni dell'accesso, i dati semplicemente non verranno cacheati. Con il 68040 gli accessi in lettura saranno effettuati a piena velocità ma quelli in scrittura (CopyBack) verranno annullati e fatti ripartire senza cache, ed il risultato sarà un accesso circa 5 volte più lento (dipendentemente dall'hardware e dalla velocità della CPU) rispetto ad un accesso non cacheable. In presenza di un 68060 gli accessi in lettura e in scrittura verranno annullati e fatti ripartire. Gli accessi in lettura saranno circa 3 volte più lenti mentre quelli in scrittura circa 5 volte.
I problemi menzionati sono relativi agli accessi ai dati. Gli accessi alle istruzioni normalmente non ne risentono e sono cacheabili all'interno della memoria Chip. C'è qualche hardware (probabilmente non funzionante correttamente) che non permette alle istruzioni di essere cacheate nella memoria Chip. Con questo hardware dovrebbe essere utilizzata l'opzione ChipNoCache/S per evitare grossi rallentamenti nella velocità di esecuzione poiché altrimenti gli accessi alle istruzioni saranno circa 2 volte più lenti.

Puoi verificare la presenza di questo problema nel tuo sistema eseguendo Speed.Slave contenuto nella directory `src/memory-speed` nell'archivio per sviluppatori.

#### Write Allocation (Allocazione Scrittura)

La Write Allocation controlla l'utilizzo delle cache nel 68030 quando queste vengono a mancare durante un'operazione di scrittura. La Write Allocation deve essere abilitata quando alcune parti del programma installato girano in Modalità Utente (User Mode). Se il programma installato gira solo in Modalità Supervisore (Supervisor Mode) la Write Allocation può essere disabilitata, e si potrà ottenere un piccolo miglioramento delle prestazioni.

#### Branch Cache

La Branch Cache è disponibile solo con il 68060. E' una specie di cache istruzioni per le istruzioni di branch. Ma a differenza delle cache istruzioni questa non risente delle impostazioni della MMU! Questo significa che anche quando una certa pagina di memoria viene contrassegnata come Non Cacheable, le istruzioni di branch saranno cacheate se la Branch Cache è abilitata.

Leggi i Motorola Microprocessors User Manuals per maggiori ragguagli. Se hai correzioni o aggiunte da fare a questa pagina ti prego di contattarmi.