fence
lyszt.net cubre fence y otras instrucciones RISC-V con más detalle.
Descripción
Las instrucciones FENCE se utilizan para ordenar las E/S de dispositivos y los accesos a memoria tal como los observan otros harts RISC-V y dispositivos externos o coprocesadores. Cualquier combinación de entrada de dispositivo (I), salida de dispositivo (O), lecturas de memoria (R) y escrituras de memoria (W) puede ordenarse con respecto a cualquier combinación de las mismas. De manera informal, ningún otro hart RISC-V ni dispositivo externo puede observar ninguna operación del conjunto successor posterior a un FENCE antes que cualquier operación del conjunto predecessor anterior al FENCE. memorymodel proporciona una descripción precisa del modelo de consistencia de memoria de RISC-V.
Las instrucciones FENCE también ordenan las lecturas y escrituras de memoria realizadas por el hart tal como las observan las lecturas y escrituras de memoria realizadas por un dispositivo externo. Sin embargo, las instrucciones FENCE no ordenan las observaciones de eventos realizadas por un dispositivo externo utilizando cualquier otro mecanismo de señalización.
La EEI definirá qué operaciones de E/S son posibles y, en particular, qué direcciones de memoria, cuando se accede a ellas mediante instrucciones de carga y almacenamiento, se tratarán y ordenarán como operaciones de entrada de dispositivo y salida de dispositivo respectivamente, en lugar de lecturas y escrituras de memoria. Por ejemplo, los dispositivos de E/S mapeados en memoria normalmente se accederán con cargas y almacenamientos no almacenados en caché que se ordenan utilizando los bits I y O en lugar de los bits R y W. Las extensiones del conjunto de instrucciones también podrían describir nuevas instrucciones de E/S que también se ordenarán utilizando los bits I y O en una instrucción FENCE.
Codificación del modo Fence
El campo de modo FENCE fm define la semántica de la instrucción FENCE. Un FENCE (con fm=0000) ordena todas las operaciones de memoria de su conjunto predecesor antes que todas las operaciones de memoria de su conjunto sucesor.
Una instrucción FENCE.TSO se codifica como una instrucción FENCE con fm=1000, predecessor=RW y successor=RW. FENCE.TSO ordena todas las operaciones de carga de su conjunto predecesor antes que todas las operaciones de memoria de su conjunto sucesor, y todas las operaciones de almacenamiento de su conjunto predecesor antes que todas las operaciones de almacenamiento de su conjunto sucesor. Esto deja las operaciones de almacenamiento non-AMO del conjunto predecesor de FENCE.TSO's sin ordenar con respecto a las cargas non-AMO de su conjunto sucesor.
Los campos no utilizados en las instrucciones FENCE --rs1 and rd-- están reservados para fences de grano más fino en futuras extensiones. Para compatibilidad futura, las implementaciones base deberán ignorar estos campos#, y el software estándar deberá poner a cero estos campos. Asimismo, muchos ajustes de fm y de conjuntos predecesor/sucesor también están reservados para uso futuro. Las implementaciones base deberán tratar todas esas configuraciones reservadas como instrucciones FENCE (con fm=0000), y el software estándar deberá utilizar únicamente configuraciones no reservadas.