昔の最近の出来事(2002.02)

2002/02/28

へたってて休業。

調査の続き。zlib_fs_inflateInit2の中から順に辿っていったところ、 cramfsモジュール内のzlib初期化に辿りつきました。その中で、zlib のwrokspaceポインタにvmalloc()を使用してメモリ割り当てを行って いて、その割り当てられたメモリポインタがヘンテコな領域を指している ため、結果、その領域へのストアがデータアクセス例外になっていると いうことのようでした。
ものの本で調べてみたところ、vmalloc()はカーネル内での動的な メモリ割り当てを行うメモリ割り当て関数であるところのkmalloc()の 拡張版で、確保するメモリサイズの制限などがkmalloc()に比べて 柔軟になっているという特徴があるようです。
それはさておき、メモリ確保を行うということはそれなりにページ アドレス変換なんかも行われるハズなのですが、全SR(セグメントレジスタ) の内容が全て0だったり、ページアドレス変換時に使用されるPTEの先頭を 示すSDR1の内容が0だったりと、どうも怪しげな状態になっていることが 引っかかりました。
そこで順に調査。まずはSRの内容をロードしている個所を調べた 所、mtsrin 命令を使用した痕跡がありました。通常はmtsrin命令 の手前で止めて見てみるところですが、いきなりmtsrin命令のppcsimソース を眺めたところ、mfsrin命令と同じになっており、全く間違っている 事が発覚しました(^^;
続いてSDR1に値が入らない件について。SDR1へのロードは arch/ppc/kernel/head.S:load_up_mmuで行われていますが、ここでは _SDR1という変数領域から実際にレジスタへロードを行っているだけ で、_SDR1領域への値の書き込みは別の場所で行われているようです。 そういえば、以前2.4.4のカーネルを動かしていたとき、でSDR1が何故か 0x40000000を指していてそのため、ppcsimのメモリをそれ専用に確保 する必要がありましたが、なんだかそれと同じ問題のような気がして きました(^^;で、実際の_SDR1への値の書き込みは arch/ppc/mm/ppc_mmu.c:MMU_init_hw で行われているようです。 そこでMMU_init_hwの入り口で止めてステップ実行で進めてみたのですが、 直ぐに関数を抜けてしまっているようです。問題の個所は

----arch/ppc/mm/ppc_mmu.c:MMU_init_hw----
        if ((cur_cpu_spec[0]->cpu_features & CPU_FTR_HPTE_TABLE) == 0)
                return;

で、cpu_featuresのCPU_FTR_HPTE_TABLEフラグが落ちているため、すぐに 戻っているようでした。CPU_FTR_HPTE_TABLEでgrepしてみたところ、 include/asm/cputable.hにフラグが、arch/ppc/kernel/cputable.cに 設定テーブルがありました。現在PVR値は0x00070201として603eプロセッサ として実行していたのですが、後者のcputable.cの603プロセッサ の設定にはCPU_FTR_HPTE_TABLEはありませんでした。603プロセッサは ページアドレス変換のPTEサーチの一部をソフトウェアでエミュレーション する必要があり、他のPPCプロセッサと少し違うという点があります。 ソフトウェアエミュレーションを行うトリガに専用の割り込みも定義されて います。しかし、ppcsimではハードウェアページアドレス変換をシミュレート していますので、初期化の方法を変える必要があると思われます。 取りあえず、PVR値を750プロセッサに設定して実行してみたところ、 SDR1の方にそれっぽい値が入る様になりました。でもまだデータアクセス 例外になりますよ(T_T)。うーむ。
今気づきましたが、HPTEはHardwarePTEのことなのかしら?

vmalloc()の返すアドレスに変化が無いので、vmalloc()内を追跡。 mm/vmalloc.c:get_vm_areaでテーブルの設定を行って いるようなのですが、addr = VMALLOC_STARTで addr=0xc3000000 となって いるようです。イマイチinclude/asm/page.h内のマクロであるところの

static inline void* ___va(unsigned long p)
{ 
        unsigned long v;
        asm volatile ("1: addis %0, %1, %2;" 
                      ".section \".ptov_fixup\",\"aw\";"
                      ".align  1;"
                      ".long   1b;"
                      ".previous;"
                      : "=r" (v) 
                      : "b" (p), "K" (((PAGE_OFFSET) >> 16) & 0xffff));

        return (void*) v;
}

の意味が良くわからないのがアレなのですが、 arch/ppc/mm/init.c:mem_init()内のhigh_memoryの代入に使用されていて、

high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);

max_low_pfn * PAGE_SIZEだけだと0x02000000になる予定なのですが、 __va(実体は___va)を通過すると0xc0000000が足されるようです。 でもこれはこれで良い感じがしなくもないですが......う〜〜〜〜む。
cramfsを使用しなければzlibは使われないのでvmallocも使用されないと いう説はありますが、それはそれでどうかという気がするし....... という訳で突っかかり気味。まだページアドレス変換テーブルの方に問題が あるのかも。

リカちゃん(人形)35才。以前、少し太めになったリカちゃんが同窓会に出て くるって設定のエステのCMがありましたが、その印象があってもっと古い のかと思っていたのですが、ちょっと意外だったかも。

2002/02/27

日付け越え前に帰着。

調査の続き。コケている命令のアドレスと命令とが一致しなくて変だなぁと 思っていたら、reconfig したカーネルを逆アセンブルし忘れてて、古い 命令列と突き合せてました(汗; で、 色々疑い所があったのですが結局どれも白。ずっこけているところは fs/inflate_fs/inflate.c:zlib_fs_inflateInit2の中なので、ハードに 依存したアドレスをアクセスしている訳では無いハズなのですが...... うーむ。結局、ppcsimのアドレス変換部分のコードが少し整理された気分。

Netscapeの6をインストールしてみました。4.7xから結構ハデに変わっている のですね(^^; IEのお気に入りをインポートできるようになっているのは 良いと思いましたが、他のはゴテゴテ付いてて便利なんだかどうだかよく判らない 感じ。

2002/02/26

日付け越え前に帰着。

Netscapeの6を試しにダウンロード.........終りません(^^;

先日のドキュメントのトラブルシューティングを読んでいると ファイルシステムのサポートとして、ext2ファイルシステムのサポートが 必要なことが書かれていました。romfsをルートファイルシステムにするの で、ext2のサポートは不要だと思ってコンフィグレーションから外していた のですが、入れてカーネルを再コンパイルしてみました。で、ppcsim上 で実行したところ、データアクセス例外でパニック(^^;

<6>Ramsize from residual data was 0 -- defaulting to 32M
Linux version 2.4.17 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release)) #17 Tue Feb 26 02:08:00 2002
PReP architecture
On node 0 totalpages: 8192
zone(0): 8192 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyS0,9600 console=tty0 root=ramfs
time_init: decrementer frequency = 496.000576 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... 61.84 BogoMIPS
Memory: 31056k available (604k kernel code, 468k data, 92k init, 0k highmem)
Dentry-cache hash table entries: 4096 (order: 3, 32768 bytes)
Inode-cache hash table entries: 2048 (order: 2, 16384 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 8192 (order: 3, 32768 bytes)
POSIX conformance testing by UNIFIX
<6>PCI: Probing PCI hardware
Setting PCI interrupts for a "Blackhawk (Powerstack)"
<6>Linux NET4.0 for Linux 2.4
<6>Based upon Swansea University Computer Society NET3.039
Starting kswapd
Oops: kernel access of bad area, sig: 11
NIP: C0062300 XER: 00000000 LR: C00623D4 SP: C01FBF70 REGS: c01fbec0 TRAP: 0300    Not tainted
MSR: 00009032 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
DAR: C3000070, DSISR: 90090014
TASK = c01fa000[1] 'swapper' Last syscall: 120 
last math 00000000 last altivec 00000000
GPR00: 00000000 C01FBF70 C01FA000 C010C590 0000000F C00A7E28 00000030 00000000 
GPR08: 000001DA C300005C FFFFFFFF 00000000 84000022 00000000 00000000 00000000 
GPR16: 00000000 00000000 00000000 00000000 003FF000 00000000 00000000 00000000 
GPR24: 00000000 001227D0 00000000 00000000 00000000 00002000 C00E0154 C010C590 
Call backtrace: 
001227D0 C00623D4 C006409C C00D8780 C00CA7AC C00CA7F4 C0003B4C 
C0006644 
<0>Kernel panic: Attempted to kill init!
 <0>Rebooting in 180 seconds..

なんだかレベルダウンしちゃったっぽい。がくり。
アドレス変換がかかっているハズなので、アドレス変換レジスタ群が見れない Oopsメッセージだけではアクセスした場所がいまいち良くわからないっぽいの に今気づきました(^^;

2002/02/25

日付け越えちょっと前に帰着。

どうもromfsはダメっぽいので、ファイルシステムやブートファイルシステム についての日本語訳ドキュメントを読んでみることにしました。量が多いので 斜め読みっぽくなってしまいましたが、HDDからブートする以外で、一般的な 方法はfdからブートしてramdiskにファイルシステムをコピーするという方法 のようです。initrdを使えばramdiskイメージを読み込んで終りって感じに なるようですが、Cygwin上でramdiskイメージを生成できなさっぽいのでNG。 cramfsの方は圧縮romfsという事のようで、romfsと大差無い感じがしますが、 scripts/cramfs以下に入っているファイルシステムを生成するツールが makeできずにNG。うーむ。

2002/02/24

いいとも増刊号時間に起床。ビルゲイツが出てた。

調査の続き。fs/romfs/inode.cを眺めてみました。ファイルシステムドライバは モジュールとして登録する形になっているようで、その中に

static DECLARE_FSTYPE_DEV(romfs_fs_type, "romfs", romfs_read_super);

の一行がありました。これはinclude/linux/fs.hと合わせて読むと file_system_type構造体への代入マクロのようですがそれはそれとして、 名前がromfsとなっていますので、ここを通ればromfsという名前は使える 様です。で、網をかけると一応通過しているようなのでOKそう。少なくとも mountはできそうな予感がします。mount_rootとモジュール初期化の前後関係 はOKそう。ふむ。

少し行き詰まり気味のところでふと携帯を見ると着信が。KOJIさんからでした。 早速かけてみたところ、四日ばかり会社に居るという大変な状況だったよう です(^^; で、ついさっき彩の新版をアップロードしたという事だったので、 早速ダウンロードしてみました。インストーラが付いててWindowsアプリの 様になってました(<Windowsアプリだって)。早速インストールしようと実行、 そして最後の問いにハイと答えて待つこと10秒。そのままインストーラが 無反応に(^^;;。 取りあえず殺してもう一度.......最初のウインドが開いて メッセージが途中で切れた状態でお亡くなりに。しかたないので、Windowsを 再起動しようとしたらどんどんWinの反応が鈍くなりしまいには青画面を開いて 再起動を促してきたまま死んでしまったので、強制電源OFFする事に。 再度起動してインストールしたらOKでした(^^;。なんだったんだ?で、お絵描き 掲示板プラグインも公開したということで早速見てみると、 今まで無かったメニューが! で、早速、投稿画像をと思い押してみたのですが彩が起動せず。IE5と Netscape4.5xでは確認したとの事でしたが、家はIE6だという事を告げると 「それは試していない」との返事だったので、その場で確認開始(^^;; 結局、インストールに関しては問題無さそう。そうこうしているうちに KOJIさんの方でIE6のインストールを行って起動確認した所、再現した 様なので、調査をお任せ。その間にNetscapeをダウンロードしてそちら での描き込みを試してみるという事で一度電話を切りました。
ダウンロード中暇だったので、ウロウロして何気に再び掲示板を見てみた 所IE6での起動を行う方法が掲示板にアップロードされていたので、早速 試してみました。IEの中に彩が組み込まれている形になっていますが、 彩としての動作はバッチリでした。で、描いてアップロードしたら YouCさんが既にアップロードしてました(^^;;;早えぇ(笑。全て終った のにネスケのダウンロードはまだ終ってませんでした(汗;

ちょっと買い物にお出かけ。ついでにゲーセン(汗; 何気に斑鳩を始めた 人が居たので見ていたのですが、何故か弾を全然撃ちません。なんだ? と思って見ていたのですが、そのまま一発も弾を撃たずに一面ボスは そのままエスケープして終了。特にボーナスが入る訳でも無し。そして 二面。やはり弾を撃ちません。で、中盤のブロックが動き回る所で、 何やら微妙な位置合わせをしている様子だったのでそのまま見ていたら、 なんとブロックとブロックの間をすり抜けていますよ(@_@; 隙間 つっても表示上は隙間なんてありませんから、殆ど心眼に近いモノを 感じました。当然、弾を撃たずにそのまま進んでしまいましたが、 後半の敵弾バラ撒きでミス。そして捨てゲー。あぁ、なんかこの続きが すげー見たいと思いました。

そして帰ってから洗濯やら色々。そして彩の新版をちょこっと触って みました。0801で問題になっていたファイルロード不可はちゃんと直って ました。07xx系列のファイルでも問題無し。で落描き。

水滴めんどくさっ!

特に動作は問題無し。エフェクト系フィルタが欲しくなってきた気分。

あ、KOJIさんに電話するって言ってたのに遊んでたらこんな時間に! すんませんがまた明日にでも電話しまする。あ、早く洗濯物を干さないと 乾かねー!

2002/02/23

昼過ぎ起床。休日出勤。

色々網をしかけてみるもよく判らず。という所で、重要な点に気づきました。 romfsからのbootを試みたと言ったものの、

Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/romfs

と、しれっと書いたのですが、そもそも/dev/romfsなんてデバイスがあるのか? という事に気づいたのです(大汗;; 。どのようなデバイスがあるのかいまいち 覚えきれないのでソースを探ってみたところ、init/main.cに root_dev_names として、ずらっと書かれているのを見つけたのですが、romfsっぽいのが 見当たりません。うーむどうしたものか。

で、Webをあたってみたのですが、romfsをbootデバイスにする技については イマイチ発見できず。mountコマンドのヘルプにはデバイスタイプとして romfsを指定できるようなので、これの親戚だからできることはできるハズ なのですが.......

ppcsimのコマンド系の整理など。CVSを使う様になったついでにチョンボな 修正を入れない為のメモとしてChangelogを書くようにしました。ここで 気づいた事実。 Ver0.03まで書かれたChangelogファイルが既に存在して いました(^^;;;。何故これ以降書かなくなったのか不明ですが、恐らく Meadowを使う様になって、X68k版のMicro emacsとインデントが違うのをMeadow のc-modeインデントに直したときに、コード自体は変わっていないのに 大量に差分が出て、結局差分管理し切れなくなったからだったと思います。 今にして思えば diff -b とかやれば良かった感じ。
少し話しが逸れますが、X68k版のMicro emacsでのc-modeは、インデント に使用されるのはタブコードのみでした。私はそれをタブ幅4表示で使用 していました。 インデントをタブのみで行うというのは非常に合理的で、仮にタブ幅が 変更されても、インデントは崩れないというメリットがあります。ところが 本家Emacsのc-modeはタブ幅は8に決めうちで、且つASCII文字で4文字を インデント深さにしています。これだとタブ幅が8でない表示ではインデント が崩れまくってしまうのです。Linuxでのコーディングスタイルでは、 「タブ幅は8だ」と言いきっているようです。そもそもタブは表示幅が不定な コードなのだと考えると、幅を決めつけるのは間違いで、幅が問題になる ならば、明示的にスペースで埋るべきだと思うのですがどうでしょうか。 と言いつつも、Meadowのc-modeでインデント深さやタブ幅を変えられなくて (正確には何故か変わらなくて)、結局オリジナルのc-modeで使っている辺りが ヘナちょこなのですが(^^;

先週「電撃王」を見てないなぁと書いたのですが、今日本屋に寄ったら ちゃんと売ってました(^^; XBOXで埋め尽くされていましたが、エロゲー ページが無くなってすっかり薄くなっていたのが、久々に復活したって 感じです。来月は元に戻りそうですが(^^;

2002/02/22

日付け越え。

先日の続き。まずはconfigでromfsをサポートするようにしたか 確認(^^;

CONFIG_ROMFS_FS=y

OKそう。続いてfs/super.c:mount_root()からコード追いかけ。 NFSやFDはサポートを殺しているので、__getname()辺りから。 最後のメッセージ「I have no root and I want to scream」 はmount_root()内の if( !ROOT_DEV ) を通る事で出力される模様。 devfs_find_handle()から確認。

        handle = devfs_find_handle (NULL, ROOT_DEVICE_NAME,
                                    MAJOR (ROOT_DEV), MINOR (ROOT_DEV),
                                    DEVFS_SPECIAL_BLK, 1);

の関数呼び出し前でレジスタ表示したのが以下。

MSR   : 00009032  SDR1  : 00000000
IBAT0U: 00000000  IBAT1U: 00000000  IBAT2U: c00003fe  IBAT3U: 00000000
IBAT0L: 00000000  IBAT1L: 00000000  IBAT2L: 00000002  IBAT3L: 00000000
DBAT0U: 80001ffe  DBAT1U: f0000ffe  DBAT2U: c00003fe  DBAT3U: 00000000
DBAT0L: 8000002a  DBAT1L: c000002a  DBAT2L: 00000002  DBAT3L: 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
PC   : c00bc304  MSR  : 00009032  SPRG0: 003ff000  DEC  : 00047d06
CR   : 44000024  SRR0 : c007f760  SPRG1: 00000000  TBU  : 00000000
XER  : 00000000  SRR1 : 00009032  SPRG2: 00000000  TBL  : 8418d580
LR   : c00bc2c4  HID0 : 0000c000  SPRG3: 001b6270
CTR  : 00000007  HID1 : 00000000  SDR1 : 00000000
GPR  : 
00-07: c00bc2c4 c01b7f10 c01b6000 00000000 c00d34e8 00000000 00000000 00000001
08-15: 00000001 c00d0000 c007f3f4 c00d0000 24000024 00000000 00000000 00000000
16-23: 00000000 00000000 00000000 00000000 003ff000 c008d80c c00b0000 c01ff000
24-31: 00000000 000fd2ac 00000000 c00d0000 00000000 c00d34e8 00000000 00000001


000d34e8 : 72 6F 6D 66 73 00 00 00 00 00 00 00 00 00 00 00 romfs...........

で、fs/devfs/base.c:devfs_find_handle() を更に追っかけていくと、 find_entry()に突き当たりました。更にいくと、_devfs_walk_path() の戻り値がNULLで、その先の if ( (major == 0) && (minor == 0) ) return NULL; の条件が合うため、 find_entry()の戻り値はNULLとなっているようです。結果、最初の devfs_find_handle()の戻り値はNULLとなるため、 fs/super.c:mount_root()内ROOT_DEVは0のままとなって、エラー メッセージの表示に至るという動作になっているようです。 ふーむ。

2002/02/21

今日も日付越え前に帰着。

先日見つけた日本語訳ドキュメントを読んでみますに、genromfs というromfsイメージを生成するプログラムを使用すれば、 良いみたいなので早速 genromfo-0.5.1をダウンロード&コンパイル。 で、コンパイルエラー(^^; major(),minor(),makedev()が見つから ないということで、glibcのインクルードファイルのsys/sysmacros.h から拾ってきて適当な場所に挿入。取りあえずOK。
続いてromfsをルートファイルシステムとする様にカーネル引き数を 指定しようとしたのですが、どうにも指定方法が判らず。以前は コマンドライン文字列の入るメモリ領域を書きかえる事で行っていたの ですが、それと思わしき領域を探してパッチを当ててみるも一向に 変化せず。仕方なくコマンドライン文字列を探してみたところ、 include/linux/autoconf.hでdefineされているCONFIG_CMDLINEを書き かえればどうにかなりそうだったので書き換えてコンパイル。OK。 include/config/cmdline.h.orgにも同じ事が書いてありますが、 こちらは書き換えても反応せずの模様。
で、材料は揃ったような気がするのですが、肝心のromfsイメージの 配置場所が判らず。とりあえずromfsブートにして実行してみたのが 以下。

block: 64 slots per queue, batch=16
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
<0>Kernel panic: I have no root and I want to scream
 <0>Rebooting in 180 seconds..

という訳でやはり失敗。うーむ。で、システムコントローラである ところのMPC106のマニュアルより、ROM空間は0xff000000から 割当たっていることになっているということで、早速ppcsim上で メモリ空間を割り当てようとしたところ、

memal 0x0f100000 0xf  #ROM area
メモリが確保できませんでした(size=252706816)

ということでした。がっくり。つーか、スワップしてでも割り当てれば 良いのに何故? しかたないので0xff000000〜の部分だけ特別措置が行える ようにppcsimに手を入れるのかしら?

2002/02/20

日付越え前に帰着。ふぅ。

調査の続き。トレースダンプを眺めてみると、例外処理から戻ってきた所で おかしくなっているのが判りました。最後に発生した例外はデクリメント 例外で、戻りアドレスは丁度r27の値を更新する命令列の後でした。先日の レジスタダンプと命令列を付き合わせてみたところ、最後のr27の更新では そのような値が入らない事が発覚。

c002d380:       7f 7f 4a 14     add     r27,r31,r9

addの結果が間違っているように見えるのですが、sourceは普通の値なのと、 他のテストではそれなりに動作しているという点から、まるっきり通って いないのではないかと予想したところ、モロにppcsimの例外処理に間違いが 見つかりました(^^;
修正して実行した結果、

<6>Ramsize from residual data was 0 -- defaulting to 32M
Linux version 2.4.17 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release)) #10 Thu Feb 21 00:07:37 2002
PReP architecture
On node 0 totalpages: 8192
zone(0): 8192 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/sda2
time_init: decrementer frequency = 496.000576 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... 61.84 BogoMIPS
Memory: 31204k available (520k kernel code, 408k data, 88k init, 0k highmem)
Dentry-cache hash table entries: 4096 (order: 3, 32768 bytes)
Inode-cache hash table entries: 2048 (order: 2, 16384 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 8192 (order: 3, 32768 bytes)
POSIX conformance testing by UNIFIX
<6>PCI: Probing PCI hardware
Setting PCI interrupts for a "Blackhawk (Powerstack)"
<6>Linux NET4.0 for Linux 2.4
<6>Based upon Swansea University Computer Society NET3.039
Starting kswapd
devfs: v1.7 (20011216) Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x0
pty: 256 Unix98 ptys configured
<6>Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI enabled
<6>ttyS00 at 0x03f8 (irq = 4) is a 16450
<6>ttyS01 at 0x02f8 (irq = 3) is a 16450
<6>ttyS02 at 0x03e8 (irq = 4) is a 16450
block: 64 slots per queue, batch=16
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
<3>request_module[block-major-8]: Root fs not mounted
VFS: Cannot open root device "sda2" or 08:02
Please append a correct "root=" boot option
<0>Kernel panic: VFS: Unable to mount root fs on 08:02
 <0>Rebooting in 180 seconds..

という訳でお約束のrootファイルシステムがマウントできなくてNGという 所まで行きました。
ひょっとして、2.4.9でもOKだったのでは?と思い直し実行した所OKでした(^^; 更に前の2.4.4でもPTE用に何故か0x40000000からメモリを割り当てているのに 対応する必要がありましたが、これが不要になりました。例外処理のバグを 含んだ状態で、2.4.4でfsのmountまでいったのはかなり奇跡に近いものが あるかも(^^;
という訳で、次はROM-fsの作り方とシミュレーションの為のROMフェッチの 動作の仕組みでも探ってみる予定。

Webでサーチをかけたら 付属ドキュメントの翻訳ページがみつかりました。 romfoのフォーマットなどについて細かく書かれているようなので、少し読んで みようと思ったのこころ。

2002/02/19

日付越え。

先日のlinuxカーネルバージョンはバグだと自分で言っているので、2.4.17を ダウンロードしてビルドしてみました。いくつかはまりつつなんとかmake完了。 printk()に仕込みを入れようとkernel/printk.cを見てみるとそれまでのと全然 変わってますよ(^^; で、変更を加えて実行してみたところやっぱNG。

<6>Ramsize from residual data was 0 -- defaulting to 32M
Linux version 2.4.17 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release)) #8 Wed Feb 20 01:55:10 2002
PReP architecture
On node 0 totalpages: 8192
zone(0): 8192 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/sda2
time_init: decrementer frequency = 496.000576 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... 61.84 BogoMIPS
Oops: kernel access of bad area, sig: 11
NIP: C002D3D0 XER: 00000000 LR: C002D390 SP: C00A3320 REGS: c00a3270 TRAP: 0300    Not tainted
MSR: 00001032 EE: 0 PR: 0 FP: 0 ME: 1 IR/DR: 11
DAR: 000014C3, DSISR: 811B0008
TASK = c00a1420[0] 'swapper' Last syscall: 0 
last math 00000000 last altivec 00000000
GPR00: C00A416C C00A3320 C00A1420 00000001 00009032 00000001 00000030 C00D0000 
GPR08: 00000000 00000018 C0106000 C00D0000 C00A614C 00000000 00000000 00000000 
GPR16: 00000000 00000000 00000000 00000000 003FF000 C00D0000 C0090000 C0090000 
GPR24: C01070C0 00000B21 00001642 000014BB FFFFFFFF 00000000 C0160140 C00A40DC 
Call backtrace: 
00000000 C002DE38 C00BB5BC C00BB7DC C00B9470 C00AF71C 000036E4 
<0>Kernel panic: Attempted to kill the idle task!
<0>In idle task - not syncing
 <0>Rebooting in 180 seconds..

先日のは仕込みの自己チェックに引っかかっていましたが、今回はそれを丁度 過ぎた所で、データアクセス例外(TRAP:0300)が発生しています。結局、前と あまり変わらずといった感じ?
もう少し詳しく見てみると、__free_pages_ok内の 「c002d3cc: 81 1b 00 08 lwz r8,8(r27)」 という命令で例外が発生しているようですが、レジスタダンプのr27は思いっきり 奇数アドレスになっています。これって、アライメント例外になりそうな気が したのですが、8byteアクセスでなければとりあえずセーフの模様。でも、この ようなアドレスをアクセスしようとしていること自体が怪しい雰囲気を醸し 出しているので、手前の演算系命令でシミュのバグが無いか確認してみる必要 がありそうです。

いくつかppcsim上の不具合も見つかったのでメモ。

  1. twi命令が未実装だとNG。
  2. アクセス例外時にDAR に保存される値が例外を起こした命令のPCになっていた。 正しくはアクセス命令で生成されるEAを保存する。 確かメモリアクセスでEAを返り値保存していなかったので、取りあえずPCでも 入れとけって入れた様な気がする(^^;

2002/02/18

起きたら悪化していたので本日休業。大抵、休業したその日の昼には普通に 動き回れるまでに回復するのですが、今回は全く回復の兆しが見えず、 結局夕方まで寝てました(T_T)

起き出してごちゃごちゃと。
先日buildしたlinuxカーネルを何気にppcsimで動かしてみました。何も手を 入れずに動作させたのですが、取りあえず何かが動いている感じだったので、 printk()に文字列横取りコードを入れて再度実行してみると、なんとなく 動いている模様。ところがある点でいつまで待っても次に進む気配が見えない ので調査。Cntl-Cで止めてtdコマンドでトレースを見てみたところ、 serial_consoleのポートwaitで無限に待っているようでした。 drivers/char/serial.c内serial_console_write()のインライン展開 されたwait_for_xmitr()で待っている様だったので、常に条件が満たされる 様にメモリパッチを当てて回避。結果、以下の所まで進んでNG。

Ramsize from residual data was 0 -- Probing for value
Ramsize default to be 32M
Total memory = 32MB; using 0kB for hash table (at 00000000)
Linux version 2.4.9 (tane@SOTECCOMPUTER) (gcc version 2.95.3 20010315 (release))
PReP architecture
On node 0 totalpages: 8192
zone(0): 8192 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: console=ttyS0,9600 console=tty0 root=/dev/sda2
time_init: decrementer frequency = 464.000544 MHz
Warning: real time clock seems stuck!
Calibrating delay loop... 57.75 BogoMIPS
Memory: 31128k available (544k kernel code, 432k data, 84k init, 0k highmem)
Dentry-cache hash table entries: 4096 (order: 3, 32768 bytes)
Inode-cache hash table entries: 2048 (order: 2, 16384 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
kernel BUG at page_alloc.c:191!

ページアロケータで「kernel BUG」だと自己診断されました(^^;。以前はTotal memory =8MBだったのですが、それが関係あるのかしら?つーか、なんで8MBになるのだった かしら?すっかり忘れてます(^^;

食料の調達。ついでにCD屋に寄って、やっとTommyFebruaryのCDをゲット。 めちゃくちゃ売れているっぽい。
本屋にも。そういや今月って「電撃王」買った記憶が無いのですが無くなっ ちゃったのか?と思い、家に帰ってから先月買ったのを見てみたところ、 二月/三月合併号になってました(^^; 情報誌でこれっていいのか?

ppcsim-0.80を置きました。コアが無茶苦茶変わっているけどあまり 自信が無いので、0.73も取りあえずそのまま見える様に置いてあります(^^;

2002/02/17

風邪気味でへろへろ。寝てたけど腹が減って起きる(汗;

ppcsimいじり。チェック。機能追加。修正。あぁ、寒くてダメ。
食事を仕入れるついでにCD屋へ。TommyFebruaryのCD売り切れ。ごはっ! なんで?!
ゲーセン。2斑鳩。いまいち。

出張中に読んだ本であるところの「CONTINUE Vol.3」。ゲーム批評っぽい 本なのですが、「超クソゲー」のライター陣が書いた記事で埋め尽くされ ています。その為、けなしているっぽい誉め方(逆もしかり)の言いまわし が絶妙で笑えます。ファミコンゲームの記事がメインでしたが、 91年以降のソフトで「烈火」(私は話でしか聞いたことがありません)を 選んでいる辺りが通好みという感じ(他に選択肢が無かったのかも知れません が)。他、「高橋名人の冒険島IV」がファミコン最後のソフトというの は初めて知りました。「歴史としてあまりにも完璧すぎだ!」というのに 思わず同感してしまいました。あと、トレジャーの社長インタビュー記事が ありましたが、その中でPS2のSILPHEEDの制作をした事が書かれていました。 ってゆーか、CAPCOMが発売元でGAME ARTSが作っているのかと思っていたら、 もう一階層あったという所に驚き。でも、 以前気になったRAYCRISISとの 関連は無さげ。

XBOXのソフトのCM。なんか週を重ねる毎にタイトルが増えてきている気が するのは気のせい?

何気にa2psをコンパイル。プリンタ無いので全然意味ありませんが(^^; 日本語文字はバケバケのため役立たず。

彩でセーブがうまくできない現象の再現テスト。最終的にセーブ失敗現象が 再現したものの足は掴めず。

意味無しねーちゃん

因みに上のは勘が働いたので事前にスクリーンセーブしたものでした(^^; 行った操作は主にレイヤーの操作系。他、専用ドライバを使っていた 所、時々カーソルが思わぬ方向に動く現象が見られたため、途中で Wacomドライバに切り替えたりしましたがこれはこれで問題っぽいですが、 セーブできない事には関係なさげ。文字落書きを入れる前にロード不可と なってしまったので、今回はここで終了(^^;
その後、レイヤー追加&削除&レイヤー消去&レイヤーの移動に重点を 置いて操作したところ、再現したもよう。更にチューニングした結果、

  1. 彩を起動。
  2. キャンバスに鉛筆ツールで適当にくるっと落書き。
  3. 「レイヤーを消去」でクリア(プルダウンメニューでもアイコンクリックでもOK)。
  4. 再び適当にくるっと落書き。
  5. 「名前を付けてキャンバスを保存」でファイルセーブ。
  6. 一度落として再び彩を起動。
  7. 先ほどセーブしたファイルをロードすると赤○白×で彩が落ちる。

という感じになりました。恐らく「レイヤーの消去」がキモとなっている と思われます。操作はマウスで行いました。タブレットは一応電源入って いましたが関係は無いと思われます。再現確認できましたら修正をお願い します。

2002/02/16

出張。帰着。ふぅ。風邪気味。

ppcsimいじり。チェック。だんだん調子が悪くなってきて死亡。

2002/02/15

出張。

2002/02/14

出張。

2002/02/13

出張。

2002/02/12

出張。

2002/02/11

実家で泊まって、まったり過ごしてそして帰着。

TommyFebruaryのCDを買いに行ったら売り切れの店ばかり。なんで? (<売れてるからでしょ)

しかたないので、マウスの転がりが悪くなっているのを思い出したので、 今主流のイメージセンサマウスを買ってみました。つーか、ボールの奴で ホイール付きってのが全然置いてなかったのですが(^^; で、ヒモが少し 短いという弱点はあるもののバッチリですよ。白い紙だろうがCDケースの 上だろうが反応します。でもドライバを組み込んだ後でWinを再起動かけ たら、「パスが見つかりません」みたいなメッセージが出たのが 気になる。でも、これでスイッチがヘタるまで使い続けられそうな 予感。

暇つぶし用の本などを仕入れに本屋に寄ったところ、話題沸騰中...... というほどでもないかも知れない「キャストパズル」が置いてあった ので一つ買ってみました。キャストパズルの単語自体はWebなどで 検索していただくとして(ぉい;、「リング」という奴を買ってみました。 箱に「はずせますか?元に戻せますか?」と書かれていて、裏に 元と外れた(というかバラけた)状態の写真が載っていたので、当然 外すのに苦労して元に戻すのに苦労するものかと思いきや、 バラけた状態には直ぐになった為「なんだこりゃ?」と思ったところ、 このリングという奴はバラすのは一瞬で、元に戻すのが大変な パズルなのでした(^^; 元の状態を覚えないでバラしたので、 もう戻せやしない(藁 そんな感じで暇だけは潰せそうです。

ちょっこりppcsimいじり。ういー、やっと逆アセンブルダンプを仕込み 終えた気分。確認は来週か?

XBOXのCMが割と盛大に流れていますが、既に海外では発売されている ものとは言え、最初からソフトが盛大にリリースできるってのは 凄いと思いました。

2002/02/10

かなり早起き(^^;。

弟の結婚式に出るため帰省。なにせ久しぶりに帰る上、ほとんど実家と 連絡を取らない人(>私)ですから、経緯やらなんやら色々聞いて、相手 の家族と挨拶してって疲れましたよ。

2002/02/09

少し早起き。

続き。 変わったところはgcc-2.95.2になった所、linuxヘッダを比較的新しい 2.4.9のものに交換(前のは2.4.4のものでしたでも、付録のバージョンは 2.4.13です(^^;)といった所。基本的には変わってないハズと思いながら diffで asm-ppcを比較してみると死ぬほど変更が加わっていてビックリ。 で、コンパイルしてみると、何故か前回引っかかったシステムコール系 ライブラリのコンパイルは問題無く通りました。ログを取っていなかった ので何故通ったか謎。でも、結局iconv_progのリンクに失敗。で、調べて みる事にしました。
そこで一つ疑問が沸いてきました。今回のコンパイルはCygwin上での 完全クロスコンパイルなのですが、この辺のシステムコールの実体は誰が 持っているかというとカーネルのハズです。実際に以下の ような実行でコケているのですが、

powerpc-linux-gcc -nostdlib -nostartfiles -o iconv_prog 
-Wl,-dynamic-linker=/usr/local/ppctools/powerpc-linux/lib/ld.so.1 
../csu/crt1.o ../csu/crti.o `powerpc-linux-gcc
--print-file-name=crtbegin.o` iconv_prog.o iconv_charmap.o charmap.o
charmap-dir.o linereader.o dummy-repertoire.o simple-hash.o xstrdup.o xmalloc.o
-Wl,-rpath-link=..:../math:../elf:../dlfcn:../nss:../nis:../rt:../resolv:../crypt
../libc.so.6 ../libc_nonshared.a -lgcc
`powerpc-linux-gcc --print-file-name=crtend.o` ../csu/crtn.o

見た所、PPCネイティブで動作する実行ファイルを生成しているだけ のようなので、最終的には必要なのかも知れませんが、クロス環境で生成 する分には実行できないので、きっと不要に違いない と、いう結論に 落ち着けてみました。で、touch iconv/iconv_prog で対処(本当か?(汗;)
因みに、locale/localedef,locale/locale,catgets/gencat,posix/getconf, io/pwd,nss/getent,timezone/zic,timezone/zdump,debug/pcprofiledump, sunrpc/rpcgen,sunrpc/rpcinfo,login/utmpdump,login/pt_chown, elf/sprof も同じ様にコケましたので同様に対処しました。
そしてなんとかコンパイル終了。とんでもなく時間がかかったような 気がするのは気のせいではない気分。Human68kでやろうとしたときは メモリの都合(make が8MB以上のメモリを使おうとした)でlibmを作るのが 精一杯だったのですが、エラー無く通っても数日コースだったかも知れません(^^; 因みに、configureの指定でshared,profiledのいずれのライブラリも、 makeをdisableにできる事がコンパイルし終わった後に判りました(=_=;
そしてmake install でエラー。elf/sln.exe,elf/ldconfig.exe が 出来あがるのですが、何故か付いている.exeが邪魔をして、インストールに 失敗している感じ。仕方ないので、.exe無しにリネームしてmake installした ところうまくインストールすることができました。

そして、gccを再ビルド。再ビルドは2.95.3を使用してみましたが、 C++ライブラリの作成に失敗しました。でも、make installを実行した 所、なにげにうまくインストールされたのでOKとしたところ。

で、ppcbootのコンパイルに挑戦してみましたがやっぱりNG。toolsの makeでソースのパスとld-scriptのパスが合っていなくてエラーしている っぽい感じ。glibcがインストールされていないとうまくいかないっ ぽかったりする辺りが、ちょっとアレな感じがしなくもありませんが、 ちょっとしたことでOKになりそうな予感がするので、もう少し詳しく 調べてみようと思います。

何気にlinuxカーネル(2.4.9)の方もmakeしてみました(新しいのは何故か 500KBダウンロードした所でftpが切れてしまうためダウンロード不可)。 以前は色々引っかかったような気がするのですが、何故か特に問題なく makeできました。 でも、前は、コンソール出力を乗っ取るために、printkの部分に文字列横取り ルーチンを追加していたので、それと同様の変更を加えるか、シリアル ポートをエミュレーションするという新たな技を使う必要があります。 うーん、色々あり過ぎ。それでも、ライブラリの構築ができた分、 前よりも少しマシか?

色々make中にppcsimいじり。変に共用ルーチンを使わないという ポリシーで変更を加えていたら死ぬほど大変。でも、見直していると デコードが抜けている関数があったりしたので、それなりに意味は あったかも知れませんが........

2002/02/08

出張。帰着。ふぅ。初めてTRICK2が放送されているところを観れました。 つっても、最後の数分だけなのですが(T_T)。

コンパイルの続き。gcc-2.95.2まで戻してみるのはどうか?とmakeして みましたが、同じくinternal errorでNG。nsswitch.oのコンパイルだけ 手動でgcc-3.0.3のコンパイラを指定してしのぎました。 glibcでは .o/.os/.op という三種類のオブジェクトファイルをコンパイル するのですが(それぞれ 通常/shared/profile付きって感じらしい)、 それ毎にエラーしますので、三度手動で実行する必要がありました。

そしてiconv/iconv_prog のコンパイルで大量の'__'始まりのシステム コールが見つからないと怒られました。もしや一部のシステムコール系を 削りまくってコンパイルしたせいか?ということで、結局やり直して みることに。がくぅ。

再コンパイル中にppcsimに少し手を入れることにしました。前の作りでは とても無理だったdisassemble機能を付けてみることにしたのですが、 やはり量が多過ぎて死亡。

2002/02/07

出張。

2002/02/06

出張。

2002/02/05

出張。

2002/02/04

出張。

2002/02/03

午前中に起床。今日も休み。雪にはなっていない模様。でも寒いです。

bootローダをダウンロードしてみた。 ppcboot-1.1.4redboot をダウンロードしてみたのですが、redbootの方は依存関係が イマイチよく判らず。ppcbootの方はconfigureとか無くてなんとなく 良いのですが、いまいちシリアルコンソールに対する制御をしている 部分が判らず。とりあえずコンパイルしてシミュに乗っければ 何か判るかもとコンパイルを試みたのですが、パス等の設定が 合わなさ過ぎて死亡。

なので、binutils,gcc,glibcをInterface誌の付録に従いmakeして みることにしました。以下メモのようなもの。
binutils。これについては付録に書かれている通りで基本的に OKな様ですが、cygdriveを使用するような指定がうまくいかない ようです。
gcc。3.0.3をコンパイルしようとしたのですが、libgccの コンパイル時にucontext.hを要求されてlibgccのコンパイルに失敗。 空ファイルを置いてその場を通過ましたが、unwind-dw2.cで何故か エラー。エラー個所をコメントアウトして凌ぎましたが、最後は リンクでcrti.oが見つからなくてつっかかりました。で、 gcc-2.95.3を使用してみたところ、同じやり方で問題なくmake できました。
glibc。time/settimeofday.o のコンパイルに失敗。NULLが定義 されていないのがダメだそうで。しかたないので、 sysdeps/unix/sysv/settimeofday.c にNULLをdefineして凌ぎ ました。他、posix下のfork等システムコール系関数のソースに sysdeps/unix/*.Sが使用されるようなのですが、m68kだったり ix86だったり全然関係無いアーキテクチャのソースを引っぱって こられてヘコリ。ソースの中の本体コードを削って凌ぎました。 実際にはLinuxのasm/unistd.h内マクロで定義されているので、 コンパイルすること自体不要だと思われます。で、しばらく した後、nsswitch.oのコンパイルで

powerpc-linux-gcc: Internal compiler error: program cc1 got fatal signal 11
だそうな。がっくり。

glibcのコンパイル中、スワップしまくりでほとんどハング状態 に陥ったため、とうとう我慢できなくなって物理的解決を試行しました。 そんな感じでメモリを購入。7300円/128MB也。PC-100でもOKな PC-133用メモリという奴です。やっぱ高いけど背に腹は変えられず。 取りつけてみたらあら不思議。コンパイルしながらだとテキスト エディットなんて全く不可能だったのですが、サクサク動いて くれますよ。IE上げても全然OKだし。なんかちょっと幸せ(^^) 64MBから192MBに一気にジャンプアップしましたが、これって一昔 前のワークステーション並にメモリが載っている事になりますよ。 でも、現在の一般的なPCの標準スペックからいくと64MBなんて無い も同然だったりする辺りに、今更ながら時代の変化を感じて しまいました(^^;
そういやXBOXのCMなどが流れ始めているこの頃なのですが、以前 ゲームショーなどで見たときは結構処理落ちしている感じがしたの ですが、CMでの映像ではそういった所が全然無くて結構良い感じ に見えたのですが、騙されているのかしら?

折角メモリが増えたので、glibのコンパイル中、暇潰しに彩 でお絵かき。

ねーちゃん

あぁ、彩の機能を活かせてなくてすまぬ。

明日から出張。来週の連休は弟の結婚式に出る為 一時帰省。 飲み会の予定がなかなか空かなくてすまぬ。

「ピカピカの一年生」のCM。象の飼育はやめます。というか、付録に CDが付いているのですか?! 私の頃なんかは小学二年で九九の ソノシートが付いてたくらいでしたのに!もしかして最近の幼児向け の雑誌なんかにもヒーローものとかの音楽CDが付いてたりとか?!

2002/02/02

珍しく少し早起き。色々準備。

速度アップに大して貢献していないさ加減をgprofを使ってプロファイリング。 プロファイルしてみて何気に気づいたのですが、命令毎に関数を用意している ので、その関数の通った回数がそのままそのppcプログラムで使用している 命令のプロファイルになってたりして。で、プロファイルをしたけれど、 結局一番重いのはプロファイラで使用する関数であるところのmcountだったり して(^^;。うーむ。少しムダを削ったりする程度で終了。
色々飾りを付けてみたり。一部の命令群が関数化されていないのを除いて、 関数毎のカウンタを付けて実行命令分布を調べられるようにしてみたり。

散髪に行ったり本屋に行ったり。「ラブひな(14)」など買ってみたり。 あまり好きでないと言いつつ一応全部読んでいたりする辺りがナニですが、 ハッピーエンディングでするっと終わるのはなんか好きかも。このマンガ を知った頃、「センチメンタルグラフティ」というMMK(モテテモテテ こまっちゃう)の代表のようなゲームがありました。「ラブひな」も一過性の MMKブームに便乗したマンガなのかと思っていたのですが、主人公で ある(と思う)ところの景太郎が、東大に合格して景太郎と成瀬川の立場が 逆になってきた辺りの展開から物語の筋が最終一話前のしのぶのセリフに 続いているように思いました。真意のほどは定かではありませんが。
他、コミッカーズとか。FFのゲーム画面グラフィックの遷移とか面白かった かも。フィールドマップのグラフィックがIよりIIの方がショボかったり するのは何故なのでしょう。そういや名前を忘れてしまいましたが、 この頃のスクウェアのプログラマに偉く腕の立つ外人プログラマが いて、FFのIとか「とび出せ大作戦」とかハイウェイなんとかとかいう ドライブゲームとか、全てそのプログラマが作ったというのを 聞いた事があるのを思い出しました。FF1のフィールドマップから 町のマップに入るときの画面が上下に割れる処理だとか高速スクロール、 あと、とび出せの擬似3Dの床や柱(縦に伸ばす処理がスムーズ)の 処理など、「お?」と思わせられるものがありました。

一部テーブルになっていない命令のテーブル化。今インプリメントしてある 命令は全て命令毎に1関数になりました。ふぅ。
で、本題。たまたま時期が 重なっていただけで本当に偶然なのですが、Interface誌に組み込みLinux のコンパイル手順などについて書かれた別冊付録が付いていて、その中に PPCをターゲットとしたGNUツールのビルド方法やLinuxカーネルのmake config 方法が書かれていました。その中で、ROM化したファイルシステムを マウントしてブートするようなことが書かれており、こいつをppcsimで エミュレーションしてやれば以前挫折したファイルシステムのマウントが できるかも知れないという魂胆です。問題は、/tmpや/varなど動的に書き 換えられる必要のあるディレクトリをRAMディスクとして使用する為の技は 紹介されているのですが、肝心のROMにファイルシステムを入れる方法が よく判らず、どうしたものやらという所。うーむ。
ブートローダーが色々紹介されていたので、その辺からファームがROMから ブートする場合のコードを読み取れば良いのかしら?
所で、事前に記事が載る事を聞いていたのですが有末一寿さんてKOJIさんの こと?少なくとも載ってるコードはKOJIさんのコーディングスタイルの ようですが(笑。

ランク王国のCGキャラの声が以前の声に戻ってた。

2002/02/01

出張。帰着。

何気にテーブル化の続き。一部を除いて完了。ふぅ。
取りあえずテストを行ってみましたが大して速度アップしていなさげ。へこり。 意外とswitch文でも速いんだとか思ったりして。
いくつかテストプログラムを実行したのですが、とりあえずレベルダウンはして いなさげ。


TOP PREV