ポインタ

複雑だと思ったのはポインタを複雑に使っているからだった、、、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[] はローカル変数だな。

やっぱり複雑。いずれ息詰まる[行き詰る)なこれは、、、