ペンディング事項三点

  1. udelay() について
  2. cached_master_mask と cached_slave_mask の初期設定値について
  3. 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()

GNU C Compiler Internalsより引用

で、__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 って何だろ。これ、タイマ関連だから別な機会にした方がよさげ。

上記処理で何やってるか、は別途だな。(を
# ペンディング多過ぎねぇ??