WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH][VT] patch make some share page can be accessed in vm

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH][VT] patch make some share page can be accessed in vmx guest
From: Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx>
Date: Mon, 05 Sep 2005 12:10:17 +0800
Delivery-date: Mon, 05 Sep 2005 04:11:12 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510
This patch make some share page can be accessed in vmx guest
The share pages include shared_info, start_info, xen store share page
Also path store_evtchn, device_evtchn, control_evtchn to guest.
This patch are needed for para-driver in unmodified guest.

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

diff -r 23d8580d56b0 -r 2be69124cb06 tools/libxc/linux_boot_params.h
--- a/tools/libxc/linux_boot_params.h   Fri Sep  2 18:23:57 2005
+++ b/tools/libxc/linux_boot_params.h   Mon Sep  5 03:56:13 2005
@@ -18,6 +18,8 @@
 #define E820_IO         16
 #define E820_SHARED     17
 #define E820_XENSTORE   18
+#define E820_STARTINFO  19
+#define E820_SHAREDINFO  20

         u32 caching_attr;    /* used by hypervisor */
 #define MEMMAP_UC      0
diff -r 23d8580d56b0 -r 2be69124cb06 tools/libxc/xc_vmx_build.c
--- a/tools/libxc/xc_vmx_build.c        Fri Sep  2 18:23:57 2005
+++ b/tools/libxc/xc_vmx_build.c        Mon Sep  5 03:56:13 2005
@@ -62,7 +62,7 @@
     mem_mapp->map[nr_map].caching_attr = MEMMAP_UC;
     nr_map++;

-#define STATIC_PAGES    2       /* for ioreq_t and store_mfn */
+#define STATIC_PAGES 4 /* for ioreq_t and store_mfn and start_info*/
     /* Most of the ram goes here */
     mem_mapp->map[nr_map].addr = 0x100000;
mem_mapp->map[nr_map].size = mem_size - 0x100000 - STATIC_PAGES*PAGE_SIZE;
@@ -83,6 +83,24 @@
     mem_mapp->map[nr_map].addr = mem_size - 2*PAGE_SIZE;
     mem_mapp->map[nr_map].size = PAGE_SIZE;
     mem_mapp->map[nr_map].type = E820_XENSTORE;
+    mem_mapp->map[nr_map].caching_attr = MEMMAP_WB;
+    nr_map++;
+
+    mem_mapp->map[nr_map].addr = mem_size - 3 * PAGE_SIZE;
+    mem_mapp->map[nr_map].size = PAGE_SIZE;
+    mem_mapp->map[nr_map].type = E820_SHAREDINFO;
+    mem_mapp->map[nr_map].caching_attr = MEMMAP_WB;
+    nr_map++;
+
+    mem_mapp->map[nr_map].addr = mem_size - 4 * PAGE_SIZE;
+    mem_mapp->map[nr_map].size = PAGE_SIZE;
+    mem_mapp->map[nr_map].type = E820_STARTINFO;
+    mem_mapp->map[nr_map].caching_attr = MEMMAP_WB;
+    nr_map++;
+
+    mem_mapp->map[nr_map].addr = mem_size - PAGE_SIZE;
+    mem_mapp->map[nr_map].size = PAGE_SIZE;
+    mem_mapp->map[nr_map].type = E820_SHARED;
     mem_mapp->map[nr_map].caching_attr = MEMMAP_WB;
     nr_map++;

@@ -227,6 +245,7 @@
                          unsigned long flags,
                          unsigned int vcpus,
                          unsigned int store_evtchn,
+                         unsigned int device_evtchn,
                          unsigned long *store_mfn,
                          struct mem_map *mem_mapp
                          )
@@ -241,6 +260,7 @@
     unsigned long l2tab;
     unsigned long l1tab;
     unsigned long count, i;
+    start_info_t *start_info;
     shared_info_t *shared_info;
     struct linux_boot_params * boot_paramsp;
     __u16 * boot_gdtp;
@@ -262,6 +282,7 @@
     unsigned long v_end;

     unsigned long shared_page_frame = 0;
+    unsigned long startinfo_page_frame = 0;
     shared_iopage_t *sp;

     memset(&dsi, 0, sizeof(struct domain_setup_info));
@@ -289,7 +310,7 @@

     /* memsize is in megabytes */
     v_end              = memsize << 20;
- vinitrd_end = v_end - PAGE_SIZE; /* leaving the top 4k untouched for IO requests page use */ + vinitrd_end = v_end - 4 * PAGE_SIZE; /* leaving the top 4k untouched for IO requests page use */
     vinitrd_start      = vinitrd_end - initrd_len;
     vinitrd_start      = vinitrd_start & (~(PAGE_SIZE - 1));

@@ -368,6 +389,7 @@
     l2tab = page_array[ppt_alloc++] << PAGE_SHIFT;
     ctxt->ctrlreg[3] = l2tab;

+ page_array[((vpt_start - dsi.v_start)>>PAGE_SHIFT) - 3] = shared_info_frame;
     /* Initialise the page tables. */
     if ( (vl2tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
                                         PROT_READ|PROT_WRITE,
@@ -530,7 +552,7 @@
     /* If you need to create a special e820map, comment this line
        and use mem-map.sxp */
     build_e820map(mem_mapp, memsize << 20);
-    *store_mfn = page_array[(v_end-2) >> PAGE_SHIFT];
+    *store_mfn = page_array[((vpt_start - dsi.v_start)>>PAGE_SHIFT) - 2];
 #if defined (__i386__)
     if (zap_mmio_ranges(xc_handle, dom, l2tab, mem_mapp) == -1)
 #else
@@ -544,6 +566,8 @@
         boot_paramsp->e820_map[i].type = mem_mapp->map[i].type;
         if (mem_mapp->map[i].type == E820_SHARED)
             shared_page_frame = (mem_mapp->map[i].addr >> PAGE_SHIFT);
+        else if (mem_mapp->map[i].type == E820_STARTINFO)
+            startinfo_page_frame = (mem_mapp->map[i].addr >> PAGE_SHIFT);
     }
     munmap(boot_paramsp, PAGE_SIZE);

@@ -575,9 +599,22 @@
                page_array[shared_page_frame])) == 0)
        goto error_out;
     memset(sp, 0, PAGE_SIZE);
-    sp->sp_global.eport = control_evtchn;
+    sp->sp_global.eport = device_evtchn;
     munmap(sp, PAGE_SIZE);

+    start_info = xc_map_foreign_range(
+        xc_handle, dom, PAGE_SIZE, PROT_READ|PROT_WRITE,
+        page_array[startinfo_page_frame]);
+    memset(start_info, 0, PAGE_SIZE);
+    start_info->nr_pages     = nr_pages;
+    start_info->shared_info  = shared_info_frame << PAGE_SHIFT;
+    start_info->flags        = flags;
+    start_info->pt_base      = vpt_start;
+    start_info->nr_pt_frames = nr_pt_pages;
+    start_info->domain_controller_evtchn = control_evtchn;
+    start_info->store_mfn    = *store_mfn;
+    start_info->store_evtchn = store_evtchn;
+    munmap(start_info, PAGE_SIZE);
     /*
      * Pin down l2tab addr as page dir page - causes hypervisor to provide
      * correct protection for the page
@@ -658,6 +695,7 @@
                    unsigned long flags,
                    unsigned int vcpus,
                    unsigned int store_evtchn,
+                   unsigned int device_evtchn,
                    unsigned long *store_mfn)
 {
     dom0_op_t launch_op, op;
@@ -733,7 +771,8 @@
                        initrd_gfd, initrd_size, nr_pages,
                        ctxt, cmdline,
                        op.u.getdomaininfo.shared_info_frame,
- control_evtchn, flags, vcpus, store_evtchn, store_mfn,
+                       control_evtchn, flags, vcpus, store_evtchn,
+                       device_evtchn, store_mfn,
                        mem_mapp) < 0 )
     {
         ERROR("Error constructing guest OS");
diff -r 23d8580d56b0 -r 2be69124cb06 tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h    Fri Sep  2 18:23:57 2005
+++ b/tools/libxc/xenguest.h    Mon Sep  5 03:56:13 2005
@@ -63,6 +63,7 @@
                  unsigned long flags,
                  unsigned int vcpus,
                  unsigned int store_evtchn,
+                 unsigned int device_evtchn,
                  unsigned long *store_mfn);

 #endif
diff -r 23d8580d56b0 -r 2be69124cb06 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Fri Sep  2 18:23:57 2005
+++ b/tools/python/xen/lowlevel/xc/xc.c Mon Sep  5 03:56:13 2005
@@ -306,7 +306,7 @@
     u32   dom;
     char *image, *ramdisk = NULL, *cmdline = "";
     PyObject *memmap;
-    int   control_evtchn, store_evtchn;
+    int   control_evtchn, store_evtchn, device_evtchn;
     int flags = 0, vcpus = 1;
     int numItems, i;
     int memsize;
@@ -314,13 +314,13 @@
     unsigned long store_mfn = 0;

     static char *kwd_list[] = { "dom", "control_evtchn", "store_evtchn",
-                                "memsize", "image", "memmap",
+ "device_evtchn", "memsize", "image", "memmap",
                                "ramdisk", "cmdline", "flags",
                                "vcpus", NULL };

- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiisO!|ssii", kwd_list, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiiisO!|ssii", kwd_list, &dom, &control_evtchn, &store_evtchn,
-                                      &memsize,
+                                      &device_evtchn, &memsize,
                                       &image, &PyList_Type, &memmap,
                                      &ramdisk, &cmdline, &flags, &vcpus) )
         return NULL;
@@ -375,7 +375,7 @@

     if ( xc_vmx_build(xc->xc_handle, dom, memsize, image, &mem_map,
                         ramdisk, cmdline, control_evtchn, flags,
-                        vcpus, store_evtchn, &store_mfn) != 0 )
+ vcpus, store_evtchn, device_evtchn, &store_mfn) != 0 )
         return PyErr_SetFromErrno(xc_error);

     return Py_BuildValue("{s:i}", "store_mfn", store_mfn);
diff -r 23d8580d56b0 -r 2be69124cb06 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Fri Sep  2 18:23:57 2005
+++ b/tools/python/xen/xend/image.py    Mon Sep  5 03:56:13 2005
@@ -302,8 +302,9 @@
             store_evtchn = 0
         ret = xc.vmx_build(dom            = self.vm.getDomain(),
                             image          = self.kernel,
-                            control_evtchn = self.device_channel.port2,
+ control_evtchn = self.vm.channel.getRemotePort(),
                             store_evtchn   = store_evtchn,
+                            device_evtchn  = self.device_channel.port2,
                             memsize        = self.vm.memory,
                             memmap         = self.memmap_value,
                             cmdline        = self.cmdline,

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH][VT] patch make some share page can be accessed in vmx guest, Xiaofeng Ling <=