なんか間違ってる気がする

カーネルコンパイルに失敗する件で、ぐるぐる探したのだが、どうも解決策が間違ってる気がする。
Kuro Box User CommunityのBBSの対処方法

Edit arch/ppc/boot/common/ns16550.c and add the following line before the line "#include ":

#include

This will allow the compilation to complete successfully.

エラーの原因って、SERIAL_PORT_DFNSが定義されてないというものな訳で、SERIAL_PORT_DFNSって何かというと、(asm/pc_serial.hだと)

#define SERIAL_PORT_DFNS                        \
        /* UART CLK   PORT IRQ     FLAGS        */                      \
        { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
        { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },      /* ttyS1 */     \
        { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },      /* ttyS2 */     \
        { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },     /* ttyS3 */

みたいな訳で、これを

static struct serial_state rs_table[RS_TABLE_SIZE] = {
        SERIAL_PORT_DFNS        /* Defined in <asm/serial.h> */
};

なんて感じで使うわけで。
となると、どのタイミングかわららないけど、ttyS0とかにアクセスすると、0x3F8とかのアドレス(あるいはI/Oポート)に何か書いてしまう訳で、これって正しいのかなぁ。というか危険。
でもこの問題となっているエラーって、カーネルのコンパイルでは発生しなくて、モジュールのビルドで発生しているところが微妙なところ。わっけわからん。
ということで、linux-2.4.17_kuro-box.tar.gzとかから適当に引っ張ってくる。ついでにserialの原クロックも修正しとく。
arch/ppc/platforms/linkstation.h(2008/1/26 2:25ダメなとこ修正)

#if defined(CONFIG_HGLAN) || defined(CONFIG_HTGL) || defined(CONFIG_KUROBOXHG)
#if 0
#define UART_CLK  130041000     /* {32.768MHz*(100% - 0.75%)} * 4 */
#endif
#define UART_CLK  130088960     /* 32.768MHz * 4 */
#elif defined(CONFIG_HLAN) || defined(CONFIG_LAN) || defined(CONFIG_KUROBOX)
#ifdef CONFIG_SERIAL_DETECT_IRQ
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF|ASYNC_SKIP_TEST|ASYNC_AUTO_IRQ)
#else
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF|ASYNC_SKIP_TEST)
#endif

#define STD_SERIAL_PORT_DFNS \
        { 0, BASE_BAUD, LINKSTATION_SERIAL_1, 13826, STD_COM_FLAGS, /* ttyS0 */   \
                iomem_base: (u8 *)LINKSTATION_SERIAL_1,                         \
                io_type: SERIAL_IO_MEM },                                       \
        { 0, BASE_BAUD, LINKSTATION_SERIAL_0, 13725, STD_COM_FLAGS, /* ttyS1 */   \
                iomem_base: (u8 *)LINKSTATION_SERIAL_0,                         \
                io_type: SERIAL_IO_MEM },

#if 0
#define SERIAL_PORT_DFNS \
	STD_SERIAL_PORT_DFNS
#endif
#define SERIAL_PORT_DFNS

で、コンパイル。さてどうなるやら。だめでした。上の間違ってるところは直してありますが、後日まとめます。