Являются ли функции ядра / инструкции x86 outw и inw атомарными при доступе к ISA/LPC?
ТЛ; др
Являются ли функции ядра Linux outw() и inw() атомарными при доступе к ISA/LPC на x86 в многоядерной системе, учитывая, что на уровне HW он должен состоять из четырех отдельных 8-битных транзакций?
В качестве эквивалентного вопроса, поскольку функции outw() и inw() являются оболочками для инструкций встроенных сборок с одинаковыми именами, гарантированно ли эти инструкции являются атомарными при доступе к LPC/ISA на многоядерном x86?
Фон
В настоящее время я пишу драйвер Linux для устройства, которое ожидает 32-битный доступ, но подключено к шине LPC (которая выглядит как шина ISA для ОС). FPGA отображает четыре отдельные 8-битные транзакции LPC в одну 32-битную транзакцию.
Я вижу, что для x86 ядро определяет outw и outl для x86, которые вырождаются в одноименные встроенные инструкции по сборке.
Определены ли эти функции / инструкции как атомарные даже в многоядерной системе? В частности, я имею в виду возможное состояние гонки, если только (например) к двум из четырех байтов обращаются до того, как другое ядро запускается, прерывание запускает новую (псевдо) 32-битную транзакцию. LDD3 не говорит ничего другого, кроме признания существования функций, и документация ядра также бесполезна в этом отношении.
Тем временем я реализовал как четыре отдельные транзакции inb(), заключенные в спин-блокировку. (Не имеет значения, вставляют ли другие драйверы транзакции между ними, потому что транслятор FPGA не будет включать эти адреса при построении 32-битной транзакции).
(Кроме того, я протестировал outw() и inw(), и они действительно выполняют многобайтовый доступ на моей платформе - Intel Atom Bay Trail - но вопрос о возможном состоянии гонки остается).