[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH][4/6] Add to virtual device operations



Add two virtual device operations:
1.set the callback irq for event channel
2.setup the hypercall paramerter share page.

Signed-off-by: Ke Yu <ke.yu@xxxxxxxxx>
Signed-off-by: Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx>
Signed-off-by: Arun Sharma <arun.sharma@xxxxxxxxx>


diff -r 287d36b46fa3 xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c        Tue Aug 30 20:36:49 2005
+++ b/xen/arch/x86/vmx.c        Fri Sep  2 22:46:13 2005
@@ -1752,6 +1803,81 @@
     asm volatile("movq %0,%%cr2": :"r" (d->arch.arch_vmx.cpu_cr2));
 #endif
 }
+
+
+/* map hypercall parameter share page address in monitor pagetable
+ * map guest virtual address <-->  hypervisor virtual address
+ * the hypervisor virtual address should below HYPERVISOR_VIRT_START,
+ * so that share page can be treated as a guest page
+ */
+int map_param_share_page(unsigned long gva, unsigned long hva){
+
+    unsigned long mfn;
+    l2_pgentry_t *mpl2e; /* monitor page table l2 */
+    l1_pgentry_t *mpl1e; /* monitor page table l1 */
+    struct pfn_info *l1_mfn_info;
+    unsigned long l1_mfn;
+    struct vcpu* v = current;
+    struct domain *d = v->domain;
+
+    mfn = __gpfn_to_mfn(d, gva >> PAGE_SHIFT);
+    mpl2e = current->arch.monitor_vtable;
+    if ( mpl2e[l2_table_offset(hva)].l2 ){
+        printk("map of hva 0x%lx already exists\n",hva);
+        return -1;
+    }
+
+    /* alloc l1 page table */
+    d->max_pages++;
+    l1_mfn_info = alloc_domheap_page(d);
+    if (!l1_mfn_info){
+        printk("alloc_domheap_page failed\n");
+        return -1;
+    }
+    l1_mfn = page_to_pfn(l1_mfn_info);
+    printk("map_param_share_page: alloc page at 0x%lx\n", l1_mfn);
+
+    /* set l2 page table entry */
+    mpl2e[l2_table_offset(hva)] =
+        l2e_from_pfn (l1_mfn, __PAGE_HYPERVISOR);
+    printk("map_param_share_page: set l2 page table entry\n");
+
+    /* set l1 page table */
+    mpl1e = (l1_pgentry_t *)map_domain_page(l1_mfn);
+    memset(mpl1e, 0, PAGE_SIZE);
+    mpl1e[l1_table_offset(hva)] =
+        l1e_from_pfn(mfn, __PAGE_HYPERVISOR);
+    unmap_domain_page(mpl1e);
+    printk("map_param_share_page: set l1 page table entry\n");
+
+    return 0;
+}
+
+asmlinkage unsigned long do_virtual_device_op(unsigned long op,
+                                              unsigned long arg1,
+                                              unsigned arg2)
+{
+    switch (op)
+    {
+        case SET_CALLBACK_IRQ:
+        {
+            if(arg1)
+                current->domain->arch.vmx_platform.callback_irq = arg1;
+            else
+                current->domain->arch.vmx_platform.callback_irq = 0;
+            return 0;
+        }
+         case SET_SHARE_PARAM_MAP:
+        {
+            int rc = map_param_share_page(arg1, arg2);
+            DPRINTK("SET_SHAER_PARAM_MAP: gva=%lx\n",arg1);
+            return rc;
+        }
+
+    }
+    return 0L;
+}
+#endif /* CONFIG_VMX */

 #ifdef TRACE_BUFFER
 asmlinkage void trace_vmentry (void)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.