昔の最近の出来事(2001.06)

2001/06/30

出張。
うへぇ、やっと帰れましたよ。でも明日から旅行。そして再び 出張生活。あぁ、 彩の新版やgcc-3.0の正式リリースなど話題は沢山あるのについて 行けなくてとほり。

gcc-3.0のPPCクロスコンパイラを試してみました。POV-Rayを 試しにコンパイルしてppcsimで実行してみました。コンパイラ としては正しい命令列を出していそうです。コードの質について はまだよく判らず。-ffast-mathを付けてもちゃんと コンパイルできました。そんな感じ。

2001/06/29

出張。

2001/06/28

出張。

2001/06/27

出張。

2001/06/26

出張。

2001/06/25

出張。

2001/06/24

出張。

2001/06/23

出張。

2001/06/22

出張。

2001/06/21

出張。age++。

2001/06/20

出張。

2001/06/19

出張。

2001/06/18

出張。

2001/06/17

昼起床。今日は少し暑いです。

ちょっと買い出し。ゲーセンに寄ったら「怒首領蜂II」は無くなってました(^^; ロケテストの一環だったのかしら。

そんな感じで明日から出張でしばらく更新が止まりますm(_'_)m
触る人などいないと思いますが、以下current版のppcsim(Ver0.59)と linuxカーネルのバイナリを置いておきます。遊んでみたい人はどうぞ。

ppcsim-0.59.tgz (41396 byte)
linu-arc.tgz (426716 byte)

2001/06/16

昼起床。なんか今日は肌寒いです。

キーボードがらみの調査。最終的にIOポートを直接触ることになるようなの ですが、結構ガードが厚くて、データがうまくセンスできないとしっかりと エラーになるような仕掛けになっているようです。でも、いまいち IOポートのアドレス割り当てが判らず。結局、プログラムにメモリパッチを 当てて、チェックを飛ばす様にすると、何気に先に進んでしまいました。
続いてrootファイルシステムのマウントで失敗。そしてカーネルパニック。 うーむ、ファイルシステムと言われましても......。因みに、 「VFS: Cannot open root device "" or 08:02」などとでて、デバイスの 指定がなされていない様だったので、カーネルコマンドラインを使って RAMDISKを指定してみることにしてみました。コマンドラインの渡し方が いまいち判らず、結局 変数cmd_lineに直接値を入れるという方法で 渡してみた結果がこれ。

Ramsize from residual data was 0 -- Probing for value
Ramsize default to be 8M
Total memory = 8MB; using 0kB for hash table (at 00000000)
Linux version 2.4.4 (既定@SOTECCOMPUTER) (gcc version 3.1 20010330 (experimental)) #16 Fri Jun 15 02:08:01 2001
PReP architecture
On node 0 totalpages: 2048
zone(0): 2048 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/ram2
time_init: decrementer frequency = 464.000480 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... 57.75 BogoMIPS
Memory: 7068k available (544k kernel code, 356k data, 72k init, 0k highmem)
Dentry-cache hash table entries: 1024 (order: 1, 8192 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 512 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
PCI: Probing PCI hardware
Setting PCI interrupts for a "Blackhawk (Powerstack)"
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Starting kswapd v1.8
initialize_kbd: Keyboard failed self test
keyboard: Timeout - AT keyboard not present?
keyboard: Timeout - AT keyboard not present?
pty: 256 Unix98 ptys configured
block: queued sectors max/low 4610kB/1536kB, 64 slots per queue
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
devfs: v0.102 (20000622) Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x2
VFS: Cannot open root device "ram2" or 01:02
Please append a correct "root=" boot option
Kernel panic: VFS: Unable to mount root fs on 01:02
Rebooting in 180 seconds..

root=/dev/ramX (Xを'',0〜2まで試した)を指定してみたのですが、どれも オープン失敗。 メッセージの 〜 or 01:02 の部分の意味もいまいちよく 判らず。 Document/ramdisk.txt を読んでみるも(言語の違いも含め)よく判らず。 floppyディスクとの関係とか色々謎がありそうです。ただ、ここんところで うまくディスクイメージをRAMDISKに持ってこれれば、シェルプログラム も動くっちゅう事なのかも。ただし、bashなどUNIX本物シェルのPPC クロスコンパイルはうまくいっていないのが難点ですが(^^;。ニセsh でもOKなのかしら?ちゅうか、動いているのは本物のLinuxなのだから、 ライブラリもPPC-Linuxと同等品を使わなくてはならないような気が しなくもありません。ライブラリとか。色々。あぁ、難しい世の中です。

深夜番組のランク王国で、台形の面積を求める公式が言えるか?というアンケート を取っていました。近い将来の教科書からは無くなるそうですが、長方形の面積 の定義が判っていれば、長方形→平行四辺形→三角形→台形 の順で求められる のだから、わざわざ「台形の」公式として「覚える」必然は無い様にも 思えます。ただ、「台形」という名詞自体が無くなると、形を言葉で伝達する のが困難になるので、面倒な事があるかも知れませんが(^^;

2001/06/15

日付け越え。

先日のデータアクセス例外はシミュで定義したPCI空間が狭過ぎた為。 最終的に0x80000000+16MBの空間を割り当てることでOK。続いてUnknownInst。 バイト反転ロードが未実装でした。で、最終的にこんな感じ。

Ramsize from residual data was 0 -- Probing for value
Ramsize default to be 8M
Total memory = 8MB; using 0kB for hash table (at 00000000)
Linux version 2.4.4 (既定@SOTECCOMPUTER) (gcc version 3.1 20010330 (experimental)) #16 Fri Jun 15 02:08:01 2001
PReP architecture
On node 0 totalpages: 2048
zone(0): 2048 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: 
time_init: decrementer frequency = 464.000480 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... 57.75 BogoMIPS
Memory: 7068k available (544k kernel code, 356k data, 72k init, 0k highmem)
Dentry-cache hash table entries: 1024 (order: 1, 8192 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 512 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
PCI: Probing PCI hardware
Setting PCI interrupts for a "Blackhawk (Powerstack)"
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Starting kswapd v1.8
initialize_kbd: Keyboard failed self test
Keyboard timed out[1]
keyboard: Timeout - AT keyboard not present?
Keyboard timed out[1]
keyboard: Timeout - AT keyboard not present?
Oops: kernel access of bad area, sig: 11
NIP: FFFF2E6C XER: 20000000 LR: C00861C8 SP: C013FD50 REGS: c013fca0 TRAP: 0400
MSR: 00009032 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
TASK = c013e000[1] 'swapper' Last syscall: 120 
last math 00000000 last altivec 00000000last math 00000000 last altivec 00000000
GPR00: FFFF2E6C C013FD50 C013E000 C013FE08 FFFFFFFF C013FDF0 00000000 0000000A 
GPR08: FFFFFFFF C0093030 C0090EC2 000000FC 24888048 00000000 00000000 00000000 
GPR16: 00000000 00000000 00000000 00000000 003FF000 00000000 00000000 00000000 
GPR24: 00000100 00000002 C013FE08 00000000 FFFFFFFF C013FE0D C013FDF0 C00DE238 
Call backtrace: 
C013DAA0 C00861C8 C005F238 C005F3B4 C00BA630 C00BA274 C00BA380 
C00B91F8 C00B8B34 C00AC820 C00AC8AC C000393C C0006618 
Kernel panic: Attempted to kill init!
Rebooting in 180 seconds..

キーボードが刺さっていない..........いや、その通りなのですが。
それよりも、ずっこけたのが命令アクセス例外というのもひっかかり ます。0xFFFF2E6Cって一体何?そんな感じ。

先日の「Warning: real time clock seems stuck!」の件は6/3に調べ終わって たのを忘れてましたよ。つーか、時間がかかっているのは、その手前の DEC周波数を調べるところでした。で、6/3の時は深く調べなかったので、 もうちっと調べて、簡単にIOシミュレートできるようなら実装してみようと 思ったのですが、nvramのアクセスやらなんやら、結構複雑で死亡。 単に時刻を得るだけなのですが、nvramのアクセスはPPCのIOアドレス空間 にリニアに割りあたっている訳ではなく、アドレスポートにnvramアドレス を入れて、validが帰ってきたらデータポートから読み出すという方式 なので、原理的にはシミュレート可能ですが、プログラム内のデバイス管理 を美しくできなくてとほり。因みに、mk48t59というデバイス?らしいの ですが、gooとかで検索するとLinuxのソースしか引っかからないのが 更にとほり。

それにしても、きちんと例外ハンドリングが行われているため、それなり に情報が得られる様になっているのが、流石の様に思いました。

2001/06/14

日付け越え。先日の日記の日付け、むちゃくちゃだったんですけど(^^;

データアクセス例外時のMSRの設定変更やらSRR1への取りこみやらのチョンボ。 この前、例外系の見直しを行ったときに一緒にやっとけばよかったのに。そんな 感じ。で、随分進んでいるような気がするにも関わらず、一向にシミュコンソール にメッセージが出力されません。追っかけてみた所、考えチョンボが発覚。 コンソール出力のインプリメントは、(int *)0x8000ff04に出力 文字列領域へのポインタを格納し、(int)0x8000ff00に'1'を書くと、 ppcsim側で0x8000ff04に書かれたシミュメモリ領域の文字列をstdoutに 出力するというようにしました。このとき、実効アドレスとして 0x8000ff00をアクセスした場合はアドレス変換を行わないようにしました。 ところが、文字列領域を指すポインタの方も実効アドレスになっているため、 実際の物理アドレスの領域を知るには、ppcsim内でもアドレス変換を行って、 実体をつきとめる必要があります。しかし、文字列領域を格納するタイミング と実際に出力を行うタイミングとの間にPTEを変更されてしまうと、メッセージ 出力は行われません。仕様と言えばそれまでですが、それだとあまり用事に ならないので、0x8000ff00に'\0'以外の値を書くと、1文字をstdout に出力する様に変更してみました(出力が完了したら、0x8000ff00は'\0' にppcsimが戻します)。で、バッチリです(^^)v
で、スナップショット。

Ramsize from residual data was 0 -- Probing for value
Ramsize default to be 8M
Total memory = 8MB; using 0kB for hash table (at 00000000)
Linux version 2.4.4 (既定@SOTECCOMPUTER) (gcc version 3.1 20010330 (experimental)) #16 Fri Jun 15 02:08:01 2001
PReP architecture
On node 0 totalpages: 2048
zone(0): 2048 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: 
time_init: decrementer frequency = 464.000480 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... 57.75 BogoMIPS
Memory: 7068k available (544k kernel code, 356k data, 72k init, 0k highmem)
Dentry-cache hash table entries: 1024 (order: 1, 8192 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 512 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
PCI: Probing PCI hardware
Oops: kernel access of bad area, sig: 11
NIP: C00BF050 XER: 00000000 LR: C0075BD0 SP: C013FBB0 REGS: c013fb00 TRAP: 0300
MSR: 00001032 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11
DAR: 00000000, DSISR: 00000000
TASK = c013e000[1] 'swapper' Last syscall: -1 
last math 00000000 last altivec 00000000last math 00000000 last altivec 00000000
GPR00: 00000000 C013FBB0 C013E000 00000086 8080000F C013FBE8 C013FE98 00000000 
GPR08: C013D0A0 00000000 C00A71BC 00000000 84888042 00000000 00000000 00000000 
GPR16: 00000000 00000000 00000000 00000000 003FF000 00000000 00000000 00000000 
GPR24: 00000000 C00A05F8 C013FC18 0000000E C0005F60 C013FBE8 C013FC18 00000008 
Call backtrace: 
00000000 C00BBE1C C00BBEE8 C00BC098 C00AD7FC C00BC0C8 C00AC85C 
C000393C C0006618 
Kernel panic: Attempted to kill init!
Rebooting in 180 seconds..

少しまともに動いている予感。リアルタイムクロックは出ていない事に なっているため、「Warning: real time clock seems stuck!」のところで 異常に時間がかかっています。あと、気になっているのが、SDR1の値 (上記レジスタ一覧には未表示の模様)。先日PTEのサーチ時にメモリ 未割り当てのセグメントアクセスを行ってppcsimがcore dumpしましたが、 このときのSDR1は0x40000000となっています。メモリが8MBしか無いっ てのに、なぜこのような物理アドレス空間に割り当てるのか謎。 MMU_init()での動作を確認してみる必要がありそうです。

2001/06/13

日付け越え。

ちょちょっと手を入れて取り合えずSDR1に値の入ることだけ確認しようと したところ、あっちこっちに手を入れなくてはならないことが判り、 ついでにうまく動かなくなったので考え直し(^^;
で、256MBのセグメントでメモリを管理することにしました。 現状、アドレス変換OFF時に、256MBを越える物理アドレス空間がリニアに 見えなくなるという制限が付いてしまいますが、シミュレータだし、 シミュレータ上でアドレス変換が行えれば物理アドレスのマッピングは 自由に変えられるので大した問題にはならないハズ。 で、SDR1に値が入りました!が、その後ppcsimがcoreダンプ。しょぼ〜ん。
PTEのサーチ時に物理メモリが未割り当てのセグメントに、そのまま アクセスしてしました。修正&再実行。その先でさらにずっこけ。今度はシミュ の不具合によるものの予感。

2001/06/12

日付け越え。

あぁ、なんか謎が解けた感じ。まず本題であったSDR1に値が入らない件。 arch/ppc/mm/init.c内でのMMU_init()で、_SDR1に値を入れているのですが、 boot時のカーネルの配置がまずくて、load_up_mmu()でSDR1への取りこみ時、 ずれたアドレスから読み出してしまい、レジスタに正しい値が入っていません でした。 本来は、0xc0000000にboot時のカーネルを配置して、__startから実行を 開始することになるのですが、ppcsimではメモリ空間の都合で0x00c00000 に配置していました。BATレジスタの初期化を行うinitial_bat()で 本来、0xcxxxxxxxを0x0xxxxxxxに変換することで、0xcxxxxxxxで実行される ようなモジュールも、0x0xxxxxxxの物理アドレス空間で実行される事に なっているのですが、0x00c00000に配置してしまうと、アドレス変換前と アドレス変換後が全く同じ空間になってしまいます。所が、 load_up_mmu()で tophys() というマクロを使用して、上位16byteを0 にしたものを物理アドレスだとして変換してしまっています。そのため、 0x00cxxxxxに配置した場合は、BAT変換とtophys()マクロとでは変換結果が 異なってしまい、結果、ずれたアドレスの_SDR1の値がSDR1レジスタに 入ってしまっていたという事の様です。ちぇ。
initial_bat()で、BLを縮めて0x00cxxxxxを0x000xxxxxに変換するように してみた所、今度は0x00exxxxxをアクセスする部分が、 BAT変換範囲を越えてしまっているためアドレス変換できずに死亡。 PCI空間を実装した方法で不連続空間にメモリを割り当てればOKだとは 思うのですが、ううむ。折角なので、memalの仕様として不連続空間の メモリ割り当てが可能な様に改良してみようかしら。

2001/06/11

今日はパスポート申請のためお休み。また来週取りに行かなくてはならないのが 面倒臭いシステムです。

なにげにダラダラとテレビを見ていたら、便秘薬のCMだかなんだかが流れていて、 その中のカットに女性の完全尻出しカットが挟まってましたよ。最近はあのくらい の映像でも大丈夫なのでしょうか?

調査の続き。まず、initial_bats()から。ここで勘違い。6/7のValidビットが 落ちているというのは嘘でスーパーバイザモード時はValidになっています。 何を見間違えていたのやら。で、BAT変換時の間違いで、EA0-14と全BATレジスタの BEPIフィールドを比較するのですが、~(BL)のマスクが抜けていました(^^; で、ここについては結果的にアドレス変換無しと同じ結果になるという事で OK。次にMMU_init()内。とりあえずPVR(プロセッサバージョンレジスタ)を 603eにして実行しているのですが、hash_init()内ではHash_sizeもHash_mask も0に設定している模様。確かに、コンソールメッセージでも 「Total memory = 8MB; using 0kB for hash table (at 00000000)」となって いるため、良いと言えば良いような。この先でPTEのクリアやら設定やらをやって いる様なので、ここん所でどのようなPTEを生成しているのかを観察してみる 必要ありといった感じ。
MMU_init()を抜けるとload_up_mmu()でSDR1の設定と全BATレジスタの無効化を 行って、以後、全てのアクセスはページアドレス変換のみで行うという手順の 予感。で、現状load_up_mmu後のページアドレス変換がうまく行われず、 命令フェッチがアクセス例外でずっこけるという状態になっています。

2001/06/10

昼過ぎ起床。時の記念日でも関係無しな感じで時間を無駄に使っている予感(^^;

散髪に行ったら思いっきり待たされ状態。結局、3時間居たことになりましたよ。 帰り際に本屋で「G-taste 4 1/2(よんとにぶんのいち)」を買ってみました。 1/2ってなんだ?と思っていたら、ミスターマガジンが無くなった為、云々。 知らんかった(^^;

ページアドレス変換を実装してみました。最初、memory.h内にマクロとして 書こうとしたのですが、BATアドレス変換時にそれをやって、ちょっと変える 度に全コンパイルになってしまうというマヌケな状態に陥ったため、取り合えず 関数で実装してみました。アドレス変換に要する手順の多さもあるのですが、 遅い遅い(^^; で、結論からいうと何の解決にもならず。やっぱりPTEは設定 されていなかった模様。つーか、0x100がマシンチェックの例外ベクタで すし、スーパーバイザモードでうっかりNULLポインタアクセスしたら死んで しまうような危険な領域にPTEを置く訳が(多分)ありません。アドレス変換無し でそこそこ動いたフリをしたことから考えると、MMU_init()辺りで何をやっている のか良く見てみる必要がありそうです。

2001/06/09

起きたら18:00。先週と同じでなのですが(苦笑;

ちょこっとゲーセンに寄ってみたら、「NIGHT RAID」が無くなっていて、 代わりに「怒首領蜂II」が置いてありました! 早速やってみたのですが、 「ほげ〜〜〜ん」そんな感じ(<どんな感じや)。いや、ただのシューティング好き なので、偉そうな事を言える身分ではないですが、グラフィックは使いまわし ばかりで、敵の攻撃はなんだかしょぼしょぼ。古臭い昔のシューティングゲームの ような香りがただよってました。従来型のボンバーと、エネルギーを溜める 事で使用できるようになるレイストーム型のボンバーを選べる様になっていました が、マキシマムボーナスとどう折り合いを付けているのかイマイチ不明な点が あります。プロデュースがCAVEなだけで、作ったのはどこか別のところ(英文字 三文字だったので失念)みたいなので、全く別物としたものかも知れません。

SDR0じゃなくて、SDR1の間違い(名前違い)に気づきました。ゲフ。それはさておき、 本当にページアドレス変換が起きていないのかを調査してみた所、そこら中で 起きているような予感(汗; ちゅうか、start_here()でBATUレジスタのvalidビットが 落ちていたのですから、当然といえば当然なのですが(^^;。うーむ、ページ フォルトすると、SDR1の値などもきちんと設定されるという事なのかしら?

2001/06/08

日付け越え。

追跡調査。例外が発生後、レジスタを退避し、実行時間などを更新したのち、 レジスタを復元して、実行の続きを行うような感じになっているようなのですが、 レジスタを復元する際、SRR0に戻すアドレスが4の倍数になっていません。 ハードインプリメント的にはbit30-31は'0'予約となっているため、bit30-31が 立っていても、'0'に落とされてしまうのかも知れません(ppcsimでは仮想の pcにsrr0の値を戻すときにbit30-31を'0'に落としている)が、そもそも4の倍数 でないアドレスを復元しようとしてしまうのは、動きとしては非常に怪しいと思われます。 で、レジスタの退避と復元の状態を調べてみました。結果、レジスタ保存時には 0x000axxxxに退避しているのですが、復元時には0x00caxxxxから復元して いました。うーん、何か変な気はしますが、微妙な感じ。

2001/06/07

久しぶりに少し早く上がれたのに、自転車がパンクしていて普段の3倍の時間をかけて 帰り着いてブルー。雨が降ってなかった事だけは幸いでした。

いやいや、命令アドレスはアドレス変換ありと無しでは同じかも知れないけど、 データアクセスの方は、一緒にはならんっしょ。という事でBAT変換だけを 実装してみました。所が本当に結果変わらず。で、よーーーく見てみると、 IBATレジスタもDBATレジスタも値は入っていますが、Validビットが落ちている じゃないですか!しかもBLフィールドがall1ということは、実際に変換がかかった としても、bit0-3の4bitしか変換されず、結果、変換前アドレスと変換後とでは同じに なってしまうという(^^;。ちゅうか、すぐ気づけよって感じですね。因みに、 SDR0は0x00000000のままというのには変わりないので、この状態だとページアドレス 変換の方は行われていないハズ。 という訳で、ちゃんと追っかければどこかに原因があるという事がわかりました。


今日のはまり事。#defineによるマクロ定義で、複数行にまたがるために'\'を使用する際、 '\'の後ろに不要な空白を入れてしまうとparseエラーになってしまう。改行文字を 目に見える形で表示するエディタならすぐに気づくのかも知れませんが、 Meadowを使っている私は気づくのにえらく時間がかかりました(^^;

2001/06/06

日付け越え

トレースはやっぱり終わりませんでした。で、取れている部分だけで 変化点を調べてみると、start_here()実行時に変換をONにしている模様。 まずはアドレス変換に使用するレジスタ群がどのように設定されている のかを調べるために、ダンプコマンドに機能追加。で、start_here()で止めると、

MSR   : 00000030  SDR0  : 00000000
BAT0U : 00c01ffe  BAT1U : 00000000  BAT2U : 00000000  BAT3U : 00000000
BAT0L : 00000002  BAT1L : 00000000  BAT2L : 00000000  BAT3L : 00000000
DBT0U : 00c01ffe  DBT1U : 00000000  DBT2U : 00000000  DBT3U : 00000000
DBT0L : 00000002  DBT1L : 00000000  DBT2L : 00000000  DBT3L : 00000000
SR00  : 00000000  SR01  : 00000000  SR02  : 00000000  SR03  : 00000000
SR04  : 00000000  SR05  : 00000000  SR06  : 00000000  SR07  : 00000000
SR08  : 00000000  SR09  : 00000000  SR10  : 00000000  SR11  : 00000000
SR12  : 00000000  SR13  : 00000000  SR14  : 00000000  SR15  : 00000000

こんな感じ。この時点ではBAT変換を使用して、0x00c0xxxxを0x0000xxxxに変換 している模様。実際の所、0x000xxxxxは0x00cxxxxxからのコピーなので、 それっぽく動くことは動くという感じのような気がしてきました。 アドレス変換を行わないことが本当の原因か?というと、アドレス変換 した場合と比べて0x00cxxxxxと0x000xxxxxを行ったり来たりして、実際と 比べて変な動きにはなりそうですが、通る命令列は同じになる気がしなくも ありません。うーむ。最後にMemアクセス越えでずっこけたサマを見てみると、

pc=0x00009030 inst=0x809b0004
  c09030:	80 9b 00 04 	lwz	r4,4(r27)

d r
PC   : 00009030  MSR  : 00002e40  SPRG0: 003ff000  DEC  : 00459d08
CR   : 00000000  SRR0 : 00009032  SPRG1: 00000000  TBU  : 00000000
XER  : 000f2e40  SRR1 : 000f2e40  SPRG2: 00000000  TBL  : 6fde4100
LR   : 00000000  HID0 : 00008000  SPRG3: 0009e6b8
CTR  : 00000000  HID1 : 00000000
GPR  : 
00-07: 00ca0410 00c13fbc 00000028 00000000 00000000 00ca0418 00ca17b8 00000040
08-15: 00ca0000 00000f60 00001032 00ce3c50 00ca8110 00c05f60 00cc9504 00ca99e0
16-23: 030003d0 00ca03e8 00ca0338 00000000 00001032 000f2e40 00000000 00000000
24-31: 01000000 00ca0408 00ca0358 1c9d4b30 01001032 00ca0418 00ca0368 00000000
d t
MSR   : 00002e40  SDR0  : 00000000
BAT0U : 00000000  BAT1U : 00000000  BAT2U : 00000000  BAT3U : 00000000
BAT0L : 00000000  BAT1L : 00000000  BAT2L : 00000000  BAT3L : 00000000
DBT0U : 00000000  DBT1U : 00000000  DBT2U : 00000000  DBT3U : 00000000
DBT0L : 00000000  DBT1L : 00000000  DBT2L : 00000000  DBT3L : 00000000
SR00  : 00000000  SR01  : 00000000  SR02  : 00000000  SR03  : 00000000
SR04  : 00000000  SR05  : 00000000  SR06  : 00000000  SR07  : 00000000
SR08  : 00000000  SR09  : 00000000  SR10  : 00000000  SR11  : 00000000
SR12  : 00000000  SR13  : 00000000  SR14  : 00000000  SR15  : 00000000

って感じ。思いっきりアドレス変換が無効に落ちていますので、これはアドレス 変換とは、別に要因があるような気がしてきました。
それにしてもアドレス変換をどうしたものか........

反応が遅くなりましたが、 情報 さんくすです。rxvtの方は日本語表示を諦めましたが、ppcsimトレース閲覧専用 に大活躍中です。gd コマンドで実行したトレースを、lessで開いて 「pc=」をサーチすれば、n,Nでレジスタダンプを行ったり来たり。そんな感じ。
direntの方は、厄介そうですね(^^; シミュレータ内でネイティブで opendir()したDIR*ポインタとシミュレータ上で実行されるプログラムに返す ポインタとの間に変換バッファを入れるような感じにしないとダメかも知れません ね.......

2001/06/05

日付け越え

TRACE例外が上がっているという事みたいなので、その周辺を調べてみたのですが、 UnknownException()の前はTrap_0fを通過しているようでした。ベクトル命令関連 臭い気がした(本当に直感)ので、なにげにCONFIG_ALTIVECをnoにして再コンパイル してみました。所が、 今度は全く動きが変わり、Memアクセスエリア越えで、全然手前でずっこけるように なりました。どうも、calibrate_delay()でのループをデクリメント例外を使用して 脱出する際、例外ベクタに飛ぶところで何かSRR0,SRR1の値がおかしかったので、 先日のrfiも含め、例外ベクタにブランチする際のSRR0,SRR1に保存するべきビット と、落とさなくてはならないMSRのビットを確認してみたところ、 全然間違っていましたよ(^^; 修正して再び実行してみた ところ、やはり同じような所でこけるのですが(というのは一番最初に実行される 例外処理がデクリメント例外だから)、MSRの値が今までと少し違っていました。 そこで判った驚愕の事実。アドレス変換が有効(MSR.IR=1,MSR.DR=1)になってますよ! あう、それでアドレス越えですか。どうしよう。
取り合えず、どこでアドレス変換がONになるのかを調べるため、一番最初から MSR値のトレースを取ってみることにしました。さて、朝起きるまでに終わる でしょうか?

2001/06/04

日付け越え

調査の続き。なぜ single step 例外が上がることになったのかを追っかけて いたところ、どうも期待しない所にブランチしているような予感。で、 よーくみてみると、rfi実行時のSRR1からMSRに復帰するビットフィールドが 思いっきり間違えてますよ(^^; なもんですから、一度セットしたら落ちなく なってしまうビットが多数。その中にSEも含まれていて、クリアできなかったり した場合におかしな事になっていたというのが原因でした。で、修正した ところ、以下のような感じ。

Ramsize from residual data was 0 -- Probing for value
Ramsize default to be 8M
Total memory = 8MB; using 0kB for hash table (at 00000000)
Linux version 2.4.4 (既定@SOTECCOMPUTER) (gcc version 3.1 20010330 (experimental)) #11 Sat Jun 2 01:42:06 2001
PReP architecture
On node 0 totalpages: 2048
zone(0): 2048 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: 
time_init: decrementer frequency = 464.000480 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... Bad trap at PC: 0, SR: 0, vector=0
Oops: Exception in kernel mode, sig: 5
NIP: 00000000 XER: 00000000 LR: 00000000 SP: 00000000 REGS: 00cf2e50 TRAP: 0000
MSR: 00000000 EE: 0 PR: 0 FP: 0 ME: 0 IR/DR: 00
TASK = 00c9e460[0] 'swapper' Last syscall: 0 
last math 00000000 last altivec 00000000last math 00000000 last altivec 00000000
GPR00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
GPR08: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
GPR24: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
Call backtrace: 
Kernel panic: Attempted to kill the idle task!
In idle task - not syncing
Rebooting in 180 seconds..

ですって(笑。何もかにも'0'っちゅう所がなにやら怪しげ。

2001/06/03

今日は休日。いや、昨日も休日でしたが(汗;

ゲーセンとか。「NIGHT RAID」をやってみました。TAITO+タクミの 組み合わせになっているのは、CAPCOMがアーケードを辞めたからでしょうか。 これ、意外と長い時間遊べるかも(^^; 1,2面は全然弾幕ではないのですが、3,4面 辺りから急に難しくなるような感じです。自機をヒモを付けて飛ばして、 レバーをガチャガチャやってるとクラッカーみたいに敵機を破壊して回ると いう変な溜め攻撃ができます。これが見た目がハデな上、出すのが難しい 訳ではないので、気分が良いです。ただ、得点のシステムがいまいちよく 判らない。何故かマイナス得点から始まったりするようで、プラスになって いるのが良いのかどうか、よくわかりませんでした。

そんな感じで「CRAZY TAXI 2」を買ってみました。「GIGA WING 2」から 4ヶ月ぶりのソフト購入ですよ。で、これ、なかなか良いんですが、 なんか難しいっす(^^;ノーマルプレイだとDランクしか取れないです(ダメすぎ)。 ゲームの方はノリノリなので、ずっとやってられそうな感じなのですが、 先に右手人指し指の方が痛くなりました(^^; これから思うに、伊集院光 は上手すぎ。

先に「Warning: real time clock seems stuck!」の方を調べてみました。 原因は、時刻レジスタの読み出しを二度行い、その時間の差を調べると いうものだったのですが、メモリマップドな時刻レジスタのアドレスの 内容は変化するような仕掛けになっていませんので、その差が0で結果、 時間が止まっているように判断されているというものでした。

2001/06/02

起きたら18:30でびっくりですよ(激汗;;

「これマジ」などを見てみました。宇宙人格闘映像って......宇宙人も 飛んだり光ったりしているわけではなく、普通に地面を歩いたり、 普通の生き物の様にこっちに気づくサマが、あまりにも普通過ぎて 逆にシュールで笑えたかも。でも番組的になんかひっぱり過ぎですよ。 つい最後まで見てしまいましたよ(^^;

タイムベースレジスタの値をカウントアップするようにしたら、 「time_init: decrementer frequency = 261.000270 MHz」のような 感じになりました。「++9カウント/1命令」でこの周波数という感じ。 また、例外処理が間違っていて、デクリメント例外が起こった時に 外部割込みのベクタにブランチしてました(^^; それを直すともっと 手前でずっこける様になったりして。間違えていて先に進むという のは珍しいです。折角なので、外部割込みが発生するようにしてみました。 すると、calibrate_delay()は通過する様になりましたが、その先で つまづき。singleステップ割り込みを期待している所、割り込みが かからずそのままオーバーランしているような予感。

2001/06/01

日付け越え。

ちょこっとprintk()にバイパスを付けてメッセージ出力を横取り。 以下スナップショット(笑)

Ramsize from residual data was 0 -- Probing for value
Ramsize default to be 8M
Total memory = 8MB; using 0kB for hash table (at 00000000)
Linux version 2.4.4 (既定@SOTECCOMPUTER) (gcc version 3.1 20010330 (experimental)) #11 Sat Jun 2 01:42:06 2001
PReP architecture
On node 0 totalpages: 2048
zone(0): 2048 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: 
time_init: decrementer frequency = 0.000000 MHz
Warning: real time clock seems stuck!
Memory: 7068k available (544k kernel code, 356k data, 72k init, 0k highmem)
Dentry-cache hash table entries: 1024 (order: 1, 8192 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 512 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX

デクリメンタ周波数が0ってのが(^^;。calibrate_delay()をスキップして いるせいかも知れません。因みに、ここまでの実行命令数は59551829 です。


TOP PREV