[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Merge
# HG changeset patch # User Tim Deegan <Tim.Deegan@xxxxxxxxxxxxx> # Date 1172485383 0 # Node ID eefbc33a41abf36451ae6c102ba79e8312906909 # Parent a70cf505aef97de5e5acab2bd196e0b6577e9440 # Parent 9f199e1fd9298b450b51fe4e7c0104121f15f11c Merge --- tools/libxc/xc_dom_compat_linux.c | 25 ++++++++++++++ tools/libxc/xc_dom_ia64.c | 10 +++++ tools/libxc/xenguest.h | 14 ++++++++ tools/python/xen/lowlevel/xc/xc.c | 54 ++++++++++++++++++++++++++------ tools/python/xen/xend/XendConfig.py | 34 +++++++++++++++++++- tools/python/xen/xend/XendDomainInfo.py | 22 ++++++++++++- xen/arch/x86/domain_build.c | 1 xen/common/libelf/libelf-dominfo.c | 7 +++- xen/include/public/elfnote.h | 5 ++ xen/include/public/libelf.h | 18 ++++++++++ 10 files changed, 177 insertions(+), 13 deletions(-) diff -r a70cf505aef9 -r eefbc33a41ab tools/libxc/xc_dom_compat_linux.c --- a/tools/libxc/xc_dom_compat_linux.c Mon Feb 26 10:22:38 2007 +0000 +++ b/tools/libxc/xc_dom_compat_linux.c Mon Feb 26 10:23:03 2007 +0000 @@ -122,6 +122,31 @@ int xc_linux_build(int xc_handle, uint32 return rc; } +int xc_dom_linux_build(int xc_handle, + struct xc_dom_image *dom, + uint32_t domid, + unsigned int mem_mb, + const char *image_name, + const char *initrd_name, + unsigned long flags, + unsigned int store_evtchn, + unsigned long *store_mfn, + unsigned int console_evtchn, unsigned long *console_mfn) +{ + int rc; + + if ( (rc = xc_dom_kernel_file(dom, image_name)) != 0 ) + return rc; + if ( initrd_name && strlen(initrd_name) && + ((rc = xc_dom_ramdisk_file(dom, initrd_name)) != 0) ) + return rc; + + return xc_linux_build_internal(dom, xc_handle, domid, + mem_mb, flags, + store_evtchn, store_mfn, + console_evtchn, console_mfn); +} + /* * Local variables: * mode: C diff -r a70cf505aef9 -r eefbc33a41ab tools/libxc/xc_dom_ia64.c --- a/tools/libxc/xc_dom_ia64.c Mon Feb 26 10:22:38 2007 +0000 +++ b/tools/libxc/xc_dom_ia64.c Mon Feb 26 10:23:03 2007 +0000 @@ -113,9 +113,19 @@ static struct xc_dom_arch xc_dom_arch = .vcpu = vcpu_ia64, }; +static struct xc_dom_arch xc_dom_arch_ia64be = { + .guest_type = "xen-3.0-ia64be", + .page_shift = PAGE_SHIFT_IA64, + .alloc_magic_pages = alloc_magic_pages, + .start_info = start_info_ia64, + .shared_info = shared_info_ia64, + .vcpu = vcpu_ia64, +}; + static void __init register_arch_hooks(void) { xc_dom_register_arch_hooks(&xc_dom_arch); + xc_dom_register_arch_hooks(&xc_dom_arch_ia64be); } /* diff -r a70cf505aef9 -r eefbc33a41ab tools/libxc/xenguest.h --- a/tools/libxc/xenguest.h Mon Feb 26 10:22:38 2007 +0000 +++ b/tools/libxc/xenguest.h Mon Feb 26 10:23:03 2007 +0000 @@ -91,6 +91,20 @@ int xc_linux_build(int xc_handle, unsigned int console_evtchn, unsigned long *console_mfn); +/** The same interface, but the dom structure is managed by the caller */ +struct xc_dom_image; +int xc_dom_linux_build(int xc_handle, + struct xc_dom_image *dom, + uint32_t domid, + unsigned int mem_mb, + const char *image_name, + const char *ramdisk_name, + unsigned long flags, + unsigned int store_evtchn, + unsigned long *store_mfn, + unsigned int console_evtchn, + unsigned long *console_mfn); + /** * This function will create a domain for a paravirtualized Linux * using buffers for kernel and initrd diff -r a70cf505aef9 -r eefbc33a41ab tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Mon Feb 26 10:22:38 2007 +0000 +++ b/tools/python/xen/lowlevel/xc/xc.c Mon Feb 26 10:23:03 2007 +0000 @@ -18,6 +18,8 @@ #include <arpa/inet.h> #include "xenctrl.h" +#include <xen/elfnote.h> +#include "xc_dom.h" #include <xen/hvm/hvm_info_table.h> #include <xen/hvm/params.h> @@ -371,13 +373,17 @@ static PyObject *pyxc_linux_build(XcObje PyObject *args, PyObject *kwds) { - uint32_t dom; + uint32_t domid; + struct xc_dom_image *dom; char *image, *ramdisk = NULL, *cmdline = "", *features = NULL; int flags = 0; int store_evtchn, console_evtchn; unsigned int mem_mb; unsigned long store_mfn = 0; unsigned long console_mfn = 0; + PyObject* elfnote_dict; + PyObject* elfnote = NULL; + int i; static char *kwd_list[] = { "domid", "store_evtchn", "memsize", "console_evtchn", "image", @@ -386,22 +392,52 @@ static PyObject *pyxc_linux_build(XcObje "features", NULL }; if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssis", kwd_list, - &dom, &store_evtchn, &mem_mb, + &domid, &store_evtchn, &mem_mb, &console_evtchn, &image, /* optional */ &ramdisk, &cmdline, &flags, &features) ) return NULL; - if ( xc_linux_build(self->xc_handle, dom, mem_mb, image, - ramdisk, cmdline, features, flags, - store_evtchn, &store_mfn, - console_evtchn, &console_mfn) != 0 ) { - return pyxc_error_to_exception(); + xc_dom_loginit(); + if (!(dom = xc_dom_allocate(cmdline, features))) + return pyxc_error_to_exception(); + + if ( xc_dom_linux_build(self->xc_handle, dom, domid, mem_mb, image, + ramdisk, flags, store_evtchn, &store_mfn, + console_evtchn, &console_mfn) != 0 ) { + goto out; } - return Py_BuildValue("{s:i,s:i}", + + if (!(elfnote_dict = PyDict_New())) + goto out; + for (i = 0; i < XEN_ELFNOTE_MAX; i++) { + switch (dom->parms.elf_notes[i].type) { + case XEN_ENT_NONE: + continue; + case XEN_ENT_LONG: + elfnote = Py_BuildValue("k", dom->parms.elf_notes[i].data.num); + break; + case XEN_ENT_STR: + elfnote = Py_BuildValue("s", dom->parms.elf_notes[i].data.str); + break; + } + PyDict_SetItemString(elfnote_dict, + dom->parms.elf_notes[i].name, + elfnote); + Py_DECREF(elfnote); + } + + xc_dom_release(dom); + + return Py_BuildValue("{s:i,s:i,s:N}", "store_mfn", store_mfn, - "console_mfn", console_mfn); + "console_mfn", console_mfn, + "notes", elfnote_dict); + + out: + xc_dom_release(dom); + return pyxc_error_to_exception(); } static PyObject *pyxc_hvm_build(XcObject *self, diff -r a70cf505aef9 -r eefbc33a41ab tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Mon Feb 26 10:22:38 2007 +0000 +++ b/tools/python/xen/xend/XendConfig.py Mon Feb 26 10:23:03 2007 +0000 @@ -729,6 +729,10 @@ class XendConfig(dict): image['hvm'] = image_hvm image['hvm']['devices'] = image_hvm_devices + notes = sxp.children(image_sxp, 'notes') + if notes: + image['notes'] = self.notes_from_sxp(notes[0]) + self['image'] = image for apikey, imgkey in XENAPI_HVM_CFG.items(): @@ -1363,6 +1367,9 @@ class XendConfig(dict): image.append([arg, val]) + if 'notes' in self['image']: + image.append(self.notes_sxp(self['image']['notes'])) + return image def update_with_image_sxp(self, image_sxp, bootloader = False): @@ -1420,6 +1427,10 @@ class XendConfig(dict): image['hvm'] = image_hvm image['hvm']['devices'] = image_hvm_devices + notes = sxp.children(image_sxp, 'notes') + if notes: + image['notes'] = self.notes_from_sxp(notes[0]) + self['image'] = image for apikey, imgkey in XENAPI_HVM_CFG.items(): @@ -1432,7 +1443,28 @@ class XendConfig(dict): self[apikey] = val self._hvm_boot_params_from_sxp(image_sxp) - + def set_notes(self, notes): + 'Add parsed elfnotes to image' + self['image']['notes'] = notes + + def get_notes(self): + try: + return self['image']['notes'] or {} + except KeyError: + return {} + + def notes_from_sxp(self, nsxp): + notes = {} + for note in sxp.children(nsxp): + notes[note[0]] = note[1] + return notes + + def notes_sxp(self, notes): + nsxp = ['notes'] + for k, v in notes.iteritems(): + nsxp.append([k, str(v)]) + return nsxp + def _hvm_boot_params_from_sxp(self, image_sxp): boot = sxp.child_value(image_sxp, 'boot', None) if boot is not None: diff -r a70cf505aef9 -r eefbc33a41ab tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Mon Feb 26 10:22:38 2007 +0000 +++ b/tools/python/xen/xend/XendDomainInfo.py Mon Feb 26 10:23:03 2007 +0000 @@ -302,6 +302,8 @@ class XendDomainInfo: @type store_mfn: int @ivar console_mfn: xenconsoled mfn @type console_mfn: int + @ivar notes: OS image notes + @type notes: dictionary @ivar vmWatch: reference to a watch on the xenstored vmpath @type vmWatch: xen.xend.xenstore.xswatch @ivar shutdownWatch: reference to watch on the xenstored domain shutdown @@ -776,12 +778,28 @@ class XendDomainInfo: def f(n, v): if v is not None: - to_store[n] = str(v) + if type(v) == bool: + to_store[n] = v and "1" or "0" + else: + to_store[n] = str(v) f('console/port', self.console_port) f('console/ring-ref', self.console_mfn) f('store/port', self.store_port) f('store/ring-ref', self.store_mfn) + + # elfnotes + for n, v in self.info.get_notes().iteritems(): + n = n.lower().replace('_', '-') + if n == 'features': + for v in v.split('|'): + v = v.replace('_', '-') + if v.startswith('!'): + f('image/%s/%s' % (n, v[1:]), False) + else: + f('image/%s/%s' % (n, v), True) + else: + f('image/%s' % n, v) to_store.update(self._vcpuDomDetails()) @@ -1462,6 +1480,8 @@ class XendDomainInfo: self.store_mfn = channel_details['store_mfn'] if 'console_mfn' in channel_details: self.console_mfn = channel_details['console_mfn'] + if 'notes' in channel_details: + self.info.set_notes(channel_details['notes']) self._introduceDomain() diff -r a70cf505aef9 -r eefbc33a41ab xen/arch/x86/domain_build.c --- a/xen/arch/x86/domain_build.c Mon Feb 26 10:22:38 2007 +0000 +++ b/xen/arch/x86/domain_build.c Mon Feb 26 10:23:03 2007 +0000 @@ -28,6 +28,7 @@ #include <asm/paging.h> #include <public/version.h> +#include <public/elfnote.h> #include <public/libelf.h> extern unsigned long initial_images_nrpages(void); diff -r a70cf505aef9 -r eefbc33a41ab xen/common/libelf/libelf-dominfo.c --- a/xen/common/libelf/libelf-dominfo.c Mon Feb 26 10:22:38 2007 +0000 +++ b/xen/common/libelf/libelf-dominfo.c Mon Feb 26 10:23:03 2007 +0000 @@ -119,13 +119,18 @@ int elf_xen_parse_note(struct elf_binary str = elf_note_desc(elf, note); elf_msg(elf, "%s: %s = \"%s\"\n", __FUNCTION__, note_desc[type].name, str); + parms->elf_notes[type].type = XEN_ENT_STR; + parms->elf_notes[type].data.str = str; } else { val = elf_note_numeric(elf, note); elf_msg(elf, "%s: %s = 0x%" PRIx64 "\n", __FUNCTION__, note_desc[type].name, val); - } + parms->elf_notes[type].type = XEN_ENT_LONG; + parms->elf_notes[type].data.num = val; + } + parms->elf_notes[type].name = note_desc[type].name; switch ( type ) { diff -r a70cf505aef9 -r eefbc33a41ab xen/include/public/elfnote.h --- a/xen/include/public/elfnote.h Mon Feb 26 10:22:38 2007 +0000 +++ b/xen/include/public/elfnote.h Mon Feb 26 10:23:03 2007 +0000 @@ -157,6 +157,11 @@ #define XEN_ELFNOTE_L1_MFN_VALID 13 /* + * The number of the highest elfnote defined. + */ +#define XEN_ELFNOTE_MAX XEN_ELFNOTE_L1_MFN_VALID + +/* * System information exported through crash notes. * * The kexec / kdump code will create one XEN_ELFNOTE_CRASH_INFO diff -r a70cf505aef9 -r eefbc33a41ab xen/include/public/libelf.h --- a/xen/include/public/libelf.h Mon Feb 26 10:22:38 2007 +0000 +++ b/xen/include/public/libelf.h Mon Feb 26 10:23:03 2007 +0000 @@ -174,12 +174,28 @@ int elf_reloc(struct elf_binary *elf); #define UNSET_ADDR ((uint64_t)-1) +enum xen_elfnote_type { + XEN_ENT_NONE = 0, + XEN_ENT_LONG = 1, + XEN_ENT_STR = 2 +}; + +struct xen_elfnote { + enum xen_elfnote_type type; + const char *name; + union { + const char *str; + uint64_t num; + } data; +}; + struct elf_dom_parms { /* raw */ const char *guest_info; const void *elf_note_start; const void *elf_note_end; - + struct xen_elfnote elf_notes[XEN_ELFNOTE_MAX + 1]; + /* parsed */ char guest_os[16]; char guest_ver[16]; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |