工業用PC上のソフト開発をqemuで行う.

工業用PCとはいっても,大部分はWindowsLinuxが動くPCと同じなので,qemubochsといったPCエミュレータが使える.


ただし,膨大にシリアルポートやパラレルポートがあったり,IRQの割当が微妙にお茶目だったりすることがあるのが工業用PCの特徴でもある..
お茶目な構成の実ハードは,台数が足りなく,開発も遅れがちで,下流のソフト屋には納品直前まで届かないこともしばしば.

ハード屋さんの仕事を待っている時間があったら,qemuをハックして自衛しよう,というのが今回のネタ.引用するqemuのバージョンは,本家のsvnにある今日現在のHEADリビジョン.


PCハードのエミュレーションは,qemu/hw/pc.c をとっかかりとしてみていけばよい.
既にqemuがエミュレートしているハードウェアの構成を変えるのは非常に簡単.例えばパラレルポートなら,

static int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
static int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 };

なんていう感じで,説明の必要がないほど.シリアルポートも同様.


I/Oバスに繋がった特殊なデバイスを自前でエミュレートしなければならない場合,qemu/vl.c 辺りにある

/* size is the word size in byte */
int register_ioport_read(int start, int length, int size,
                         IOPortReadFunc *func, void *opaque)

とか

/* size is the word size in byte */
int register_ioport_write(int start, int length, int size,
                          IOPortWriteFunc *func, void *opaque)

とかを覗けば,何をすればよいのかは概ね想像がつくはず.


PCIバスの向こうにも独自デバイスがある場合は,qemu/hw/pci.c も見る必要がある.