katsu > katsu/refmon > katsu/refmon/arm_port

ARM への移植作業

アーキテクチャ固有のレジスタ

CPSR があるのとないのとで struct pt_regs のレジスタ数が違う。 Armadillo-9 に使われている ARM9 は CPSR を持っているので armv の方である。

もっとも CPSR が何のレジスタであってもかまわないのだが、カーネルのヘッダがこういう定義をしているため非常にやりづらい。どういうことかというと CPSR の有無によって struct pt_regs 内での ARM_ORIG_r0 の位置が変わってしまうのである。

//include/arch-arm/proc-armv/ptrace.h
struct pt_regs {
    long uregs[18];
};
#define ARM_cpsr       uregs[16]
#define ARM_pc         uregs[15]
(省略)
#define ARM_r0         uregs[0]
#define ARM_ORIG_r0    uregs[17]
//include/arch-arm/proc-armo/ptrace.h
struct pt_regs {
    long uregs[17];
};
#define ARM_pc         uregs[15]
(省略)
#define ARM_r0         uregs[0]
#define ARM_ORIG_r0    uregs[16]

システムコール周りの処理について

ARM は i386 と全然違うのでかなり困っている。ここに違いを適宜メモしていく予定である。

システムコールの引数について

これで正しそう。引き続き観察する。

Intelx86 と違って、r0 が呼び出し時は第一引数なのに、返ってきた時は返り値になっているというのが後で困りそうな気がします。呼び出し時に引数を変更して、返ってきたときに元の値を復元しようとしておかしくなるんじゃないかという疑惑がわいております。

レジスタ意味
orig_r0第 1引数(元の r0)
r0第 1引数 帰ってくるときは、システムコールの返り値
r1第 2引数
r2第 3引数
r3第 4引数
r4第 5引数
r5第 6引数

システムコール番号の取得

i386 とは違って、システムコール番号の取得が結構面倒である。

システムコールの改変について

i386 では orig_eax を変更すると勝手に反映してくれたが、ARM のシステムコール呼び出しでは、変更する方法がなさそうである。どうしたものかな。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS