Voglio scrivere il mio codice che gestirà le mancanze TLB sul Microblaze e attraverso ciò, ovviamente, le tabelle della pagina ecc. Tutto questo viene fatto su OVPsim.Perché l'accesso a una posizione non mappata non genera un'eccezione hardware (Microblaze)
Come sto imparando come vado ho scritto questo piccolo pezzo di assemblaggio per fare riferimento a una posizione non mappata (0x1000000) - Sto facendo funzionare questo codice come privilegiato con VM on:
ori r20, r0, 0
ori r12, r0, 0x1000000
/* next line should break it */
sw r20, r12, r0
(Vale a dire, scrivere il contenuto di r20 == 0
fuori all'indirizzo formate da ORing r12 == 0x1000000
e r0 == 0 => 0x1000000
ovviamente)
Ma invece di saltare al vettore eccezione, GDB rapporti "Programma ricevuto SIGSEV" -. quello che ho ottenuto sbagliato? Non ho il bit dell'eccezione dell'abilitazione abilitata nel MSR ma il manuale dice che non è possibile mascherare queste eccezioni in ogni caso in modo che non dovrebbe essere il problema.
Ulteriori informazioni non riesco a ottenere qualsiasi (per esempio, tra le eccezioni di disallineamento) del codice di gestione delle eccezioni di eseguire, (a meno che esplicitamente lo chiamo), anche se non sto usando il debugger. Con il debugger off ottengo questo output da OVPsim (NB Ho semplicemente cambiato l'indirizzo di prova - non v'è alcun significato nella differenza tra 0xA000000 e 0x100000 sopra):
Processor Exception (PC_PRX) Processor 'platform/cpu0' 0x248: sw r20, r12, r0
Processor Exception (PC_WPX) No write access at 0xa000000
Questo è tutto il codice viene eseguito in modalità privilegiata, quindi non vedo alcuna ragione esplicita per non chiamare i gestori, a meno che non sia stato impostato Non ho configurato correttamente Microblaze. Ho questi acceso:
icmAddStringAttr(cpu1_attr, "endian", "big");
icmAddDoubleAttr(cpu1_attr, "mips", 100.000000);
icmAddStringAttr(cpu1_attr, "variant", "V8_20");
icmAddBoolAttr(cpu1_attr, "verbose", "true");
icmAddUns32Attr(cpu1_attr, "C_PVR", 2);
icmAddUns32Attr(cpu1_attr, "C_USE_MMU", 3);
icmAddStringAttr(cpu1_attr, "C_USE_BARREL", "1");
icmAddStringAttr(cpu1_attr, "C_USE_DIV", "1");
icmAddUns32Attr(cpu1_attr, "C_USE_INTERRUPT", 1);
icmAddUns32Attr(cpu1_attr, "C_MMU_TLB_ACCESS", 3);
icmAddUns32Attr(cpu1_attr, "C_UNALIGNED_EXCEPTIONS", 1);
icmAddUns32Attr(cpu1_attr, "C_ILL_OPCODE_EXCEPTION", 1);
icmAddUns32Attr(cpu1_attr, "C_DIV_ZERO_EXCEPTION", 1);
icmAddUns32Attr(cpu1_attr, "C_OPCODE_0x0_ILLEGAL", 1);
icmAddUns32Attr(cpu1_attr, "C_DEBUG_ENABLED", 1);
Non c'è ragione di credere che questo non funzionerà come OVPsim verrà eseguito Linux sul Microblaze.
La configurazione di Microblaze sembra OK. L'output dell'emulatore sembra un po 'strano. L'eccezione "Nessun accesso in scrittura" potrebbe significare che la pagina corrispondente è stata trovata in TLB ma non ha accesso in scrittura abilitato. Dovresti vedere un'eccezione anche in questo caso. Prova a impostare il bit 'EE' in' MSR', anche se nel caso l'implementazione di OVPsim sia errata. – dkz
Ho già impostato il bit EE :( MSR è 0x2502 – adrianmcmenamin
Solo un altro suggerimento è quello di impostare il parametro Microblaze 'C_MMU_ZONES = 2'. Anche se non si stanno utilizzando le zone di protezione, quando questo parametro è 0 Microblaze non genera codice o l'eccezione di accesso ai dati – dkz