mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: configure dom0less domain for enabling xenstore after boot
Export evtchn_alloc_unbound and make it __must_check. If "xen,enhanced" is enabled, then add to dom0less domains: - the hypervisor node in device tree - the xenstore event channel The xenstore event channel is also used for the first notification to let the guest know that xenstore has become available. Signed-off-by: Luca Miccio <lucmiccio@gmail.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@xilinx.com> Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com> Acked-by: Jan Beulich <jbeulich@suse.com> CC: Julien Grall <julien@xen.org> CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com> CC: Bertrand Marquis <bertrand.marquis@arm.com>
This commit is contained in:
1 parent
5eedfe7728
commit
79eb2871f2
3 files changed
+42
-1
No files matched your search
@@ -27,6 +27,7 @@
|
||||
#include <asm/setup.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/domain_build.h>
|
||||
#include <xen/event.h>
|
||||
|
||||
#include <xen/irq.h>
|
||||
#include <xen/grant_table.h>
|
||||
@@ -2813,6 +2814,8 @@ static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo)
|
||||
int ret;
|
||||
|
||||
kinfo->phandle_gic = GUEST_PHANDLE_GIC;
|
||||
kinfo->gnttab_start = GUEST_GNTTAB_BASE;
|
||||
kinfo->gnttab_size = GUEST_GNTTAB_SIZE;
|
||||
|
||||
addrcells = GUEST_ROOT_ADDRESS_CELLS;
|
||||
sizecells = GUEST_ROOT_SIZE_CELLS;
|
||||
@@ -2887,6 +2890,13 @@ static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if ( kinfo->dom0less_enhanced )
|
||||
{
|
||||
ret = make_hypervisor_node(d, kinfo, addrcells, sizecells);
|
||||
if ( ret )
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = fdt_end_node(kinfo->fdt);
|
||||
if ( ret < 0 )
|
||||
goto err;
|
||||
@@ -3153,6 +3163,25 @@ static int __init construct_domain(struct domain *d, struct kernel_info *kinfo)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init alloc_xenstore_evtchn(struct domain *d)
|
||||
{
|
||||
evtchn_alloc_unbound_t alloc;
|
||||
int rc;
|
||||
|
||||
alloc.dom = d->domain_id;
|
||||
alloc.remote_dom = hardware_domain->domain_id;
|
||||
rc = evtchn_alloc_unbound(&alloc);
|
||||
if ( rc )
|
||||
{
|
||||
printk("Failed allocating event channel for domain\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN] = alloc.port;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init construct_domU(struct domain *d,
|
||||
const struct dt_device_node *node)
|
||||
{
|
||||
@@ -3222,6 +3251,15 @@ static int __init construct_domU(struct domain *d,
|
||||
if ( rc < 0 )
|
||||
return rc;
|
||||
|
||||
if ( kinfo.dom0less_enhanced )
|
||||
{
|
||||
ASSERT(hardware_domain);
|
||||
rc = alloc_xenstore_evtchn(d);
|
||||
if ( rc < 0 )
|
||||
return rc;
|
||||
d->arch.hvm.params[HVM_PARAM_STORE_PFN] = ~0ULL;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -290,7 +290,7 @@ void evtchn_free(struct domain *d, struct evtchn *chn)
|
||||
xsm_evtchn_close_post(chn);
|
||||
}
|
||||
|
||||
static int evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc)
|
||||
int evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc)
|
||||
{
|
||||
struct evtchn *chn;
|
||||
struct domain *d;
|
||||
|
||||
@@ -71,6 +71,9 @@ void evtchn_free(struct domain *d, struct evtchn *chn);
|
||||
/* Allocate a specific event channel port. */
|
||||
int evtchn_allocate_port(struct domain *d, unsigned int port);
|
||||
|
||||
/* Allocate a new event channel */
|
||||
int __must_check evtchn_alloc_unbound(evtchn_alloc_unbound_t *alloc);
|
||||
|
||||
/* Unmask a local event-channel port. */
|
||||
int evtchn_unmask(unsigned int port);
|
||||
|
||||
|
||||