日付け越え。
rxvtの再コンパイルにチャレンジ。というのも、英語圏のパッケージ
ではマルチバイトコード対応はされていないのでは?という推測から。
アーカイブが見当たらなかったので、cvsダウンロードしてmakeして
みたのですが、色々足りなくてずっこけまくり。失敗の巻。
表示が普通に速いので、かなり使い勝手が良いだけに、
ますますしくり。
ppcsimにちょこっとしたコンソールIOデバイス(今の所output方向
だけ(^^;)を付けてみました。
日付け越え。
calibrate_delay()自体を実行しないようにメモリパッチしてみま
した(^^;。で、先に進んで UnknownInst。eieioをnopで追加。そして
sc命令の実行。システムコール例外シミュレーションをenableに。
で、メモリ空間越え。0x90350000 をアクセスしているのですが、
何が配置されているのかいまいち判らず。アドレス変換は行われて
いないので、何かがあるちっく。sys_ptrace()内で、プロセス制御
を行おうとしている感じ。
printk()の入り口をモニタしてみたのですが、メモリサイズの表示、
Linuxバナー表示、PRePアーキテクチャで立ちあがっている旨の表示、
その他もろもろ。pseudoのIOデバイスを付けてブートの経過が判る
ようにしてみようかしら。
何気にCygwinパッケージのダウンロード。少し前からrxvtという
パッケージが入るようになっていたのですが、似た名前の
シリアル転送プロトコルプログラムかと思い込んでいたため、
インストールしてはいたのですが、使った事はありませんでした。
なにげにman rxvt とか実行してみると、
「rxvt (ouR XVT) - a VT102 emulator for the X window system」
だそうですよ!早速、実行してみた所、バックスクロール付き、
リサイズ自由、ペースト可能な幸せターミナル(ちゅうか、普通の
ターミナル)が開きましたよ! 日本語表示がアレなのでマニュアル
を読んでみると、-km オプションなるものも!でも、何故か
「rxvt: bad option "-km"」だそうな。へぐ。あぁ、もう少しなのに、
惜しいです。でも、もしかして、ktermとかも実はコンパイルできたり
するのかしら?
雷音で起きたら凄い時間だったり(激汗;。本日休業。
CONFIG_AUPS を生かす様にリコンパイルしてみたところ、コンパイル
エラー。エラーをつぶすよりも、ちゃんとPRePで動作させることを
考えた方が良さそう。で、よくprom_init()をみてみると、なんの事
はない、0番地に0xdeadc0deを書き込んでおく、つまりPReP動作の仕込み
とほぼ等価なことをやっとけば良いだけという事が判明。
そして実行........先に進んだ模様(^^)v。で、ついにPCI/IO空間
アクセスに突入。実際に何をするという訳では無いので、PReP的な
IOレジスタ空間(0x80000000〜64kB分)をアクセスできるように
ppcsimに手を入れてみて、再び実行.......UnknownInst
。タイムベースレジスタアクセス命令を追加。再び実行......で、
そのまま無限ループ。calibrate_delay()内でループしているのですが、
「目盛り付け遅延?」「遅延を目盛り付け?」 何かの時間を計って
割り込みを期待しているようなそんな予感。MSR.EEが'1'になって
いるので、外部割込みを期待している感じなのですが、
はて、どうしたものか............
日付け越え。
Linux on ppcsimの続き。トレースダンプで最終的にどこから0番地に
ブランチしているのかを見てみたところ、ppc_md.setup_arch()で
飛んでいる様子。元々ここの値が入らないからstart_here()から始める
のが正解なのでは?と思ったので、start_here()からの実行を試みて
いたのでした。で、start_here()からの実行ではidentify_machine()
内で、PReP判定を行う様に引き数をセットしていた訳で、そのときは
うまくsetup_archが入ったので、identify_machine()の入り口に原因
があるという事になります。調べてみると、r3=0x61707573となってい
ました。ということは、arch/ppc/kernel/setup.cで、
_machine = _MACH_apus; を踏んでしまうことになり、
_machine = _MACH_prep; は通らないと判明。あぁっ!なんかすっきり
した気分!ちゅうことは、identify_machine()の引き数r3に
0x61707573を入れなければ良いだけのことですか。と、思い出すに、
r3に0x61707573をセットしたのは、prom_init()で、 何の加工も
なしにphysを返すためだったような........あう、あちらを立てれば
こちらが立たず。
一日病人状態。ほとんど寝て過ごしてしまいました。たまの休み
なのに最悪の使い方ですよ(~-~)。
先日の日記を補完したり、だらだら。天気も微妙に良くなくていまいち。
Webぐるしていたらこんな
痛いゲームの紹介ページに。
あまりに痛いので途中で見るのがイヤになりました。
そんな感じでKOJIさんと飲み。いつもの様に新橋バド屋に行った所、
あるべき所に店がありませんよ!!
KOJIさん曰く新宿店も無くなっていたという事で、新橋も連鎖で
消滅してしまった模様。あぁ........生きる希望が無くなったような
そんな感じ(<オーバーです)。
しかた無いので、慣れない渋谷を開拓しようとしたのですが、慣れない
だけに、良い感じの店が見つかりやしません。で、和民(^^;。
彩の話やら、近況やら色々。終電車で帰宅。昨日の今日なので、また
死亡。
まさちくさんも参加の予定だったのですが、奥さんの具合が突然
悪くなったらしく、今回は参加不能でした。また今度という事で。
会社の飲み会。早く帰ってきたような記憶があるけどそのまま 死亡。
2001/05/24
凄い!23:00前に帰れましたよ!
んふ〜、んふ〜、彩でお絵かき。
今日は特に新たな発見はありませんでしたが、新規もしくはマスク
からの変換によりレイヤーを作成したときは、消しゴムだけではなく
基本的な描画ツールも置いてもらえた方が良いかも。
先日のレイヤーくくりつけというのと合わせて考えますに、
描画ツールを置くパレット(以後ペン立てと呼びます)をいくつか
持てるようにするのはどうでしょうか。
考え方としては単純で、リアル画材でもあまりに道具が多い場合は
鉛筆や絵筆は別ペン立てに分けるし、同じ筆や色鉛筆でも系統に
よって更に分ける場合があるという所にあります。上の図では
4つしかペン立てがありませんが、適当な方法で無限に持ち、
選択する事は可能だと思います。
これだと、新規レイヤー作成時にくくりつけられるのは現在選択
されているペン立てとかいう風にする事で、レイヤーを作るたびに
ペンを新規作成する手間もなくなると思います。何よりレイヤー
と独立に管理できるので、ペン立てさえ別セーブできれば、新規
で絵を描く場合にも、大量にある描画ツールの設定をし直す必要も
なくなるでしょう。
日付け越え。雨降りでかなりブルー
遂に出ましたよ、彩の新版が!!
「今までのとは全く別もの」と事前に聞いてはいたのですが、
あまりの変わり様にかなりびっくり(^^;です。
えぇ、早速 使ってみましたとも。
色付け作業をまじめに行うような使い方に至ってないのがアレですが、
全体的に細かいところで機能追加が色々されていますよ。追加機能に
ついては、書ききれないので操作に関連する今までとの差など。
日付け越え。
例外ハンドルルーチンはメモリ中に一種類しか存在できない。
あたりまえ。
__start()から始めてカーネルコピー(relocate)&コピー後のカーネル
テキストにブランチという所まではOKで、その後で何故か再びコピー
元のカーネルテキストをなめ始めて、最後は0番地にブランチ。
PReP対応のため、0番地に仕込んだデータ列がメモリアクセスエリア越え
命令として解釈されて、偶然ずっこけて止まったのですが、デフォルト
NOPのままだと、カーネルコピー後の領域で0番地から実行される、
すなわち再び__start()から実行開始されるのと同じ事になってしまう
ため、最悪無限ループに陥ってしまうところでした。
ここまでで1485823命令実行されています。トレースを取って
眺めるのにはちょっとアレなのですが.....
日付け越え。山は越えたけど次の山が既に用意されていた模様。
あぁ(T_T)....
mfspr,mtsprのSPR番号のデコードが思いっきりチョンボってました(^^;
10bitで指定するところをr2だけで指定していたというもの。
SPR指定のフィールドで見ると、r2で指定するのは一瞬間違いの様に
見えますが、なぜかこのフィールドだけリトルエンディアンライクに
なっているため、XER,LR,CTRのようなSPR番号が31以下のものは
偶然正しく動作していた模様。
ppcsimのop_exec2.cでいうと SPR番号=r3*32+r2 となります。
やっぱりstart_here()から始めるのはハズレだった模様(^^; ただ、
メインメモリ空間への乗り換え部分はstart_here()から始めるのと
同じになって良いと思われるので、start_here()までがうまく
動けば先に進みそうな予感?
今日も大丈夫なもよう。
データキャッシュは厄介です。
ずっと追跡。MMU_init()が抜ければ終わりなのか?
うーむ、グローバル変数が初期化されていることを期待している
部分が割と多いような.......そんな感じ。
そういや、由水圭氏のCGキャラを使った下着のCMが流れてました。
モーションが凄いと思ったのですが、絵の方もブラのまま踊ると
いうカットがあって、ちょっとびっくり。
今日は大丈夫なもよう。明日あさって何事もなければ、日付け越え
生活も少し緩むハズ。
gdbの方は結局コンパイルでエラー。make CFLAGS='-mno-cygwin -O2'
などとしてmakeしたのですが、sys/param.hが見つかりませんとエラー。
でも、単にmakeだけで実行すればOKなので謎は深まるばかり。
思いつきでCygwin上からMeadowを直接起動してみたところ、大丈夫な
もよう(^^) これでメモ取ったりするのが少し楽になりそうな予感。
Cygwinのコンソールも、バックロールログが付いて、サイズが変えら
れて、ペーストできる様になると使い勝手が格段に上がると思うの
ですけどね。
うーむ、日付けがずれてましたよ(^^; 一日ぶん、何かをやってる間に
空中散布してしまった模様(^^;
日付け越え。あぁ、長い一週間でした。
KOJIさんよりお電話。最近の話など色々。奥さん、
今度の彩は凄いらしいですよ。
来週、飲みに行くことを約束。
gdbをMeadowで使う実験。CYGWIN1.DLLが見つかりません攻撃。当然。
-mno-cygwinオプションをつけて再リンク。ハング。なじぇ。
configureから再実行。しばらく時間がかかるので、
Cygwin-1.1.8だと
コンパイルOKだという話を読んで、w3m-0.2.1
をコンパイル。Cygwin-1.3.xだとrand48が定義されているようで、
ソースには一切手をいれなくてOKでした。うむ、やっぱlynxバインド
の方が手に馴染んでますよ(^^; ただ、ファイルのダウンロード
になると、lynxやw3mは他に何もできなくなってしまうので、こういう
のはウインド系ブラウザの方が便利なんですよね。
日付け越え。
少しおっかけ。
identify_machine()内で_machineの値を元に、アーキテクチャタイプに
よって、*_init()で設定を切りかえるという感じになっていますが、
_machineの情報がうまく得られていないため、defaultを通って、
結果うまくいっていないという感じ。intuit_machine_type()で
何もせずに戻ってしまっているため、ここんところを押さえる必要
がありそうな予感。
日付け越え。眠くて死にそう。
何やってたかすっかり忘れかけてますよ(^^; そうそう、setup_arch()が
入らない件でした。start_here()から実行し、identify_machine()で
マシンタイプを判定してアドレスマップの切り替えと初期化などを行う
という仕掛けになっています。いまいち#ifdefが生きているのか死んで
いるのか判らないので、-gオプションで再コンパイルしてみたところ、
コンパイルエラー。本当に-O2を-gに変えて他のオプションは一切変更
しなかったのですが..... うーむ、じっくり追いかけてみた方が
よいかのぅ.....
緊急事態発生。急遽半徹。空が白んでいます。
久々にその日に帰着。
メモリ同期を実装。でも大して先に進まず。なんだかループ
しているような感じになったので、実行順序の本格調査。
結果、なにかスタート位置が変じゃなかろうかという結論に
至りました。
そのこころは、ppc_md構造体にマシンのアーキテクチャや
構成に関する情報が入っているようなのですが、
ppc_md.setup_arch()を実行すると妙なアドレスに飛んで
しまいます。ppc_md.setup_arch()を初期化する必要があり、
マシンアーキテクチャによって、arch/ppc/kernel/*_setup.c
のどれかが選ばれるものと思われます。で、実行開始アドレス
を start_here()から開始するようにしてみましたが、結果
惨敗。ぐふっ。
恐るべし、シャコパンチ。
今日も早く起きて出社。そして 今日で数ヶ月間の日付け越え
生活も終了か? やっと終わった〜〜 そんな感じ。
ちょこっと実行。Unknown Inst。lwarx.........ん?
lwbrx(バイト反転ロード)ではなく? プロ環で動作を確認。
reverseではなくてreserve?メモリ同期アクセス?
結果的には普通のld/stアクセスと同じになるのかしら?
あぁ、もう今日は眠くてダメですよ。
早く起きて出社。そして半徹夜。死にそうです。
あまりに遅過ぎてかえって眠れず(x_x)。コマンド追加とか
見なおしとか。そうこうしてると哲也が始まったので観て
から死亡。
日付け越え。
ユーザキャッシュ命令を取り合えずNOPで追加......って、
もう足してあるような(^^; デコードチョンボ発覚。死亡。
そして実行。「pc=XXXXXXXX is rfi. but sc emulation mode now.」
うーみゅ、sc命令実行時のシステムコールエミュレーションを
行わない時しか実行できない様にしたのは失敗でした(^^;。で、
例外シミュレーションをENABLEにすると無限ループ。原因は
未実装命令を実行してプログラム例外ハンドルでループ。
死亡。
日付け越え。
先日の続き。ちょこっと命令追加....のつもりが思いっきり
てこずってるし(^^; で、その先でUnknown Instruction.
つっても、そのような命令はありません。何か動作が変。
そんな訳でブートの手順を調査。最初はprom_init。なにやら
色々意味不明データ列を引き数にして判定していますが、
基本は0xc0000000から0x00000000にカーネル本体をコピーする
事から始める仕掛けのようです。0xc0000000はMPC106(システム
コントローラ)のマニュアルによると、Prep仕様ではPCIメモリ
空間に割りあたっています。ppcsimでもアドレスマッピングを
合わせれば良いのですが、今はちょっち面倒なので0x00000000
にロードして、全く同じアドレスにコピーするという事にしま
した。レジスタ引き数はr3=0x61707573,r4=0x00000000。
そんな感じでinclude/asm/page.hの#define PAGE_OFFSET
を変更。ユーザレベルキャッシュ操作命令が見つからなくて死亡
他、ppcsimのかなり絶望的なコマンドバグ発覚(^^; ブレーク
ポイントを設定した状態でgoコマンドを実行するとブレーク
ポイントの設定数ぶんのステップ実行になってしまいます。
ダサすぎて倒れそうになりました。
日付け越え。
Linuxカーネルクロスコンパイル on Cygwinの続き。ちゅうか、
net関連ソースで、printk,dprintkの仕様がヘッダのそれと
随分違うものがあり、parseエラーしまくり。我慢ならずに
最新のソース2.4.4をダウンロードしてみました。そして、
ドライバ類を全部外してconfigし、makeしてみたところ、
先日のu_quad_t問題は変わらずだったので修正。もうひとつ
arch/ppc/kernel/ppc_ksyms.c で undefined symbolでエラー
したのをちょこっとコメントアウトで修正(?)。でも、これ
だけでコンパイルできた模様(^^)v。
vmlinuxというモジュールがカーネル実行
ファイルの様ですが、objdump -d で逆アセンブルしたところ
例外ベクタのイメージが先頭の方にあり、それっぽく並んで
いるので、本物のカーネルみたいです(笑。Altivecの初期化
や例外ベクタも載っているようなので、参考になりそうな
予感。ただし、カーネル内では、load_up_altivecと
giveup_altivecの中(いずれもarch/ppc/kernel/head.S内)
だけAltivec命令が使われているだけの様です。コンパイラ
のサポートが無いのでは当たり前なのですけどね(^^;
で、もちろんやってみましたよ linux on ppcsim (笑。
結果は撃沈(あたりまえ)。
PPC> set pc 0 pc=0 and Reset execed instruction count. PPC> g pc=0008b61c : Unknown Instruction. pc=0x0008b61c inst=0x7ccba5aa PPC>
起きているのが辛いくせに遅くまで起きていたせいで微妙に
出社時間に間に合わず。ダメな人みたいだ(<みたいじゃなく
ダメです)。
色々warnningが出ているものの、それはとりあえず良しとして、
parseエラーの根本原因は、u_quad_tのtypedef宣言が何故か
うまく定義されていないという事がわかり、
unsigned long long になるようにヘッダを書き変えて実行。
ををっ、コンパイラを変えずとも通っている臭いじゃない
ですか。makeの引き数でクロスコンパイル用バイナリパスを
与えられるように書かれているため、良い感じです。さて、
本当にバイナリが出来上がるのでしょうか?
コンパイラの方はなぜか最新が、
gcc> ./cc1 --version GNU C version 3.0 20010430 (prerelease) (powerpc-powerx-elf) compiled by GNU C version 2.95.3-4 (cygwin special). GNU CPP version 3.0 20010430 (prerelease) (cpplib) (PowerPC System V.4)
GNU C version 3.1 20010330 (experimental) (powerpc-powerx-elf) compiled by GNU C version 2.95.2-6 19991024 (cygwin experimental). GNU CPP version 3.1 20010330 (experimental) (cpplib) (PowerPC System V.4)
すっかり昼夜逆転して昼間起きているのが辛い辛い(^^;
何気にディスクの肥しとなっているlinuxのカーネルソースを
Cygwinでクロスコンパイルできないか試してみました。というのは、
以前コンパイルを試したときはmmapのサポートが「?」でmkdepが
うまく動作しなかったのですが、Cygwin-1.3.1になったことだしと
いう事で試してみたという次第。すると、何故かうまく通りますよ。
おや?たしか、ちょろっと試してダメだった記憶があるのですがと
調べてみると、linux-2.2.xではcore dumpするmkdepがCygwin-1.3.1
でも生成されるのですが、linux-2.4.xでは動くmkdepがmakeされる
ようです。早速 make dep 、make を試してみたところ、コンパイル
エラー。つーか、parseエラーって一体........
gccのバージョンと1.3.1の改行コードがらみかと思い、gccのカレント
cvsバージョンのダウンロード。その間に色々試してみましたが、
クロスでなくてもうまくいかなくて謎。
起きたら17:00。完全にダメ連休を過ごしたような感じ。
リモートデバッグについてのまとめを上げてみました。ご参考まで。
「特命リサーチ」とか久々に見ましたよ。絵本の読み聞かせ。うーん、
とても効果のあることは判るのですが、読み聞かせを行う親の方も
それなりに勉強が必要という点が難しいですね(^^;。「なぜ?」と
いう質問に「そういうものなのでしょう」なんて答えてしまっては
ダメなのでしょうね。
ちゅうことは、私ゃダメっつー事ですか(^_^;;
今日はフェスタ68の日だったのに起きたら16:00ですよ!しかも
障害発生電話により会社に強制召還。ゲフ。日付け越え。
フェスタでは何か変わったことがあったのかしら?
「ゾイド0」がなんかすげー。めちゃめちゃ遊んでいるような感じが
しなくもなかったのですが、3Dをあそこまで使って遊んでいることに
関心しました。
リモートデバッグのまとめ。
ガンパイに黒の練り牌。なんのこっちゃとイチャモンつけつつ見入って
しまいましたよ(^^; なんか来週がちょっと楽しみ(ぉぃぉぃ;
はて、gdbでリモートターゲットの場合、set args .... は一体
どこに渡されているのかしら?
runコマンド以外では渡すことができない模様。しかも今のbuildの方法では
target remoteにはrunコマンドは使用できない模様。
今日はお休み。風呂掃除後、本屋とゲーセン(苦笑)。
プロギアの嵐をやってみました。いまいちジュエリングのコツが
つかめず。
Interface誌を買ってみました。SHなボードではどんどんLinuxが
動いているような感じです。PCI周りの対応の仕方など参考に
なりそうな話題満載。そんな感じ。
昼頃起きて出社。日付け越え。
gdb-5.0のシリアルプロトコルには'Zt,addr,length'というものが
あり、これでブレークポイントの設定を行うようなことが書かれて
います。gdbはその設定値だけ受け渡して後は知らんぷり、
ブレークポイントの命令のすり替えや、再実行時の復帰処理などは
ターゲット側が自前で行うものだと思っていたのですが、冷静に考え
ますにそのようなことはやらなくても良い気がしてきました。
gdbではdisassembleコマンドで逆アセンブルリストを表示することが
できます。このとき、必ずメモリから命令列を取ってきて逆アセンブル
リストを表示しているとするならば、ターゲット側で返すべきメモリの
内容はブレークポイント設定後のトラップ命令を返してはダメで、
元の命令をすり替えながら返す必要があります。これではターゲット
側のプロトコル制御が絶望的に面倒になってしまいます。大きなシステム
ならともかく、組み込み系システムでそんなことをやらなくてはならない
のではgdbなんて使う気にならないでしょう(<ここは精神論臭いですが)。
なもんですから、その辺gdbが全て制御しているのではなかろうか?と推測
し、なにげにブレークポイントを設定して 'c'コマンドで継続実行。
やっぱりきちんと止まりますよ(^-^) さすがですな。
でも、実際のところ どのような手順でブレークポイントの設定と継続
実行が実現されているものなのかよく判らず。プロトコルを観察して
おく必要ありでしょう。
すっかり過去の話題になってしまいましたが、プログラム例外時の
SRR0値については
御意です。冷静に考えてみますに、illegal instructionなんかは
次に実行すべき命令を指す事が原理的に不可能なのですから、自分自身
のアドレスを入れるのが当然といえば当然ですね。あと、MSR[FP]の方は
実は、使えるか否かを指すのではなくて、使っているか否かを指すのですよ。
つまり浮動小数点命令を使えるプロセッサでもMSR[FP]=0ならば、
使用不可能例外が上がりますし、リセット直後は'0'だったりします。
問題はプログラム例外やトレース例外が発生した時にMSR[FP]が'0'に
なる点で、実際に浮動小数点命令を使っていたかどうかを知るには、
正しくは例外ベクタ内でのSRR1のMSR[FP]のコピーフィールドを参照
しなくてはならないと思われます。実際のところgccでは 可変長引き数
の受け渡しにFPRを使用したり、8バイトクリアにFPRに0を入れてストア
したりする場合があるようですので、本当に浮動小数点命令が
使用不可能なハードウェアインプリメントの場合、
GNUツールだと、かなり面倒なことになるかも知れません。
フジテレビの木曜深夜に放送している「百萬男 (なのかな?)」が
興味深いこの頃。「時間内に100万円を自分の為だけに使い切れ」
(使い切れれば買ったものはそのまま自分のもの ダメな場合は使った
分を全額返済)と言われた人間の行動に興味をひかれます。
普段から物欲の乏しい 私にゃ 絶対使い切ることはできませんな(^^;
2時間ほど起床時間オーバー!今日は普通に出社日なのに!!
クレヨンしんちゃんを見終わってから出社(ぉぃ;;;;
ちょこっとブレークポイントの設定について考えてみようとしたの
ですが眠くて死亡。このままじゃ連休はずっと昼夜反転になりそう
な危険が!
日付け越え。
ちゅうか、昼夜逆転状態で猛烈に眠くて死亡。