* [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.