昔の最近の出来事(2002.06)

2002/06/30

出張。帰着。

眠くて死亡。

2002/06/29

出張。

2002/06/28

出張。

2002/06/27

日付け越え。

ちょこーりコーディング。

2002/06/26

日付け越え少し前に帰着。

ちょこーりコーディング。

2002/06/25

日付け越え少し前に帰着。

何気に3D CGアルゴリズム関連資料を探索してみたり。 同じような内容の資料は沢山ありますが、論理だけに留まって コードが無いとか割と多いように感じました。以前、OpenGLを 使ってみて、至れり尽せりさ加減に感動したものですが、 それだけに、知らなくても使える部分が多いから、「....という事を ライブラリがやってくれるので、別に知らなくても大丈夫です。」 って感じになるのかなぁなどと思ってみました。それでも、オブジェクトの 動きのアルゴリズムだとか、自分で考えなくてはならない部分に 専念できるという点はメリットだとは思いますけどね。

ちょっと横になったら、電気もTVもつけっぱなしで朝まで爆睡 してました。

2002/06/24

風邪ひいたみたい。

WBSでやってた大容量光ディスク。DVDサイズで24時間×1ヶ月間 TV録画し続ける事ができる豪快な容量が素敵。世の中頭打ちには、 なかなかならないものだなと思いました。

力尽き気味で死亡。

2002/06/23

普通に起きて休日出勤(T_T)

日のあるうちに帰れたので、掃除したりゴミを片付けたり。 一通り終った後、帰り際に何気に買った「超アーケード」を読んでいたのですが、 眠くなったのでちょっと目をつぶったらそのまま爆睡(汗; 起きたら MIBも中盤にさしかかろうという時間。

ちょこーりプログラムをいじったりしながらダラダラ過ごして 一日終了。

2002/06/22

夕方頃起床。寝過ぎ(<ってまたかよ)。

先日仕掛けたMegaPOV実行の結果を、プロ遊下の「PPC-gccのコンパイラ性能比較」に 反映しました。バージョンが上がる毎の傾向は同じようです。

打ち切り宣告されたウルトラマンコスモスの総集編が放送されていました。 放送が始まる前のウルトラマンによる事の経緯の説明セリフで「ムサシがいつ戻って 来るのか私にも判らない」という所が切ないと思いました。 これを見てて、昔、美少女3DCG作家であるところの由水桂氏が「CGはスキャンダルが 無いのが良い」と言ってたのを思い出しました。

食料調達ついでに本屋に。電撃王と幽玄漫玉日記(6)を査収。

2002/06/21

日付け越え前に帰着。

先日makeを仕掛けたmipsクロスgccの確認。結果から言うとOKでした(^^)。 -gでシンボルもきちんと入るので、gdbのmipsシミュレータで動作 させた時も正しく行ごとにBreakPointを設定できました。あぁ、 ちゃんとしてないなんて言ってしまってすんませんm(_'_)m (>mips gccの方々(誰?!)。それにしても、オプティマイズレベルを上ると 出ていたインターナルエラーが出なくなったのはイマイチ理解ができません。 --with-gnu-as/ld オプションと何の関係があるのかしら?

ppcクロスgccの方も出来あがっていたのでMegaPOV実行を仕掛けて寝る。

2002/06/20

少し早めに帰着。

ダウンロードしたgcc-3.1を取りあえずmipsクロスコンパイル。 でもやっぱオプティマイズレベルを上げるとInternal ErrorでNG。

test> /usr/local/mips/bin/mips-powerx-elf-gcc -c -Wall -O2 -mno-mips-tfile  -I. -I/usr/local/mips/ppclib/include gdbtest.c
gdbtest.c: In function `main':
gdbtest.c:12: Internal compiler error in text_section, at varasm.c:241
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions.

問題個所を指摘しているメッセージに見えるのですが、実際 に見てみても、テキストセクションがエラーしているという事くらいしか判らなくて、 結局メッセージと同程度の情報しか含んでいないようです。-dyオプションを 付けてみたりして、エラーの経緯がもう少し詳しく出ることを期待したのですが、 情報無し。うーむ、こういう時どうやって調べるのが良いのやら。

そしてPPCクロスコンパイル。終りそうにない気分。Altivec対応版が本格的に でてきそうなのは3.2くらいかららしい。

何気にgccのサポートプラットホーム関連資料を読んでいたら、 mipsはIRIXなど既存OS付属のas/ldを使用するのがデフォルトで云々。 また他のアーキテクチャでは、デフォルトでGNU-as/GNU-ldを使用しない ので、--with-gnu-asなどを付ける必要があるなど云々。もしかしてこれか? と思い、--with-gnu-as --with-gnu-ldを追加してconfigure/makeを仕掛けて 寝る。

2002/06/19

日付け越え。

CygwinでDLLを生成する手順を ここ から仕入れて練習。手数が少々多いのですが、一応生成OKでした。 あと、libpngのCygwin用Makefileを使用すると、DLLを生成するような Makefileになっていて、そちらも参考になりそうです。

何気にWebぐるしていたらgcc-3.1が出ている模様。全然気づかなかった(^^;

2002/06/18

日付け越え少し前に帰着。

ppcsimをちょこりいじり。シリアルポート入力を行うためにグラフィック ウインドにキーセンスコードを追加してましたが、結局、キーコード(?) からASCII文字への変換方法がいまいちよく判らず。MapVirtualKey() というWinAPIを使用することで、仮想キーコードからASCII文字に変換できそうな所 までは判ったのですが、仮想キーコードはどうやればキー入力から得られる ものなのか判らず。

CygwinでもDLLを生成できるらしい。要調査項目。

2002/06/17

日付け越え少し前に帰着。

先日ppcbootをコンパイルした際に、IOデバイスがROM空間に割当たっていると 書いたのですが、正しくはPCIメモリ空間でした。また、ROM空間でも、特に ROMとして割り当てる必要は無いため、デバッグ用のデバイスを割り当てる 目的でROM空間にIOデバイスを割り当てるデザインもあるようです。

そんな感じなので、ppcsimのメモリ割り当て方法を、現在の256MB×16セグメント から16MB×256セグメントに変更することにしました。一部ハードコーディング されている部分がありましたが、ちょこっといじって修正完了。 取りあえずレベルダウンはしていなさげ。

随分前からやっていた「放送作家トキワ荘」。番組中で生み出される企画より もその添削を行うT部長のコメントの方が面白いと思いました。電波の企画はかなり無茶 なものが多いと思っているのですが、どの企画も何故か最後は信じられない ような成功を収めて終了していると思います(稀に大ハズレの時もありますが)。 添削コメントに「こうなるであろう事が予想できなくてはダメ」 みたいな節がよく見られるように思いました。これを 見ていると、電波の企画はデタラメに考えられている訳でなく、成功する ことが非常に高い確率で期待できると判っているから、企画として成立 させる事ができるのではなかろうかと思いました。 電波少年的地球防衛軍のような、絶対に成功があり得ないと思われるような 企画の成功が見ぬけていたとすると、それはある意味 神がかり的眼力がある ように思えるのですが どうでしょう?(^^;

2002/06/16

昼過ぎ起床。掃除したり洗濯したり。

CGを描きながら過ごしてみたり。以前からあった彩のバグなのですが、 それっぽい再現方法が判ったのでメモ。

  1. 適当な線画を使用してマスクを自動選択する。
  2. 一度ブラシツールなどに切り替えて、スクラッチパッドなどから適当な 色を拾っておく。
  3. マスクをレイヤーに変換を実行する。このとき、色作成ウインドの 色がなんだか変になっています。色を選ばずそのままOKを実行する。
  4. 生成されたレイヤーの選択領域のエッジがヘンな色になってれば 再現成功。この状態でレイヤーに対して着色を行うと、不思議な色味 で塗られます。

以上、再現確認してみてください。

コンビニにキティちゃんの団扇が置いてあったのですが、思いっきり 日焼けしたキティちゃんですよ。様々なコスプレをするキャラという 意味で他に例を見ないくらいの、いじられキャラのような気がします。

何気にチャンネルザッピングしていたら、「ゲームクリエーターズ」と いう特番(の再放送?)をやってました。前半が終っているような所から 見はじめたのですが、KOEIの会長やらセガの水口氏やらコナミの小島氏 やら他、色々な人(ただPS系のメーカーが対象だったようで、任天堂の宮本氏 は出てないようでしたが)が出てました。「最近のゲームは...」とは言われて いますが、インタビューの話だけ聞く分には、作り手の方はそれなりに 新しい事を色々と考えているのだなぁと思いました。また、ハードの進化 は大手にしてみれば、やっぱ使い甲斐がある程、燃えるという感じの ようです。良い事だと思いました。

2002/06/15

夕方起床。寝過ぎ(汗;

シリアルポートをちょこりと実装。つっても出力方向だけ。基本は consoleデバイスと同じという感じ。Linuxカーネルの方はポートの 初期化が終った頃からメッセージが出てくる様子。ppcbootの方は 何も出力は無く、シリアル入力がポーリングされている様子。 入力ができるように、グラフィックデバイスの方でキーボード 入力を受けて、それをシリアルポート入力としてセンスできるように しようとしたのですが、キーコードが返っているようで、ASCIIに 変換する必要がありそうな予感。

何気に本屋で「はじめての水墨画」という本を買ってみました。 水墨画自体に別段興味は無かったのですが、パラパラとめくってみた 所、筆運びや墨の付け方、筆先の作り方など、実に多彩な基本テクニック があり、それを組み合わせて描くというのに非常に興味をそそられ ました。かすれをうまく使って石桶の表面を表現したり、筆跡の 中心が濃くなるような手法(内脈というらしい)で、魚の背を表現した り、なるほどと思わされます。単に墨で描けば水墨画っぽく見える とは思いますが、これらの表現手法を知ると、単に墨で描いただけ では表現が乏しく感じるようになるのかもと思います。
この本の中で出てきた筆使いを見ていると、CGで筆を完全に 再現するのは、インターフェースも含め当分の間は不可能だと 感じました。

2002/06/14

少し早めに帰着。

サッカー勝ったらしいというニュースを見てたら眠くて死亡。

2002/06/13

日付け越え。

先日の彩の動作確認で、一つ起こった不具合があったのですが、 再現できるようなのでメモ。

  1. 2000×2000のキャンバスを新規作成
  2. 領域選択でキャンバス全面を選択
  3. 選択領域をマスクからレイヤーに変換で全面塗りつぶしレイヤーを作成
  4. 全面塗りつぶしレイヤーをレイヤー複写で数枚複写(スワップしっぱなしになる)
  5. 新規レイヤーを一枚割り当て、ブラシ等で適当にラクガキ (スワップでガリガリ状態)
  6. キャンバスを保存せずに終了
  7. 以上で彩のウインドは消えて見た目は終了したように見えるのですが、 彩本体のプロセスがビジー状態のまま(CPUも使いっぱなしで)残って しまう場合があります。この状態では、他のアプリが起動できない場合が あるようです。Cntl+Alt+DEL でプロセスを殺せばメモリもCPUも開放され、 BUSY状態から開放されるため、他アプリを起動する事が可能となります。
メモリ管理関係が狂ってしまっているのか、スレッド間のメッセージ通信 が、スワップインのため時間関係が逆転してしまい、メッセージがロスト する場合があるのかは不明ですが、再現確認をしてみてください。

パイレーツってこんなキャラでやってましたっけ?

2002/06/12

日付け越え。じわじわ来たよ。

彩で色々動作を試していたら落っこちたり無反応になったりしまいに Windowsがハングったり(^^;

XBOXのブロードバンドユニットで、音声コミュニケータというのが あるのを知りました。普通に考えるとTV電話みたいな使い方をする のかとも思ったのですが、 シーマンの音声認識機構とPSOの自動翻訳機構を組み合わせて、 音声自動翻訳とかできるとスゲーなと思った。

2002/06/11

少し早めに帰着。

ちょっと前にCVS coしておいたgccでmipsクロスコンパイル。 以前オプティマイズレベルを 上げるとインターナルエラーでずっこけていましたが、今回coしたもの もやはりNG。なんだ?盛大に更新した痕跡がありそうなのですが、 状況変化無しというのは、クロスコンパイルのやり方に何か問題が あるのかしら?

消しゴムで消せる水性ペンのCMのD-inkを何気に買ってみました。一応 消える事は消えますが、若干の跡は残る模様。それよりも、指とかで 擦ると結構消えてしまうようなので、何度も参照するようなメモに 使うのはあまり向いていなさげ。

2002/06/10

少し早めに帰着。

何気にppcbootをコンパイルしてみました。以前コンパイルしようとして失敗 したときは、glibcを標準Cライブラリとしてgccを構築していなかったため、 glibcに含まれるマクロ群がことごとく見つからなくて全くダメダメでした。 以前作ってあったglibcを標準Cライブラリにしたgccを使用して、適当なボード をターゲットにしてコンパイルしてみた所、いくつか手を入れる部分がありました がコンパイルに成功しました(^^)v。
ターゲットをmake BAB750_config で指定して取りあえずコンパイルして みたのですが、bootローダをROM空間(0xff000000)に配置するようになっていて ppcsimではメモリを割り当てられなくてNG(^^;

で、board/eltec/bab750/config.mkのTEXT_BASEを0xff000000から0x40000000に、 include/config_BAB750.hのFLASHメモリの配置位置も0xffc00000から0x40c00000に 変更してコンパイル。そして実行。stwbrx(バイト反転ストア)が未実装でNG(^^; 入れた記憶があったのですが、ロードを入れただけだったらしい。で、実行 するとメモリアクセス越えでずっこけ。0xfec00cf8にストアを実行している のですが、このアドレスはシステムコントローラMPC106のPCIコンフィグレー ションレジスタのアドレスになっています。所が、メモリマップ-Aでは 0x80000cf8に割当たっているのが正解で、CFG_ADDRESS_MAP_Aがdefineされている にも関わらず、何故かメモリマップ-Bのような振る舞いを行っています。 メモリアクセスを行っている命令列のアドレスから、関数を逆引きして、 board/eltec/bab750/mpc106_init.Sのset_address_map()が該当個所である のを見つけたのですが、ifdefでCFG_ADDRESS_MAP_Aの時は0xfec0をlisで読み込んで いて、明らかに仕様と反対の事をやっているように見えます(^^; ifdefをifndefにするべきなのか0xfec0を0x8000にするべきなのか判りませんが 、とりあえず後者でしのいで実行した所、動きっぱなしになり、適当な所 で止めるとwaitEmpty()という関数で止まっているようだったので、何かが 動いているような気分。シリアルポートのコントローラを実装できれば、そちら を経由してメッセージ出力されそうな予感がしなくもありませんが、取りあえず ここまで。

2002/06/09

適当な時間に寝て割と朝早く起きて、また寝てしまったら夕方(T_T)

bochsのbiosソースを眺めていると、ディスクの読み出しの場合、 最初にDMAをセットして、その後FDCにコマンドを入れています。

  4059          // turn on motor of selected drive, DMA & int enabled, normal operation
  4060          if (drive)
  4061            dor = 0x20;
  4062          else
  4063            dor = 0x10;
  4064          dor |= 0x0c;
  4065          dor |= drive;
  4066          outb(0x03f2, dor);
  4067  
  4068          // check port 3f4 for drive readiness
  4069          val8 = inb(0x3f4);
  4070          if ( (val8 & 0xf0) != 0x80 )
  4071            panic("int13_diskette:f02: ctrl not ready");

ここだけ見ると、0x03f2ポートにコマンドを入れて、0x03f4が0x80だったら それでOKっぽく見えます。因みに、ppcsimでのFDCへのコマンドと割り込み生成の タイミングは以下のような感じ。0x3f2ポートに0x0cを入れたときに発生するよう にしてみました。

<6>Floppy drive(s): fd0 is 2.88M                               ; Linuxコンソールメッセージ
Passed count= 78410807 : floppy_grab_irq_and_dma
touch memory 0x800000a1 (prob=0x80000078) at pc=0xc000da90     ;  ──┬─PIC0 IR allマスク
PIC1 : IMR=ff , ISR=00 , IRR=00                                ;  ──┘
touch memory 0x80000021 (prob=0x80000000) at pc=0xc000daac     ;  ──┬─PIC0 IR FD/IR2マスク開く
PIC0 : IMR=bb , ISR=00 , IRR=00                                ;  ──┘
Passed count= 78411902 : reset_fdc_info
touch memory 0x800003f2 (prob=0x80000078) at pc=0xc00841cc
FDC(pc:c00841cc,ad:800003f2,st) = 00 00 04 00 80 00 00 00      ;  ────FDC-Enable?
Passed count= 78412033 : set_dor
touch memory 0x800003f2 (prob=0x80000078) at pc=0xc007bc08     ;  ──┬─FDCコマンド FDC-Enable,DMA-Enable?
FDC(pc:c007bc08,ad:800003f2,st) = 00 00 0c 00 80 00 00 00      ;  ──┘  motorは回していない
pc=00000500 : Catch External Interrupt.                        ;  割り込み発生
touch memory 0x80000020 (prob=0x80000000) at pc=0xc000d898     ;  ──┬─割り込み要因の回収と
PIC0 : IMR=bb , ISR=40 , IRR=40                                ;      │  再設定
touch memory 0x80000020 (prob=0x80000000) at pc=0xc000d8ac     ;      │
PIC0 : IMR=bb , ISR=40 , IRR=40                                ;      │
touch memory 0x80000021 (prob=0x80000000) at pc=0xc000da2c     ;      │
PIC0 : IMR=bb , ISR=40 , IRR=40                                ;      │
touch memory 0x80000021 (prob=0x80000000) at pc=0xc000da40     ;      │
PIC0 : IMR=bb , ISR=40 , IRR=40                                ;      │
touch memory 0x80000020 (prob=0x80000000) at pc=0xc000da58     ;      │
PIC0 : IMR=bb , ISR=00 , IRR=00                                ;  ──┘
<7>Unhandled interrupt 4, disabled                             ; Linuxコンソールメッセージ ダメ?

という感じ。そもそもリセットごときに割り込みで返事を期待する必要は 無いような、でも既にプロセススケジューリングが始まっている状態で ポーリングにする必要も無いような。というか、やはりFDCへのコマンド の出し方がいまいち変な気分も。

そういや、コンパイルに失敗してほったらかしになっていたppcbootの方 のFDCコントロールはどうやっているのか調べてみました。 common/cmd_fdc.cがコードの実体で、fdc_setup()というそれっぽい コードを眺めてみたところ、bochsのbiosとも、またなんだか随分様子が 違うなぁという感じ(^^;カーネルは、ブートローダによってFDCがある程度初期化 されている事を期待しているのかしら? bochsのbiosのFDCリセットコードは 実際にFDCへコマンドを出している感じではなかったので、一番まともっ ぽいのはppcbootのコードの気がしなくもない予感。

2002/06/08

朝一瞬目が覚めた後、また寝て次に暑くて起きたら昼過ぎ。寝過ぎ。

ちょこりお出かけ。何気に液晶ディスプレイとか眺めてみたり。うーん、 確かに安くなっていますが、やっぱまだ液晶独特の色合いには慣れません なぁ。テキストエディットするだけとかだと気にするところではないと は思いますが。

帰ってからppcsimのIOデバイス周りのコードを書き換え。 デバイス毎にソースを分離して、IOエントリテーブルを用意して そのエントリテーブルにポートアドレスを仕込んでおいて 比較するという構造にしてみました。で、FDCからの割り込みを PICに伝えてプロセッサに割り込みが伝わるようにしてみたのですが、 結局、FDCのあるべき振る舞いがイマイチよく判っていないため、 どのタイミングで割り込みを出して良いのやら。

KOJIさんと電話でお話。彩の巨大キャンバスエディット時のパフォーマンス 低下についてとか色々。

2002/06/07

少し早めに帰着。

帰ってきて横になったらそのまま朝まで爆睡(汗;

2002/06/06

起きたら風邪が悪化していて休業。本当に一日中寝てました。

先日拾った割り込みコントローラの資料読み。つっても英語は読めませんが(涙。 フィーリングで読んだ所、IR入力に信号が入るとIRR(Interrupt Request Register) にデバイスからの割り込み要求が保持され、IMR(Interrupt Mask Register)値を 通してプライオリティ制御が行われるようです。INT出力に信号を上げると同時に、 ISR(In-Service Register)にIR番号に対応したbitをセットして、 CPUからの割り込み処理終了信号INTA待ちになり、それが 上がると、ISR,IRRはリセットされて次の割り込みを受け付けられる状態に なるという感じのようです。イマイチよく判らなかい点は、CPUの割り込み 処理終了信号であるところのINTAですが、PPCではそのような信号は出てい ません。データシートの図にはIRRをリセットする信号が書かれていない ため、FREEZE信号でIRRの内容を更新しているように見えるのですが、 このFREEZE信号の説明には 「!FREEZE is active during !INTA and poll sequences only.」など と書かれていて、INTAをどうにかしなくてはIRRの更新ができないように 読めました。いまいち判りにくかった「I/O制御プログラミング入門」を 合わせて読んでみた所、EOI(End of interrupt)コマンドと呼ばれる 割り込み完了をポートを通してコントローラに通知する手段が設けられ ており、ICW4.AEOI(Auto end of interrupt)が1であればEOIコマンド を発行する必要がなくなりますと(通常はAEOI=0にするとも)書かれて います。これを考えると、INTAが出せないプロセッサではICW4.AEOI=0 でも、IRRが更新できなければ変という感じがします。
これらの情報をまとめて動作を推測しますに、IR入力に割り込み が入るとIRRに保持され、プライオリティを取ってINT出力を上げて、 それをプロセッサ(PPCとすると)が受け付けると外部割り込み例外が 発生して割り込みベクタに飛びます。カーネルはISRを読みとって、 どのデバイスからの割り込みかをチェックし、割り込み処理を ドライバ等が行った後、EOIを発行して割り込み処理を終了する という感じなのでしょうか?
因みに先日のLinuxの割り込みについてのドキュメントを読んでみると、 ISRはInterrupt Status Registerと読みかえられています(ソース のコメントにもこの単語がありました)。どうでも良い事ですが、 個人的意見で言うと、Statusという単語は意味が判るようで実は判り にくくて、「何のステータスなの?」と、結局、何のレジスタか判らない ものです。In-Serviceの方が意味を持ったレジスタ名としては良い呼び方 だと思いました。あと、何故Programableなのか理由がよく判りません でしたが、IMRによる割り込みマスクや割り込み優先順位を自由に変更 できるという意味でプログラマブルという事のようです。

食料調達ついでに本屋へ。ヒカ碁(17)査収。飯食べる前に一気読み。 あぁ、面白かった。新シリーズも楽しみ。

ぐじぐじとPICを実装。取りあえずできたので、リンク&実行。Linux カーネルを実行した結果は以下。

PIC0 : IMR=ff , ISR=0 , IRR=0
PIC1 : IMR=ff , ISR=0 , IRR=0
PIC0 : IMR=fb , ISR=0 , IRR=0
Passed count= 138141521 : floppy_init
Passed count= 138157497 : reschedule_timeout
Passed count= 138191850 : floppy_grab_irq_and_dma
PIC1 : IMR=ff , ISR=0 , IRR=0
PIC0 : IMR=bb , ISR=0 , IRR=0
Passed count= 138192945 : reset_fdc_info
Passed count= 138193076 : set_dor

まず、最初は両方のPICのIMRを0xffにマスクし、続いてMasterPICの IR2のマスクを開いてSlavePICの割り込みを生かしています。その後、 floppy_grab_irq_and_dma()の実行で、FD割り込み番号である所のIR6を 開いて割り込み受け 付け状態に遷移した所で、PICへのアクセスは無くなっています。 以前は無理矢理外部割込みを起こしたので、それによりカーネルは 割り込み要因をセンスする動作を行っているようでしたが、今回は プロセッサへの割り込みは行っていないので、これで正解の気分。 つーか、この先どうすれば?!(^^;

2002/06/05

少し早めに帰着。

掲示板にて割り込みコントローラの資料の所存を教えていただきました。他、 検索条件を8259で捜していたのを8259Aで捜すとみつかったり色々。 PICの単語も「PIC」と「割り込み」をAND条件で検索すると、良い感じの資料が色々 見つかりました。でもやはりマイコンのPIC(Peripheral Interface Controller) も多く引っかかるようです。Linuxの割り込み処理については こんな感じのとか見つかったり。ふむ。

そんな訳でシミュレータにPICを実装してみる事を考えてみました。 最初、sim_io.cに埋め込んじゃえばいいやと思っていたのですが、 現在実装してあるPseudoIOデバイスはin/outは片方向のみで定義して あるのと、cmdを入れると次の命令以降でデータが読めるような仕掛けに してあるのとで、命令実行後にIOアクセスをチェックするだけで 済むのですが、PICやFDCは双方向ポートになっているため、Readの 場合は命令を実行する前に、Writeの場合は命令実行後にIOアクセス の判定を行わなくてはならないのでは......と少し悩んでみたり。
一分考えた後、至った結論は常にシミュレータメモリには常にRead対応の データをセットしておき、Writeアクセスが行われて潰された場合は、 Writeアクセス解釈後、すぐにRead対応のデータを戻すという方法が 良いかと思われ。
あぁ、それよりも適当に増築してきたIOデバイスのコードを少し 見直して、デバイスの組み込みや取り外しがスケーラビリティに 行えるように考えた方がよさげ。

2002/06/04

少し早めに帰着。

先日の結果を元にソース読み。
arch/ppc/kernel/i8259.cにi8259_init()という初期化ルーチンがあるので 資料片手に読み。大きく分けて、初期化フェーズと操作フェーズの二種類 の操作があり、それぞれICW(Initialization Command Words)と OCW(Operation Command Words)をIOポートに送り込むことでレジスタ設定 及び操作を行うという事のようです。i8259_init()では初期化フェーズのみ が実行されています。以下が実際のコードになっています。

   139          /* init master interrupt controller */
   140          outb(0x11, 0x20); /* Start init sequence */
   141          outb(0x00, 0x21); /* Vector base */
   142          outb(0x04, 0x21); /* edge tiggered, Cascade (slave) on IRQ2 */
   143          outb(0x01, 0x21); /* Select 8086 mode */
   144          outb(0xFF, 0x21); /* Mask all */
   145          /* init slave interrupt controller */
   146          outb(0x11, 0xA0); /* Start init sequence */
   147          outb(0x08, 0xA1); /* Vector base */
   148          outb(0x02, 0xA1); /* edge triggered, Cascade (slave) on IRQ2 */
   149          outb(0x01, 0xA1); /* Select 8086 mode */
   150          outb(0xFF, 0xA1); /* Mask all */

ICWは4種類ありICW1〜4と呼んでいるようで、これを適切な順で適切 なポート(I/Oポートとして何故か二口用意されていて種類によって書 くべきポートが決まっている)に書き込みます。また、i8259は物理的に カスケード接続できるようになっていて、カスケードの親をマスター、 マスターにぶら下がる事になるi8259をスレーブと呼んでいるようです。 ポートの割り当てと設定できるコマンドの関係は以下のような感じ らしいです。

 (((( PPCでのPort割り当てアドレス ))))
┏━━━━━┯━━━━━━━━━━━━┓
┃          │   Master     Slave     ┃
┠─┬───┼────────────┨
┃A │Port0 │0x80000020  0x800000A0  ┃
┃D ├───┼────────────┨
┃R │Port1 │0x80000021  0x800000A1  ┃
┗━┷━━━┷━━━━━━━━━━━━┛
※Port0/Port1という呼び名は便宜上 TANEが勝手に名づけたもの

(((( コマンド/データの種類とアクセスするPortの対応 ))))
┏━━━━┯━━━━┓
┃ Port0  │  Port1 ┃
┠────┼────┨
┃ICW1(W) │ICW2(W) ┃
┃OCW2(W) │ICW3(W) ┃
┃OCW3(W) │ICW4(W) ┃
┃IRR(R)  │OCW1(W) ┃
┃ISR(R)  │IMR(R)  ┃
┗━━━━┷━━━━┛
※()内はポートへのアクセスの方向 Write(Out)/Read(In) を示す

これを踏まえて、ICWxを順に設定していく。

ICW1  7 6 5 4 3 2 1 0
      | | | | | | | +--- IC4   ICW4の要否  1:必要  0:不要
      | | | | | | +----- SNGL  カスケード接続か? 1:シングル 0:複数
      | | | | | +------- ADI   CALLアドレスインターバル  86系では0
      | | | | +--------- LTIM  トリガモード  1:レベル  0:エッジ
      | | | +----------- '1'   ICW1を示す
      +-+-+------------- A7-A5 下位ベクタアドレス  86系では0

ICW2  7 6 5 4 3 2 1 0
      | | | | | +-+-+--- '000'
      +-+-+-+-+--------- T7-T3   86系では割り込みベクタタイプの上位5bitを示す

ICW3  7 6 5 4 3 2 1 0    (マスター設定時)
      +-+-+-+-+-+-+-+--- マスタデバイス設定 '1' でbitに対応する割り込み
                         入力はスレーブi8259が接続されている
      | | | | | | | |
      | | | | | | | |    (スレーブ設定時)
      | | | | | +-+-+--- スレーブID
      +-+-+-+-+--------- '00000'
                         

ICW4  7 6 5 4 3 2 1 0
      | | | | | | | +--- μPM   1:8086モード  0:8085モード
      | | | | | | +----- AEOI   1:AEOIモード  0:ノーマルモード
      | | | | +-+------- BUF/MS 0x:バッファモードでない
      | | | |                   10:バッファモード(スレーブ)
      | | | |                   11:バッファモード(マスター)
      | | | +----------- SFNM   1:スペシャルフリーネスティッドモード
      | | |                     0:フリーネスティッドモード
      +-+-+------------- '000'

ソースでの設定の順番は

  1. Master-ICW1 140行目 ICW4が必要Edgeトリガで動作。
  2. Master-ICW2 141行目 PPCではベクタアドレス不要なので0なのか?
  3. Master-ICW3 142行目 スレーブをIR2に設定する Edgeトリガかどうかは関係無し?
  4. Master-ICW4 143行目 8086モードに設定している。多分意味無し。
  5. Master-OCW1 144行目 マスター受けの全割り込みをマスク(割り込み無視)。
  6. Slave-ICW1 146行目 ICW4が必要。Edgeトリガで動作。
  7. Slave-ICW2 147行目 0x08?なんで?
  8. Slave-ICW3 148行目 スレーブID2に設定。Edgeトリガかどうかは関係無し?
  9. Slave-ICW4 149行目 8086モードに設定している。多分意味無し。
  10. Slave-OCW1 150行目 スレーブ受けの全割り込みをマスク(割り込み無視)。

となっているらしい。どのIR番号にどのデバイスが割当たっているのかは、 ここでは不明。
恐らく、初期化の後でデバイス割り込みが必要になったら、ドライバ からカーネルにIRQ割り込み要求を出して、カーネルはどこかしらで 定義している「デバイス:IR番号対応」に従ってマスクを開くと予想される。

これらを踏まえて、bochsのソースを眺めてみると、iodev/pic.hやiodev/pic.cc が、なんとなく似ているというのが見て取れる気分。PICで検索かければ、最新 情報が得られそうですが、ノイズがめちゃくちゃ多そうな予感がします(^^;

2002/06/03

少し早めに帰着。今日は一日眠かったっす。

メモリプローブを使用して、IOポートアクセスを監視してみました。 ポートのアドレスと直接アクセスしている命令から、関数を逆引きして 整形した結果が以下。

touch memory 0x8000000a (prob=0x80000000) at pc=0xc007e960  reset_fdc
touch memory 0x8000000a (prob=0x80000000) at pc=0xc007edac  floppy_shutdown
touch memory 0x80000020 (prob=0x80000000) at pc=0xc000d898  i8259_irq
touch memory 0x80000020 (prob=0x80000000) at pc=0xc000d8ac  i8259_irq
touch memory 0x80000020 (prob=0x80000000) at pc=0xc000da58  i8259_mask_and_ack_irq
touch memory 0x80000020 (prob=0x80000000) at pc=0xc00d078c  i8259_init
touch memory 0x80000021 (prob=0x80000000) at pc=0xc000da2c  i8259_mask_and_ack_irq
touch memory 0x80000021 (prob=0x80000000) at pc=0xc000da40  i8259_mask_and_ack_irq
touch memory 0x80000021 (prob=0x80000000) at pc=0xc000daac  i8259_set_irq_mask
touch memory 0x80000021 (prob=0x80000000) at pc=0xc00d07a4  i8259_init
touch memory 0x80000021 (prob=0x80000000) at pc=0xc00d07bc  i8259_init
touch memory 0x80000021 (prob=0x80000000) at pc=0xc00d07d4  i8259_init
touch memory 0x80000021 (prob=0x80000000) at pc=0xc00d07ec  i8259_init
touch memory 0x80000021 (prob=0x80000000) at pc=0xc00d089c  i8259_init
touch memory 0x800000a0 (prob=0x80000078) at pc=0xc00d0804  i8259_init
touch memory 0x800000a1 (prob=0x80000078) at pc=0xc000da90  i8259_set_irq_mask
touch memory 0x800000a1 (prob=0x80000078) at pc=0xc00d081c  i8259_init
touch memory 0x800000a1 (prob=0x80000078) at pc=0xc00d0834  i8259_init
touch memory 0x800000a1 (prob=0x80000078) at pc=0xc00d084c  i8259_init
touch memory 0x800000a1 (prob=0x80000078) at pc=0xc00d0864  i8259_init
touch memory 0x800000a1 (prob=0x80000078) at pc=0xc00d0880  i8259_init
touch memory 0x800002e9 (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002e9 (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800002eb (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002ec (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002ec (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800002ee (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002f8 (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002f9 (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002f9 (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800002fa (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002fa (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800002fb (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002fb (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800002fc (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002fc (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800002ff (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800002ff (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x80000398 (prob=0x80000078) at pc=0xc00d17d8  prep_setup_arch
touch memory 0x80000399 (prob=0x80000078) at pc=0xc00d17ec  prep_setup_arch
touch memory 0x80000399 (prob=0x80000078) at pc=0xc00d1804  prep_setup_arch
touch memory 0x80000399 (prob=0x80000078) at pc=0xc00d1818  prep_setup_arch
touch memory 0x800003e8 (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003e9 (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003e9 (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003ea (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003ea (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003eb (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003eb (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003ec (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003ec (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003ef (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003ef (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003f2 (prob=0x80000078) at pc=0xc007bc08  set_dor
touch memory 0x800003f2 (prob=0x80000078) at pc=0xc007ea00  reset_fdc
touch memory 0x800003f2 (prob=0x80000078) at pc=0xc007ea68  reset_fdc
touch memory 0x800003f2 (prob=0x80000078) at pc=0xc00841cc  floppy_grab_irq_and_dma
touch memory 0x800003f2 (prob=0x80000078) at pc=0xc0084248  floppy_grab_irq_and_dma
touch memory 0x800003f4 (prob=0x80000078) at pc=0xc007bf20  set_fdc
touch memory 0x800003f8 (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003f8 (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003f9 (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003f9 (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003fa (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003fa (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003fb (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003fb (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003fc (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003fc (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800003fd (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003ff (prob=0x80000078) at pc=0xc00735b4  serial_in
touch memory 0x800003ff (prob=0x80000078) at pc=0xc0073618  serial_out
touch memory 0x800004d0 (prob=0x80000078) at pc=0xc00d0e20  prep_route_pci_interrupts
touch memory 0x800004d1 (prob=0x80000078) at pc=0xc00d0e38  prep_route_pci_interrupts
touch memory 0x80000800 (prob=0x80000078) at pc=0xc00d0910  raven_init
touch memory 0x80000800 (prob=0x80000078) at pc=0xc00d0c74  prep_route_pci_interrupts
touch memory 0x80000803 (prob=0x80000078) at pc=0xc00d0c8c  prep_route_pci_interrupts
touch memory 0x8000081c (prob=0x80000078) at pc=0xc00d1888  prep_setup_arch
touch memory 0x8000081c (prob=0x80000078) at pc=0xc00d1894  prep_setup_arch
touch memory 0x8000ff30 (prob=0x80000078) at pc=0xc00e3bbc  mk48t59_get_rtc_time(PseudoIO)
touch memory 0x8000ff34 (prob=0x80000078) at pc=0xc00e3bc0  mk48t59_get_rtc_time(PseudoIO)

あと、PPCアーキテクチャに既定されているところの、外部割込みをデタラメに 発生させたところ、Linuxでは割り込みがかかるとi8259_irq()を実行する仕掛けに なっているようでした。ここん所で正しくFDC割り込みを発生させてやれば良さそう な予感がします。で、i8259という割り込みコントローラについての資料を Web検索してみたのですが、Intelのサイト内ですら発見できず。うーむ。
ふと気づいて、以前何気に買ったまま 積読になっていた「I/O制御プログラミング入門」というかなり古い本を発掘 したところ、ずぱりi8259の操作について書いてありました。しかし、なんだか いまいち判りにくくてへこり。でも、ポートの配置はその資料となんとなく 合っていたので、Linuxのソースと付き合わせれば何か判るかも。
因みに、0x80000074〜0x80000077はNVRAMアクセスポートのようで、 bootの最初の方で鬼の様にアクセスしているようです。このポート を監視したまま、ppcsimの実行logをファイルに落としていて、ふと見ると 数百MBのlogファイルになっててちょっとびっくり(^^;

しかし、Intelのサイトにも資料が無いくらいのi8259という割り込み コントローラは、もう前世紀の石なのでしょうか。

2002/06/02

夕方頃まで寝こけてました。

食料調達ついでに本屋に。先日のアニメの原作と思われる単行本が 置いてあったり。東京ミュウミュウというらしい。

宿題。ぐぅ。

2002/06/01

朝、トイレに起きて何気にTVを付けてチャンネル回していたら、ヘンテコな アニメをやってました。なにやらセーラームーンのパクリのような設定 らしかったのですが、何故かバレエで戦うという無茶な設定でした。戦い とはおおよそにつかわしくないバレエの動きで、敵を倒すというその バカバカしさに思わず笑ってしまいましたよ。何故かシッポが生えてたり ネコ耳だったり、何がなんだかよく判らなかったのですが、朝の番組だけ にあれを観て育つ少年少女の未来を心配せずには居られない気持ちになり ました(^^;。

とかしてまた寝て起きると昼過ぎ(汗;

AsianHの総集編番組みて過ごした後、お出かけ。ゲーセンで久しぶりに GIGAWING2をやってみたり。意外と覚えているなぁとか思ったりして(^^;
「ケロロ軍曹(5)」とDVD「MEMORIES」購入。

先日の続き。
reschedule_timeout()はタイムアウトするまでに二度設定されていて、 最初は_lock_fdc()(==user_reset_fdc()内のマクロラッピング LOCK_FDC())内で一度呼ばれていて、次はdo_wakeup()内で呼ばれています。 do_weakup()はgeneric_done()内でハンドラが関連付けられているようですが、 この辺、実行順序関係がなんだかよく判らなくなったりして(^^;なんだか難しい なぁ.......
で、ppcsimの方に手を入れて、パストレースを行ってみました。ppコマンドに ラベルを指定できるようにしただけなのですが(^^;。floppy.cの関数を全て pp設定してちょっとフィルタを通して以下のような感じ。

Passed count= 138026747  label=floppy_init
Passed count= 138042723  label=reschedule_timeout
Passed count= 138077076  label=floppy_grab_irq_and_dma
Passed count= 138078171  label=reset_fdc_info
FDC(pc:c00841cc,ad:800003f2,st) = 00 00 04 00 80 00 00 00
Passed count= 138078302  label=set_dor
FDC(pc:c007bc08,ad:800003f2,st) = 00 00 0c 00 80 00 00 00
FDC(pc:c0084248,ad:800003f2,st) = 00 00 0c 00 80 00 00 00
Passed count= 138079244  label=user_reset_fdc
Passed count= 138079253  label=_lock_fdc
Passed count= 138079267  label=floppy_grab_irq_and_dma
Passed count= 138079331  label=reschedule_timeout
Passed count= 138079489  label=set_fdc
Passed count= 138079503  label=set_dor
Passed count= 138079536  label=set_dor
Passed count= 138079566  label=reset_fdc_info
FDC(pc:c007bf20,ad:800003f4,ld) = 00 00 0c 00 80 00 00 00
Passed count= 138079722  label=wait_til_done
Passed count= 138079730  label=schedule_bh
Passed count= 138080538  label=reset_fdc
Passed count= 138080556  label=reset_fdc_info
FDC(pc:c007ea00,ad:800003f2,st) = 00 00 08 00 80 00 00 00
FDC(pc:c007ea68,ad:800003f2,st) = 00 00 0c 00 80 00 00 00
Passed count= 230970160  label=floppy_shutdown
Passed count= 230970169  label=cancel_activity
Passed count= 230970231  label=floppy_enable_hlt
Passed count= 230970324  label=generic_done
Passed count= 230970335  label=do_wakeup
Passed count= 230970343  label=reschedule_timeout

count=138080556でのreset_fdc_infoから次のfloppy_shutdownが発動する までがタイムアウト時間(約1億命令分)なのですが、その間に何か起こる のが期待されている予感がするようなそうでもないような.......


TOP PREV