Как включить 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.