Как выяснилось, выполнение некоторых специфичных инструкций FMA3 на процессоре AMD Ryzen приводит к критическому сбою ОС.
Инструкции типа FMA3 (Fused-Multiply-Add) поддерживаются и Intel (в Haswell), и AMD. Это инструкции типа d = round(a × b + c)
, где d должна быть в том же регистре, что и a, b или c. Для сравнения, инструкции FMA4 поддерживает только AMD (в процессорах Buldozer и более поздних). Там a, b, c и d могут быть в разных регистрах.
Баг в процессоре обнаружен во Flops version2 — простой и малоизвестной утилите для тестирования ЦП. Следует заметить, что разработчик этой утилиты Александр «Mystical» Йи (Alexander «Mystical» Yee) позиционирует её как специфическую утилиту тестирования, которая чувствительна к микроархитектуре процессоров. В других бенчмарках баг так и не проявился.
С утилитой Flops version2 поставляются специфические бинарники для всех основных архитектур x64 (Core2, Bulldozer, Sandy Bridge, Piledriver, Haswell, Skylake). Но на данный момент ни среди бинарных сборок под Windows, ни под Linux нет версии для тестирования Zen. Поэтому сейчас для тестирования Ryzen применяли бинарники других архитектур, а именно наиболее близкой Haswell. Вышеупомянутая ошибка с инструкциями FMA3 обнаружена две недели назад самим автором программы Flops, когда он запустил тест со стоковым бинарником для Haswell на компьютере следующей конфигурации:
- Ryzen 7 1800X
- Asus Prime B350M-A (BIOS 0502)
- 4 x 8GB Corsair CMK32GX4M4A2400C14 @ 2133 MHz
- Windows 10 Anniversary Update
Внезапно обнаружилось, что система обычно зависает при выполнении следующей операции:
Single-Precision - 128-bit FMA3 - Fused Multiply Add:
Иногда тест проходит эту операцию успешно, но всё равно зависает на какой-нибудь другой операции в дальнейшем.
Разработчик объясняет, что его тест — с открытым исходным кодом, и если вы не доверяете результатам, то можете сами взять и скомпилировать бинарник в Visual Studio, и перепроверить результаты.
Александр понимал, какое внимание привлечёт, сообщая об ошибке в разрекламированном процессоре. Поэтому он многократно перепроверил результаты. Процессор вешал систему на всех тактовых частотах. А при работе в однопотоковом режиме систему вешало каждое ядро.
Оставались какие-то вероятности, что причина сбоя может быть всё-таки не в процессоре, а в чём-то другом. Например, в специфической материнской плате, в специфическом BIOS, в специфической операционной системе… Что ещё может быть?
Разработчик поделился результатами с коллегами, чтобы они проверили другие версии Zen на своих компьютерах. Сбои подтвердились и для других процессоров, на разных материнских платах, под разными версиями Windows и под Linux.
В первые дни после призыва Алекса тесты запустили пять владельцев процессоров Ryzen. Вот какие получены результаты:
Подтверждённые сбои:
- 1800X + Asus Prime B350M-A (BIOS 0502)
- 1700 + Asus Prime B350M-A (BIOS ???)
- 1700 + Asus Crosshair VI Hero
- 1700 + Asus Crosshair VI Hero (BIOS 5803) (два банка памяти G.Skill + Kingston)
- 1800X + Asus Crosshair VI Hero (Windows 7) — один раз прошёл тест, многократно не прошёл.
Подтверждённая бессбойная работа:
- Пока нет
Разработчик бенчмарка проверил все варианты FMA (128 бит, 256 бит, одинарная точность, двойная точность чисел). Во всех случаях компьютер намертво зависал.
Ему не давала покоя только одна деталь: хотя тест написан правильно, но почему-то зависания не присходило в других бенчмарках, таких как prime95 и y-cruncher, хотя они тоже используют FMA в тестировании.
Так что некоторая неопределённость оставалась.
В конце концов, 16 марта было получено официальное сообщение от представителя AMD, что баг будет исправлен в новом коде AGESA (AMD Generic Encapsulated Software Architecture) — протокола, который используется в том числе для инициализации ядер процессоров AMD. Другими словами, специалисты компании проверили и подтвердили баг. Позже представители AMD официально подтвердили баг в комментариях для СМИ.
К счастью, такой баг можно исправить без замены железа, а просто обновлением микрокода. Баг незначительный, так что он не вызовет отзывы процессоров или какие-то другие проблемы для компании. Фактически, в реальных условиях работы вряд ли кто-то когда-либо может столкнуться с этим багом, он никак не сказывается ни на работе компьютера, ни на производительности процессора.
Плохая новость в том, что его могут использовать злоумышленники для DoS-атак. То есть главным образом эта ошибка — проблема информационной безопасности. Ведь обычная пользовательская программа, работающая в user mode, а не на уровне ядра ОС, никак не должна намертво вешать систему. Но это происходит.
То, что тест запускали на бинарнике для другой архитектуры — не так принципиально. Любой процессор должен успешно воспроизводить тесты из любого бинарника, если он поддерживает соответствующий набор инструкций, пишет автор бенчмарка. Но даже если запустить тест с использованием несовместимых инструкций, программа не должна вешать систему намертво.
Опасность уязвимости в безопасности усугубляется тем, что вредоносный код можно запустить даже из-под виртуальной машины, он всё равно подвесит всю систему. Компьютер с новым процессором Ryzen может подвесить любая вредоносная программа. Возможно, даже через браузер.
Как уже было сказано, AMD работает над обновлением протокола AGESA. После этого патчи будут выпущены для всех версий BIOS во всех материнских платах.
Источник