mret
lyszt.net aborda mret e outras instruções RISC-V com mais detalhes.
Descrição
mret retorna de um tratador de trap. Um trap ocorre quando o processador interrompe o programa que está executando para que um tratador possa assumir o controle. Um tratador é uma rotina em um endereço fixo. Um dispositivo gera uma interrupção, como o botão da placa GPIO, e isso inicia um trap. O nome significa retorno em modo máquina.
mret
Quando um trap começa, o processador armazena o endereço da instrução interrompida em mepc, registra o motivo em mcause, limpa o bit de habilitação global de interrupções de mstatus e salta para o endereço do tratador contido em mtvec. mret desfaz isso. Ele carrega o contador de programa com o endereço em mepc e restaura o bit de habilitação de interrupções que mstatus salvou no início do trap. O programa interrompido então continua na instrução que estava prestes a executar.
mret não recebe operandos. Sem ele, o processador continua além do fim do tratador para o código que vier em seguida.
Uma interrupção pode chegar entre quaisquer duas instruções, e o programa interrompido não fez nenhuma preparação para isso. Um tratador, portanto, salva todos os registradores que altera e os restaura antes de mret.
Um tratador de botão também limpa o bit pendente do botão antes de mret. Se esse bit permanecer definido, a mesma interrupção dispara novamente assim que mret reativa as interrupções.
O exemplo escreve o endereço de target em mepc e executa mret, que salta para lá. Fora de um trap real, isso mostra o salto por si só. Consulte csrw para escrever em um CSR.
Exemplo
la t0, target csrw mepc, t0 mret # pc = mepc, so execution continues at target target: nop
