(toppers-users 392) Windows-HAL バグ修正
Takayuki WAKABAYASHI
takayuki @ ertl.ics.tut.ac.jp
2002年 5月 23日 (木) 22:00:05 JST
豊橋技術科学大学の若林です。
株式会社リコーの竹内さんより、
TOPPERS/JSP Windows環境のバグ報告を頂きました。
---8<---
症状 プログラムが暴走する
原因 コンソールシリアルエミュレータの関数の中で、
ESI/EDIレジスタの退避を行っていない
頻度 まれ (発症条件がそろうことがまれ。そろえば常に起こる)
条件 1. Visual C++を使用している
2. コンソールシリアルエミュレータを使用している
3. タスクの中でEDI or ESIレジスタを使用している最中に、
serial_read関数を呼び出す
#ただし、デバッグビルドを行った場合
#ESIのみの破壊では発症しない (コンパイラの機能)
場所 MemoryCopy関数(jsp/config/windows/serial_console.cpp:98)
対象 TOPPERS/JSP Release 1.2以降
修正 該当する関数を、次のコードで置き換える。または110行目の
#defineのみを残し、#ifdefブロックを削除する。
--- ここから ---
__forceinline __declspec(naked) void * __fastcall MemoryCopy(void * dest, void * src, unsigned int size)
{
__asm mov eax, ecx
__asm pop ebx
__asm pop ecx
__asm push esi
__asm push edi
__asm mov edi, ecx
__asm mov esi, edx
__asm rep movsb
__asm pop edi
__asm pop esi
__asm jmp ebx
}
--- ここまで ----
--8<---
竹内さんには、バグ報告と一緒に問題点まで指摘して頂きました。
レジスタ破壊でプログラムが暴走するという非常に頭の痛い種類の
バグだったのですが、「EDIレジスタが破壊されている」という
ご指摘を頂いたおかげでかなり早く問題解決に至りました。
#さらに その後で修正コードまでもご提供頂きました
竹内さん、いろいろとありがとうございました。
大変感謝しております。
--------
わかばやし たかゆき (mailto:takayuki @ ertl.ics.tut.ac.jp)