katsu > katsu/refmon > katsu/refmon/arm_port
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 のシステムコール呼び出しでは、変更する方法がなさそうである。どうしたものかな。