Linux/mipsに於けるsmp_processor_id()の謎

Linuxのsmp_processor_id()がどう実装されているか調べてみた。

include/linux/smp.h

# define smp_processor_id() raw_smp_processor_id()

include/asm-mips/smp.h

#define raw_smp_processor_id() (current_thread_info()->cpu)

include/asm-mips/thread_info.h

/* How to get the thread information struct from C.  */
register struct thread_info *__current_thread_info __asm__("$28");
#define current_thread_info()  __current_thread_info

と言う訳で、ハードウェアからID番号を貰っているかとおもいきや、$28(gp)にstruct thread_info *を置いといてここから番号を引っ張り出すようだ。

疑問

  • グローバルポインタって使わないの?BSDだと使ってるような気がするんだけど・・・そもそも、どういう時つかってどういう時使わないんだろう。
  • ユーザランドで$28を書き換えられる心配は無いの?書き換えられたら一体どうやってリストアするの?(プロセッサが2個以上ある場合。)ユーザランドが書き換えたらExceptionを発生させて阻止するような事って、MIPSでは出来ないよね?

う〜ん。
良く分からない。
他の方法で現在走行中なスレッドが分かるようになってるのか?

Linux-MIPSな人居ないかなぁ・・・ちっとも読み解けない・・・