int vcpu, unsigned long long virt);
-/**
- * DEPRECATED. Avoid using this, as it does not correctly account for PFNs
- * without a backing MFN.
- */
-int xc_get_pfn_list(xc_interface *xch, uint32_t domid, uint64_t *pfn_buf,
- unsigned long max_pfns);
-
int xc_copy_to_domain_page(xc_interface *xch, uint32_t domid,
unsigned long dst_pfn, const char *src_page);
return rc;
}
-int xc_get_pfn_list(xc_interface *xch,
- uint32_t domid,
- uint64_t *pfn_buf,
- unsigned long max_pfns)
-{
- DECLARE_DOMCTL;
- DECLARE_HYPERCALL_BOUNCE(pfn_buf, max_pfns * sizeof(*pfn_buf), XC_HYPERCALL_BUFFER_BOUNCE_OUT);
- int ret;
-
- if ( xc_hypercall_bounce_pre(xch, pfn_buf) )
- {
- PERROR("xc_get_pfn_list: pfn_buf bounce failed");
- return -1;
- }
-
- domctl.cmd = XEN_DOMCTL_getmemlist;
- domctl.domain = domid;
- domctl.u.getmemlist.max_pfns = max_pfns;
- set_xen_guest_handle(domctl.u.getmemlist.buffer, pfn_buf);
-
- ret = do_domctl(xch, &domctl);
-
- xc_hypercall_bounce_post(xch, pfn_buf);
-
- return (ret < 0) ? -1 : domctl.u.getmemlist.num_pfns;
-}
-
long xc_get_tot_pages(xc_interface *xch, uint32_t domid)
{
xc_dominfo_t info;
-> nativeint -> Xenmmap.mmap_interface
= "stub_map_foreign_range"
-external domain_get_pfn_list: handle -> domid -> nativeint -> nativeint array
- = "stub_xc_domain_get_pfn_list"
-
external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
= "stub_xc_domain_assign_device"
external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
external map_foreign_range :
handle -> domid -> int -> nativeint -> Xenmmap.mmap_interface
= "stub_map_foreign_range"
-external domain_get_pfn_list :
- handle -> domid -> nativeint -> nativeint array
- = "stub_xc_domain_get_pfn_list"
external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
= "stub_xc_domain_assign_device"
CAMLreturn(Val_unit);
}
-CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid,
- value nr_pfns)
-{
- CAMLparam3(xch, domid, nr_pfns);
- CAMLlocal2(array, v);
- unsigned long c_nr_pfns;
- long ret, i;
- uint64_t *c_array;
-
- c_nr_pfns = Nativeint_val(nr_pfns);
-
- c_array = malloc(sizeof(uint64_t) * c_nr_pfns);
- if (!c_array)
- caml_raise_out_of_memory();
-
- ret = xc_get_pfn_list(_H(xch), _D(domid),
- c_array, c_nr_pfns);
- if (ret < 0) {
- free(c_array);
- failwith_xc(_H(xch));
- }
-
- array = caml_alloc(ret, 0);
- for (i = 0; i < ret; i++) {
- v = caml_copy_nativeint(c_array[i]);
- Store_field(array, i, v);
- }
- free(c_array);
-
- CAMLreturn(array);
-}
-
CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid,
value start_port, value nr_ports,
value allow)
break;
}
- case XEN_DOMCTL_getmemlist:
- {
- unsigned long max_pfns = domctl->u.getmemlist.max_pfns;
- uint64_t mfn;
- struct page_info *page;
-
- if ( unlikely(d->is_dying) )
- {
- ret = -EINVAL;
- break;
- }
-
- /*
- * XSA-74: This sub-hypercall is broken in several ways:
- * - lock order inversion (p2m locks inside page_alloc_lock)
- * - no preemption on huge max_pfns input
- * - not (re-)checking d->is_dying with page_alloc_lock held
- * - not honoring start_pfn input (which libxc also doesn't set)
- * Additionally it is rather useless, as the result is stale by the
- * time the caller gets to look at it.
- * As it only has a single, non-production consumer (xen-mceinj),
- * rather than trying to fix it we restrict it for the time being.
- */
- if ( /* No nested locks inside copy_to_guest_offset(). */
- paging_mode_external(currd) ||
- /* Arbitrary limit capping processing time. */
- max_pfns > GB(4) / PAGE_SIZE )
- {
- ret = -EOPNOTSUPP;
- break;
- }
-
- spin_lock(&d->page_alloc_lock);
-
- ret = i = 0;
- page_list_for_each(page, &d->page_list)
- {
- if ( i >= max_pfns )
- break;
- mfn = page_to_mfn(page);
- if ( copy_to_guest_offset(domctl->u.getmemlist.buffer,
- i, &mfn, 1) )
- {
- ret = -EFAULT;
- break;
- }
- ++i;
- }
-
- spin_unlock(&d->page_alloc_lock);
-
- domctl->u.getmemlist.num_pfns = i;
- copyback = true;
- break;
- }
-
case XEN_DOMCTL_getpageframeinfo3:
{
unsigned int num = domctl->u.getpageframeinfo3.num;
#define XEN_DOMCTL_pausedomain 3
#define XEN_DOMCTL_unpausedomain 4
#define XEN_DOMCTL_getdomaininfo 5
-#define XEN_DOMCTL_getmemlist 6
+/* #define XEN_DOMCTL_getmemlist 6 Removed */
/* #define XEN_DOMCTL_getpageframeinfo 7 Obsolete - use getpageframeinfo3 */
/* #define XEN_DOMCTL_getpageframeinfo2 8 Obsolete - use getpageframeinfo3 */
#define XEN_DOMCTL_setvcpuaffinity 9