Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Zynqのqemu (その10)



Zynqのqemu (その8)でのqemu_register_reset関数は、
 300     for (; env; env = env->next_cpu) {
 301         env->boot_info = info;
 302         qemu_register_reset(do_cpu_reset, env);
 303     }
vl.cで次のように定義されています。
1358 void qemu_register_reset(QEMUResetHandler *func, void *opaque)
1359 {
1360     QEMUResetEntry *re = g_malloc0(sizeof(QEMUResetEntry));
1361 
1362     re->func = func;
1363     re->opaque = opaque;
1364     QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
1365 }

reset_handlersに、登録するだけです。reset_handlersに登録されたものは、vl.cで次のようにqemu_system_reset関数で呼び出されます。
1380 void qemu_system_reset(bool report)
1381 { 
1382     QEMUResetEntry *re, *nre;
1383 
1384     /* reset all devices */
1385     QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
1386         re->func(re->opaque);
1387     }
1388     if (report) {
1389         monitor_protocol_event(QEVENT_RESET, NULL);
1390     }
1391     cpu_synchronize_all_post_reset();
1392 }

そして、qemu_system_reset関数は、vl.cのmain関数で呼び出されます。
3489     qemu_system_reset(VMRESET_SILENT);

つまり、引数で指定した(-Mオプション)でマシンのinit関数を呼び出し、init関数
リセット後に呼び出される関数を登録し、qemu_system_reset関数を呼ぶようになっています。

長くなりましたが、11回に分けて、Zynq用のqemuのコードをみてきました。

で、FPGA部にユーザー回路を実装したときに、
どのようにしてqemuにモデルを追加すればいいかについては、
機会がありましたら、アップしたいと思います。

検証、Verification、FPGA

P.S
なんとタイミングのいいことでしょう。
CQ出版社インタフェース5月号の特集は、シミュレータでQEMUについての記載もあります。
この特集を読めば、モデルの追加も簡単にできるかもしれません。