diff -r c1fafdcdb19a tools/libxc/xc_dom.h --- a/tools/libxc/xc_dom.h Tue May 01 22:24:01 2007 +0100 +++ b/tools/libxc/xc_dom.h Wed May 02 11:25:52 2007 +0100 @@ -1,4 +1,5 @@ #include +#include #define INVALID_P2M_ENTRY ((xen_pfn_t)-1) @@ -206,6 +207,13 @@ int xc_dom_alloc_segment(struct xc_dom_i struct xc_dom_seg *seg, char *name, xen_vaddr_t start, xen_vaddr_t size); +/* --- configure grant table --------------------------------------- */ + +int xc_dom_install_gnttab_entries(struct xc_dom_image *dom, + grant_handle_t start_handle, + uint32_t count, + grant_entry_t entries[count]); + /* --- misc bits --------------------------------------------------- */ void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t first, diff -r c1fafdcdb19a tools/libxc/xc_dom_core.c --- a/tools/libxc/xc_dom_core.c Tue May 01 22:24:01 2007 +0100 +++ b/tools/libxc/xc_dom_core.c Mon Apr 30 14:07:25 2007 +0100 @@ -771,6 +771,46 @@ int xc_dom_build_image(struct xc_dom_ima return -1; } +int xc_dom_install_gnttab_entries(struct xc_dom_image *dom, + grant_handle_t start_handle, + uint32_t count, + grant_entry_t entries[count]) +{ + int i, rc = -1; + gnttab_install_entry_t *ops; + DECLARE_HYPERCALL; + + if ((ops = malloc(count * sizeof(*ops))) == NULL) + return rc; + + for (i = 0; i < count; ++i) { + ops[i].domid = dom->guest_domid; + ops[i].handle = start_handle + i; + ops[i].entry = entries[i]; + } + + if (lock_pages(ops, count * sizeof(*ops)) != 0) { + PERROR("Could not lock memory for Xen hypercall"); + goto out; + } + + hypercall.op = __HYPERVISOR_grant_table_op; + hypercall.arg[0] = GNTTABOP_install_entry; + hypercall.arg[1] = (unsigned long) ops; + hypercall.arg[2] = count; + + if ((rc = do_xen_hypercall(dom->guest_xc, &hypercall)) < 0) + if (errno == EACCES) + DPRINTF("gnttab operation failed -- need to rebuild the " + "user-space tool set?\n"); + + unlock_pages(ops, count * sizeof(*ops)); + +out: + free(ops); + return rc; +} + /* * Local variables: * mode: C diff -r c1fafdcdb19a tools/libxc/xc_dom_ia64.c --- a/tools/libxc/xc_dom_ia64.c Tue May 01 22:24:01 2007 +0100 +++ b/tools/libxc/xc_dom_ia64.c Wed May 02 11:51:25 2007 +0100 @@ -28,6 +28,19 @@ static int alloc_magic_pages(struct xc_d dom->console_pfn = dom->total_pages -1; dom->xenstore_pfn = dom->total_pages -2; dom->start_info_pfn = dom->total_pages -3; + + /* create grant entries for console and xenstore */ + gnt_entries[0].flags = GTF_permit_access; + gnt_entries[0].domid = 0; + gnt_entries[0].frame = xc_dom_feature_translated(dom) ? + dom->xenstore_pfn : xc_dom_p2m_host(dom, dom->xenstore_pfn); + gnt_entries[1].flags = GTF_permit_access; + gnt_entries[1].domid = 0; + gnt_entries[1].frame = xc_dom_feature_translated(dom) ? + dom->console_pfn : xc_dom_p2m_host(dom, dom->console_pfn); + if ( xc_dom_install_gnttab_entries(dom, 0, 2, gnt_entries) ) + return -1; + return 0; } diff -r c1fafdcdb19a tools/libxc/xc_dom_powerpc.c --- a/tools/libxc/xc_dom_powerpc.c Tue May 01 22:24:01 2007 +0100 +++ b/tools/libxc/xc_dom_powerpc.c Wed May 02 11:53:06 2007 +0100 @@ -43,6 +43,18 @@ static int alloc_magic_pages(struct xc_d dom->shared_info_pfn = --rma_pages; dom->console_pfn = --rma_pages; dom->xenstore_pfn = --rma_pages; + + /* create grant entries for console and xenstore */ + gnt_entries[0].flags = GTF_permit_access; + gnt_entries[0].domid = 0; + gnt_entries[0].frame = xc_dom_feature_translated(dom) ? + dom->xenstore_pfn : xc_dom_p2m_host(dom, dom->xenstore_pfn); + gnt_entries[1].flags = GTF_permit_access; + gnt_entries[1].domid = 0; + gnt_entries[1].frame = xc_dom_feature_translated(dom) ? + dom->console_pfn : xc_dom_p2m_host(dom, dom->console_pfn); + if ( xc_dom_install_gnttab_entries(dom, 0, 2, gnt_entries) ) + return -1; /* Gather shadow allocation info for the device tree. */ rc = xc_shadow_control(dom->guest_xc, dom->guest_domid, diff -r c1fafdcdb19a tools/libxc/xc_dom_x86.c --- a/tools/libxc/xc_dom_x86.c Tue May 01 22:24:01 2007 +0100 +++ b/tools/libxc/xc_dom_x86.c Tue Apr 03 11:05:44 2007 +0100 @@ -307,6 +307,7 @@ static int alloc_magic_pages(struct xc_d static int alloc_magic_pages(struct xc_dom_image *dom) { size_t p2m_size = dom->total_pages * dom->arch_hooks->sizeof_pfn; + grant_entry_t gnt_entries[2]; /* allocate phys2mach table */ if ( xc_dom_alloc_segment(dom, &dom->p2m_seg, "phys2mach", 0, p2m_size) ) @@ -320,6 +321,18 @@ static int alloc_magic_pages(struct xc_d if ( xc_dom_feature_translated(dom) ) dom->shared_info_pfn = xc_dom_alloc_page(dom, "shared info"); dom->alloc_bootstack = 1; + + /* create grant entries for console and xenstore */ + gnt_entries[0].flags = GTF_permit_access; + gnt_entries[0].domid = 0; + gnt_entries[0].frame = xc_dom_feature_translated(dom) ? + dom->xenstore_pfn : xc_dom_p2m_host(dom, dom->xenstore_pfn); + gnt_entries[1].flags = GTF_permit_access; + gnt_entries[1].domid = 0; + gnt_entries[1].frame = xc_dom_feature_translated(dom) ? + dom->console_pfn : xc_dom_p2m_host(dom, dom->console_pfn); + if ( xc_dom_install_gnttab_entries(dom, 0, 2, gnt_entries) ) + return -1; return 0; }