[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Mapping Dom0 page in hypervisor from domctl
Hi all, I'm trying to map a page provided by Dom0 into Xen's address space, but I keep freezing the physical computer when I try. Maybe I'm hitting a spinlock or something, but clearly I'm doing something incorrectly. I'll probably be able to get farther once I have another computer with a serial port to get logging, but hopefully it's something obvious. Dom0 sends a domctl containing a virtual address. I attempt to translate it to a GFN, and then get the page_info structure, and finally map it. Source code: /* Unmap any existing mapping */ if ( d->arch.hvm_domain.dom0_mapping.page_info ) { unmap_domain_page(d->arch.hvm_domain.dom0_mapping.buffer); put_page(d->arch.hvm_domain.dom0_mapping.page_info); d->arch.hvm_domain.dom0_mapping.buffer = NULL; d->arch.hvm_domain.dom0_mapping.page_info = NULL; } if ( domctl->va ) { struct page_info* page_info; uint64_t gfn; uint32_t pfec = 0; gdprintk (XENLOG_DEBUG, "Using guest VA 0x%lX\n", domctl->va); /* Validate that the given VA is page-aligned */ if ((domctl->va & ~PAGE_MASK) != 0) { gdprintk (XENLOG_DEBUG, "VA is not page aligned\n"); ret = -EINVAL; break; } /* Translate the given virtual address to the guest frame number */ gfn = paging_gva_to_gfn(current, domctl->va, &pfec); if ( gfn == INVALID_GFN ) { gdprintk (XENLOG_DEBUG, "Invalid GFN\n"); ret = -EFAULT; break; } gdprintk (XENLOG_DEBUG, "Translated to gfn 0x%lX\n", gfn); /* Get the page info */ page_info = get_page_from_gfn(current->domain, gfn, NULL, P2M_UNSHARE); if ( !page_info ) { gdprintk (XENLOG_DEBUG, "No page info\n"); ret = -ESRCH; break; } gdprintk (XENLOG_DEBUG, "Translated to mfn 0x%lX\n", page_to_mfn(page_info)); d->arch.hvm_domain.dom0_mapping.page_info = page_info; d->arch.hvm_domain.dom0_mapping.buffer = (uint8_t*)map_domain_page_global(page_to_mfn(page_info)); if ( !d->arch.hvm_domain.dom0_mapping.buffer ) { gdprintk (XENLOG_DEBUG, "Map failed\n"); put_page(page_info); ret = -ENOMEM; break; } gdprintk (XENLOG_DEBUG, "All Mapped: %p\n", d->arch.hvm_domain.dom0_mapping.buffer); } Any insight into what I'm doing wrong would be appreciated! _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |