[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Initialize the xenstore MFN for VMX domains
# HG changeset patch # User cl349@xxxxxxxxxxxxxxxxxxxx # Node ID 66b81b6c096c57a5ca0da825d4da15d98e31a954 # Parent 5a683386dc5839aa453961fdc67affb3a067949e Initialize the xenstore MFN for VMX domains Signed-off-by: Arun Sharma <arun.sharma@xxxxxxxxx> Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> diff -r 5a683386dc58 -r 66b81b6c096c tools/libxc/linux_boot_params.h --- a/tools/libxc/linux_boot_params.h Tue Aug 9 16:26:19 2005 +++ b/tools/libxc/linux_boot_params.h Wed Aug 10 08:44:58 2005 @@ -17,6 +17,7 @@ #define E820_NVS 4 #define E820_IO 16 #define E820_SHARED 17 +#define E820_XENSTORE 18 u32 caching_attr; /* used by hypervisor */ #define MEMMAP_UC 0 diff -r 5a683386dc58 -r 66b81b6c096c tools/libxc/xc.h --- a/tools/libxc/xc.h Tue Aug 9 16:26:19 2005 +++ b/tools/libxc/xc.h Wed Aug 10 08:44:58 2005 @@ -306,7 +306,10 @@ const char *ramdisk_name, const char *cmdline, unsigned int control_evtchn, - unsigned long flags); + unsigned long flags, + unsigned int vcpus, + unsigned int store_evtchn, + unsigned long *store_mfn); int xc_bvtsched_global_set(int xc_handle, unsigned long ctx_allow); diff -r 5a683386dc58 -r 66b81b6c096c tools/libxc/xc_vmx_build.c --- a/tools/libxc/xc_vmx_build.c Tue Aug 9 16:26:19 2005 +++ b/tools/libxc/xc_vmx_build.c Wed Aug 10 08:44:58 2005 @@ -37,58 +37,70 @@ int nr_map = 0; /* XXX: Doesn't work for > 4GB yet */ - mem_mapp->map[0].addr = 0x0; - mem_mapp->map[0].size = 0x9F800; - mem_mapp->map[0].type = E820_RAM; - mem_mapp->map[0].caching_attr = MEMMAP_WB; + mem_mapp->map[nr_map].addr = 0x0; + mem_mapp->map[nr_map].size = 0x9F800; + mem_mapp->map[nr_map].type = E820_RAM; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; nr_map++; - mem_mapp->map[1].addr = 0x9F800; - mem_mapp->map[1].size = 0x800; - mem_mapp->map[1].type = E820_RESERVED; - mem_mapp->map[1].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = 0x9F800; + mem_mapp->map[nr_map].size = 0x800; + mem_mapp->map[nr_map].type = E820_RESERVED; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[2].addr = 0xA0000; - mem_mapp->map[2].size = 0x20000; - mem_mapp->map[2].type = E820_IO; - mem_mapp->map[2].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = 0xA0000; + mem_mapp->map[nr_map].size = 0x20000; + mem_mapp->map[nr_map].type = E820_IO; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[3].addr = 0xF0000; - mem_mapp->map[3].size = 0x10000; - mem_mapp->map[3].type = E820_RESERVED; - mem_mapp->map[3].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = 0xF0000; + mem_mapp->map[nr_map].size = 0x10000; + mem_mapp->map[nr_map].type = E820_RESERVED; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[4].addr = 0x100000; - mem_mapp->map[4].size = mem_size - 0x100000 - PAGE_SIZE; - mem_mapp->map[4].type = E820_RAM; - mem_mapp->map[4].caching_attr = MEMMAP_WB; +#define STATIC_PAGES 2 /* for ioreq_t and store_mfn */ + /* 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; + mem_mapp->map[nr_map].type = E820_RAM; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; nr_map++; - mem_mapp->map[5].addr = mem_size - PAGE_SIZE; - mem_mapp->map[5].size = PAGE_SIZE; - mem_mapp->map[5].type = E820_SHARED; - mem_mapp->map[5].caching_attr = MEMMAP_WB; + /* Statically allocated special pages */ + + /* Shared ioreq_t page */ + 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++; - mem_mapp->map[6].addr = mem_size; - mem_mapp->map[6].size = 0x3 * PAGE_SIZE; - mem_mapp->map[6].type = E820_NVS; - mem_mapp->map[6].caching_attr = MEMMAP_UC; + /* For xenstore */ + 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[7].addr = mem_size + 0x3 * PAGE_SIZE; - mem_mapp->map[7].size = 0xA * PAGE_SIZE; - mem_mapp->map[7].type = E820_ACPI; - mem_mapp->map[7].caching_attr = MEMMAP_WB; + mem_mapp->map[nr_map].addr = mem_size; + mem_mapp->map[nr_map].size = 0x3 * PAGE_SIZE; + mem_mapp->map[nr_map].type = E820_NVS; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[8].addr = 0xFEC00000; - mem_mapp->map[8].size = 0x1400000; - mem_mapp->map[8].type = E820_IO; - mem_mapp->map[8].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = mem_size + 0x3 * PAGE_SIZE; + mem_mapp->map[nr_map].size = 0xA * PAGE_SIZE; + mem_mapp->map[nr_map].type = E820_ACPI; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; + nr_map++; + + mem_mapp->map[nr_map].addr = 0xFEC00000; + mem_mapp->map[nr_map].size = 0x1400000; + mem_mapp->map[nr_map].type = E820_IO; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; mem_mapp->nr_map = nr_map; @@ -212,7 +224,11 @@ unsigned long shared_info_frame, unsigned int control_evtchn, unsigned long flags, - struct mem_map * mem_mapp) + unsigned int vcpus, + unsigned int store_evtchn, + unsigned long *store_mfn, + struct mem_map *mem_mapp + ) { l1_pgentry_t *vl1tab=NULL, *vl1e=NULL; l2_pgentry_t *vl2tab=NULL, *vl2e=NULL; @@ -510,7 +526,10 @@ boot_paramsp->drive_info.dummy[14] = 32; /* memsize is in megabytes */ + /* 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]; #if defined (__i386__) if (zap_mmio_ranges(xc_handle, dom, l2tab, mem_mapp) == -1) #else @@ -637,7 +656,10 @@ const char *ramdisk_name, const char *cmdline, unsigned int control_evtchn, - unsigned long flags) + unsigned long flags, + unsigned int vcpus, + unsigned int store_evtchn, + unsigned long *store_mfn) { dom0_op_t launch_op, op; int initrd_fd = -1; @@ -712,7 +734,8 @@ initrd_gfd, initrd_size, nr_pages, ctxt, cmdline, op.u.getdomaininfo.shared_info_frame, - control_evtchn, flags, mem_mapp) < 0 ) + control_evtchn, flags, vcpus, store_evtchn, store_mfn, + mem_mapp) < 0 ) { ERROR("Error constructing guest OS"); goto error_out; diff -r 5a683386dc58 -r 66b81b6c096c tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Tue Aug 9 16:26:19 2005 +++ b/tools/python/xen/lowlevel/xc/xc.c Wed Aug 10 08:44:58 2005 @@ -297,22 +297,23 @@ u32 dom; char *image, *ramdisk = NULL, *cmdline = ""; PyObject *memmap; - int control_evtchn, flags = 0; + int control_evtchn, store_evtchn; + int flags = 0, vcpus = 1; int numItems, i; int memsize; struct mem_map mem_map; - - static char *kwd_list[] = { "dom", "control_evtchn", - "memsize", - "image", "memmap", + unsigned long store_mfn = 0; + + static char *kwd_list[] = { "dom", "control_evtchn", "store_evtchn", + "memsize", "image", "memmap", "ramdisk", "cmdline", "flags", - NULL }; - - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiisO!|ssi", kwd_list, - &dom, &control_evtchn, + "vcpus", NULL }; + + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiisO!|ssii", kwd_list, + &dom, &control_evtchn, &store_evtchn, &memsize, &image, &PyList_Type, &memmap, - &ramdisk, &cmdline, &flags) ) + &ramdisk, &cmdline, &flags, &vcpus) ) return NULL; memset(&mem_map, 0, sizeof(mem_map)); @@ -321,7 +322,6 @@ /* get the number of lines passed to us */ numItems = PyList_Size(memmap) - 1; /* removing the line containing "memmap" */ - printf ("numItems: %d\n", numItems); mem_map.nr_map = numItems; /* should raise an error here. */ @@ -365,11 +365,11 @@ } if ( xc_vmx_build(xc->xc_handle, dom, memsize, image, &mem_map, - ramdisk, cmdline, control_evtchn, flags) != 0 ) - return PyErr_SetFromErrno(xc_error); - - Py_INCREF(zero); - return zero; + ramdisk, cmdline, control_evtchn, flags, + vcpus, store_evtchn, &store_mfn) != 0 ) + return PyErr_SetFromErrno(xc_error); + + return Py_BuildValue("{s:i}", "store_mfn", store_mfn); } static PyObject *pyxc_bvtsched_global_set(PyObject *self, diff -r 5a683386dc58 -r 66b81b6c096c tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Tue Aug 9 16:26:19 2005 +++ b/tools/python/xen/xend/image.py Wed Aug 10 08:44:58 2005 @@ -274,14 +274,24 @@ # Create an event channel self.device_channel = channel.eventChannel(0, self.vm.getDomain()) log.info("VMX device model port: %d", self.device_channel.port2) - return xc.vmx_build(dom = self.vm.getDomain(), + if self.vm.store_channel: + store_evtchn = self.vm.store_channel.port2 + else: + store_evtchn = 0 + ret = xc.vmx_build(dom = self.vm.getDomain(), image = self.kernel, control_evtchn = self.device_channel.port2, + store_evtchn = store_evtchn, memsize = self.vm.memory, memmap = self.memmap_value, cmdline = self.cmdline, ramdisk = self.ramdisk, - flags = self.flags) + flags = self.flags, + vcpus = self.vm.vcpus) + if isinstance(ret, dict): + self.vm.store_mfn = ret.get('store_mfn') + return 0 + return ret def parseMemmap(self): self.memmap = sxp.child_value(self.vm.config, "memmap") @@ -387,7 +397,9 @@ (pid, status) = os.waitpid(self.pid, 0) def getDomainMemory(self, mem_mb): - return (mem_mb * 1024) + self.getPageTableSize(mem_mb) + # for ioreq_t and xenstore + static_pages = 2 + return (mem_mb * 1024) + self.getPageTableSize(mem_mb) + 4 * static_pages def getPageTableSize(self, mem_mb): """Return the size of memory needed for 1:1 page tables for physical _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |