ポインタ
複雑だと思ったのはポインタを複雑に使っているからだった、、、bus は irq 用のポインタを用意している。
qemu_irq *irqp[QDEV_MAX_IRQ];
簡単にするために配列を考えずに考えよう。(少し簡単になった)
qemu_ira *irqp
sysbus_init_irq でデバイス側の irq のポインタが登録される。
sysbus_init_irq(dev, &s->irq);
これは
dev->irqp = p;
と代入される。CPU 側は最終的に sysbus_connect_irq でコネクトされる。たとえば
sysbus_create_varargs("zynq_gpio", 0xE000A000, pic[20], NULL);
これで実体が引き渡される。ポインタではない。で sysbus_connect_irq では
void sysbus_connect_irq(SysBusDevice *dev, int n, qemu_irq irq)
とこれもまた第3引数は実体。でソース上は
*dev->irqp= irq;
となっているからコピーしてますね。
memcpy(dev->irqp, &irq, sizeof(irq));
と同じ。ということで、内容を引き回してコピーしている!!!というのが実情です。そういわれてみれば xilinx.c のなかで pic[] はローカル変数だな。
やっぱり複雑。いずれ息詰まる[行き詰る)なこれは、、、