高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

spacer image


Technote 1084

Running CFM-68K Code at Interrupt Time: Is Your Code at Risk?


内容

問題の定義

問題が発生しうるコードの例

まとめ
り込み時に CFM-68K コードを実行することは、デベロッパの皆さんにとってリスクをともないます。Code Fragment Manager-68K コードが割り込み時に実行されると、割り込み終了後に実行される従来形式の68Kコード(classic 68K code)のA5レジスタ値が不正になる可能性があります。
E.T.O. #21のリリースノートに記述されてはいるのですが、 CFM-68K コードを割り込み時に実行することができないという制約に気づいていないデベロッパもいるかもしれません。この制約は CFM-68K のすべてのバージョンに存在しているものであり、したがって、68Kマシンで実行するコードにのみ当てはまります。デベロッパの皆さんは、 PowerPC 上で実行されていたコードをCFM-68Kに移植した場合、それが68Kマシン上でもまったく同様に実行されると考えることでしょう。しかし、割り込み時に実行されるコードに関する限り、それは正しくありません。
もしCFM-68Kコードを開発しているか、あるいは、利用しているのであれば、本 Technote を読んでこの制約が開発中のコードに影響を及ぼすかどうかを判断してください。


問題の定義

この問題は、CFM-68Kコードを実行中に割り込みが発生し、その中でCFM-68Kコードが起動される場合に生じます。その結果、従来形式の68KコードのA5レジスタ値が不正に変更されてしまうことがあります。
この問題は、68K版の Mixed Mode と割り込みシステム相互の作用に起因します。CFM-68Kが実行されている間、従来形式の68KコードのA5レジスタ値は Mixed Mode が管理します。割り込みが発生しその中でCFM-68Kコードが実行されると、従来形式の68Kコードを実行するために Mixed Mode 内に保存されているA5レジスタの値が不正に変更されてしまいます。従来形式の68Kコードの実行が再開されるときにはもはやA5レジスタは正しい値ではなく、それ以降のA5レジスタ相対参照( A5-relative reference 、例えばグローバルデータを参照する際に行われる)も正しく行われなくなります。その結果、従来形式の68Kコードはおそらくシステムクラッシュを引き起こすでしょう。

註:PowerPCでは割り込みシステムとMixed Modeがナノ・カーネル( nanokernel )により統合されているため、この問題は発生しません。

問題が発生しうるコードの例

以下は、割り込み時(あるいは例外時)に実行されるコードの例です。それらの中でCFM-68Kコードを実行することはできません。
  • Deferredタスク
  • VBLタスク
  • I/O完了ルーチン(I/O completion routine)
  • プリエンプティブ・スレッド
  • プロセッサ例外
これらは、以下のような場合も含みます。
  • CFM-68Kコードをポイントしているルーチン・デスクリプタが、割り込み時に実行されるとして先にあげたルーチンとしてシステムに渡される場合。
  • CFM-68Kコードが割り込みハンドラからコールされる場合。
  • CFM-68Kコードをコールしている従来形式の68Kコード(Classic 68K code that wraps a CFM-68K implementation)が割り込みハンドラやルーチンからコールされる場合。
  • 割り込み時に実行可能なトラップ(interrupt-safe trap)が、CFM-68Kコードをポイントしているルーチン・デスクリプタで(あるいは、CFM-68Kコードをコールする従来形式の68Kコードで)パッチされている場合。
もし従来形式の68Kコードによるサービス(例えば、静的ライブラリ)を提供しており、かつ、その実装にCFM-68Kコードを使用しているのであれば、クライアントに対するドキュメントを作成し本件を明確にしておくべきです。皆さんが提供するサービスを利用するクライアントは、それらが割り込み時に実行不可能であること知っている必要があります。

まとめ

現在のところ、AppleはCFM-68Kコードを割り込み時に使用することをサポートしていません。しかしながら、CFM-68Kコードを割り込み時に使用することを希望するデベロッパの皆さんのために、Appleは現在解決策を見つける努力をしています。CFM-68Kの将来のバージョンでは、CFM-68Kコードを割り込み時に使用することが可能になるでしょう。もし、CFM-68Kコードを割り込み時に使用しているのであれば、従来形式の68Kを割り込み時に使用するために必要な手順を実行するようにしてください。

参考資料
Technote 1077 - Calling CFM Code From Classic 68K Code、 or There and Back Again、 A Mixed Mode Magic Adventure
spacer image