Zynqのqemu (その9)の続き。
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 }
長くなりましたが、11回に分けて、Zynq用のqemuのコードをみてきました。
検証、Verification、FPGA