[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 3/4] tools/libxc: Add APIs to create and get the PV ring page
Add two APIs, xc_mem_access_create_ring_page() and xc_mem_access_get_ring_mfn(). The mem_access listener needs to call xc_mem_access_create_ring_page() before enabling mem_access for PV domains. This is not needed for HVM domains as the page is created during domain creation time. It can then call xc_mem_access_get_ring_mfn() to get the mfn of the created page to map in. This is requivalent to xc_get_hvm_param(HVM_PARAM_ACCESS_RING_PFN) for HVM domains. Signed-off-by: Aravindh Puthiyaparambil <aravindp@xxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxc/xc_mem_access.c | 29 +++++++++++++++++++++++++++++ tools/libxc/xenctrl.h | 17 ++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/tools/libxc/xc_mem_access.c b/tools/libxc/xc_mem_access.c index f436e69..b85af0d 100644 --- a/tools/libxc/xc_mem_access.c +++ b/tools/libxc/xc_mem_access.c @@ -97,6 +97,35 @@ int xc_get_mem_access(xc_interface *xch, return rc; } +int xc_mem_access_create_ring_page(xc_interface *xch, domid_t domain_id) +{ + xen_mem_access_op_t mao = + { + .op = XENMEM_access_op_create_ring_page, + .domid = domain_id + }; + + return do_memory_op(xch, XENMEM_access_op, &mao, sizeof(mao)); +} + +int xc_mem_access_get_ring_mfn(xc_interface *xch, domid_t domain_id, + unsigned long *mfn) +{ + int rc; + xen_mem_access_op_t mao = + { + .op = XENMEM_access_op_get_ring_mfn, + .domid = domain_id + }; + + rc = do_memory_op(xch, XENMEM_access_op, &mao, sizeof(mao)); + + if ( !rc ) + *mfn = mao.pfn; + + return rc; +} + /* * Local variables: * mode: C diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index 02129f7..a1c743d 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -2050,7 +2050,10 @@ int xc_mem_access_resume(xc_interface *xch, domid_t domain_id); /* * Set a range of memory to a specific access. * Allowed types are XENMEM_access_default, XENMEM_access_n, any combination of - * XENMEM_access_ + (rwx), and XENMEM_access_rx2rw + * XENMEM_access_ + (rwx), XENMEM_access_rx2rw and XENMEM_access_n2rwx for HVM + * domains. + * Allowed types are XENMEM_access_default, XENMEM_access_r, XENMEM_access_rw, + * XENMEM_access_rwx and XENMEM_access_rx2rw for PV domains. */ int xc_set_mem_access(xc_interface *xch, domid_t domain_id, xenmem_access_t access, uint64_t first_pfn, @@ -2062,6 +2065,18 @@ int xc_set_mem_access(xc_interface *xch, domid_t domain_id, int xc_get_mem_access(xc_interface *xch, domid_t domain_id, uint64_t pfn, xenmem_access_t *access); +/* + * Create the ring page for PV domains. This has to be called before calling + * xc_mem_access_enable(). This should not be called for HVM domains + */ +int xc_mem_access_create_ring_page(xc_interface *xch, domid_t domain_id); + +/* + * Get the mfn of the ring page for PV domains + */ +int xc_mem_access_get_ring_mfn(xc_interface *xch, domid_t domain_id, + unsigned long *mfn); + /*** * Memory sharing operations. * -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |