fence

fence

Assembly RISC-V Referência

lyszt.net aborda fence e outras instruções RISC-V com mais detalhes.

Descrição

As instruções FENCE são usadas para ordenar E/S de dispositivos e acessos à memória conforme vistos por outros harts RISC-V e dispositivos externos ou coprocessadores. Qualquer combinação de entrada de dispositivo (I), saída de dispositivo (O), leituras de memória (R) e escritas de memória (W) pode ser ordenada em relação a qualquer combinação das mesmas. Informalmente, nenhum outro hart RISC-V ou dispositivo externo pode observar qualquer operação no conjunto successor após um FENCE antes de qualquer operação no conjunto predecessor anterior ao FENCE. memorymodel fornece uma descrição precisa do modelo de consistência de memória RISC-V.

As instruções FENCE também ordenam leituras e escritas de memória feitas pelo hart conforme observadas por leituras e escritas de memória feitas por um dispositivo externo. No entanto, as instruções FENCE não ordenam observações de eventos feitas por um dispositivo externo usando qualquer outro mecanismo de sinalização.

ℹ
Um dispositivo pode observar um acesso a um local de memória por meio de algum mecanismo de comunicação externo, por exemplo, um registrador de controle mapeado em memória que aciona um sinal de interrupção para um controlador de interrupções. Essa comunicação está fora do escopo do mecanismo de ordenação FENCE e, portanto, as instruções FENCE não podem fornecer nenhuma garantia sobre quando uma mudança no sinal de interrupção é visível para o controlador de interrupções. Dispositivos específicos podem fornecer garantias de ordenação adicionais para reduzir a sobrecarga de software, mas essas estão fora do escopo do modelo de memória RISC-V.

A EEI definirá quais operações de E/S são possíveis e, em particular, quais endereços de memória, quando acessados por instruções de load e store, serão tratados e ordenados como operações de entrada de dispositivo e saída de dispositivo, respectivamente, em vez de leituras e escritas de memória. Por exemplo, dispositivos de E/S mapeados em memória normalmente serão acessados com loads e stores não armazenados em cache que são ordenados usando os bits I e O em vez dos bits R e W. Extensões do conjunto de instruções também podem descrever novas instruções de E/S que também serão ordenadas usando os bits I e O em uma instrução FENCE.

Codificação do modo Fence

O campo de modo FENCE fm define a semântica da instrução FENCE. Um FENCE (com fm=0000) ordena todas as operações de memória em seu conjunto predecessor antes de todas as operações de memória em seu conjunto successor.

Uma instrução FENCE.TSO é codificada como uma instrução FENCE com fm=1000, predecessor=RW e successor=RW. FENCE.TSO ordena todas as operações de load em seu conjunto predecessor antes de todas as operações de memória em seu conjunto successor, e todas as operações de store em seu conjunto predecessor antes de todas as operações de store em seu conjunto successor. Isso deixa as operações de store non-AMO no conjunto predecessor do FENCE.TSO sem ordenação em relação aos loads non-AMO em seu conjunto successor.

ℹ
Como FENCE RW,RW impõe um superconjunto das ordenações que FENCE.TSO impõe, é correto ignorar o campo fm e implementar FENCE.TSO como FENCE RW,RW.

Os campos não utilizados nas instruções FENCE--rs1 and rd--são reservados para fences de granularidade mais fina em extensões futuras. Para compatibilidade futura, as implementações base devem ignorar esses campos#, e o software padrão deve zerar esses campos. Da mesma forma, muitas configurações de fm e de conjunto predecessor/successor também são reservadas para uso futuro. As implementações base devem tratar todas essas configurações reservadas como instruções FENCE (com fm=0000), e o software padrão deve usar apenas configurações não reservadas.

ℹ
Escolhemos um modelo de memória relaxado para permitir alto desempenho a partir de implementações de máquina simples e de prováveis extensões futuras de coprocessadores ou aceleradores. Separamos a ordenação de E/S da ordenação de R/W de memória para evitar serialização desnecessária dentro de um hart de driver de dispositivo e também para dar suporte a caminhos alternativos não de memória para controlar coprocessadores ou dispositivos de E/S adicionados. Implementações simples podem adicionalmente ignorar os campos predecessor and successor e sempre executar um FENCE conservador em todas as operações.