include/asm-i386/io.h について
{in|out}[bwl] に関するメモ。
とりあえず、inb() と outb() について調査。io.h において定義されているマクロ __BUILDIO にてこれらのインライン関数が定義されている。マクロ CONFIG_X86_NUMAQ の定義によって定義処理が分岐している。NUMA についての参考文書は以下。
ここでは CONFIG_X86_NUMAQ マクロが定義されていない事を前提として定義処理をチェックしたい。inb() と outb() の定義は以下のようになると考えられる。
static inline void outb(unsigned char value, int port) { outb_local(value, port); } static inline unsigned char inb(int port) { return inb_local(port); }
次に {in|out}b_local() の定義を見てみる。io.h においては直下にある BUILDIO マクロ内にて定義されている。(以下はマクロが展開された結果を若干見易く修正している)
static inline void outb_local(unsigned char value, int port) { __asm__ __volatile__("outb %b0, %w1" : : "a"(value), "Nd"(port)); } static inline unsigned char inb_local(int port) { unsigned char value; __asm__ __volatile__("inb %w1, %b0" : "=a"(value) : "Nd"(port)); return value; }
以下は参考にした文書。
io.h にて定義されている {in|out}[bwl]() 関数群は見事にラッパになっているのが分かる。非常に興味深い。{in|out}[bwl]_p() にて呼ばれている slow_down_io() 関数については直上にて定義されているが、調査は別途。又、CONFIG_X86_NUMAQ なナニについても別途という事で。
で、関数が静的に宣言されてるんですが、どーゆーこった??と思っていたんですが、inline 展開されないレベルでコンパイルされた時のためのニゲ道 (って言い方悪いな) なのかな?? (静的に宣言されているので、別なソースから参照不可能な為、シンボル解決不可能なエラーになってしまう??)
疑問点は微妙に残っているんですが、次は arch/i386/kernel/i8259.c を。