Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

нужна необычная обработка исключений для collapse [Delphi, Windows]


Страницы:   1 2

Владимир Кладов ©   (2005-03-12 20:43:00) 

кто-нибудь разбирался глубоко в обработке исключений на самом нижнем уровне? мне нужно вот что: научиться по исключению в обработчике вернуть управление на следующую команду. Команда, вызывающая исключение - некоторая 1-байтовая машинная инструкция, фиксированная, но любая. Хоть int 3 (не очень хорошо), а лучше например HLT ($F4 кажется). Для collapse надо, чтобы переход к выполнению P-кода занимал всего 1 байт, а не 5, иначе овчинка дороговата...

Т.е. на самом деле надо чтобы стек был в той же позиции, что и при исключении, и все регистры те же, но я мог бы смоделировать вызов некоторой подпрограммы, как если бы call сработал. Можно направить меня куда-нибудь, где ответ знают.

Другой вариант решения - "начать отладку" процесса, ловить событие соответствующее. Правда, в этой области я еще ничего не знаю, не знаю даже получится ли вообще процессу начать отладку самого себя...


Владимир Кладов   (2005-03-13 20:09:00) [21]

Забыл добавить:

InstallCollapse должно быть вызвано как можно раньше, до первого try-finally/except и до первого возможного обращения к П-коду (возможно, даже некоторые процедуры из System будут перекроены на новый лад, так что может быть в initialization в system.pas придется тогда добавлять). Этим же манером возможно установить глобальный обработчик какого-либо типа ошибок. Например, вместо того, чтобы во всяком подозрительном месте отлавливать деление на 0 через свой собственный try-except, можно прямо в этом месте поправить делитель/делимое, и просто продолжить выполнение... И тогда отдельные try-except не нужны. И еще: Exception (класс такой) тоже не нужен, и err.pas не надо подключать, все сделано на уровне SEH, без того, что навершивает на SEH сама Delphi... Так что вооружайтесь.

Сейчас погляжу на часы, может еще обновление выложу...


Владимир Кладов   (2005-03-13 19:59:00) [22]

Все, я управился :)

procedure EmulatePCode;
asm

end;

var Collapse_OldHandler: Pointer;

procedure Collapse_Handler;
asm
 mov edx, [esp+12] // edx = @ Context
 mov ecx, [edx].TContext.Eip
 cmp byte ptr [ecx], $F4
 je @@collapse_F4

 jmp dword ptr [Collapse_OldHandler]

@@collapse_F4:
 {$IFDEF JUSTSKIP_PRIVILEGE}
 inc dword ptr [edx].TContext.Eip
 {$ELSE}
 mov ecx, [edx].TContext.Eip
 inc ecx
 mov eax, dword ptr [edx].TContext._Esp
 sub eax, 4
 mov dword ptr [edx].TContext._Esp, eax
 mov [eax], ecx
 lea ecx, [EmulatePCode]
 mov [edx].TContext.Eip, ecx
 {$ENDIF}
 xor eax, eax // "ïðîäîëæèòü"
end;

procedure InstallCollapse;
asm
 xor eax, eax
 mov edx, fs:[eax]
 mov ecx, [edx+4]
 mov [Collapse_OldHandler], ecx
 lea ecx, [Collapse_Handler]
 mov [edx+4], ecx
end;


This code allows to start emulating P-code each time when F4 occure in the code... Just from the next byte P-procedure header can start. No more 5-bytes , economy is about 4*N bytes, where N = number of Pascal (or Assembler) procedures/functions/methods rewritten to P-code. This method is not fast since exceptions are used, but if P-procedure is called from another P-procedure, the emulator itself can check if F4 code is there and in such case simulate as needed, so no exception will be in such case, only when P-procedure is called from the usual code...


thaddy   (2005-03-13 17:31:00) [23]

did you possibly overlook the caching mechanism? I mean wbinvd can write back the cache changes to memory which would restore proper state maybe? I didn't try this because I have no use for such lowlevel things. I suggest you contact Tomasz Grysztar. He maybe able to help.


thaddy   (2005-03-13 17:28:00) [24]

did you possibly overlook the caching mechanism? I mean wbinvd can write back the cache changes to memory which would restore proper state maybe? I didn't try this because I have no use for such lowlevel things. I suggest you contact Tomasz Grysztar. He maybe able to help.


Владимир Кладов   (2005-03-13 16:45:00) [25]

в примерах для FASM ничего не нашел. Есть что-то для MASM32, но там используется SEH. В Delphi это не помогает, здесь на SEH накладывается куча мала всего. В итоге я могу проверить в обработчике EXCEPT, что действительно сработала "неверная" команда по некоторому адресу. Но никак не получается передвинуть Eip в CONTEXT-е (и даже непонятно точно, где этот самый контекст располагается, т.е. передвинуть можно, но эффекта это не дает). Финальный вопрос - как же все-таки заставить систему поверить, что действительно обработка завершена, и надо просто восстановить контекст, и продолжить выполнение со следующего байта. Уже второй день бьюсь, без результата :(


thaddy   (2005-03-13 04:50:00) [26]

I only know that after a halt the only instructions that can re-enable the processor are an enabled interrupt, a debug exception $33 and the RESET, BINIT and INIT operands. Look at how FASM handles this in its exception examples. The author is very helpfull and knowledgable on this subject


thaddy   (2005-03-12 21:07:00) [27]

Maybe a look at the X86 compiler core from Freepascal would help?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо