Как включить SSE для моего автономного загрузочного кода?

(Этот вопрос был изначально о CVTSI2SD инструкция и тот факт, что я думал, что он не работает на процессоре Pentium M, но на самом деле это потому, что я использую пользовательскую ОС и мне нужно вручную включить SSE.)

У меня есть процессор Pentium M и пользовательская ОС, которая до сих пор не использовала инструкции SSE, но теперь мне нужно их использовать.

Попытка выполнить любую инструкцию SSE приводит к прерыванию 6, неправильному коду операции (который в Linux может вызвать SIGILL, но это не Linux), также упоминаемый в руководстве разработчика программного обеспечения для архитектур Intel (который теперь я называю IASDM) как #UD - недействительный код операции (UnDefined Opcode).

Редактировать: Питер Кордес фактически определил правильную причину и указал мне на решение, которое я возобновляю ниже:

Если вы используете старую ОС, которая не поддерживает сохранение правил XMM при переключении контекста, бит включения SSE в одном из регистров управления машиной не будет установлен.

Действительно, IASDM упоминает это:

Если операционная система не обеспечивала адекватную поддержку системного уровня для SSE, выполнение инструкций SSE или SSE2 также может генерировать #UD.

Питер Кордес указал мне на вики SSE OSDev, которая описывает, как включить SSE, написав обеим CR0 а также CR4 управляющие регистры:

clear the CR0.EM bit (bit 2) [ CR0 &= ~(1 << 2) ]
set the CR0.MP bit (bit 1) [ CR0 |= (1 << 1) ]
set the CR4.OSFXSR bit (bit 9) [ CR4 |= (1 << 9) ]
set the CR4.OSXMMEXCPT bit (bit 10) [ CR4 |= (1 << 10) ]

Обратите внимание, что для того, чтобы иметь возможность записи в эти регистры, если вы находитесь в защищенном режиме, вам нужно быть на уровне привилегий 0. Ответ на этот вопрос объясняет, как это проверить: если в защищенном режиме, то есть когда бит 0 (PE) в CR0 установлен в 1, то вы можете проверить биты 0 и 1 из CS селектор, который должен быть как 0.

Наконец, пользовательская ОС должна правильно обрабатывать регистры XMM во время переключения контекста, сохраняя и восстанавливая их при необходимости.

2 ответа

Решение

Если вы используете старую или пользовательскую ОС, которая не поддерживает сохранение правил XMM при переключении контекста, она не установит биты включения SSE в регистрах управления машиной. В этом случае все инструкции, которые касаются регистров xmm, будут ошибочными.

Мне потребовалось несколько секунд, чтобы найти, но http://wiki.osdev.org/SSE объясняет, как изменить CR0 и CR4, чтобы инструкции SSE могли работать на голом железе без #UD,


Моя первая мысль о вашей старой версии вопроса состояла в том, что вы могли скомпилировать свою программу с -mavx, -march=sandybridge или эквивалент, вызывая компилятор испускать VEX-кодированную версию всего.

CVTSI2SD   xmm1, xmm2/m32         ; SSE2
VCVTSI2SD  xmm1, xmm2, xmm3/m32   ; AVX

См. https://stackru.com/tags/x86/info ссылки, в том числе на руководство по установке Intel insn.


Связанный: Какие версии Windows поддерживают / требуют, какие расширения мультимедиа ЦП? содержит некоторые подробности о том, как проверить поддержку AVX и AVX512 (которые также вводят новое архитектурное состояние, поэтому ОС должна установить бит, иначе HW выйдет из строя). Это происходит с другой стороны, но ссылки должны указывать, как активировать / отключить поддержку AVX.

Я предлагаю вам обратиться к руководству Intel, когда у вас есть такие вопросы.

В руководстве четко указано, что CVTSI2SD инструкция SSE2

Другие вопросы по тегам