Page 1 of 2

Сохранение FPU/SSE регистров в контексте.

Posted: Sat May 12, 2012 10:57 pm
by XVilka
Работая над кое-какими SSE программами решил добавить поддержку отображения этих регистров в MTDBG
В отладчик поддержку добавил, но нужна поддержка со стороны ядра.
Изучив механизм сохранения контекста в ядре (debug.inc) я узнал, что контекст берется из команды pushad в конце
каждого обработчика прерывания. Надо сохранять и MMX регистры, к примеру. Ставить сохранение MMX регистров в конце каждого прерывания мне кажется не очень красиво. Есть какие-либо идеи, как лучше оганизовать сохранение MMX/SSE/AVX регистров?

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Sat May 12, 2012 11:04 pm
by Mario
А собственно зачем сохранять? Я понимаю, когда обработчик прерывания использует эти регистры, но если он не использует, то зачем нужен дополнительный перевод электрической энергии в тепло?

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Sat May 12, 2012 11:08 pm
by XVilka
Вопрос в том, как достоверно узнать, сохраняет ли обработчик их, или нет? С другой стороны, возможно добавить сохранение регистров в самом debug.inc при сохранении контекста из стека

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Sun May 13, 2012 1:46 am
by Mario
Насколько я знаю Serge делал какие то доработки относительно сохранения MMX/SSE при переключении задач.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Sun May 13, 2012 2:00 pm
by Serge
Контекст сохраняется в pl0 стеке потока. В моём понимании надо сделать ещё один отладочный вызов для запроса контекста FPU. В вызове сделать проверку fpu_owner. Если отлаживаемый поток не является fpu_owner скопировать контекст из pl0 стека.
Если является сделать
а) clts, fnsave в наш буфер и снова поставить флаг ts
б)команда fpu чтобы ядро сохранило контекст и так-же копировать его из pl0 стека.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Sun May 13, 2012 4:20 pm
by XVilka
Я так думаю надо еще отладочный вызов отдельно для FPU, отдельно для MMX+SSE, отдельно для AVX? Если для FPU более-менее понятно, то для MMX/SSE/AVX то же самое делать?

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Sun May 13, 2012 9:29 pm
by Serge
XVilka
Регистры MMX проецируются на регистры FPU и область сохранения у них общая. Поддержки AVX нет, так что пока хватит одного вызова. Размер области сохранения для fxsave 512 байт. Если SSE нет, контекст сохраняетя fnsave и используется только часть области.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 4:11 pm
by Serge
Как вариант могу предложить 69.10 - получить состояние регистров FPU/SSE отлаживаемого потока.

Параметры:
eax = 69 - номер функции
ebx = 10d - номер подфункции
ecx = идентификатор потока
edx = указатель на область сохранения контекста размером 512 байт
область должна быть выравнена на границу параграфа (16 байт)

Возвращаемое значение:
Некоторые флаги в регистре eax

Реализация:
проверяем fpu_owner, если это отлаживаемый поток выполняем команду fpu для переключения контекста, копируем контекст.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 5:14 pm
by CleverMouse
Вроде можно добавить эту функциональность в 69.1/69.2, разве нет? Там выделен один из параметров под размер контекста.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 6:35 pm
by Serge
CleverMouse
Это нарушает обратную совместимость.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 6:40 pm
by CleverMouse
Serge, разве что новый клиент не будет работать со старым ядром, но так в любом случае будет.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 7:08 pm
by Serge
В принципе можно. Просто я обожаю обратную совместимость. Но область сохранения FPU обязательно надо выравнивать.

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 7:22 pm
by XVilka
Совместимость, так совместимость. Будем пилить 69.10

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 7:23 pm
by CleverMouse
Так есть же совместимость. Старый клиент просто не заметит изменений в 69.1/69.2, потому что не знает, что их можно вызывать с edx != sizeof(контекст cpu).

Re: Сохранение FPU/SSE регистров в контексте.

Posted: Mon May 14, 2012 7:57 pm
by Serge
Согласен, согласен на .1 .2
Убедили :)