mret
lyszt.net cubre mret y otras instrucciones RISC-V con más detalle.
Descripción
mret regresa desde un manejador de trampa. Una trampa ocurre cuando el procesador detiene el programa que está ejecutando para que un manejador pueda tomar el control. Un manejador es una rutina en una dirección fija. Un dispositivo genera una interrupción, como el botón en la placa GPIO, y eso inicia una trampa. El nombre significa retorno en modo máquina.
mret
Cuando comienza una trampa, el procesador almacena la dirección de la instrucción interrumpida en mepc, registra el motivo en mcause, borra el bit de habilitación global de interrupciones de mstatus y salta a la dirección del manejador contenida en mtvec. mret deshace esto. Carga el contador de programa con la dirección en mepc y restaura el bit de habilitación de interrupciones que mstatus guardó al inicio de la trampa. El programa interrumpido entonces se reanuda en la instrucción que estaba a punto de ejecutar.
mret no toma operandos. Sin él, el procesador continúa más allá del final del manejador hacia el código que siga.
Una interrupción puede llegar entre dos instrucciones cualesquiera, y el programa interrumpido no ha hecho ninguna preparación para ella. Por lo tanto, un manejador guarda cada registro que modifica y los restaura antes de mret.
Un manejador de botón también borra el bit pendiente del botón antes de mret. Si ese bit permanece establecido, la misma interrupción se dispara de nuevo tan pronto como mret vuelve a habilitar las interrupciones.
El ejemplo escribe la dirección de target en mepc y ejecuta mret, que salta allí. Fuera de una trampa real, esto muestra el salto por sí solo. Consulta csrw para escribir un CSR.
Ejemplo
la t0, target csrw mepc, t0 mret # pc = mepc, so execution continues at target target: nop
