Currently the GUEST_MAGIC_BASE in the init-dom0less application is
hardcoded, which will lead to failures for 1:1 direct-mapped Dom0less
DomUs.
Since the guest magic region allocation from init-dom0less is for
XenStore, and the XenStore page is now allocated from the hypervisor,
instead of hardcoding the guest magic pages region, use
xc_hvm_param_get() to get the XenStore page PFN. Rename alloc_xs_page()
to get_xs_page() to reflect the changes.
With this change, some existing code is not needed anymore, including:
(1) The definition of the XenStore page offset.
(2) Call to xc_domain_setmaxmem() and xc_clear_domain_page() as we
don't need to set the max mem and clear the page anymore.
(3) Foreign mapping of the XenStore page, setting of XenStore interface
status and HVM_PARAM_STORE_PFN from init-dom0less, as they are set
by the hypervisor.
Take the opportunity to do some coding style improvements when possible.
Reported-by: Alec Kwapis <alec.kwapis@medtronic.com>
Signed-off-by: Henry Wang <xin.wang2@amd.com>
---
v3:
- Only get the XenStore page.
- Drop the unneeded code.
v2:
- Update HVMOP keys name.
---
tools/helpers/init-dom0less.c | 58 +++++++++--------------------------
1 file changed, 14 insertions(+), 44 deletions(-)
diff --git a/tools/helpers/init-dom0less.c b/tools/helpers/init-dom0less.c
index fee93459c4..2b51965fa7 100644
--- a/tools/helpers/init-dom0less.c
+++ b/tools/helpers/init-dom0less.c
@@ -16,30 +16,18 @@
#include "init-dom-json.h"
-#define XENSTORE_PFN_OFFSET 1
#define STR_MAX_LENGTH 128
-static int alloc_xs_page(struct xc_interface_core *xch,
- libxl_dominfo *info,
- uint64_t *xenstore_pfn)
+static int get_xs_page(struct xc_interface_core *xch, libxl_dominfo *info,
+ uint64_t *xenstore_pfn)
{
int rc;
- const xen_pfn_t base = GUEST_MAGIC_BASE >> XC_PAGE_SHIFT;
- xen_pfn_t p2m = (GUEST_MAGIC_BASE >> XC_PAGE_SHIFT) + XENSTORE_PFN_OFFSET;
- rc = xc_domain_setmaxmem(xch, info->domid,
- info->max_memkb + (XC_PAGE_SIZE/1024));
- if (rc < 0)
- return rc;
-
- rc = xc_domain_populate_physmap_exact(xch, info->domid, 1, 0, 0, &p2m);
- if (rc < 0)
- return rc;
-
- *xenstore_pfn = base + XENSTORE_PFN_OFFSET;
- rc = xc_clear_domain_page(xch, info->domid, *xenstore_pfn);
- if (rc < 0)
- return rc;
+ rc = xc_hvm_param_get(xch, info->domid, HVM_PARAM_STORE_PFN, xenstore_pfn);
+ if (rc < 0) {
+ printf("Failed to get HVM_PARAM_STORE_PFN\n");
+ return 1;
+ }
return 0;
}
@@ -100,6 +88,7 @@ static bool do_xs_write_vm(struct xs_handle *xsh, xs_transaction_t t,
*/
static int create_xenstore(struct xs_handle *xsh,
libxl_dominfo *info, libxl_uuid uuid,
+ uint64_t xenstore_pfn,
evtchn_port_t xenstore_port)
{
domid_t domid;
@@ -145,8 +134,7 @@ static int create_xenstore(struct xs_handle *xsh,
rc = snprintf(target_memkb_str, STR_MAX_LENGTH, "%"PRIu64, info->current_memkb);
if (rc < 0 || rc >= STR_MAX_LENGTH)
return rc;
- rc = snprintf(ring_ref_str, STR_MAX_LENGTH, "%lld",
- (GUEST_MAGIC_BASE >> XC_PAGE_SHIFT) + XENSTORE_PFN_OFFSET);
+ rc = snprintf(ring_ref_str, STR_MAX_LENGTH, "%"PRIu64, xenstore_pfn);
if (rc < 0 || rc >= STR_MAX_LENGTH)
return rc;
rc = snprintf(xenstore_port_str, STR_MAX_LENGTH, "%u", xenstore_port);
@@ -230,7 +218,6 @@ static int init_domain(struct xs_handle *xsh,
libxl_uuid uuid;
uint64_t xenstore_evtchn, xenstore_pfn;
int rc;
- struct xenstore_domain_interface *intf;
printf("Init dom0less domain: %u\n", info->domid);
@@ -245,20 +232,11 @@ static int init_domain(struct xs_handle *xsh,
if (!xenstore_evtchn)
return 0;
- /* Alloc xenstore page */
- if (alloc_xs_page(xch, info, &xenstore_pfn) != 0) {
- printf("Error on alloc magic pages\n");
- return 1;
- }
-
- intf = xenforeignmemory_map(xfh, info->domid, PROT_READ | PROT_WRITE, 1,
- &xenstore_pfn, NULL);
- if (!intf) {
- printf("Error mapping xenstore page\n");
+ /* Get xenstore page */
+ if (get_xs_page(xch, info, &xenstore_pfn) != 0) {
+ printf("Error on getting xenstore page\n");
return 1;
}
- intf->connection = XENSTORE_RECONNECT;
- xenforeignmemory_unmap(xfh, intf, 1);
rc = xc_dom_gnttab_seed(xch, info->domid, true,
(xen_pfn_t)-1, xenstore_pfn, 0, 0);
@@ -272,19 +250,11 @@ static int init_domain(struct xs_handle *xsh,
if (rc)
err(1, "gen_stub_json_config");
- /* Now everything is ready: set HVM_PARAM_STORE_PFN */
- rc = xc_hvm_param_set(xch, info->domid, HVM_PARAM_STORE_PFN,
- xenstore_pfn);
- if (rc < 0)
- return rc;
-
- rc = create_xenstore(xsh, info, uuid, xenstore_evtchn);
+ rc = create_xenstore(xsh, info, uuid, xenstore_pfn, xenstore_evtchn);
if (rc)
err(1, "writing to xenstore");
- rc = xs_introduce_domain(xsh, info->domid,
- (GUEST_MAGIC_BASE >> XC_PAGE_SHIFT) + XENSTORE_PFN_OFFSET,
- xenstore_evtchn);
+ rc = xs_introduce_domain(xsh, info->domid, xenstore_pfn, xenstore_evtchn);
if (!rc)
err(1, "xs_introduce_domain");
return 0;
--
2.34.1
On 2024-05-16 23:21, Henry Wang wrote: > Currently the GUEST_MAGIC_BASE in the init-dom0less application is > hardcoded, which will lead to failures for 1:1 direct-mapped Dom0less > DomUs. > > Since the guest magic region allocation from init-dom0less is for > XenStore, and the XenStore page is now allocated from the hypervisor, > instead of hardcoding the guest magic pages region, use > xc_hvm_param_get() to get the XenStore page PFN. Rename alloc_xs_page() > to get_xs_page() to reflect the changes. > > With this change, some existing code is not needed anymore, including: > (1) The definition of the XenStore page offset. > (2) Call to xc_domain_setmaxmem() and xc_clear_domain_page() as we > don't need to set the max mem and clear the page anymore. > (3) Foreign mapping of the XenStore page, setting of XenStore interface > status and HVM_PARAM_STORE_PFN from init-dom0less, as they are set > by the hypervisor. > > Take the opportunity to do some coding style improvements when possible. > > Reported-by: Alec Kwapis <alec.kwapis@medtronic.com> > Signed-off-by: Henry Wang <xin.wang2@amd.com> Reviewed-by: Jason Andryuk <jason.andryuk@amd.com> Thanks, Jason
On Mon, 20 May 2024, Jason Andryuk wrote: > On 2024-05-16 23:21, Henry Wang wrote: > > Currently the GUEST_MAGIC_BASE in the init-dom0less application is > > hardcoded, which will lead to failures for 1:1 direct-mapped Dom0less > > DomUs. > > > > Since the guest magic region allocation from init-dom0less is for > > XenStore, and the XenStore page is now allocated from the hypervisor, > > instead of hardcoding the guest magic pages region, use > > xc_hvm_param_get() to get the XenStore page PFN. Rename alloc_xs_page() > > to get_xs_page() to reflect the changes. > > > > With this change, some existing code is not needed anymore, including: > > (1) The definition of the XenStore page offset. > > (2) Call to xc_domain_setmaxmem() and xc_clear_domain_page() as we > > don't need to set the max mem and clear the page anymore. > > (3) Foreign mapping of the XenStore page, setting of XenStore interface > > status and HVM_PARAM_STORE_PFN from init-dom0less, as they are set > > by the hypervisor. > > > > Take the opportunity to do some coding style improvements when possible. > > > > Reported-by: Alec Kwapis <alec.kwapis@medtronic.com> > > Signed-off-by: Henry Wang <xin.wang2@amd.com> > > Reviewed-by: Jason Andryuk <jason.andryuk@amd.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
© 2016 - 2024 Red Hat, Inc.