SSE эмулятор

Тема в разделе "WASM.NT.KERNEL", создана пользователем cppasm, 17 мар 2008.

  1. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Привет.
    Никто не видел в природе SSE эмулятора?
    А то тут Adobe устроил засаду, Adobe Bridge хочет SSE для работы.
    Притом не то что хочет, а даже не проверяет ничего, а так как у меня CPU SSE не поддерживает - он просто валится.
    В отладчике я посмотрел - конечно оптимизация супер, без SSE ну просто никак.
    95% SSE кода это:
    movss xmm0,[mem1]
    movss [mem2],xmm0
    Ну вот собственно я и подумал, что если сэмулировать SSE, производительность будет приемлемая, тем более что Photoshop работает без проблем.
    Собственно почему тема в WASM.OS.KERNEL?
    Ну я больше чем уверен что нет такого эмулятора, прийдётся писать :/

    И есть пару вопросов:

    1. Есть ли в адресном пространстве процесса ниже 2Gb адреса куда он не лезет?
    Т.е. ImageBase обычно 400000h, а что находится ниже?
    Просто надо где-то хранить для каждого процесса XMM регистры, и адресное пространство - самое подходящее место.
    Тогда не надо отслеживать переключение задач и отлавливать завершение процесса для освобождения памяти занимаемой виртуальными XMM регистрами.
    Вопрос есть ли какая-нибудь функция MemoryManager чтобы замапить страницу в адресное пространство процесса ниже 2Гб желательно с доступом только из Ring0, и по каким адресам лучше мапить?
    Руками не охота что-то таблицу страниц править...

    2. Как из Ring0 проверить доступна ли память?
    Т.е. допустим в коде написана команда movss xmm0,[mem_addr]
    Я её буду эмулировать, и если прога бажная, mem_addr вообще говоря может быть недоступен.
    А BSOD ловить не охота...

    3. Как перехватить CPUID чтобы прикинуться что есть поддержка SSE?
    Что-то кроме трассировки ничего в голову не приходит, но это убьёт производительность в разы.
    Ну это не обязательно, эмуляция преимущественно делается для наглых программ которые не проверяют наличие SSE.
    Хотя было бы полезно.
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    cppasm
    не легче обновить хард, что бы не писать изначально глючный эмулятор
     
  3. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Было б легче я б не писал.
    Мне и без SSE нормально живётся, вполне MMX и 3DNow! хватает.
    А из-за одной проги покупать себе новый CPU не вижу никакого смысла.
    По теме что-нить можеш сказать?
     
  4. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.729
    Не пользуйся ей ...
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    cppasm
    для эдукатион полно интересных и серьёзных и нужных тем.
    поменяй железо
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    нельзя предугадать правильность кода, работающего в контексте процесса
    из-за ошибки в коде может идти обращение к любой части адресного пространства
    первые несколько страниц линейного адресного пространства обычно используются для детекста доступа к данным по нулевому указателю, т. е при нормальной работе туда никто не лезет
    можно отобразить туда нужные физические страницы со сброшенным U/S битом в соответствующих PTE
    правда это может сказаться на правильности обработки #PF ядром в случае доступа к ним из пользовательского режима
    VAD?
    никак
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.328
    cppasm
    раз ты говоришь (на краклабе), что sse-кода там не много, то не проще ли переписать функции, в которых он используется.
     
  8. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    это понятно, потому и хочу с доступом только из R0
    А какие с PF# могут быть проблемы?
    Вообще для этого есть функция какая-нибудь, или PTE прийдётся руками править?
    пошёл в Google...
    ну с тут я так и думал...

    Млин, впервые вижу коммерческий продукт который даже не говорит по человечески что хочу SSE, а тупо падает :/
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    У меня исходников нет :)
    Или ты имееш ввиду пропатчить?
    В принципе можно (это я первое начал делать), но там есть одна сложность.
    Код компилятором раскидан сильно.
    Т.е. есть к примеру
    Код (Text):
    1. xorps xmm0,xmm0
    а потом через кучу кода call функции, в которой
    Код (Text):
    1. movss [mem1],xmm0
    2. movss xmm0,[mem2]
    3. movss [mem3],xmm0
    И эту же функцию вызывают из других мест, но перед вызовом уже xor нету.
    И что в XMM0 отследить напряжно.
    Я пока что придумал, так это прилепить к файлу ещё одну секцию, и в ней все эти команды реализовать в виде процедур, а вместо xorps xmm0,xmm0 патчить на call sw_xorps
    Но проблема в том что длины опкода может не везде хватить...
    Хотя можно выкрутиться.
    Я просто думал эмулятор сделать может кому ещё надо, но после советов купить новый проц я всё больше склоняюсь к мысли просто пропатчить прогу.
    А может и вообще забить :)
    ПС: ещё как вариант поставить свой SEH и в нём эмулировать нужную команду...
     
  10. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    cppasm
    так у всех потому что есть.
    если дело в средствах - купи подержанный.
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    кто такой все?
    гигагерцовый атлон уже не процессор что-ли?
    дело не в средствах, а в принципе, и под Socket A с поддержкой SSE по-моему нифига нет.
    а менять всю систему я уж точно не буду.
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    к примеру неправильная интерпретация флагов в PTE
    т. е по-умолчанию PTE определяет набор флагов, которые предписывают обработчику #PF выполнение некоторых действий при возникновении #PF
    изменяем флаги - изменяется поведение
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    cppasm
    1. Зачем тебе Bridge? Есть фотошоп и без него, прежние версии. И тормозить не так будет на твоём железе. Я больше сомневаюсь, что SSE не нужен самому фотошопу (разве что он проверяет и имеет код для работы без SSE).
    2. Эмулятор-то написать можно теоретически, в ОС есть функционал, который тебе бы помог в этом. Но смысл? См п. 1.
    2. Эмулировать CPUID тебе не понадобится, ты же говоришь, что прога не проверяет наличие SSE. А для общего случая ничего нет, кроме аппаратной эмуляции. Для частного можно придумать по обстоятельствам.
     
  14. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ну Bridge в общем-то так, программа прикольная :) Особо не нужен.
    Дело ещё и в интересе.
    А Photoshop CS3 отлично работает, уже недели две пользуюсь.
    У него ядро есть - MMXCore или как-то так.
    Оно при старте проверяет какие есть расширения и использует максимальные из доступных.
    Я бы даже сказал нужные механизмы заложены в CPU в виде исключения UD# ;)
    То что оно нафиг никому не надо я уже понял...
    Та про CPUID можно забыть уже...
    Для этой конкретной проги оно не надо, я просто думал если полнофункциональный эмулятор делать то можно было бы опционально "software sse" включать даже для прог которые проверяют поддержку.
    В общем это последнее в очереди на реализацию, да и эмулятор наверное писать я уже не буду...
     
  15. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    cppasm
    если действительно хочется - пиши!
    просто дочерта разных тем, которые не только тебе одному интересны, и это всем
    пригодится. Сам решай что тебе интересно и нужно. Удачи!
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ну, это тоже. Я о
    Такое место уже есть: в контексте потока (было бы ошибкой хранить одну копию регистров на один процесс).
     
  17. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Насчёт процесса это я оговорился, конечно надо для потока.
    А можно по-подробней? По каким хоть ключевым словам в google искать.
    Т.е. как получить доступ к памяти хранящей текущий контекст.
    В принципе я предполагаю что где-то это должно быть, но я с ядром ОС не очень глубоко знаком.
    Обычно хранят в TSS, но в Win2k и выше физический TSS один на всех...
    К тому же тут вопрос: если у меня процессор не поддерживает SSE - в контектсе потока место под XMM регистры всё равно выделяется, но не используется?
    Может ведь ставиться другое ядро без поддержки SSE - и в контексте потока просто не будет места для регистров.
    Хотя это врядли...
    // Добавлено
    Обдумал немного.
    Основные вопросы:
    1. какой аналог GetThreadContext для Ring0.
    2. на каком IRQL работает обработчик исключения.
    3. не меняется ли структура контекста в зависимости от наличия/отсутствия SSE.
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    в TSS контекст не хранится
    смотря как идет сохранение/восстановление FPU-контекста
    если посредством fxsave/fxrstor, то место есть, т. к эти инструкции в любом случае оперируют с 512-ти байтной областью памяти, в которой предусмотрено место под XMM регистры
    если SSE не поддерживается процессором, то это место просто им не используется
    проверить, использует ли ОС fxsave/fxrstor, можно через CR4.OSFXSR
     
  19. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это понятно.
    Вопрос в том что если ОС не использует fxsave, а использует fsave - не меняется ли структура контекста. Ну это я думаю врядли, но всё же.

    Подскажите где найти структуру контекста и работает ли GetThreadContext из режима ядра.
     
  20. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Относительно простой метод:
    1. Делаешь inject в процесс своей DLL
    2. Хукаешь VEH
    3. Запускаешь.
    4. Произошел exception, смотришь какой.
    5. Если нужный тебе (попали на SSE комманду), думаешь что с ней делать. Если размер позволяет, меняешь на CALL <твой обработчик>. Если нет - эмулируешь на месте, но будет тормозить :-\ Вариант - если SSE комманды идут "кучкой", то их в своем обработчике пачкой и обрабатываешь - большая вероятность замены на CALL.
    6. Обработчик генерится от пропатченой комманды (какие регистры используются, etc) и вызывает generic handler конкретного опкода. Что то типа:
    ; Тут всякие push'ы для частей опкода (address там, или data)
    push mod/rm
    call handleMovSS
    ret

    Вобщем, гимморойно, но сделать можно.

    Edit: Да, thread-safety это отдельная тема.