18:26:10 # Life 時代はBinary. Binary 2.0 Conference会場. とりあえず,カーネルソースを展開して,今日解決しようとしている問題を分析してみる. 調べたいのは,powerpcのLinuxカーネルで,ptraceのPTRACE_GETREGSは実装できるのか,という点. 2.6.15系列はpowerpc関連のカーネルツリーがいろいろといじられていて,ファイルの場所が移動しているため,2.6.14を対象にする. なんとなく見てみると,arch/ppc64/kernel/ptrace.c と arch/ppc64/kernel/ptrace32.c というのがあり, sys32_ptraceを見てみると, PPC_PTRACE_GETREGSというのが定義されている. arch/ppc/kernel/ptrace.cには,PPC_PTRACE_GETREGS がない.
やっていることをそのまま移植できるか,確認. child は, find_task_by_pid(pid) を呼んでいる. ppc64では, child->thread.regs というのがあり, その該当スレッドの汎用レジスタの値が返って来る. ppc32では,unsigned long は4バイト.
include/asm-ppc/ptrace.hを見ると, それっぽいPT_R0とかが定義されている. その上に「mklinuxとかの互換性をもたせるために変更できない」というコメントが書いてある.
とかいろいろと調べてみると, PTRACE_GETREGSは実装されていないが, PTRACE_PEEKUSRは実装されているような気がして来た.
必要っぽい部分だけを32ビット版PPCのツリーにコピペして, カーネル側でPPC_PTRACE_GETREGSを処理するようにしてみた. しかし,ユーザ空間からたたいてみようとすると,Bad addressというエラーがかえってくる.なぜだ. glibcでの内容はどうやらここらへんだろう. glibc-2.3.2/sysdeps/unix/sysv/linux/ptrace.c. なんだかありえないくらいifdef __i386__と書いてあり,他のアーキテクチャだったら厳格なチェックをしないで適当に処理しようというスタンスがひしひしと伝わって来る. で,Bad address をかえしそうなのは,CHECK_1のようだ. sysdeps/generic/bp-checks.hで定義.
しかし,ここまで調べたところでBinary 2.0 Conference終了. 時間切れ.
$Id: dancer-diary.el,v 1.89 2005/05/12 11:19:14 dancer Exp $