Select the types of activity you want to include in your feed.
xen/two-domain: run the interrupt self-test before the shared-page exchange
Each domain calls R.irq_selftest once at boot, demonstrating the GICv3 interrupt subsystem in a dom0less domU. Boot-verified: both domains report the SGI handler FIRED.
···2222boots both domains -- no hand-written device tree, no raw qemu:
23232424```
2525+(d2) [irq] SGI self-test: FIRED (interrupt path works)
2626+(d1) [irq] SGI self-test: FIRED (interrupt path works)
2527(d2) [round 1/10] shared counter now 1 -- the peer's writes are visible
2628(d1) [round 1/10] shared counter now 3 -- the peer's writes are visible
2729(d2) [round 2/10] shared counter now 2 -- the peer's writes are visible
···2931(d2) ==== done: shared counter reached 18 > 10 rounds -- the two domains share one page ====
3032(d1) ==== done: shared counter reached 20 > 10 rounds -- the two domains share one page ====
3133```
3434+3535+Each domain first runs an interrupt self-test (`R.irq_selftest`): it installs an
3636+AArch64 exception vector table, brings up the GICv3 CPU interface and
3737+redistributor, sends itself a software-generated interrupt, and confirms the IRQ
3838+handler ran -- the machinery a guest needs to wake on a device interrupt instead
3939+of polling, since Xen/ARM injects device IRQs through the vGIC (there is no
4040+`bind_pirq` path to an event channel on ARM). The counter exchange then follows.
32413342Both domains run the same image (`unikernel.xen`, linked at the standard guest
3443RAM base `0x40000000` where Xen maps each domain's static memory) and need no
···1515 mapping ONE host page instead reach about 2*[rounds], because each sees the
1616 other's writes. The port (10) and the shared page's guest address are
1717 conventions the host device tree and the runner (cmd_run) agree on, since a
1818- fully static domain gets no dynamically generated tree of its own. *)
1818+ fully static domain gets no dynamically generated tree of its own.
1919+2020+ Before the exchange, each domain runs {!R.irq_selftest} once: it installs an
2121+ exception vector table, brings up the GICv3 CPU interface and redistributor,
2222+ sends itself a software interrupt, and confirms the handler ran -- the
2323+ interrupt machinery a guest needs to wake on a device IRQ (Xen/ARM injects
2424+ those through the vGIC) instead of polling. *)
19252026module R = Mirage_eio_xen_hypercalls.Runtime
2127···3945 (* Map shared_info (the event-channel pending bitmap lives there) and the
4046 grant table, as any PV guest does at boot. *)
4147 if R.boot_identity () <> 0 then failwith "boot_identity: boot mapping failed";
4848+ Printf.printf "[irq] SGI self-test: %s\n%!"
4949+ (if R.irq_selftest () then "FIRED (interrupt path works)"
5050+ else "no interrupt (timed out)");
4251 (* The one host page Xen maps into both domains (xen,static-shm): the counter
4352 lives in its first four bytes. *)
4453 let shared = R.shared_region ~gpa:shm_gpa ~len:shm_len in