cached_master_mask と cached_slave_mask について

これらの初期設定値やらその他モロモロについて
結構ムチャなワザを使っている。以下はinit_8259A()#arch/i386/kernel/i8259.c のマスク後処理の部分。

outb(cached_master_mask, PIC_MASTER_IMR);
outb(cached_slave_mask, PIC_SLAVE_IMR);

cached_master_mask って何だ、という事で TAG 引っ張ると include/asm-i386/i8259.h にて以下の定義。

extern unsigned int cached_irq_mask;

#define __byte(x,y)         (((unsigned char *) &(y))[x])
#define cached_master_mask    (__byte(0, cached_irq_mask))
#define cached_slave_mask    (__byte(1, cached_irq_mask))

cached_irq_mask はどこで定義されているか、というと arch/i386/kernel/i8259.cにて以下。

unsigned int cached_irq_mask = 0xffff;

unsigned int で確保した領域を無理矢理 char [2] な配列として使われております。
i386 とゆーコトでリトルエンディアン前提なアレになっている点にも注意が必要かも。どうもあのバイトオーダとゆーやつには未だに慣れない。

で、最初は全部マスクな状態な、という事も分かりました。
がしかし、なら後処理いらねーじゃん、というのは素人考えですな。