mret
lyszt.net tratta mret e altre istruzioni RISC-V in modo più dettagliato.
Descrizione
mret ritorna da un gestore di trap. Un trap si verifica quando il processore ferma il programma in esecuzione affinché un gestore possa subentrare. Un gestore è una routine a un indirizzo fisso. Un dispositivo genera un interrupt, come il pulsante sulla scheda GPIO, e questo avvia un trap. Il nome sta per ritorno in modalità machine.
mret
Quando un trap inizia, il processore memorizza l'indirizzo dell'istruzione interrotta in mepc, registra il motivo in mcause, azzera il bit di abilitazione globale degli interrupt di mstatus e salta all'indirizzo del gestore contenuto in mtvec. mret annulla tutto questo. Carica il program counter con l'indirizzo in mepc e ripristina il bit di abilitazione degli interrupt che mstatus aveva salvato all'inizio del trap. Il programma interrotto riprende quindi dall'istruzione che stava per eseguire.
mret non accetta operandi. Senza di esso il processore prosegue oltre la fine del gestore nel codice che segue.
Un interrupt può arrivare tra due istruzioni qualsiasi, e il programma interrotto non vi si è preparato. Un gestore salva quindi ogni registro che modifica e li ripristina prima di mret.
Un gestore del pulsante azzera anche il bit pending del pulsante prima di mret. Se quel bit rimane impostato, lo stesso interrupt scatta di nuovo non appena mret riattiva gli interrupt.
L'esempio scrive l'indirizzo di target in mepc ed esegue mret, che salta lì. Al di fuori di un trap reale, questo mostra il salto da solo. Vedi csrw per scrivere un CSR.
Esempio
la t0, target csrw mepc, t0 mret # pc = mepc, so execution continues at target target: nop
