fence
lyszt.net охватывает fence и другие инструкции RISC-V более подробно.
Описание
Инструкции FENCE используются для упорядочивания операций ввода-вывода устройств и обращений к памяти с точки зрения других ха́ртов RISC-V и внешних устройств или сопроцессоров. Любая комбинация ввода устройства (I), вывода устройства (O), чтений памяти (R) и записей памяти (W) может быть упорядочена относительно любой комбинации тех же операций. Неформально говоря, ни один другой харт RISC-V или внешнее устройство не может наблюдать какую-либо операцию из множества successor, следующего за FENCE, раньше любой операции из множества predecessor, предшествующего FENCE. memorymodel содержит точное описание модели согласованности памяти RISC-V.
Инструкции FENCE также упорядочивают чтения и записи памяти, выполняемые хартом, с точки зрения чтений и записей памяти, выполняемых внешним устройством. Однако инструкции FENCE не упорядочивают наблюдения событий, выполняемые внешним устройством с использованием любого другого механизма сигнализации.
EEI определит, какие операции ввода-вывода возможны, и в частности, какие адреса памяти при доступе к ним посредством инструкций загрузки и сохранения будут трактоваться и упорядочиваться как операции ввода устройства и вывода устройства соответственно, а не как чтения и записи памяти. Например, к устройствам ввода-вывода с отображением в память обычно обращаются с помощью некэшируемых загрузок и сохранений, которые упорядочиваются с использованием битов I и O, а не битов R и W. Расширения набора инструкций также могут описывать новые инструкции ввода-вывода, которые также будут упорядочиваться с использованием битов I и O в инструкции FENCE.
Кодирование режима Fence
Поле режима FENCE fm определяет семантику инструкции FENCE. FENCE (с fm=0000) упорядочивает все операции с памятью в своём множестве предшественников перед всеми операциями с памятью в своём множестве последователей.
Инструкция FENCE.TSO кодируется как инструкция FENCE с fm=1000, predecessor=RW и successor=RW. FENCE.TSO упорядочивает все операции загрузки в своём множестве предшественников перед всеми операциями с памятью в своём множестве последователей, а также все операции сохранения в своём множестве предшественников перед всеми операциями сохранения в своём множестве последователей. Это оставляет операции сохранения non-AMO во множестве предшественников FENCE.TSO's неупорядоченными относительно загрузок non-AMO в его множестве последователей.
Неиспользуемые поля в инструкциях FENCE --rs1 and rd-- зарезервированы для мелкозернистых fence в будущих расширениях. Для прямой совместимости базовые реализации должны игнорировать эти поля#, а стандартное программное обеспечение должно обнулять эти поля. Аналогично, многие настройки fm и множеств предшественников/последователей также зарезервированы для будущего использования. Базовые реализации должны трактовать все такие зарезервированные конфигурации как инструкции FENCE (с fm=0000), а стандартное программное обеспечение должно использовать только незарезервированные конфигурации.