Write the associated event channel into the xenstore page so xenstored can read it. xenstored can map the grant by the reserved grant table entry, and then read out the event channel and bind it. This eliminates the need for an additional mechanism to discover the event channel.
Signed-off-by: Jason Andryuk <jason.andr...@amd.com> --- v2: No change This should go in after the init-dom0less changes so init-dom0less is ready for xenstored automatically introducing domains. I'm looking for feedback. This is ARM-only for the time being, but that is the only in-tree user of this code. From the perspective, it is okay to go in. If we want a cross-arch approach, a common function to write to guest physical addresses would be needed for additional arches, but they aren't available yet. Oleksii added a function pointer to dtb_load() and initrd_load() when moving dom0less to common, but I think that isn't necessary. Just having a common helper would be sufficient. copy_to_guest_phys() or something_copy_to_guest_phys() could be defined or a wrapper for ARM's copy_to_guest_phys_flush_dcache(). Other arches could need to implement it when using dom0less. I'm not an ARM expert, but Stefano said copy_to_guest_phys_flush_dcache() is not necessary since this xenstore page isn't expected to be accessed without caches enabled. --- xen/common/device-tree/dom0less-build.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/xen/common/device-tree/dom0less-build.c b/xen/common/device-tree/dom0less-build.c index badc227031..1a40f68837 100644 --- a/xen/common/device-tree/dom0less-build.c +++ b/xen/common/device-tree/dom0less-build.c @@ -26,6 +26,7 @@ #include <public/event_channel.h> #include <public/io/xs_wire.h> +#include <asm/guest_access.h> #include <asm/setup.h> #include <xen/static-memory.h> @@ -120,8 +121,14 @@ static void __init initialize_domU_xenstore(void) if ( gfn != XENSTORE_PFN_LATE_ALLOC && IS_ENABLED(CONFIG_GRANT_TABLE) ) { + evtchn_port_t port = d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN]; + paddr_t evtchn_gaddr = gfn_to_gaddr(_gfn(gfn)) + + offsetof(struct xenstore_domain_interface, evtchn_port); + ASSERT(gfn < UINT32_MAX); gnttab_seed_entry(d, GNTTAB_RESERVED_XENSTORE, xs_domid, gfn); + access_guest_memory_by_gpa(d, evtchn_gaddr, &port, sizeof(port), + true /* is_write */); } } } -- 2.50.1