(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)