All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][VT] patch make some share page can be accessed in vmx guest
@ 2005-09-05  4:10 Xiaofeng Ling
  0 siblings, 0 replies; only message in thread
From: Xiaofeng Ling @ 2005-09-05  4:10 UTC (permalink / raw)
  To: xen-devel

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@intel.com>
Signed-off-by: Arun Sharma <arun.sharma@intel.com>

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,

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-09-05  4:10 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-09-05  4:10 [PATCH][VT] patch make some share page can be accessed in vmx guest Xiaofeng Ling

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.