Переключение VGA режимов портами

Тема в разделе "WASM.OS.DEVEL", создана пользователем Treant, 14 ноя 2009.

  1. reversecode

    reversecode Guest

    Публикаций:
    0
    in с порта это как задержка
    а еще с порта иногда нужно читать чтобы подтвердить чтение
     
  2. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    Плохие новости - переключить режим ни в какую не получается на GTX 260
    Просто ничего нет - no signal (((
    Подскажите что нибудь пожалуйста
    на 2 компах уже работает, а на этом никак
    ЗЫ: в реальном режиме переключил - переключился - написал put_pixel - вывел линию... так легко а с портами ужс
    ЗЗЫ начал дизассемблировать прошивку от GTX 260 - начало практически одинаковое.
     
  3. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Treant

    возможна, проще будет не дизассемблировать а логгировать обращения к портам? Вызвал функцию переключения режимов и смотри что в логах...
     
  4. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    PSR1257
    А можно поподробнее о том как это сделать
    Я даже не знаю с чего начать кроме гугла(
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ужас. Treant may not root there.
    Во-первых про порт 3С3h.
    Зачем эти танцы с бубном?
    Это стандартный VGA порт, документации полно - осталось только прочитать.

    По поводу выставления высоких разрешений.
    То что ты делаешь - это путь в никуда.
    Судя по датам постов - ты потратил уже больше двух недель.
    А результат нулевой. При том что это одна карта, а их десятки, если не сотни.
    Ты с каждой так извращаться будешь?
    Есть два нормальных варианта, которые будут работать везде (точнее он один в двух ипостасях).
    Первый - использовать Vesa Bios Extension, точку входа для работы в 32-битном защищённом режиме.
    Если она есть (обычно есть).
    Второй - использовать Vesa Bios Extension в режиме V86.
    За то время что ты ерундой страдаешь можно было уже написать и отладить поддержку V86 и потом вызывать кучу сервисов BIOS, а не только видео.
    Если есть 32-битная точка входя для PM - делать вообще ничего не надо практически.
     
  6. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    261
    cppasm
    Да я по документации и делаю и не работает, всмысле не везде работает
    И еще документация расходится - везде описан порт 3c3h а у intel он reserved.

    Насчет VESA есть максимум разрешение 1600x1200 и нету таких нестандартных разрешений, как 1024x600
    А у меня как назло как раз мониторы 1920x1200, и 1024x600

    Да, можно поставить стандартное разрешение, делал уже через VESA, но хочу чтобы без выхода в реальный переключаться, хотя бы на паре карт

    А что за точка входа для работы в 32 битном режиме?
     
  7. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Treant
    Логгирование обращений к портам может быть с использованием следующих аппаратных фич:

    0) Регистры DRx (DR7). Нормально работают в реальном режиме или в защищенном (про винду далее) но требуют установки своего отладочного прерывания; можно использовать в win98 (vxd), но вообще получается несовместимость с отладчиком типа Sice - отлаживать придеццо через многие reboot'ы;

    1) Битовая карта ввода-вывода. Не используется виндой потому и нет ни сервисов под это, и ломать существующую схему этой оси наверное очень сложно (карта на самом деле есть - одна - но она только для третьего кольца или V86 - для виртуализации - так что может если логгировать BIOS то может и прокатит).

    В не-win защищенном режиме (например для dos с extender'ами) возможно пользовать следующий сервис:
    ;
    ; Check Windows present
    ;
    mov ax,1600h
    int 2Fh
    or al,al
    jz @@Nowin
    cmp al,80h
    jz @@Nowin
    ... exit
    @@Nowin:
    ; Check Int 67h vector - emm
    push ds
    push 0
    pop ds
    mov ax,ds:[019Ch]
    or ax,ds:[019Eh]
    pop ds
    jz @@NoEMM
    ; Check EMM
    mov ax,0FFA5h
    int 67h
    cmp ax,845Ah
    jz @@EMMExist
    ; If EMM no present...
    @@EMMExist:
    ; Set protected mode ports handler
    mov ax,4A15h
    mov bx,0000h ; 0-function
    mov dx,ds:Port
    add dx,(PortArea - 1)
    shl edx,16
    mov dx,ds:Port ; port low, port hi
    mov cx,PortArea ; PortArea ; ports number
    mov si,offset Table02815
    mov ds:[si],dx ; base port number to structure
    ...
    mov di,offset @@InitWatcher ;; - offset begin
    int 2Fh
    jnc @@EMMOK
    jmp @@NoEMM
    @@EMMOK:
    ; Set new int 28h handler
    ...
    2) У обработчика прерывания #SMI (System Managment Mode) есть фича траппинга портов (в невозбранном количестве в отличии от DRx), причем ему абсолютно пофигу на Ring0 и на все остальное - мониторит все подряд. Единственная проблема - нужно знать для конкретного чипсета как попасть (и поменять) в этот обработчик. На старых моделях не было защиты [SMI] так что можно рекомендовать какой-то старый комп с тестируемой картой.

    Ну и программные. Возможно перехватывать виндовые stub'ы типа ReadPortUshort (HAL), но гарантии что твои обращения к портам идут через них нет никакой (я бы сказал вероятность почти нулевая... хотя если драйвер от производителя то может он и работает через них).

    Можно также (если есть возможность запускать потом) тупа патчить изучаемый код - все in/out подпрограммы - на логгирование, но вот не уверен что там будет с BIOS.
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Вообще-то можно просто установить обработчик #DB, установить флаг TF, вызвать прерывание 10h и в обработчике уже смотреть на следующую инструкцию, и если это in или out, запоминать произошедшую операцию. Нужно, впрочем, помнить, что int сбрасывает флаг TF, так что вызывать прерывание по pushf / call far [13h*4] (с ds=0), но даже с учётом этого вроде получается проще возни с i/o permission map.
    Можно с этого момента поподробнее? В мануалах Intel вроде ничего такого нет.
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    пардон, push 0 / pop ds / pushf / call far [10h*4], конечно же
     
  10. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Поищи на форуме, _BC_ 2-3 года назад об этом писАл. Фича заключается в настройке чипсета таким образом, чтобы запись-чтение по определенным адресам I/O space вызывала
    SMI#, причем SMI# обрабатывается ДО выполнения in/out, в отличие от брекпойнтов по DRx.
    В общем то влезть в обработчик SMI# нет ничего сложного, для этого даже мануалы по чипсету не нужны (атака, описанная Рутковской). Сложней настроить конкретные девайсы на генерацию SMI# по in/out. _BC_ тогда писАл, что это его ноу-хау ;)
     
  11. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Ага, спасибо, тему нашёл (если кому тоже интересно, вот она: http://www.wasm.ru/forum/viewtopic.php?id=8842&p=2). Впрочем, это чипсетозависимо и далеко не факт, что вообще существует на не-Intel'овских чипсетах, но всё равно интересно.
     
  12. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    и как тогда управлять pci если не через порты?
     
  13. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    все гораздо проще. берется дос, отладчик, и трейсится прервывание биоса, которое несомненно полезет в биос видеокарты
     
  14. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Про устанофку лофушки на порт в SMM:

    Код (Text):
    1. Set_IOtrap_I810 proc
    2. mov    cx,PIIX_ID
    3. shl      cx , 8
    4. mov    PIIX_ID, cx
    5.  
    6. mov    cx,PIIX_ID
    7. add     cx,0c6h
    8. mov    al,078h            ;set port 378h to be
    9. call     X_Set_Ct           ;I/O trap2
    10.  
    11. mov    cx,PIIX_ID
    12. add     cx,0c7h
    13. mov    al,03h             ;set port 378h to be
    14. Call     X_Set_Ct           ;I/O trap2
    15.  
    16. mov    cx,PIIX_ID;
    17. add     cx,0cch
    18. Call     X_Get_Ct
    19. and     al,0fh            ;set I/O trap2 mask
    20. Call     X_Set_Ct
    21.  
    22. mov   cl,41h
    23. call    X_Get_PMIO
    24. or      al,00000010b       ;enable I/O trap2
    25. call    X_Set_PMIO
    26. ret
    27. Set_IOtrap_I810 endp
    Это, конечно, проще только сколько инструкций трейсить? 1000h? Больше? BIOS отличаеццо тем что он не отличаеццо оптимизацией. Ты так пробовал делать хоть раз? Я раз сделал и больше не буду. К тому же трейс руками отличается от реального экзекьюшена и устройство в реальном времени может вести себя по-другому нежели когда команды поступают с частотой в 5-10 секунд а то и больше.
     
  15. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    PSR1257
    Пробовал, в институте. Были проблемы с int3, а пошагово все работало, помоему даже в Turbo Debugger
     
  16. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    PSR1257
    Помоему нужно было int 10 заменить на push/jmp