ペンディング事項三点
- udelay() について
- cached_master_mask と cached_slave_mask の初期設定値について
- disable_8259A_irq() と mask_and_ack_8259A() について
とりあえず udelay() について
include/asm-i386/delay.h にマクロの定義あり。udelay マクロの定義は以下。
#define udelay(n) (__builtin_constant_p(n) ? \ ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \ __udelay(n))
__builtin_constant_p って何??ってコトで google 先生に聞いたトコロ、test_bit()/Linux2.6 - 読学のススメに hit。
__builtin_constant_p(nr)は、nrの値がコンパイル時に定数であるかどうかを調べる
test_bit()/Linux2.6 - 読学のススメより引用
英語で探してたら、GCC のドキュメント読んでみ、みたいなレスが付いてて、GNU C Compiler Internalsナドとゆー文書に行き当たったんですが、英語力が微妙スギ。以下に引用を。
Builtin Name | Explanation |
builtin_constant_p | returns true if the argument is a constant |
builtin_memcpy | equivalent to memcpy() |
builtin_strlen | equivalent to strlen() |
で、__const_udelay() とか __udelay() とかの実体ってドコよ??って見てみると Linus Torvalds さん直筆のコメントにて arch/i386/lib/delay.c との記述あり。開いてみると関数の定義が。
inline void __const_udelay(unsigned long xloops) { int d0; xloops *= 4; __asm__("mull %0" :"=d" (xloops), "=&a" (d0) :"1" (xloops),"0" (cpu_data[_smp_processor_id()].loops_per_jiffy * (HZ/4))); __delay(++xloops); } void __udelay(unsigned long usecs) { __const_udelay(usecs * 0x000010c7); /* 2**32 / 1000000 (rounded up) */ }
なんだこれは、と白痴化寸前の脳でナニすんのは面倒なので、読学のススメ先生にお伺い。__const_udelay()/linux2.6に解説あり。ちょっと記述違うけどバージョンが原因かも。
読学のススメにばかり頼っていてはアレなので TAG を引っ張ってみる。
まず、cpu_data 配列は arch/i386/kernel/smpboot.c にて定義。
/* Per CPU bogomips and other parameters */ struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
struct cpuinfo_x86 な構造体の定義は omit (include/asm-i386/processor.h)。loops_per_jiffy って何だろ。これ、タイマ関連だから別な機会にした方がよさげ。
上記処理で何やってるか、は別途だな。(を
# ペンディング多過ぎねぇ??