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

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

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

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

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

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

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

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

Питер Кордес указал мне на SSE OSDev wiki, который описывает, как включить 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 regs на контекстных переключателях, она не будет устанавливать биты включения SSE в регистрах управления машиной. В этом случае все инструкции, которые касаются XMM regs, будут неисправны.

мне потребовалась секунда, чтобы найти, но 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://stackoverflow.com/tags/x86/info для ссылок, в том числе на руководство Intel insn set ref.


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


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

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