На волне интереса публики к уязвимостям Meltdown и Spectre программист Брюс Доусон (Bruce Dawson), занимающийся сейчас в Google оптимизацией производительности и проверкой надёжности алгоритмов, решил рассказать историю о том, как обнаружил аналогичную архитектурную уязвимость процессора Xbox 360. В 2005 году он, как признаётся, жил и дышал этим чипом, пытаясь понять, как работает его конвейер, чтобы выявить возможные сбои и ошибки накануне запуска.
Процессор Xbox 360 включает три ядра с архитектурой IBM PowerPC — они расположены на трёх четвертях занимаемой CPU площади кристалла, а последняя четверть отведена под 1 Мбайт кеш-памяти L2. Каждое ядро включает по 32 Кбайт кеша инструкций и 32 Кбайт кеша данных. Проблема чипа заключалась в долгих задержках, особенно при работе с памятью. Вдобавок 1 Мбайт кеша L2 (всё, что могло уместиться в заданную площадь) было маловато для 3-ядерного процессора. Так что оптимизация использования кеш-памяти была очень важна.
Кеш-память CPU повышает производительность с помощью пространственной и временно́й локальности. Пространственная локальность означает, что если алгоритм использовал байт данных по некоторому адресу, то, вероятно, он будет вскоре использовать байты данных из соседних адресов. Временна́я локальность означает, что если использована некая хранящаяся в кеше информация, вероятно, она будет использована снова в ближайшем будущем.
Если обрабатывается большой массив данных один раз за кадр, то вполне ожидаемо, что они исчезнут из кеша L2 к моменту повторного использования на следующем кадре. Порой данные всё ещё нужны в кеше L1, но при том они потребляют ценное пространство в кеше L2, вытесняя ценные данные и, возможно, замедляя два других ядра. Протокол MESI, используемый для когерентности памяти, требует, чтобы когда одно ядро модифицирует кеш-линию, другие ядра с её копией уже не могли использовать кешированные данные.
Но речь шла о процессоре для игровой консоли, и производительность стояла на первом месте. Поэтому была добавлена новая инструкция — xdcbt. И если стандартная dcbt в PowerPC была типичной инструкцией предварительной выборки, то xdcbt позволяла осуществлять выборку прямо из памяти в кеш данных L1, пропуская L2. В результате когерентность памяти уже не была гарантирована, но разработчики игр знали, что делали и всё должно было быть хорошо. Однако практика выявила проблемы при предварительной выборке xdcbt: когда инструкция применялась к кеш-линиям, последние части которых были частью смежных структур данных, возникали сбои. Поэтому использовать xdcbt нужно было крайне осторожно, чтобы не выйти ни на байт за пределы буфера.
Но затем подобная же проблема стала проявляться даже там, где игры не использовали инструкцию xdcbt — это было весьма серьёзным препятствием для запуска платформы. Брюс Доусон бился безрезультатно над выявлением причин ошибки, пока его не осенило. После письма в IBM опасения подтвердились — дело заключалось в тонкостях дизайна CPU, о которых мало кто думал.
Хотя чип Xbox 360, в отличие от большинства современных чипов, — процессор с последовательным исполнением инструкций, опирающийся прежде всего на высокую частоту для достижения хорошей производительности, у него тоже есть предсказатель ветвлений — это вызвано очень длинными конвейерами (из-за чего верно предсказанные инструкции могли ускоряться даже при последовательном выполнении команд).
Так вот, порой блок предсказания ветвлений при длинных задержках спекулятивно вызывал инструкцию предварительной выборки xdcbt, которая работала идентично реальной и могла вызывать те же проблемы, что и при реальном вызове той же инструкции. Подобная же трудность со спекулятивным исполнением инструкций процессором с целью повышения производительности лежит и в основе обнародованных недавно уязвимостей Meltdown и Spectre.
Принцип работы блока предсказания ветвлений показал, что инструкция xdcbt слишком небезопасна с точки зрения стабильности системы, чтобы её задействовать в любых сегментах кода любых игр для Xbox 360. Возможность снизить риски была, но полностью их избежать вряд ли было возможно и поэтому Брюс Доусон сомневается, что вышла хоть одна игра, в которой использовалась xdcbt, хотя в обсуждениях архитектуры Xbox 360 она продолжает упоминаться.
Источник: 3DNews