Работая над кое-какими SSE программами решил добавить поддержку отображения этих регистров в MTDBG
В отладчик поддержку добавил, но нужна поддержка со стороны ядра.
Изучив механизм сохранения контекста в ядре (debug.inc) я узнал, что контекст берется из команды pushad в конце
каждого обработчика прерывания. Надо сохранять и MMX регистры, к примеру. Ставить сохранение MMX регистров в конце каждого прерывания мне кажется не очень красиво. Есть какие-либо идеи, как лучше оганизовать сохранение MMX/SSE/AVX регистров?
Сохранение FPU/SSE регистров в контексте.
А собственно зачем сохранять? Я понимаю, когда обработчик прерывания использует эти регистры, но если он не использует, то зачем нужен дополнительный перевод электрической энергии в тепло?
Вопрос в том, как достоверно узнать, сохраняет ли обработчик их, или нет? С другой стороны, возможно добавить сохранение регистров в самом debug.inc при сохранении контекста из стека
Насколько я знаю Serge делал какие то доработки относительно сохранения MMX/SSE при переключении задач.
Контекст сохраняется в pl0 стеке потока. В моём понимании надо сделать ещё один отладочный вызов для запроса контекста FPU. В вызове сделать проверку fpu_owner. Если отлаживаемый поток не является fpu_owner скопировать контекст из pl0 стека.
Если является сделать
а) clts, fnsave в наш буфер и снова поставить флаг ts
б)команда fpu чтобы ядро сохранило контекст и так-же копировать его из pl0 стека.
Если является сделать
а) clts, fnsave в наш буфер и снова поставить флаг ts
б)команда fpu чтобы ядро сохранило контекст и так-же копировать его из pl0 стека.
Я так думаю надо еще отладочный вызов отдельно для FPU, отдельно для MMX+SSE, отдельно для AVX? Если для FPU более-менее понятно, то для MMX/SSE/AVX то же самое делать?
XVilka
Регистры MMX проецируются на регистры FPU и область сохранения у них общая. Поддержки AVX нет, так что пока хватит одного вызова. Размер области сохранения для fxsave 512 байт. Если SSE нет, контекст сохраняетя fnsave и используется только часть области.
Регистры MMX проецируются на регистры FPU и область сохранения у них общая. Поддержки AVX нет, так что пока хватит одного вызова. Размер области сохранения для fxsave 512 байт. Если SSE нет, контекст сохраняетя fnsave и используется только часть области.
Как вариант могу предложить 69.10 - получить состояние регистров FPU/SSE отлаживаемого потока.
Параметры:
eax = 69 - номер функции
ebx = 10d - номер подфункции
ecx = идентификатор потока
edx = указатель на область сохранения контекста размером 512 байт
область должна быть выравнена на границу параграфа (16 байт)
Возвращаемое значение:
Некоторые флаги в регистре eax
Реализация:
проверяем fpu_owner, если это отлаживаемый поток выполняем команду fpu для переключения контекста, копируем контекст.
Параметры:
eax = 69 - номер функции
ebx = 10d - номер подфункции
ecx = идентификатор потока
edx = указатель на область сохранения контекста размером 512 байт
область должна быть выравнена на границу параграфа (16 байт)
Возвращаемое значение:
Некоторые флаги в регистре eax
Реализация:
проверяем fpu_owner, если это отлаживаемый поток выполняем команду fpu для переключения контекста, копируем контекст.
Вроде можно добавить эту функциональность в 69.1/69.2, разве нет? Там выделен один из параметров под размер контекста.
Сделаем мир лучше!
CleverMouse
Это нарушает обратную совместимость.
Это нарушает обратную совместимость.
Serge, разве что новый клиент не будет работать со старым ядром, но так в любом случае будет.
Сделаем мир лучше!
В принципе можно. Просто я обожаю обратную совместимость. Но область сохранения FPU обязательно надо выравнивать.
Совместимость, так совместимость. Будем пилить 69.10
Так есть же совместимость. Старый клиент просто не заметит изменений в 69.1/69.2, потому что не знает, что их можно вызывать с edx != sizeof(контекст cpu).
Сделаем мир лучше!
Согласен, согласен на .1 .2
Убедили
Убедили
Who is online
Users browsing this forum: No registered users and 20 guests