@@ -20,6 +20,8 @@
#include <asm/static-memory.h>
#include <asm/static-shmem.h>
+#define XENSTORE_PFN_LATE_ALLOC UINT64_MAX
+
static domid_t __initdata xs_domid = DOMID_INVALID;
static bool __initdata need_xenstore;
@@ -756,7 +758,7 @@ static int __init alloc_xenstore_params(struct kernel_info *kinfo)
if ( (kinfo->dom0less_feature & (DOM0LESS_XENSTORE | DOM0LESS_XS_LEGACY))
== (DOM0LESS_XENSTORE | DOM0LESS_XS_LEGACY) )
- d->arch.hvm.params[HVM_PARAM_STORE_PFN] = ~0ULL;
+ d->arch.hvm.params[HVM_PARAM_STORE_PFN] = XENSTORE_PFN_LATE_ALLOC;
else if ( kinfo->dom0less_feature & DOM0LESS_XENSTORE )
{
rc = alloc_xenstore_page(d);
@@ -788,6 +790,12 @@ static void __init initialize_domU_xenstore(void)
rc = alloc_xenstore_evtchn(d);
if ( rc < 0 )
panic("%pd: Failed to allocate xenstore_evtchn\n", d);
+
+ if ( gfn != XENSTORE_PFN_LATE_ALLOC && IS_ENABLED(CONFIG_GRANT_TABLE) )
+ {
+ ASSERT(gfn < UINT32_MAX);
+ gnttab_seed_entry(d, GNTTAB_RESERVED_XENSTORE, xs_domid, gfn);
+ }
}
}
@@ -4346,6 +4346,20 @@ static void gnttab_usage_print(struct domain *rd)
printk("no active grant table entries\n");
}
+#ifdef CONFIG_DOM0LESS_BOOT
+void __init gnttab_seed_entry(const struct domain *d, unsigned int idx,
+ domid_t be_domid, uint32_t frame)
+{
+ const struct grant_table *gt = d->grant_table;
+
+ ASSERT(!d->creation_finished);
+ ASSERT(gt->gt_version == 1);
+ shared_entry_v1(gt, idx).flags = GTF_permit_access;
+ shared_entry_v1(gt, idx).domid = be_domid;
+ shared_entry_v1(gt, idx).frame = frame;
+}
+#endif
+
static void cf_check gnttab_usage_print_all(unsigned char key)
{
struct domain *d;
@@ -33,6 +33,10 @@
struct grant_table;
+/* Seed a gnttab entry for Hyperlaunch/dom0less. */
+void gnttab_seed_entry(const struct domain *d, unsigned int idx,
+ domid_t be_domid, uint32_t frame);
+
#ifdef CONFIG_GRANT_TABLE
extern unsigned int opt_gnttab_max_version;
@@ -44,6 +44,7 @@ typedef __UINTPTR_TYPE__ uintptr_t;
#define UINT8_MAX (255)
#define UINT16_MAX (65535)
#define UINT32_MAX (4294967295U)
+#define UINT64_MAX (18446744073709551615ULL)
#define INT_MAX ((int)(~0U>>1))
#define INT_MIN (-INT_MAX - 1)